// @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" "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" ) // wsSearchHandler retourne un http.HandlerFunc qui émet un message NATS puis ouvre la connexion WS. // dataType == -1 signifie toutes les ressources (ResourceController). func wsSearchHandler(dataType int) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { parts := strings.Split(strings.TrimSuffix(r.URL.Path, "/"), "/") search := parts[len(parts)-1] t := "" if len(parts) >= 3 { t = parts[len(parts)-3] } user, _, _ := oclib.ExtractTokenInfo(*r) b, _ := json.Marshal(map[string]string{"search": search, "type": t}) infrastructure.EmitNATS(user, tools.PropalgationMessage{ Action: tools.PB_SEARCH, DataType: dataType, Payload: b, }) controllers.Websocket(user, w, r) } } 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("/data", beego.NSInclude( &controllers.DataController{}, ), ), beego.NSNamespace("/compute", beego.NSInclude( &controllers.ComputeController{}, ), ), beego.NSNamespace("/storage", beego.NSInclude( &controllers.StorageController{}, ), ), beego.NSNamespace("/processing", beego.NSInclude( &controllers.ProcessingController{}, ), ), beego.NSNamespace("/workflow", beego.NSInclude( &controllers.WorkflowController{}, ), ), beego.NSNamespace("/enum", beego.NSInclude( &controllers.EnumController{}, ), ), beego.NSNamespace("/version", beego.NSInclude( &controllers.VersionController{}, ), ), ) beego.AddNamespace(ns) // Routes WebSocket hors du pipeline Beego (évite le WriteHeader parasite) beego.Handler("/oc/resource/decentralized/:type/search/:search", wsSearchHandler(-1)) beego.Handler("/oc/compute/decentralized/:type/search/:search", wsSearchHandler(tools.COMPUTE_RESOURCE.EnumIndex())) beego.Handler("/oc/data/decentralized/:type/search/:search", wsSearchHandler(tools.DATA_RESOURCE.EnumIndex())) beego.Handler("/oc/processing/decentralized/:type/search/:search", wsSearchHandler(tools.PROCESSING_RESOURCE.EnumIndex())) beego.Handler("/oc/storage/decentralized/:type/search/:search", wsSearchHandler(tools.STORAGE_RESOURCE.EnumIndex())) beego.Handler("/oc/workflow/decentralized/:type/search/:search", wsSearchHandler(tools.WORKFLOW_RESOURCE.EnumIndex())) }