package service import ( "context" "fmt" "gorm.io/gorm" "wx_service/internal/achievement" ) func (s *Service) ListAchievementThemes(ctx context.Context) ([]achievement.Theme, error) { var themes []achievement.Theme err := s.db.WithContext(ctx). Preload("Levels", func(db *gorm.DB) *gorm.DB { return db.Order("required_days ASC, sort_order ASC") }). Order("sort_order ASC, id ASC"). Find(&themes).Error if err != nil { return nil, fmt.Errorf("list themes: %w", err) } return themes, nil } func (s *Service) GetAchievementTheme(ctx context.Context, id uint) (*achievement.Theme, error) { var theme achievement.Theme err := s.db.WithContext(ctx). Preload("Levels"). First(&theme, id).Error if err != nil { return nil, err } return &theme, nil } func (s *Service) CreateAchievementTheme(ctx context.Context, name, key, icon string, sortOrder int, isActive *bool) (*achievement.Theme, error) { active := true if isActive != nil { active = *isActive } theme := achievement.Theme{ Name: name, Key: key, Icon: icon, SortOrder: sortOrder, IsActive: active, } if err := s.db.WithContext(ctx).Create(&theme).Error; err != nil { return nil, fmt.Errorf("create theme: %w", err) } return &theme, nil } func (s *Service) UpdateAchievementTheme(ctx context.Context, id uint, name, key, icon string, sortOrder int, isActive *bool) (*achievement.Theme, error) { var theme achievement.Theme if err := s.db.WithContext(ctx).First(&theme, id).Error; err != nil { return nil, err } if name != "" { theme.Name = name } if key != "" { theme.Key = key } if icon != "" { theme.Icon = icon } theme.SortOrder = sortOrder if isActive != nil { theme.IsActive = *isActive } if err := s.db.WithContext(ctx).Save(&theme).Error; err != nil { return nil, err } return &theme, nil } func (s *Service) DeleteAchievementTheme(ctx context.Context, id uint) error { return s.db.WithContext(ctx).Delete(&achievement.Theme{}, id).Error } func (s *Service) ListAchievementLevels(ctx context.Context, themeID uint) ([]achievement.Level, error) { var levels []achievement.Level err := s.db.WithContext(ctx). Where("theme_id = ?", themeID). Order("required_days ASC, sort_order ASC"). Find(&levels).Error return levels, err } func (s *Service) CreateAchievementLevel(ctx context.Context, themeID uint, name, icon string, requiredDays, sortOrder int) (*achievement.Level, error) { level := achievement.Level{ ThemeID: themeID, Name: name, Icon: icon, RequiredDays: requiredDays, SortOrder: sortOrder, } if err := s.db.WithContext(ctx).Create(&level).Error; err != nil { return nil, err } return &level, nil } func (s *Service) UpdateAchievementLevel(ctx context.Context, id uint, name, icon string, requiredDays, sortOrder int) (*achievement.Level, error) { var level achievement.Level if err := s.db.WithContext(ctx).First(&level, id).Error; err != nil { return nil, err } if name != "" { level.Name = name } if icon != "" { level.Icon = icon } level.RequiredDays = requiredDays level.SortOrder = sortOrder if err := s.db.WithContext(ctx).Save(&level).Error; err != nil { return nil, err } return &level, nil } func (s *Service) DeleteAchievementLevel(ctx context.Context, id uint) error { return s.db.WithContext(ctx).Delete(&achievement.Level{}, id).Error }