76 lines
2.1 KiB
Go
76 lines
2.1 KiB
Go
|
package dao
|
||
|
|
||
|
import (
|
||
|
"time"
|
||
|
|
||
|
"gorm.io/gorm"
|
||
|
)
|
||
|
|
||
|
// 贴子点赞表
|
||
|
|
||
|
type PostLike struct {
|
||
|
PostId uint64 `gorm:"index;not null;comment:'帖子'"`
|
||
|
UserId int32 `gorm:"index;not null;comment:'点赞者'"`
|
||
|
CreatedAt time.Time `gorm:"type:datetime(0)"`
|
||
|
}
|
||
|
|
||
|
// 点赞。如果已经点过赞了,则忽略。
|
||
|
func PostLike_Like(data *PostLike) error {
|
||
|
return s.db.Where("user_id = ? and post_id = ?", data.UserId, data.PostId).FirstOrCreate(data).Error
|
||
|
}
|
||
|
|
||
|
// 去掉点赞
|
||
|
func PostLike_UnLike(userId int32, postId uint64) error {
|
||
|
return s.db.Where("user_id = ? and post_id = ?", userId, postId).Delete(&PostLike{}).Error
|
||
|
}
|
||
|
|
||
|
// 获取点赞数
|
||
|
func PostLike_Count(postId uint64) (int64, error) {
|
||
|
count := int64(0)
|
||
|
if err := s.db.Model(&PostLike{}).Where("post_id = ?", postId).Count(&count).Error; err != nil && err != gorm.ErrRecordNotFound {
|
||
|
return 0, err
|
||
|
}
|
||
|
return count, nil
|
||
|
}
|
||
|
|
||
|
// 批量获取帖子点赞数
|
||
|
func PostLike_Count_Batch(postIds []uint64) (map[uint64]int64, error) {
|
||
|
type search_result_item struct {
|
||
|
PostId uint64
|
||
|
LikeCount int64
|
||
|
}
|
||
|
var result []*search_result_item
|
||
|
if err := s.db.Model(&PostLike{}).Where("post_id in (?)", postIds).Select("post_id,count(*) as like_count").Group("post_id").Scan(&result).Error; err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
reply := make(map[uint64]int64)
|
||
|
for _, item := range result {
|
||
|
reply[item.PostId] = item.LikeCount
|
||
|
}
|
||
|
return reply, nil
|
||
|
}
|
||
|
|
||
|
// 当前用户有没有点赞
|
||
|
func PostLike_Exists(userId int32, postId uint64) (bool, error) {
|
||
|
count := int64(0)
|
||
|
if err := s.db.Model(&PostLike{}).Where("user_id = ? and post_id = ?", userId, postId).Count(&count).Error; err != nil && err != gorm.ErrRecordNotFound {
|
||
|
return false, err
|
||
|
}
|
||
|
return count != int64(0), nil
|
||
|
}
|
||
|
|
||
|
// 批量查询用户有没有点赞
|
||
|
func PostLike_Exists_Batch(userId int32, postIds []uint64) (map[uint64]bool, error) {
|
||
|
var result []uint64
|
||
|
if err := s.db.Model(&PostLike{}).Where("user_id = ?", userId).Where("post_id in (?)", postIds).Select("post_id").Group("post_id").Scan(&result).Error; err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
reply := make(map[uint64]bool)
|
||
|
for _, post_id := range result {
|
||
|
reply[post_id] = true
|
||
|
}
|
||
|
return reply, nil
|
||
|
}
|