- Rename Go module switchboard-core → armature (155+ files) - Rename Docker image → gobha/armature - Rename K8s resources, secrets, deployments - Rename Prometheus metrics switchboard_* → armature_* - Rename env vars SWITCHBOARD_ADMIN_* → ARMATURE_ADMIN_* - Rename DB names switchboard_core* → armature* - Update all frontend branding, notification templates, docs - Update CI scripts, e2e tests, Keycloak realm, nginx conf - Rename scripts/switchboard-ca.sh → scripts/armature-ca.sh - Rename k8s/switchboard.yaml → k8s/armature.yaml - Rename chart alerting/dashboard files - Fix: DockerHub push uses env: binding for secret injection - Helm chart updated (name, labels, template functions, dashboard, alerting) - Replace favicon/icon assets with Armature brand No functional changes. Pure mechanical rename + CI fix. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
"sort"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"armature/auth"
|
|
"armature/store"
|
|
)
|
|
|
|
// ProfilePermissionsHandler exposes the current user's resolved permissions.
|
|
type ProfilePermissionsHandler struct {
|
|
stores store.Stores
|
|
}
|
|
|
|
func NewProfilePermissionsHandler(s store.Stores) *ProfilePermissionsHandler {
|
|
return &ProfilePermissionsHandler{stores: s}
|
|
}
|
|
|
|
// GetMyPermissions returns the current user's effective permission set.
|
|
// GET /api/v1/profile/permissions
|
|
func (h *ProfilePermissionsHandler) GetMyPermissions(c *gin.Context) {
|
|
userID := getUserID(c)
|
|
role, _ := c.Get("role")
|
|
ctx := c.Request.Context()
|
|
|
|
// Admin gets all permissions by definition.
|
|
var list []string
|
|
if role == "admin" {
|
|
list = make([]string, len(auth.AllPermissions))
|
|
copy(list, auth.AllPermissions)
|
|
} else {
|
|
perms, err := auth.ResolvePermissions(ctx, h.stores, userID)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to resolve permissions"})
|
|
return
|
|
}
|
|
list = make([]string, 0, len(perms))
|
|
for p := range perms {
|
|
list = append(list, p)
|
|
}
|
|
}
|
|
sort.Strings(list)
|
|
|
|
// Contributing groups
|
|
groupIDs, _ := h.stores.Groups.GetUserGroupIDs(ctx, userID)
|
|
if groupIDs == nil {
|
|
groupIDs = []string{}
|
|
}
|
|
groupIDs = append(groupIDs, auth.EveryoneGroupID)
|
|
|
|
// Teams
|
|
teams, _ := h.stores.Teams.ListForUser(ctx, userID)
|
|
teamData := make([]gin.H, 0, len(teams))
|
|
for _, t := range teams {
|
|
teamData = append(teamData, gin.H{
|
|
"id": t.ID,
|
|
"name": t.Name,
|
|
"my_role": t.MyRole,
|
|
})
|
|
}
|
|
|
|
// Policies that affect UI gating
|
|
policies := make(map[string]bool)
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"permissions": list,
|
|
"groups": groupIDs,
|
|
"teams": teamData,
|
|
"policies": policies,
|
|
})
|
|
}
|