Files
user-system/internal/repository/theme.go
long-agent 8095307d82 fix: P0/P1 security and quality fixes
P0-01: Add ESCAPE clause to LIKE queries in operation_log.go and device.go
P0-02: Add atomic Increment to L1Cache and L2Cache interfaces
P0-07: Add TOTP verification step after password login
P1-01: Sanitize error messages in error.go middleware
P1-03: Remove err.Error() from export error messages
P1-04: Add error return to CountByResultSince in login_log.go
P1-05: Add transactional DeleteCascade to RoleRepository
P1-06: Add PasswordChangedAt tracking for JWT token invalidation
P1-07: Wrap theme SetDefault in database transaction
P1-08: Use config values for database pool parameters
P1-09: Add rows.Err() checks in social_account_repo.go
P1-10: Validate sortOrder with map in user.go ORDER BY
P1-11: Add GORM tags to Announcement struct
P1-15: Add pageSize upper limit (100) to device and log handlers
2026-04-18 15:33:12 +08:00

102 lines
3.1 KiB
Go

package repository
import (
"context"
"gorm.io/gorm"
"github.com/user-management-system/internal/domain"
)
// ThemeConfigRepository 主题配置数据访问层
type ThemeConfigRepository struct {
db *gorm.DB
}
// NewThemeConfigRepository 创建主题配置数据访问层
func NewThemeConfigRepository(db *gorm.DB) *ThemeConfigRepository {
return &ThemeConfigRepository{db: db}
}
// Create 创建主题配置
func (r *ThemeConfigRepository) Create(ctx context.Context, theme *domain.ThemeConfig) error {
return r.db.WithContext(ctx).Create(theme).Error
}
// Update 更新主题配置
func (r *ThemeConfigRepository) Update(ctx context.Context, theme *domain.ThemeConfig) error {
return r.db.WithContext(ctx).Save(theme).Error
}
// Delete 删除主题配置
func (r *ThemeConfigRepository) Delete(ctx context.Context, id int64) error {
return r.db.WithContext(ctx).Delete(&domain.ThemeConfig{}, id).Error
}
// GetByID 根据ID获取主题配置
func (r *ThemeConfigRepository) GetByID(ctx context.Context, id int64) (*domain.ThemeConfig, error) {
var theme domain.ThemeConfig
err := r.db.WithContext(ctx).First(&theme, id).Error
if err != nil {
return nil, err
}
return &theme, nil
}
// GetByName 根据名称获取主题配置
func (r *ThemeConfigRepository) GetByName(ctx context.Context, name string) (*domain.ThemeConfig, error) {
var theme domain.ThemeConfig
err := r.db.WithContext(ctx).Where("name = ?", name).First(&theme).Error
if err != nil {
return nil, err
}
return &theme, nil
}
// GetDefault 获取默认主题
func (r *ThemeConfigRepository) GetDefault(ctx context.Context) (*domain.ThemeConfig, error) {
var theme domain.ThemeConfig
err := r.db.WithContext(ctx).Where("is_default = ?", true).First(&theme).Error
if err != nil {
// 如果没有默认主题,返回默认配置
if err == gorm.ErrRecordNotFound {
return domain.DefaultThemeConfig(), nil
}
return nil, err
}
return &theme, nil
}
// List 获取所有已启用的主题配置
func (r *ThemeConfigRepository) List(ctx context.Context) ([]*domain.ThemeConfig, error) {
var themes []*domain.ThemeConfig
err := r.db.WithContext(ctx).Where("enabled = ?", true).Order("is_default DESC, id ASC").Find(&themes).Error
if err != nil {
return nil, err
}
return themes, nil
}
// ListAll 获取所有主题配置
func (r *ThemeConfigRepository) ListAll(ctx context.Context) ([]*domain.ThemeConfig, error) {
var themes []*domain.ThemeConfig
err := r.db.WithContext(ctx).Order("is_default DESC, id ASC").Find(&themes).Error
if err != nil {
return nil, err
}
return themes, nil
}
// SetDefault 设置默认主题
func (r *ThemeConfigRepository) SetDefault(ctx context.Context, id int64) error {
// 使用事务确保原子性:先清除所有默认标记,再设置新默认
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
// 先清除所有默认标记
if err := tx.Model(&domain.ThemeConfig{}).Where("is_default = ?", true).Update("is_default", false).Error; err != nil {
return err
}
// 设置新的默认主题
return tx.Model(&domain.ThemeConfig{}).Where("id = ?", id).Update("is_default", true).Error
})
}