wx-server/internal/dao/post_like.go

76 lines
2.1 KiB
Go
Raw Normal View History

2024-06-04 21:22:50 +08:00
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
}