package controllers import ( "encoding/json" "slices" oclib "cloud.o-forge.io/core/oc-lib" beego "github.com/beego/beego/v2/server/web" "cloud.o-forge.io/core/oc-lib/models/allowed_image" ) // AllowedImageController gère la liste locale des images autorisées à persister // sur ce peer après l'exécution d'un workflow. // // GET /allowed-image/ → tous les utilisateurs authentifiés // GET /allowed-image/:id → tous les utilisateurs authentifiés // POST /allowed-image/ → peer admin uniquement // DELETE /allowed-image/:id → peer admin uniquement (bloqué si IsDefault) type AllowedImageController struct { beego.Controller } // isAdmin vérifie que l'appelant est peer admin (groupe "admin" dans le token JWT). func isAdmin(groups []string) bool { return slices.Contains(groups, "admin") } // @Title GetAll // @Description Retourne toutes les images autorisées à persister sur ce peer // @Success 200 {object} []allowed_image.AllowedImage // @router / [get] func (o *AllowedImageController) GetAll() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) res := oclib.NewRequest(oclib.LibDataEnum(oclib.ALLOWED_IMAGE), user, peerID, groups, nil).LoadAll(false) o.Data["json"] = res o.ServeJSON() } // @Title Get // @Description Retourne une image autorisée par son ID // @Param id path string true "ID de l'image autorisée" // @Success 200 {object} allowed_image.AllowedImage // @router /:id [get] func (o *AllowedImageController) Get() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) id := o.Ctx.Input.Param(":id") res := oclib.NewRequest(oclib.LibDataEnum(oclib.ALLOWED_IMAGE), user, peerID, groups, nil).LoadOne(id) o.Data["json"] = res o.ServeJSON() } // @Title Post // @Description Ajoute une image à la liste des images autorisées (peer admin uniquement) // @Param body body allowed_image.AllowedImage true "Image à autoriser" // @Success 200 {object} allowed_image.AllowedImage // @router / [post] func (o *AllowedImageController) Post() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) if !isAdmin(groups) { o.Ctx.Output.SetStatus(403) o.Data["json"] = map[string]string{"err": "peer admin required"} o.ServeJSON() return } var img allowed_image.AllowedImage if err := json.Unmarshal(o.Ctx.Input.RequestBody, &img); err != nil { o.Ctx.Output.SetStatus(400) o.Data["json"] = map[string]string{"err": err.Error()} o.ServeJSON() return } img.IsDefault = false // l'opérateur ne peut pas créer d'entrées bootstrap via API res := oclib.NewRequest(oclib.LibDataEnum(oclib.ALLOWED_IMAGE), user, peerID, groups, nil).StoreOne(img.Serialize(&img)) o.Data["json"] = res o.ServeJSON() } // @Title Delete // @Description Supprime une image de la liste des images autorisées (peer admin uniquement, entrées bootstrap non supprimables) // @Param id path string true "ID de l'image autorisée" // @Success 200 {object} allowed_image.AllowedImage // @router /:id [delete] func (o *AllowedImageController) Delete() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) if !isAdmin(groups) { o.Ctx.Output.SetStatus(403) o.Data["json"] = map[string]string{"err": "peer admin required"} o.ServeJSON() return } id := o.Ctx.Input.Param(":id") res := oclib.NewRequest(oclib.LibDataEnum(oclib.ALLOWED_IMAGE), user, peerID, groups, nil).DeleteOne(id) o.Data["json"] = res o.ServeJSON() }