feat: add details demo
ci-api / test (push) Has been cancelled

This commit is contained in:
Nuxgrid
2026-07-28 14:44:48 +02:00
parent 65ca24b6eb
commit 4b3a5720a3
8 changed files with 143 additions and 38 deletions
+41 -7
View File
@@ -9,7 +9,10 @@ import (
"github.com/omnex/control-plane/api/internal/auth"
)
type Handler struct{ svc *Service }
type Handler struct {
svc *Service
helm *HelmProvisioner // interface déjà implémentée par HelmProvisioner
}
func NewHandler(svc *Service) *Handler { return &Handler{svc: svc} }
@@ -18,6 +21,16 @@ type createRequest struct {
Username string `json:"username" binding:"omitempty,min=3,max=64,alphanum"`
}
type DetailDemoUserRequest struct {
Username string `json:"username" binding:"required,min=3,max=64,alphanum"`
}
type DemoDetailsResponse struct {
Username string `json:"username"`
Namespace string `json:"namespace"`
State ResourceState `json:"state"`
}
// Create : POST /demos — provisionne une démo (202 Accepted, worker asynchrone).
func (h *Handler) Create(c *gin.Context) {
var req createRequest
@@ -47,19 +60,40 @@ func (h *Handler) List(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"items": items})
}
// ListMine : GET /demos/mine — démos rattachées au client authentifié.
func (h *Handler) ListMine(c *gin.Context) {
func (h *Handler) ListDetails(c *gin.Context) {
p := auth.PrincipalFrom(c)
if p == nil {
c.JSON(http.StatusUnauthorized, gin.H{"error": "non authentifié"})
return
}
items, err := h.svc.ListForUser(p.Username)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "erreur serveur"})
if p.Role != "admin" {
c.JSON(http.StatusForbidden, gin.H{"error": "vous n'avez pas les droits"})
return
}
c.JSON(http.StatusOK, gin.H{"items": items})
var req DetailDemoUserRequest
if err := c.ShouldBindJSON(&req); err != nil || req.Username == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "username requis"})
return
}
demo, err := h.svc.store.GetDemoByUsername(req.Username)
if err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "démo introuvable"})
return
}
state, err := h.helm.GetResourceState(c.Request.Context(), demo.Namespace)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "impossible de récupérer l'état des ressources"})
return
}
c.JSON(http.StatusOK, DemoDetailsResponse{
Username: req.Username,
Namespace: demo.Namespace,
State: state,
})
}
// Get : GET /demos/:id.