112 lines
3.1 KiB
Go
112 lines
3.1 KiB
Go
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
|
||
}
|