Files
junhong_cmp_fiber/pkg/gorm/callback.go
huang 03a0960c4d
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m2s
refactor: 数据权限过滤从 GORM Callback 改为 Store 层显式调用
- 移除 RegisterDataPermissionCallback 和 SkipDataPermission 机制
- 在 Auth 中间件预计算 SubordinateShopIDs 并注入 Context
- 新增 ApplyShopFilter/ApplyEnterpriseFilter/ApplyOwnerShopFilter 等 Helper 函数
- 所有 Store 层查询方法显式调用数据权限过滤函数
- 权限检查函数 CanManageShop/CanManageEnterprise 改为从 Context 获取数据

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-26 16:38:52 +08:00

61 lines
1.5 KiB
Go

package gorm
import (
"reflect"
"github.com/break/junhong_cmp_fiber/pkg/constants"
"gorm.io/gorm"
)
// RegisterSetCreatorUpdaterCallback 注册 GORM 创建数据时创建人更新人 Callback
func RegisterSetCreatorUpdaterCallback(db *gorm.DB) error {
err := db.Callback().Create().Before("gorm:create").Register("set_creator_updater", func(tx *gorm.DB) {
ctx := tx.Statement.Context
userID, ok := tx.Statement.Context.Value(constants.ContextKeyUserID).(uint)
if !ok || tx.Statement.Schema == nil {
return
}
creatorField, hasCreator := tx.Statement.Schema.FieldsByName["Creator"]
updaterField, hasUpdater := tx.Statement.Schema.FieldsByName["Updater"]
if !hasCreator && !hasUpdater {
return
}
rv := tx.Statement.ReflectValue
switch rv.Kind() {
case reflect.Slice, reflect.Array:
for i := 0; i < rv.Len(); i++ {
elem := rv.Index(i)
if elem.Kind() == reflect.Ptr {
elem = elem.Elem()
}
if hasCreator {
_ = creatorField.Set(ctx, elem, userID)
}
if hasUpdater {
_ = updaterField.Set(ctx, elem, userID)
}
}
case reflect.Struct:
if hasCreator {
_ = creatorField.Set(ctx, rv, userID)
}
if hasUpdater {
_ = updaterField.Set(ctx, rv, userID)
}
case reflect.Ptr:
elem := rv.Elem()
if elem.Kind() == reflect.Struct {
if hasCreator {
_ = creatorField.Set(ctx, elem, userID)
}
if hasUpdater {
_ = updaterField.Set(ctx, elem, userID)
}
}
}
})
return err
}