package middleware import ( "allapp/db" "allapp/db/repo" "allapp/utils/errorx" "allapp/utils/redisx" "allapp/utils/responsex" "strconv" "strings" "github.com/gofiber/fiber/v3" ) const CtxSpaceIDKey = "space_id" func SpaceGuard() fiber.Handler { return func(c fiber.Ctx) error { userID, err := GetUserID(c) if err != nil { return err } spaceIDStr := strings.TrimSpace(c.Get("SPACE_ID")) spaceID, err := strconv.ParseInt(spaceIDStr, 10, 64) if err != nil || spaceID <= 0 { return responsex.SpaceError(c, "请选择空间") } // 校验 inSpace, err := redisx.SpaceIsMember(spaceID, userID) if inSpace { return c.Next() } // 检验空间是否存在 space, err := db.Queries.GetSpaceById(c.Context(), spaceID) if err != nil { if errorx.IsNotFound(err) { // 未找到 return responsex.SpaceError(c, "空间已失效") } return err } // 空间有效,判断是否在该空间内 role, err := db.Queries.GetUserSpaceRole(c.Context(), repo.GetUserSpaceRoleParams{ SpaceID: spaceID, UserID: spaceID, }) if err != nil { if errorx.IsNotFound(err) { } } } }