fd097729d7
- 成就系统、连续打卡天数计算、管理后台成就 CRUD - 梦想目标图标预设 DreamPreset 与用户端 dream-presets 接口 - 管理后台梦想图标 CRUD;戒烟打卡 summary 修正 - 忽略根目录编译产物 /api Made-with: Cursor
128 lines
3.3 KiB
Go
128 lines
3.3 KiB
Go
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
|
|
}
|