ultisuite-backend/internal/api/users/handlers.go
2026-06-07 21:55:22 +02:00

60 lines
1.5 KiB
Go

package users
import (
"log/slog"
"net/http"
"github.com/go-chi/chi/v5"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/ultisuite/ulti-backend/internal/api/apiresponse"
"github.com/ultisuite/ulti-backend/internal/api/apivalidate"
"github.com/ultisuite/ulti-backend/internal/api/middleware"
"github.com/ultisuite/ulti-backend/internal/permission"
platformusers "github.com/ultisuite/ulti-backend/internal/users"
)
type Handler struct {
db *pgxpool.Pool
logger *slog.Logger
}
func NewHandler(db *pgxpool.Pool) *Handler {
return &Handler{
db: db,
logger: slog.Default().With("component", "users-api"),
}
}
func (h *Handler) Routes() chi.Router {
r := chi.NewRouter()
r.Get("/me", h.Me)
return r
}
func (h *Handler) Me(w http.ResponseWriter, r *http.Request) {
claims := middleware.ClaimsFromContext(r.Context())
if claims == nil {
apiresponse.WriteError(w, r, http.StatusUnauthorized, apiresponse.CodeAuthUnauthorized, "unauthorized", nil)
return
}
state, err := platformusers.GetAccountState(r.Context(), h.db, claims.Sub)
if err != nil {
h.logger.Error("read account state", "error", err)
apivalidate.WriteInternal(w, r)
return
}
role := permission.DeriveAccountRole(state.PlatformAdmin, state.Status)
apiresponse.WriteJSON(w, http.StatusOK, map[string]any{
"sub": claims.Sub,
"email": claims.Email,
"name": claims.Name,
"status": state.Status,
"platform_admin": state.PlatformAdmin,
"role": role,
"groups": claims.Groups,
})
}