2026-01-02 00:22:08 +00:00
|
|
|
package organization
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"errors"
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"github.com/get-drexa/drexa/internal/account"
|
|
|
|
|
"github.com/get-drexa/drexa/internal/httperr"
|
|
|
|
|
"github.com/get-drexa/drexa/internal/reqctx"
|
|
|
|
|
"github.com/get-drexa/drexa/internal/user"
|
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
|
"github.com/uptrace/bun"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func NewMiddleware(orgService *Service, accountService *account.Service, db *bun.DB) fiber.Handler {
|
|
|
|
|
return func(c *fiber.Ctx) error {
|
|
|
|
|
slug := strings.ToLower(c.Params("orgSlug"))
|
|
|
|
|
if slug == "" {
|
|
|
|
|
return c.SendStatus(fiber.StatusNotFound)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u, _ := reqctx.AuthenticatedUser(c).(*user.User)
|
|
|
|
|
if u == nil {
|
|
|
|
|
return c.SendStatus(fiber.StatusUnauthorized)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var org *Organization
|
|
|
|
|
var err error
|
|
|
|
|
|
2026-01-02 15:57:35 +00:00
|
|
|
if slug == ReservedSlug {
|
2026-01-02 00:22:08 +00:00
|
|
|
org, err = orgService.PersonalOrganizationForUser(c.Context(), db, u.ID)
|
|
|
|
|
} else {
|
|
|
|
|
org, err = orgService.OrganizationBySlug(c.Context(), db, slug)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
if errors.Is(err, ErrOrganizationNotFound) {
|
|
|
|
|
return c.SendStatus(fiber.StatusNotFound)
|
|
|
|
|
}
|
|
|
|
|
return httperr.Internal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
acc, err := accountService.FindUserAccountInOrg(c.Context(), db, org.ID, u.ID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
if errors.Is(err, account.ErrAccountNotFound) {
|
|
|
|
|
return c.SendStatus(fiber.StatusNotFound)
|
|
|
|
|
}
|
|
|
|
|
return httperr.Internal(err)
|
|
|
|
|
}
|
|
|
|
|
if acc.Status != account.StatusActive {
|
|
|
|
|
return c.SendStatus(fiber.StatusNotFound)
|
|
|
|
|
}
|
|
|
|
|
reqctx.SetCurrentAccount(c, acc)
|
|
|
|
|
|
|
|
|
|
reqctx.SetCurrentOrganization(c, org)
|
|
|
|
|
|
|
|
|
|
return c.Next()
|
|
|
|
|
}
|
|
|
|
|
}
|