Simplify but Complete Catalog
This commit is contained in:
@@ -9,6 +9,7 @@ package routers
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"oc-catalog/controllers"
|
||||
"oc-catalog/infrastructure"
|
||||
@@ -17,31 +18,51 @@ import (
|
||||
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"
|
||||
)
|
||||
|
||||
// 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, _, 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, w, r)
|
||||
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/",
|
||||
ns := beego.NewNamespace("/oc",
|
||||
beego.NSNamespace("/generic",
|
||||
beego.NSInclude(
|
||||
&controllers.GeneralController{},
|
||||
@@ -57,31 +78,6 @@ func init() {
|
||||
&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{},
|
||||
@@ -94,12 +90,7 @@ func init() {
|
||||
),
|
||||
)
|
||||
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()))
|
||||
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.
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user