97 lines
3.4 KiB
Go
97 lines
3.4 KiB
Go
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()
|
|
}
|