casnode/object/favorites.go

268 lines
7.4 KiB
Go
Raw Permalink Normal View History

2020-06-30 12:13:47 +08:00
// Copyright 2020 The casbin Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package object
import (
"github.com/casbin/casnode/util"
2022-09-29 00:37:37 +08:00
"github.com/casdoor/casdoor-go-sdk/casdoorsdk"
)
2020-06-30 12:13:47 +08:00
type Favorites struct {
Id int `xorm:"int notnull pk autoincr" json:"id"`
FavoritesType string `xorm:"varchar(100) index" json:"favoritesType"`
ObjectId string `xorm:"varchar(100) index" json:"objectId"`
CreatedTime string `xorm:"varchar(40)" json:"createdTime"`
MemberId string `xorm:"varchar(100) index" json:"memberId"`
2020-06-30 12:13:47 +08:00
}
const (
FavorTopic = "favor_topic"
FollowUser = "follow_user"
FavorNode = "favor_node"
SubscribeTopic = "subscribe_topic"
)
func IsFavoritesExist(Type string) bool {
2022-08-09 20:10:21 +08:00
// check the if the string is in the enum
if Type == FavorTopic || Type == FollowUser || Type == FavorNode || Type == SubscribeTopic {
return true
}
return false
}
2020-06-30 12:13:47 +08:00
func AddFavorites(favorite *Favorites) bool {
2021-06-01 20:51:13 +08:00
affected, err := adapter.Engine.Insert(favorite)
2020-06-30 12:13:47 +08:00
if err != nil {
panic(err)
}
return affected != 0
}
func AddMemberFavorites(memberId string, favoritesType string, objectId string) bool {
status := GetFavoritesStatus(memberId, favoritesType, objectId)
if status == true {
return true
}
favorite := Favorites{
FavoritesType: favoritesType,
ObjectId: objectId,
CreatedTime: util.GetCurrentTime(),
MemberId: memberId,
}
return AddFavorites(&favorite)
}
func DeleteFavorites(memberId string, objectId string, favoritesType string) bool {
2021-06-01 20:51:13 +08:00
affected, err := adapter.Engine.Where("favorites_type = ?", favoritesType).And("object_id = ?", objectId).And("member_id = ?", memberId).Delete(&Favorites{})
2020-06-30 12:13:47 +08:00
if err != nil {
panic(err)
}
return affected != 0
}
func GetFavoritesCount() int {
2021-06-01 20:51:13 +08:00
count, err := adapter.Engine.Count(&Favorites{})
2020-06-30 12:13:47 +08:00
if err != nil {
panic(err)
}
return int(count)
}
func GetFavoritesStatus(memberId string, objectId string, favoritesType string) bool {
2020-06-30 12:13:47 +08:00
node := new(Favorites)
2021-06-01 20:51:13 +08:00
total, err := adapter.Engine.Where("favorites_type = ?", favoritesType).And("object_id = ?", objectId).And("member_id = ?", memberId).Count(node)
2020-06-30 12:13:47 +08:00
if err != nil {
panic(err)
}
return total != 0
}
func GetTopicsFromFavorites(memberId string, limit int, offset int, favoritesType string) []*TopicWithAvatar {
2020-06-30 12:13:47 +08:00
favorites := []*Favorites{}
err := adapter.Engine.Where("member_id = ?", memberId).And("favorites_type = ?", favoritesType).Limit(limit, offset).Find(&favorites)
2020-06-30 12:13:47 +08:00
if err != nil {
panic(err)
}
2020-07-07 00:33:29 +08:00
topics := []*TopicWithAvatar{}
2020-06-30 12:13:47 +08:00
for _, v := range favorites {
topicId := util.ParseInt(v.ObjectId)
2021-08-22 10:35:04 +08:00
temp := GetTopicWithAvatar(topicId, nil)
2020-06-30 12:13:47 +08:00
topics = append(topics, temp)
}
return topics
}
2022-09-29 00:37:37 +08:00
func GetMembersFromFavorites(objectId string, favoritesType string) []*casdoorsdk.User {
favorites := []*Favorites{}
err := adapter.Engine.Where("object_id = ?", objectId).And("favorites_type = ?", favoritesType).Find(&favorites)
if err != nil {
panic(err)
}
2022-09-29 00:37:37 +08:00
members := []*casdoorsdk.User{}
for _, v := range favorites {
2022-10-07 21:01:54 +08:00
user := GetUser(v.MemberId)
if user != nil {
members = append(members, user)
}
}
return members
}
func GetRepliesFromFavorites(memberId string, limit int, offset int, favoritesType string) []*ReplyWithAvatar {
favorites := []*Favorites{}
err := adapter.Engine.Where("member_id = ?", memberId).And("favorites_type = ?", favoritesType).Limit(limit, offset).Find(&favorites)
if err != nil {
panic(err)
}
replies := []*ReplyWithAvatar{}
for _, v := range favorites {
topicId := util.ParseInt(v.ObjectId)
temp, _ := GetReplies(topicId, nil, limit, offset)
for _, v := range temp {
replies = append(replies, v)
}
}
return replies
}
2020-07-07 00:33:29 +08:00
func GetFollowingNewAction(memberId string, limit int, offset int) []*TopicWithAvatar {
var topics []*TopicWithAvatar
2020-06-30 12:13:47 +08:00
2021-06-01 20:51:13 +08:00
err := adapter.Engine.Table("topic").
Join("INNER", "favorites", "favorites.object_id = topic.author").
Where("favorites.member_id = ?", memberId).And("favorites.favorites_type = ?", FollowUser).
Desc("topic.id").
Cols("topic.id, topic.author, topic.node_id, topic.node_name, topic.title, topic.created_time, topic.last_reply_user, topic.last_Reply_time, topic.reply_count, topic.favorite_count, topic.deleted, topic.home_page_top_time, topic.tab_top_time, topic.node_top_time").
Omit("topic.content").
Limit(limit, offset).Find(&topics)
2020-06-30 12:13:47 +08:00
if err != nil {
panic(err)
}
for _, topic := range topics {
2021-08-21 23:31:54 +08:00
topic.Avatar = getUserAvatar(topic.Author)
}
return topics
2020-06-30 12:13:47 +08:00
}
func GetNodesFromFavorites(memberId string, limit int, offset int) []*NodeFavoritesRes {
favorites := []*Favorites{}
err := adapter.Engine.Where("member_id = ?", memberId).And("favorites_type = ?", FavorNode).Limit(limit, offset).Find(&favorites)
2020-06-30 12:13:47 +08:00
if err != nil {
panic(err)
}
nodes := []*NodeFavoritesRes{}
for _, v := range favorites {
var temp NodeFavoritesRes
temp.NodeInfo = GetNode(v.ObjectId)
temp.TopicNum = GetNodeTopicNum(v.ObjectId)
nodes = append(nodes, &temp)
}
return nodes
}
func GetNodeFavoritesNum(id string) int {
node := new(Favorites)
total, err := adapter.Engine.Where("favorites_type = ?", FavorNode).And("object_id = ?", id).Count(node)
2020-06-30 12:13:47 +08:00
if err != nil {
panic(err)
}
return int(total)
}
func GetTopicFavoritesNum(id string) int {
topic := new(Favorites)
total, err := adapter.Engine.Where("favorites_type = ?", FavorTopic).And("object_id = ?", id).Count(topic)
if err != nil {
panic(err)
}
return int(total)
}
func GetTopicSubscribeNum(id string) int {
topic := new(Favorites)
total, err := adapter.Engine.Where("favorites_type = ?", SubscribeTopic).And("object_id = ?", id).Count(topic)
if err != nil {
panic(err)
}
return int(total)
}
func GetFollowingNum(id string) int {
member := new(Favorites)
total, err := adapter.Engine.Where("favorites_type = ?", FollowUser).And("member_id = ?", id).Count(member)
if err != nil {
panic(err)
}
return int(total)
}
func GetFavoritesNum(favoritesType string, memberId string) int {
2020-06-30 12:13:47 +08:00
var total int64
var err error
switch favoritesType {
case FavorTopic:
2020-06-30 12:13:47 +08:00
topic := new(Favorites)
total, err = adapter.Engine.Where("favorites_type = ?", FavorTopic).And("member_id = ?", memberId).Count(topic)
2020-06-30 12:13:47 +08:00
if err != nil {
panic(err)
}
break
case FollowUser:
2020-06-30 12:13:47 +08:00
topic := new(Favorites)
total, err = adapter.Engine.Table("topic").Join("INNER", "favorites", "topic.author = favorites.object_id").Where("favorites.member_id = ?", memberId).And("favorites.favorites_type = ?", FollowUser).Count(topic)
2020-06-30 12:13:47 +08:00
if err != nil {
panic(err)
}
break
case FavorNode:
2020-06-30 12:13:47 +08:00
node := new(Favorites)
total, err = adapter.Engine.Where("favorites_type = ?", FavorNode).And("member_id = ?", memberId).Count(node)
if err != nil {
panic(err)
}
break
case SubscribeTopic:
topic := new(Favorites)
total, err = adapter.Engine.Where("favorites_type = ?", SubscribeTopic).And("member_id = ?", memberId).Count(topic)
if err != nil {
panic(err)
}
break
2020-06-30 12:13:47 +08:00
default:
return 0
}
return int(total)
}