feat(moderation): add user profile content moderation for avatars, covers, and bios
This commit is contained in:
123
internal/repository/user_profile_audit_repo.go
Normal file
123
internal/repository/user_profile_audit_repo.go
Normal file
@@ -0,0 +1,123 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user