// @APIVersion 1.0.0 // @Title oc-catalog // @Description OpenCloud catalog // @Contact admin@o-cloud.io // @TermsOfServiceUrl http://cloud.o-forge.io/ // @License AGPL // @LicenseUrl https://www.gnu.org/licenses/agpl-3.0.html package routers import ( "encoding/json" "fmt" "net/http" "oc-catalog/controllers" "oc-catalog/infrastructure" "strings" oclib "cloud.o-forge.io/core/oc-lib" "cloud.o-forge.io/core/oc-lib/tools" beego "github.com/beego/beego/v2/server/web" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } // wsTypedSearchHandler retourne un HandlerFunc WebSocket qui résout le DataType // depuis le segment :type de l'URL (compute, data, storage, processing, workflow). // dataType == -1 signifie toutes les ressources. func TypedSearchHandler(w http.ResponseWriter, r *http.Request) { fmt.Println("wsTypedSearchHandler") conn, err := upgrader.Upgrade(w, r, nil) if err != nil { return } parts := strings.Split(strings.TrimSuffix(r.URL.Path, "/"), "/") search := parts[len(parts)-1] dt := "resource" t := "partner" if len(parts) >= 3 { dt = parts[len(parts)-3] } if len(parts) >= 4 { t = parts[len(parts)-4] } // Résout le DataType depuis le slug de type (ex: "compute" → COMPUTE_RESOURCE) dataType := tools.FromString(strings.ToLower(dt) + "_resource") if dataType <= 0 { dataType = -1 } user, _, groups := oclib.ExtractTokenInfo(*r) b, _ := json.Marshal(map[string]string{"search": search, "type": t}) infrastructure.EmitNATS(user, groups, tools.PropalgationMessage{ Action: tools.PB_SEARCH, DataType: dataType, Payload: b, }) controllers.Websocket(r.Context(), user, groups, dataType, conn) } func init() { ns := beego.NewNamespace("/oc", beego.NSNamespace("/generic", beego.NSInclude( &controllers.GeneralController{}, ), ), beego.NSNamespace("/purchase", beego.NSInclude( &controllers.PurchaseController{}, ), ), beego.NSNamespace("/resource", beego.NSInclude( &controllers.ResourceController{}, ), ), beego.NSNamespace("/enum", beego.NSInclude( &controllers.EnumController{}, ), ), beego.NSNamespace("/version", beego.NSInclude( &controllers.VersionController{}, ), ), ) beego.AddNamespace(ns) beego.Handler("/oc/decentralized/:type/:datatype/search/:search", http.HandlerFunc(TypedSearchHandler)) // Route WebSocket décentralisée unique — le handler résout le type depuis l'URL. // Hors pipeline Beego pour éviter le WriteHeader parasite. }