From 329fac415f7b4ba13eac1d2675f13d727451a053 Mon Sep 17 00:00:00 2001 From: LandaMm Date: Wed, 25 Jun 2025 11:54:45 +0200 Subject: [PATCH] feat: get all roles endpoint --- internal/admin/roles.go | 61 ++++++++++++++++++++++++++++++++++++++++ internal/admin/routes.go | 2 ++ 2 files changed, 63 insertions(+) create mode 100644 internal/admin/roles.go diff --git a/internal/admin/roles.go b/internal/admin/roles.go new file mode 100644 index 0000000..6db3f1f --- /dev/null +++ b/internal/admin/roles.go @@ -0,0 +1,61 @@ +package admin + +import ( + "encoding/json" + "log" + "net/http" + + "gitea.local/admin/hspguard/internal/repository" + "gitea.local/admin/hspguard/internal/web" +) + +func (h *AdminHandler) GetAllRoles(w http.ResponseWriter, r *http.Request) { + rows, err := h.repo.GetRolesGroupedWithPermissions(r.Context()) + if err != nil { + log.Println("ERR: Failed to list roles from db:", err) + web.Error(w, "failed to get all roles", http.StatusInternalServerError) + return + } + + type RolePermissions struct { + Permissions []repository.Permission `json:"permissions"` + repository.Role + } + + type RowDTO struct { + Scope string `json:"scope"` + Roles []RolePermissions `json:"roles"` + } + + if len(rows) == 0 { + rows = make([]repository.GetRolesGroupedWithPermissionsRow, 0) + } + + var mapped []RowDTO + + for _, row := range rows { + var mappedRow RowDTO + + mappedRow.Scope = row.Scope + + if err := json.Unmarshal(row.Roles, &mappedRow.Roles); err != nil { + log.Println("ERR: Failed to extract roles from byte array:", err) + web.Error(w, "failed to get roles", http.StatusInternalServerError) + return + } + + mapped = append(mapped, mappedRow) + } + + if len(mapped) == 0 { + mapped = make([]RowDTO, 0) + } + + encoder := json.NewEncoder(w) + + w.Header().Set("Content-Type", "application/json") + + if err := encoder.Encode(mapped); err != nil { + web.Error(w, "failed to encode response", http.StatusInternalServerError) + } +} diff --git a/internal/admin/routes.go b/internal/admin/routes.go index d8fa557..7fd71c3 100644 --- a/internal/admin/routes.go +++ b/internal/admin/routes.go @@ -44,6 +44,8 @@ func (h *AdminHandler) RegisterRoutes(router chi.Router) { r.Get("/permissions", h.GetAllPermissions) r.Get("/permissions/{user_id}", h.GetUserPermissions) + + r.Get("/roles", h.GetAllRoles) }) router.Get("/api-services/client/{client_id}", h.GetApiServiceCID)