package repository import ( "with_you/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 }