Files
backend/internal/repository/user_profile_audit_repo.go
lafay 90495385cd
All checks were successful
Build Backend / build (push) Successful in 4m24s
Build Backend / build-docker (push) Successful in 1m14s
feat(moderation): add user profile content moderation for avatars, covers, and bios
2026-04-15 11:50:47 +08:00

124 lines
4.1 KiB
Go

package repository
import (
"carrot_bbs/internal/model"
"gorm.io/gorm"
)
type UserProfileAuditRepository interface {
Create(audit *model.UserProfileAudit) error
GetByID(id string) (*model.UserProfileAudit, error)
GetByUserID(userID string, contentType model.UserProfileContentType) (*model.UserProfileAudit, error)
GetPendingByUserID(userID string, contentType model.UserProfileContentType) (*model.UserProfileAudit, error)
Update(audit *model.UserProfileAudit) error
Delete(id string) error
GetPendingList(contentType model.UserProfileContentType, page, pageSize int) ([]*model.UserProfileAudit, int64, error)
CountPending(contentType model.UserProfileContentType) (int64, error)
CountPendingAll() (int64, int64, int64, error)
}
type userProfileAuditRepository struct {
db *gorm.DB
}
func NewUserProfileAuditRepository(db *gorm.DB) UserProfileAuditRepository {
return &userProfileAuditRepository{db: db}
}
func (r *userProfileAuditRepository) Create(audit *model.UserProfileAudit) error {
return r.db.Create(audit).Error
}
func (r *userProfileAuditRepository) GetByID(id string) (*model.UserProfileAudit, error) {
var audit model.UserProfileAudit
err := r.db.Preload("User").First(&audit, "id = ?", id).Error
if err != nil {
return nil, err
}
return &audit, nil
}
func (r *userProfileAuditRepository) GetByUserID(userID string, contentType model.UserProfileContentType) (*model.UserProfileAudit, error) {
var audit model.UserProfileAudit
err := r.db.Where("user_id = ? AND content_type = ?", userID, contentType).
Order("created_at DESC").
First(&audit).Error
if err != nil {
return nil, err
}
return &audit, nil
}
func (r *userProfileAuditRepository) GetPendingByUserID(userID string, contentType model.UserProfileContentType) (*model.UserProfileAudit, error) {
var audit model.UserProfileAudit
err := r.db.Where("user_id = ? AND content_type = ? AND status = ?", userID, contentType, model.UserProfileAuditStatusPending).
Order("created_at DESC").
First(&audit).Error
if err != nil {
return nil, err
}
return &audit, nil
}
func (r *userProfileAuditRepository) Update(audit *model.UserProfileAudit) error {
return r.db.Save(audit).Error
}
func (r *userProfileAuditRepository) Delete(id string) error {
return r.db.Delete(&model.UserProfileAudit{}, "id = ?", id).Error
}
func (r *userProfileAuditRepository) GetPendingList(contentType model.UserProfileContentType, page, pageSize int) ([]*model.UserProfileAudit, int64, error) {
var audits []*model.UserProfileAudit
var total int64
query := r.db.Model(&model.UserProfileAudit{}).Where("status = ?", model.UserProfileAuditStatusPending)
if contentType != "" {
query = query.Where("content_type = ?", contentType)
}
if err := query.Count(&total).Error; err != nil {
return nil, 0, err
}
offset := (page - 1) * pageSize
if err := query.Preload("User").Order("created_at DESC").Offset(offset).Limit(pageSize).Find(&audits).Error; err != nil {
return nil, 0, err
}
return audits, total, nil
}
func (r *userProfileAuditRepository) CountPending(contentType model.UserProfileContentType) (int64, error) {
var count int64
err := r.db.Model(&model.UserProfileAudit{}).
Where("content_type = ? AND status = ?", contentType, model.UserProfileAuditStatusPending).
Count(&count).Error
return count, err
}
func (r *userProfileAuditRepository) CountPendingAll() (int64, int64, int64, error) {
var avatarCount, coverCount, bioCount int64
if err := r.db.Model(&model.UserProfileAudit{}).
Where("content_type = ? AND status = ?", model.UserProfileContentTypeAvatar, model.UserProfileAuditStatusPending).
Count(&avatarCount).Error; err != nil {
return 0, 0, 0, err
}
if err := r.db.Model(&model.UserProfileAudit{}).
Where("content_type = ? AND status = ?", model.UserProfileContentTypeCover, model.UserProfileAuditStatusPending).
Count(&coverCount).Error; err != nil {
return 0, 0, 0, err
}
if err := r.db.Model(&model.UserProfileAudit{}).
Where("content_type = ? AND status = ?", model.UserProfileContentTypeBio, model.UserProfileAuditStatusPending).
Count(&bioCount).Error; err != nil {
return 0, 0, 0, err
}
return avatarCount, coverCount, bioCount, nil
}