2024-07-26 13:07:25 +02:00
|
|
|
// @APIVersion 1.0.0
|
2024-09-05 09:22:06 +02:00
|
|
|
// @Title oc-catalog
|
|
|
|
|
// @Description OpenCloud catalog
|
|
|
|
|
// @Contact admin@o-cloud.io
|
|
|
|
|
// @TermsOfServiceUrl http://cloud.o-forge.io/
|
2024-10-03 09:39:40 +02:00
|
|
|
// @License AGPL
|
|
|
|
|
// @LicenseUrl https://www.gnu.org/licenses/agpl-3.0.html
|
2024-07-26 13:07:25 +02:00
|
|
|
package routers
|
|
|
|
|
|
|
|
|
|
import (
|
2026-03-05 13:58:47 +01:00
|
|
|
"encoding/json"
|
2026-04-01 15:56:05 +02:00
|
|
|
"fmt"
|
2026-03-05 13:58:47 +01:00
|
|
|
"net/http"
|
2024-07-26 13:07:25 +02:00
|
|
|
"oc-catalog/controllers"
|
2026-03-05 13:58:47 +01:00
|
|
|
"oc-catalog/infrastructure"
|
|
|
|
|
"strings"
|
2024-07-26 13:07:25 +02:00
|
|
|
|
2026-03-05 13:58:47 +01:00
|
|
|
oclib "cloud.o-forge.io/core/oc-lib"
|
|
|
|
|
"cloud.o-forge.io/core/oc-lib/tools"
|
2024-07-26 13:07:25 +02:00
|
|
|
beego "github.com/beego/beego/v2/server/web"
|
2026-04-01 15:56:05 +02:00
|
|
|
"github.com/gorilla/websocket"
|
2024-07-26 13:07:25 +02:00
|
|
|
)
|
|
|
|
|
|
2026-04-01 15:56:05 +02:00
|
|
|
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]
|
2026-03-05 13:58:47 +01:00
|
|
|
}
|
2026-04-01 15:56:05 +02:00
|
|
|
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)
|
2026-03-05 13:58:47 +01:00
|
|
|
}
|
|
|
|
|
|
2024-07-26 13:07:25 +02:00
|
|
|
func init() {
|
2026-04-01 15:56:05 +02:00
|
|
|
ns := beego.NewNamespace("/oc",
|
2026-01-12 14:37:37 +01:00
|
|
|
beego.NSNamespace("/generic",
|
|
|
|
|
beego.NSInclude(
|
|
|
|
|
&controllers.GeneralController{},
|
|
|
|
|
),
|
|
|
|
|
),
|
2025-06-24 09:13:29 +02:00
|
|
|
beego.NSNamespace("/purchase",
|
|
|
|
|
beego.NSInclude(
|
|
|
|
|
&controllers.PurchaseController{},
|
|
|
|
|
),
|
|
|
|
|
),
|
2024-07-26 14:39:57 +02:00
|
|
|
beego.NSNamespace("/resource",
|
|
|
|
|
beego.NSInclude(
|
|
|
|
|
&controllers.ResourceController{},
|
|
|
|
|
),
|
|
|
|
|
),
|
2025-01-17 17:03:32 +01:00
|
|
|
beego.NSNamespace("/enum",
|
|
|
|
|
beego.NSInclude(
|
|
|
|
|
&controllers.EnumController{},
|
|
|
|
|
),
|
|
|
|
|
),
|
2024-07-26 13:07:25 +02:00
|
|
|
beego.NSNamespace("/version",
|
|
|
|
|
beego.NSInclude(
|
|
|
|
|
&controllers.VersionController{},
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
beego.AddNamespace(ns)
|
2026-04-01 15:56:05 +02:00
|
|
|
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.
|
2024-07-26 13:07:25 +02:00
|
|
|
}
|