package repository import ( "errors" "time" "github.com/topfans/backend/pkg/database" "github.com/topfans/backend/pkg/models" "gorm.io/gorm" ) // ActivityMessagesRepository 活动留言仓库接口 type ActivityMessagesRepository interface { // Insert 插入一条留言,返回新 ID Insert(msg *models.ActivityMessage) (int64, error) // ListByActivity 列出活动的留言(分页,按 created_at DESC, id DESC) ListByActivity(activityID int64, page, pageSize int) ([]*models.ActivityMessage, int64, error) // CountByUserActivity 统计某用户在某活动的留言数(用于累计上限校验) CountByUserActivity(activityID, userID int64) (int64, error) // UpdateProfile 更新留言的昵称头像(写后异步补字段,避免读时RPC反查) UpdateProfile(msgID int64, nickname, avatarURL string) error } // activityMessagesRepository 实现 type activityMessagesRepository struct { db *gorm.DB } // NewActivityMessagesRepository 创建仓库实例 func NewActivityMessagesRepository() ActivityMessagesRepository { return &activityMessagesRepository{ db: database.GetDB(), } } // Insert 插入一条留言,返回新 ID func (r *activityMessagesRepository) Insert(msg *models.ActivityMessage) (int64, error) { if msg == nil { return 0, errors.New("message cannot be nil") } if err := r.db.Create(msg).Error; err != nil { return 0, err } return msg.ID, nil } // ListByActivity 列出活动的留言 func (r *activityMessagesRepository) ListByActivity(activityID int64, page, pageSize int) ([]*models.ActivityMessage, int64, error) { if activityID <= 0 { return nil, 0, errors.New("activity_id must be greater than 0") } if page <= 0 { page = 1 } if pageSize <= 0 { pageSize = 20 } if pageSize > 50 { pageSize = 50 } query := r.db.Model(&models.ActivityMessage{}). Where("activity_id = ? AND deleted_at IS NULL AND status = 0", activityID) var total int64 if err := query.Count(&total).Error; err != nil { return nil, 0, err } var messages []*models.ActivityMessage offset := (page - 1) * pageSize if err := query.Order("created_at ASC, id ASC"). Offset(offset). Limit(pageSize). Find(&messages).Error; err != nil { return nil, 0, err } return messages, total, nil } // CountByUserActivity 统计某用户在某活动的留言数 func (r *activityMessagesRepository) CountByUserActivity(activityID, userID int64) (int64, error) { if activityID <= 0 || userID <= 0 { return 0, errors.New("activity_id and user_id must be greater than 0") } var count int64 if err := r.db.Model(&models.ActivityMessage{}). Where("activity_id = ? AND user_id = ? AND deleted_at IS NULL", activityID, userID). Count(&count).Error; err != nil { return 0, err } return count, nil } // UpdateProfile 更新留言的昵称头像 func (r *activityMessagesRepository) UpdateProfile(msgID int64, nickname, avatarURL string) error { if msgID <= 0 { return errors.New("msg_id must be greater than 0") } return r.db.Model(&models.ActivityMessage{}). Where("id = ?", msgID). Updates(map[string]interface{}{ "nickname": nickname, "avatar_url": avatarURL, "updated_at": time.Now().UnixMilli(), }).Error }