Files
wx_service/internal/admin/service/achievement_service.go
T
nepiedg fd097729d7 feat: 戒烟成就、梦想图标预设、打卡统计与依赖注入调整
- 成就系统、连续打卡天数计算、管理后台成就 CRUD
- 梦想目标图标预设 DreamPreset 与用户端 dream-presets 接口
- 管理后台梦想图标 CRUD;戒烟打卡 summary 修正
- 忽略根目录编译产物 /api

Made-with: Cursor
2026-04-04 14:55:50 +08:00

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
}