2024-08-28 14:29:42 +00:00
|
|
|
|
package model
|
|
|
|
|
|
2024-08-29 13:26:01 +00:00
|
|
|
|
import (
|
|
|
|
|
"app-cloudep-tweeting-service/internal/domain"
|
|
|
|
|
"context"
|
|
|
|
|
"errors"
|
2024-08-29 14:50:09 +00:00
|
|
|
|
"time"
|
|
|
|
|
|
2024-08-29 13:26:01 +00:00
|
|
|
|
"github.com/zeromicro/go-zero/core/stores/mon"
|
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
|
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
|
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
|
|
|
)
|
2024-08-28 14:29:42 +00:00
|
|
|
|
|
|
|
|
|
var _ Post_likesModel = (*customPost_likesModel)(nil)
|
|
|
|
|
|
|
|
|
|
type (
|
|
|
|
|
// Post_likesModel is an interface to be customized, add more methods here,
|
|
|
|
|
// and implement the added methods in customPost_likesModel.
|
|
|
|
|
Post_likesModel interface {
|
|
|
|
|
post_likesModel
|
2024-08-29 14:49:42 +00:00
|
|
|
|
LikeDislike(ctx context.Context, postLike *PostLikes) (*PostReactionAction, error)
|
2024-08-29 13:26:01 +00:00
|
|
|
|
FindLikeUsers(ctx context.Context, param *QueryPostLikeReq) ([]*PostLikes, int64, error)
|
2024-08-29 13:49:47 +00:00
|
|
|
|
FindUIDPostLikeStatus(ctx context.Context, param *QueryUIDPostLikeStatusReq) ([]UIDPostLikeStatusResp, error)
|
2024-08-29 14:49:42 +00:00
|
|
|
|
Count(ctx context.Context, target string, likeType domain.LikeType) (int64, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PostReactionAction struct {
|
|
|
|
|
PostID string // 貼文的 ID
|
|
|
|
|
ReactionType domain.LikeType // 用戶的反應類型,可能是讚或不讚
|
|
|
|
|
IsIncrement bool // 表示是否增加(true 表示增加,false 表示減少)
|
2024-08-29 13:26:01 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QueryPostLikeReq struct {
|
|
|
|
|
Target string `bson:"target"`
|
|
|
|
|
LikeType domain.LikeType `bson:"like_type"`
|
|
|
|
|
PageIndex int64 `bson:"page_index"`
|
|
|
|
|
PageSize int64 `bson:"page_size"`
|
2024-08-28 14:29:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-08-29 13:49:47 +00:00
|
|
|
|
QueryUIDPostLikeStatusReq struct {
|
|
|
|
|
Targets []string `bson:"target"`
|
|
|
|
|
LikeType domain.LikeType `bson:"like_type"`
|
|
|
|
|
UID string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UIDPostLikeStatusResp struct {
|
|
|
|
|
TargetID string `json:"target_id"`
|
|
|
|
|
LikeStatus bool `json:"like_status"`
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-28 14:29:42 +00:00
|
|
|
|
customPost_likesModel struct {
|
|
|
|
|
*defaultPost_likesModel
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// NewPost_likesModel returns a model for the mongo.
|
|
|
|
|
func NewPost_likesModel(url, db, collection string) Post_likesModel {
|
|
|
|
|
conn := mon.MustNewModel(url, db, collection)
|
|
|
|
|
return &customPost_likesModel{
|
|
|
|
|
defaultPost_likesModel: newDefaultPost_likesModel(conn),
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-08-29 13:26:01 +00:00
|
|
|
|
|
2024-08-29 14:49:42 +00:00
|
|
|
|
func (m *defaultPost_likesModel) LikeDislike(ctx context.Context, postLike *PostLikes) (*PostReactionAction, error) {
|
|
|
|
|
result := &PostReactionAction{
|
|
|
|
|
PostID: postLike.TargetID,
|
|
|
|
|
ReactionType: domain.LikeType(postLike.Type),
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-29 13:26:01 +00:00
|
|
|
|
// 使用 target_id、uid、type 來查詢資料是否存在
|
|
|
|
|
filter := bson.M{
|
|
|
|
|
"target_id": postLike.TargetID,
|
|
|
|
|
"uid": postLike.UID,
|
|
|
|
|
"type": postLike.Type,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 查詢資料是否存在
|
|
|
|
|
var existingPostLike PostLikes
|
|
|
|
|
err := m.conn.FindOne(ctx, &existingPostLike, filter)
|
|
|
|
|
|
|
|
|
|
if err == nil {
|
|
|
|
|
// 資料存在,進行刪除操作
|
2024-08-29 14:49:42 +00:00
|
|
|
|
result.IsIncrement = false
|
2024-08-29 13:26:01 +00:00
|
|
|
|
_, err = m.conn.DeleteOne(ctx, filter)
|
|
|
|
|
if err != nil {
|
2024-08-29 14:49:42 +00:00
|
|
|
|
return nil, err // 刪除失敗
|
2024-08-29 13:26:01 +00:00
|
|
|
|
}
|
2024-08-29 14:49:42 +00:00
|
|
|
|
|
|
|
|
|
return result, nil // 刪除成功
|
2024-08-29 13:26:01 +00:00
|
|
|
|
} else if errors.Is(mongo.ErrNoDocuments, err) {
|
|
|
|
|
// 資料不存在,進行插入操作
|
2024-08-29 14:49:42 +00:00
|
|
|
|
result.IsIncrement = true
|
2024-08-29 13:26:01 +00:00
|
|
|
|
postLike.ID = primitive.NewObjectID() // 設置新的 ObjectID
|
|
|
|
|
postLike.CreateAt = time.Now().UTC().UnixNano()
|
|
|
|
|
_, err = m.conn.InsertOne(ctx, postLike)
|
|
|
|
|
if err != nil {
|
2024-08-29 14:49:42 +00:00
|
|
|
|
return nil, err // 插入失敗
|
2024-08-29 13:26:01 +00:00
|
|
|
|
}
|
2024-08-29 14:49:42 +00:00
|
|
|
|
|
|
|
|
|
return result, nil // 插入成功
|
2024-08-29 13:26:01 +00:00
|
|
|
|
} else {
|
|
|
|
|
// 其他錯誤
|
2024-08-29 14:49:42 +00:00
|
|
|
|
return nil, err
|
2024-08-29 13:26:01 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (m *defaultPost_likesModel) FindLikeUsers(ctx context.Context, param *QueryPostLikeReq) ([]*PostLikes, int64, error) {
|
|
|
|
|
// 建立篩選條件
|
|
|
|
|
filter := bson.M{}
|
|
|
|
|
|
|
|
|
|
// 如果指定了 Target 條件,將其添加到篩選條件中
|
|
|
|
|
if param.Target != "" {
|
|
|
|
|
filter["target_id"] = param.Target
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果指定了 LikeType 條件,將其添加到篩選條件中
|
|
|
|
|
if param.LikeType != 0 {
|
|
|
|
|
filter["type"] = param.LikeType
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 計算符合條件的文檔總數
|
|
|
|
|
totalCount, err := m.conn.CountDocuments(ctx, filter)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, 0, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 設置分頁和排序選項
|
|
|
|
|
opts := options.Find()
|
|
|
|
|
opts.SetSort(bson.D{{"createAt", -1}}) // 按照創建時間倒序排序
|
|
|
|
|
if param.PageSize > 0 {
|
|
|
|
|
opts.SetLimit(param.PageSize)
|
|
|
|
|
}
|
|
|
|
|
if param.PageIndex > 0 && param.PageSize > 0 {
|
|
|
|
|
opts.SetSkip((param.PageIndex - 1) * param.PageSize)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 查詢符合條件的文檔
|
|
|
|
|
var results []*PostLikes
|
|
|
|
|
err = m.conn.Find(ctx, &results, filter, opts)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, 0, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 返回結果集、總數和錯誤信息
|
|
|
|
|
return results, totalCount, nil
|
|
|
|
|
}
|
2024-08-29 13:49:47 +00:00
|
|
|
|
|
|
|
|
|
func (m *defaultPost_likesModel) FindUIDPostLikeStatus(ctx context.Context, param *QueryUIDPostLikeStatusReq) ([]UIDPostLikeStatusResp, error) {
|
|
|
|
|
// 初始化返回結果的切片
|
|
|
|
|
var results []UIDPostLikeStatusResp
|
|
|
|
|
|
|
|
|
|
// 建立篩選條件
|
|
|
|
|
filter := bson.M{
|
|
|
|
|
"uid": param.UID, // 篩選指定的 UID
|
|
|
|
|
"target_id": bson.M{"$in": param.Targets}, // 篩選多個目標 ID
|
|
|
|
|
"type": param.LikeType, // 篩選指定的 LikeType
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 查詢符合條件的點讚記錄
|
|
|
|
|
var postLikes []PostLikes
|
|
|
|
|
err := m.conn.Find(ctx, &postLikes, filter)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 構建一個 map 來保存查詢到的點讚記錄
|
|
|
|
|
targetLikeMap := make(map[string]bool)
|
|
|
|
|
for _, like := range postLikes {
|
|
|
|
|
targetLikeMap[like.TargetID] = true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 構建每個目標的點讚狀態
|
|
|
|
|
for _, targetID := range param.Targets {
|
|
|
|
|
likeStatus := UIDPostLikeStatusResp{
|
|
|
|
|
TargetID: targetID,
|
|
|
|
|
LikeStatus: targetLikeMap[targetID], // 如果 map 中有該 targetID,返回 true,否則返回 false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果該 targetID 沒有點讚記錄,默認 LikeStatus 為 false
|
|
|
|
|
if _, found := targetLikeMap[targetID]; !found {
|
|
|
|
|
likeStatus.LikeStatus = false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
results = append(results, likeStatus)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return results, nil
|
|
|
|
|
}
|
2024-08-29 14:49:42 +00:00
|
|
|
|
|
|
|
|
|
func (c customPost_likesModel) Count(ctx context.Context, target string, likeType domain.LikeType) (int64, error) {
|
|
|
|
|
// TODO implement me
|
|
|
|
|
panic("implement me")
|
|
|
|
|
}
|