package middleware import ( "errors" "strconv" "github.com/gin-gonic/gin" "github.com/wmms/wmms/internal/service" "github.com/wmms/wmms/pkg/response" ) const OrganizationIDKey = "organization_id" func OrganizationMiddleware() gin.HandlerFunc { svc := service.NewOrganizationAccessService() return func(c *gin.Context) { value := c.GetHeader("X-Organization-ID") id, err := strconv.ParseInt(value, 10, 64) valid := value != "" && err == nil && id > 0 for _, ch := range value { if ch < '0' || ch > '9' { valid = false } } if !valid { response.BadRequest(c, "请选择有效的公司(X-Organization-ID 必须为正整数)") c.Abort() return } if err := svc.Validate(GetCurrentUserID(c), id); err != nil { if errors.Is(err, service.ErrOrganizationInaccessible) { response.Forbidden(c, err.Error()) } else { response.InternalError(c, "公司访问校验失败") } c.Abort() return } c.Set(OrganizationIDKey, id) c.Next() } } func GetCurrentOrganizationID(c *gin.Context) int64 { id, _ := c.Get(OrganizationIDKey) value, _ := id.(int64) return value }