refactor(api): extract repository layer and thin HTTP handlers

Introduce internal/repository for data access and cache-backed system
config reads. Move business logic into logics.go across admin push,
user, template, cache, system_config, and upload/handler packages.

Remove Gin from internal/util by relocating request-scoped helpers to
oauth/gin_context.go. Propagate request context for config lookups in
user flows. Slim model entities and delete model-level DB/cache helpers.

Wire handlers to logics/repository so targeted packages no longer call
db.DB directly. Update admin router tests to use ErrorHandlerMiddleware.
This commit is contained in:
ryan
2026-06-18 12:12:49 +08:00
parent e5b3a60f73
commit 1b2e083aec
77 changed files with 2370 additions and 1783 deletions
+1 -49
View File
@@ -4,13 +4,9 @@
package model
import (
"context"
"errors"
"strings"
"time"
"github.com/Rain-kl/Wavelet/internal/db"
"gorm.io/gorm"
)
// PushEvent 系统通知事件模型
@@ -51,48 +47,4 @@ func (pe *PushEvent) Validate() error {
return errors.New("cannot enable event without any push channels configured")
}
return nil
}
const activePushEventCacheTTL = 24 * time.Hour
// GetActivePushEventByKey 获取启用的通知事件 (优先从 Redis 缓存获取)
func GetActivePushEventByKey(ctx context.Context, key string) (*PushEvent, error) {
cacheKey := "push:event:active:" + key
var event PushEvent
if db.Redis != nil {
if err := db.GetJSON(ctx, cacheKey, &event); err == nil {
return &event, nil
}
}
err := db.DB(ctx).Where("event_key = ? AND enabled = ?", key, true).First(&event).Error
if err != nil {
return nil, err
}
if db.Redis != nil {
// 缓存有效时间设置为 24 小时
_ = db.SetJSON(ctx, cacheKey, event, activePushEventCacheTTL)
}
return &event, nil
}
// DeleteActivePushEventCache 清理启用通知事件的缓存
func DeleteActivePushEventCache(ctx context.Context, key string) {
if db.Redis != nil {
_ = db.Redis.Del(ctx, db.PrefixedKey("push:event:active:"+key)).Err()
}
}
// AfterSave GORM 保存后钩子,用于自动清理缓存
func (pe *PushEvent) AfterSave(tx *gorm.DB) error {
DeleteActivePushEventCache(tx.Statement.Context, pe.EventKey)
return nil
}
// AfterDelete GORM 删除后钩子,用于自动清理缓存
func (pe *PushEvent) AfterDelete(tx *gorm.DB) error {
DeleteActivePushEventCache(tx.Statement.Context, pe.EventKey)
return nil
}
}