All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m2s
- 移除 RegisterDataPermissionCallback 和 SkipDataPermission 机制 - 在 Auth 中间件预计算 SubordinateShopIDs 并注入 Context - 新增 ApplyShopFilter/ApplyEnterpriseFilter/ApplyOwnerShopFilter 等 Helper 函数 - 所有 Store 层查询方法显式调用数据权限过滤函数 - 权限检查函数 CanManageShop/CanManageEnterprise 改为从 Context 获取数据 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
61 lines
1.5 KiB
Go
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
|
|
}
|