topfans/backend/services/activityService/repository/activity_messages_repository.go

112 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}