package middleware import ( "context" "github.com/break/junhong_cmp_fiber/internal/model" "github.com/break/junhong_cmp_fiber/pkg/constants" "github.com/break/junhong_cmp_fiber/pkg/errors" ) // ShopStoreInterface 店铺存储接口 // 用于权限检查时查询店铺信息和下级店铺ID type ShopStoreInterface interface { GetByID(ctx context.Context, id uint) (*model.Shop, error) GetSubordinateShopIDs(ctx context.Context, shopID uint) ([]uint, error) } // EnterpriseStoreInterface 企业存储接口 // 用于权限检查时查询企业信息 type EnterpriseStoreInterface interface { GetByID(ctx context.Context, id uint) (*model.Enterprise, error) } // CanManageShop 检查当前用户是否有权管理目标店铺的账号 // 超级管理员和平台用户自动通过 // 代理账号只能管理自己店铺及下级店铺的账号 // 企业账号禁止管理店铺账号 func CanManageShop(ctx context.Context, targetShopID uint, shopStore ShopStoreInterface) error { userType := GetUserTypeFromContext(ctx) // 超级管理员和平台用户跳过权限检查 if userType == constants.UserTypeSuperAdmin || userType == constants.UserTypePlatform { return nil } // 企业账号禁止管理店铺账号 if userType != constants.UserTypeAgent { return errors.New(errors.CodeForbidden, "无权限管理店铺账号") } // 获取当前代理账号的店铺ID currentShopID := GetShopIDFromContext(ctx) if currentShopID == 0 { return errors.New(errors.CodeForbidden, "无权限管理店铺账号") } // 递归查询下级店铺ID(包含自己) subordinateIDs, err := shopStore.GetSubordinateShopIDs(ctx, currentShopID) if err != nil { return errors.Wrap(errors.CodeInternalError, err, "查询下级店铺失败") } // 检查目标店铺是否在下级列表中 for _, id := range subordinateIDs { if id == targetShopID { return nil } } return errors.New(errors.CodeForbidden, "无权限管理该店铺的账号") } // CanManageEnterprise 检查当前用户是否有权管理目标企业的账号 // 超级管理员和平台用户自动通过 // 代理账号只能管理归属于自己店铺或下级店铺的企业账号 // 企业账号禁止管理其他企业账号 func CanManageEnterprise(ctx context.Context, targetEnterpriseID uint, enterpriseStore EnterpriseStoreInterface, shopStore ShopStoreInterface) error { userType := GetUserTypeFromContext(ctx) // 超级管理员和平台用户跳过权限检查 if userType == constants.UserTypeSuperAdmin || userType == constants.UserTypePlatform { return nil } // 企业账号禁止管理其他企业账号 if userType != constants.UserTypeAgent { return errors.New(errors.CodeForbidden, "无权限管理企业账号") } // 获取目标企业信息 enterprise, err := enterpriseStore.GetByID(ctx, targetEnterpriseID) if err != nil { return errors.Wrap(errors.CodeForbidden, err, "无权限操作该资源或资源不存在") } // 代理账号不能管理平台级企业(owner_shop_id为NULL) if enterprise.OwnerShopID == nil { return errors.New(errors.CodeForbidden, "无权限管理平台级企业账号") } // 获取当前代理账号的店铺ID currentShopID := GetShopIDFromContext(ctx) if currentShopID == 0 { return errors.New(errors.CodeForbidden, "无权限管理企业账号") } // 递归查询下级店铺ID(包含自己) subordinateIDs, err := shopStore.GetSubordinateShopIDs(ctx, currentShopID) if err != nil { return errors.Wrap(errors.CodeInternalError, err, "查询下级店铺失败") } // 检查企业归属的店铺是否在下级列表中 for _, id := range subordinateIDs { if id == *enterprise.OwnerShopID { return nil } } return errors.New(errors.CodeForbidden, "无权限管理该企业的账号") }