49 lines
1.1 KiB
Go
49 lines
1.1 KiB
Go
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
|
||
}
|