Files
shiran aa9f892a32 feat: 添加数据库集成、定时任务调度器和事件Hook体系
- 新增数据库配置项(DB_TYPE, DB_HOST, DB_PORT等),支持MySQL和PostgreSQL
- 集成GORM实现数据库连接和自动迁移功能
- 添加定时任务调度器(cmd/scheduler),基于robfig/cron实现秒级调度
- 实现事件Hook体系,支持同步/异步处理和优先级排序
- 更新构建脚本,编译server、cli、scheduler三个二进制文件
- 配置systemd服务管理定时任务调度器
- 重构项目结构,新增crontab和hooks目录模块
- 更新README文档,完善各组件使用说明和部署配置
2026-04-15 12:39:59 +08:00

84 lines
1.9 KiB
Go

package hooks
import (
"apiServer_service/utils/logger"
"context"
"fmt"
"sort"
"sync"
)
type handlerWithMeta struct {
priority int
async bool
h Handler
}
type Manager struct {
mu sync.RWMutex
handlers map[EventType][]handlerWithMeta
}
func NewManager() *Manager {
return &Manager{
handlers: make(map[EventType][]handlerWithMeta),
}
}
// Register 同步注册,优先级 0
func (m *Manager) Register(event EventType, h Handler) {
m.RegisterWithOptions(event, 0, false, h)
}
// RegisterWithPriority 指定优先级(同步)
func (m *Manager) RegisterWithPriority(event EventType, priority int, h Handler) {
m.RegisterWithOptions(event, priority, false, h)
}
// RegisterAsync 异步注册,优先级 0
func (m *Manager) RegisterAsync(event EventType, h Handler) {
m.RegisterWithOptions(event, 0, true, h)
}
// RegisterWithOptions 核心注册:优先级 + 同步/异步
func (m *Manager) RegisterWithOptions(event EventType, priority int, async bool, h Handler) {
m.mu.Lock()
defer m.mu.Unlock()
m.handlers[event] = append(m.handlers[event], handlerWithMeta{
priority: priority,
async: async,
h: h,
})
}
// Trigger 触发事件,按优先级从高到低执行
func (m *Manager) Trigger(ctx context.Context, event EventType, payload *EventPayload) {
m.mu.RLock()
hs := m.handlers[event]
m.mu.RUnlock()
if len(hs) == 0 {
return
}
sorted := make([]handlerWithMeta, len(hs))
copy(sorted, hs)
sort.SliceStable(sorted, func(i, j int) bool {
return sorted[i].priority > sorted[j].priority
})
for _, hm := range sorted {
if hm.async {
go func(hm handlerWithMeta) {
if err := hm.h.Handle(ctx, event, payload); err != nil {
logger.Error("Hook", fmt.Sprintf("async event=%s err=%v", event, err))
}
}(hm)
} else {
if err := hm.h.Handle(ctx, event, payload); err != nil {
logger.Error("Hook", fmt.Sprintf("event=%s err=%v", event, err))
}
}
}
}