From d8e3ca4c4735b46375202a7143758fb83c3e3d8d Mon Sep 17 00:00:00 2001 From: mr Date: Thu, 5 Mar 2026 13:58:47 +0100 Subject: [PATCH] distributed research fully operationnal --- controllers/compute.go | 39 ++------------ controllers/data.go | 31 ----------- controllers/general.go | 10 ++-- controllers/processing.go | 41 +++------------ controllers/resource.go | 34 ------------ controllers/storage.go | 31 ----------- controllers/workflow.go | 31 ----------- go.mod | 50 ++++++++++++++---- go.sum | 108 ++++++++++++++++++++++++++++++++++++++ infrastructure/nats.go | 2 + routers/commentsRouter.go | 54 ------------------- routers/router.go | 35 ++++++++++++ ws.go | 106 +++++++++++++++++++++++++++++++++++++ 13 files changed, 305 insertions(+), 267 deletions(-) create mode 100644 ws.go diff --git a/controllers/compute.go b/controllers/compute.go index ed88042..a69f01d 100755 --- a/controllers/compute.go +++ b/controllers/compute.go @@ -24,12 +24,12 @@ var comp_dt = tools.COMPUTE_RESOURCE // @Success 200 {compute} models.compute // @router /:id [put] func (o *ComputeController) Put() { - user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) + user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) // store and return Id or post with UUID var res map[string]interface{} id := o.Ctx.Input.Param(":id") json.Unmarshal(o.Ctx.Input.CopyBody(10000), &res) - data := oclib.NewRequest(comp_collection, user, peerID, groups, nil).UpdateOne(res, id) + data := oclib.NewRequestAdmin(comp_collection, nil).UpdateOne(res, id) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) infrastructure.EmitNATS(user, tools.PropalgationMessage{ @@ -96,9 +96,9 @@ func (o *ComputeController) Search() { // @Success 200 {compute} models.compute // @router /:id [get] func (o *ComputeController) Get() { - user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) + // user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) id := o.Ctx.Input.Param(":id") - o.Data["json"] = oclib.NewRequest(comp_collection, user, peerID, groups, nil).LoadOne(id) + o.Data["json"] = oclib.NewRequestAdmin(comp_collection, nil).LoadOne(id) o.ServeJSON() } @@ -122,34 +122,3 @@ func (o *ComputeController) Delete() { o.Data["json"] = oclib.NewRequest(comp_collection, user, peerID, groups, nil).DeleteOne(id) o.ServeJSON() } - -// @Title Search Decentralized -// @Description find workflow by key word -// @Param search path string true "the search you want to get" -// @Param is_draft query string false "draft wished" -// @Success 200 {workflow} models.workflow -// @router /decentralized/:type/search/:search[get] -func (o *ComputeController) SearchDecentralized() { - user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) - search := o.Ctx.Input.Param(":search") - t := o.Ctx.Input.Param(":type") - b, err := json.Marshal(map[string]string{ - "search": search, - "type": t, - }) - infrastructure.EmitNATS(user, tools.PropalgationMessage{ - Action: tools.PB_SEARCH, - DataType: comp_dt.EnumIndex(), - Payload: b, - }) - if err != nil { - o.Data["json"] = map[string]interface{}{ - "data": nil, - "code": 400, - "error": err, - } - o.ServeJSON() - return - } - Websocket(o.Ctx.Request.Context(), user, o.Ctx.ResponseWriter, o.Ctx.Request) -} diff --git a/controllers/data.go b/controllers/data.go index cd46f90..e5312a3 100755 --- a/controllers/data.go +++ b/controllers/data.go @@ -123,34 +123,3 @@ func (o *DataController) Delete() { o.Data["json"] = data o.ServeJSON() } - -// @Title Search Decentralized -// @Description find workflow by key word -// @Param search path string true "the search you want to get" -// @Param is_draft query string false "draft wished" -// @Success 200 {workflow} models.workflow -// @router /decentralized/:type/search/:search[get] -func (o *DataController) SearchDecentralized() { - user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) - search := o.Ctx.Input.Param(":search") - t := o.Ctx.Input.Param(":type") - b, err := json.Marshal(map[string]string{ - "search": search, - "type": t, - }) - infrastructure.EmitNATS(user, tools.PropalgationMessage{ - Action: tools.PB_SEARCH, - DataType: data_dt.EnumIndex(), - Payload: b, - }) - if err != nil { - o.Data["json"] = map[string]interface{}{ - "data": nil, - "code": 400, - "error": err, - } - o.ServeJSON() - return - } - Websocket(o.Ctx.Request.Context(), user, o.Ctx.ResponseWriter, o.Ctx.Request) -} diff --git a/controllers/general.go b/controllers/general.go index f05002d..ac8cdd6 100755 --- a/controllers/general.go +++ b/controllers/general.go @@ -1,7 +1,6 @@ package controllers import ( - cx "context" "net/http" "oc-catalog/infrastructure" @@ -9,7 +8,6 @@ import ( w "cloud.o-forge.io/core/oc-lib/models/workflow" tools "cloud.o-forge.io/core/oc-lib/tools" beego "github.com/beego/beego/v2/server/web" - "github.com/beego/beego/v2/server/web/context" "golang.org/x/net/websocket" ) @@ -62,13 +60,13 @@ func (o *GeneralController) GetAll() { o.ServeJSON() } -func Websocket(ctx cx.Context, user string, r *context.Response, w *http.Request) { +func Websocket(user string, w http.ResponseWriter, r *http.Request) { websocket.Handler(func(ws *websocket.Conn) { defer ws.Close() - for { - if msg, ok := <-infrastructure.SearchStream[user]; !ok || websocket.Message.Send(ws, msg) != nil { + for msg := range infrastructure.SearchStream[user] { + if websocket.JSON.Send(ws, msg) != nil { return } } - }).ServeHTTP(r, w) + }).ServeHTTP(w, r) } diff --git a/controllers/processing.go b/controllers/processing.go index 6bd48e4..9104f88 100755 --- a/controllers/processing.go +++ b/controllers/processing.go @@ -2,6 +2,7 @@ package controllers import ( "encoding/json" + "fmt" "oc-catalog/infrastructure" oclib "cloud.o-forge.io/core/oc-lib" @@ -25,11 +26,12 @@ var processing_dt = tools.PROCESSING_RESOURCE // @router /:id [put] func (o *ProcessingController) Put() { // store and return Id or post with UUID - user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) + user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) var res map[string]interface{} id := o.Ctx.Input.Param(":id") json.Unmarshal(o.Ctx.Input.CopyBody(10000), &res) - data := oclib.NewRequest(processing_collection, user, peerID, groups, nil).UpdateOne(res, id) + fmt.Println("Sqdqsqsd") + data := oclib.NewRequestAdmin(processing_collection, nil).UpdateOne(res, id) if data.Err == "" { data, _ := json.Marshal(data.Data.Serialize(data.Data)) infrastructure.EmitNATS(user, tools.PropalgationMessage{ @@ -96,9 +98,9 @@ func (o *ProcessingController) Search() { // @Success 200 {processing} models.processing // @router /:id [get] func (o *ProcessingController) Get() { - user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) + // user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) id := o.Ctx.Input.Param(":id") - o.Data["json"] = oclib.NewRequest(processing_collection, user, peerID, groups, nil).LoadOne(id) + o.Data["json"] = oclib.NewRequestAdmin(processing_collection, nil).LoadOne(id) o.ServeJSON() } @@ -122,34 +124,3 @@ func (o *ProcessingController) Delete() { o.Data["json"] = data o.ServeJSON() } - -// @Title Search Decentralized -// @Description find workflow by key word -// @Param search path string true "the search you want to get" -// @Param is_draft query string false "draft wished" -// @Success 200 {workflow} models.workflow -// @router /decentralized/:type/search/:search[get] -func (o *ProcessingController) SearchDecentralized() { - user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) - search := o.Ctx.Input.Param(":search") - t := o.Ctx.Input.Param(":type") - b, err := json.Marshal(map[string]string{ - "search": search, - "type": t, - }) - infrastructure.EmitNATS(user, tools.PropalgationMessage{ - Action: tools.PB_SEARCH, - DataType: processing_dt.EnumIndex(), - Payload: b, - }) - if err != nil { - o.Data["json"] = map[string]interface{}{ - "data": nil, - "code": 400, - "error": err, - } - o.ServeJSON() - return - } - Websocket(o.Ctx.Request.Context(), user, o.Ctx.ResponseWriter, o.Ctx.Request) -} diff --git a/controllers/resource.go b/controllers/resource.go index a93ee80..330cb3c 100755 --- a/controllers/resource.go +++ b/controllers/resource.go @@ -1,12 +1,9 @@ package controllers import ( - "encoding/json" "fmt" - "oc-catalog/infrastructure" oclib "cloud.o-forge.io/core/oc-lib" - "cloud.o-forge.io/core/oc-lib/tools" beego "github.com/beego/beego/v2/server/web" ) @@ -86,34 +83,3 @@ func (o *ResourceController) Get() { o.Data["json"] = map[string]interface{}{"data": results, "code": 200, "error": ""} o.ServeJSON() } - -// @Title Search Decentralized -// @Description find workflow by key word -// @Param search path string true "the search you want to get" -// @Param is_draft query string false "draft wished" -// @Success 200 {workflow} models.workflow -// @router /decentralized/:type/search/:search [get] -func (o *ResourceController) SearchDecentralized() { - user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) - search := o.Ctx.Input.Param(":search") - t := o.Ctx.Input.Param(":type") - b, err := json.Marshal(map[string]string{ - "search": search, - "type": t, - }) - infrastructure.EmitNATS(user, tools.PropalgationMessage{ - Action: tools.PB_SEARCH, - DataType: -1, - Payload: b, - }) - if err != nil { - o.Data["json"] = map[string]interface{}{ - "data": nil, - "code": 400, - "error": err, - } - o.ServeJSON() - return - } - Websocket(o.Ctx.Request.Context(), user, o.Ctx.ResponseWriter, o.Ctx.Request) -} diff --git a/controllers/storage.go b/controllers/storage.go index ef697f2..749c624 100755 --- a/controllers/storage.go +++ b/controllers/storage.go @@ -122,34 +122,3 @@ func (o *StorageController) Delete() { o.Data["json"] = data o.ServeJSON() } - -// @Title Search Decentralized -// @Description find workflow by key word -// @Param search path string true "the search you want to get" -// @Param is_draft query string false "draft wished" -// @Success 200 {workflow} models.workflow -// @router /decentralized/:type/search/:search[get] -func (o *StorageController) SearchDecentralized() { - user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) - search := o.Ctx.Input.Param(":search") - t := o.Ctx.Input.Param(":type") - b, err := json.Marshal(map[string]string{ - "search": search, - "type": t, - }) - infrastructure.EmitNATS(user, tools.PropalgationMessage{ - Action: tools.PB_SEARCH, - DataType: storage_dt.EnumIndex(), - Payload: b, - }) - if err != nil { - o.Data["json"] = map[string]interface{}{ - "data": nil, - "code": 400, - "error": err, - } - o.ServeJSON() - return - } - Websocket(o.Ctx.Request.Context(), user, o.Ctx.ResponseWriter, o.Ctx.Request) -} diff --git a/controllers/workflow.go b/controllers/workflow.go index 632be39..74acfe3 100755 --- a/controllers/workflow.go +++ b/controllers/workflow.go @@ -90,37 +90,6 @@ func (o *WorkflowController) Search() { o.ServeJSON() } -// @Title Search Decentralized -// @Description find workflow by key word -// @Param search path string true "the search you want to get" -// @Param is_draft query string false "draft wished" -// @Success 200 {workflow} models.workflow -// @router /decentralized/:type/search/:search[get] -func (o *WorkflowController) SearchDecentralized() { - user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) - search := o.Ctx.Input.Param(":search") - t := o.Ctx.Input.Param(":type") - b, err := json.Marshal(map[string]string{ - "search": search, - "type": t, - }) - if err != nil { - o.Data["json"] = map[string]interface{}{ - "data": nil, - "code": 400, - "error": err, - } - o.ServeJSON() - return - } - infrastructure.EmitNATS(user, tools.PropalgationMessage{ - Action: tools.PB_SEARCH, - DataType: workflow_dt.EnumIndex(), - Payload: b, - }) - Websocket(o.Ctx.Request.Context(), user, o.Ctx.ResponseWriter, o.Ctx.Request) -} - // @Title Get // @Description find workflow by id // @Param id path string true "the id you want to get" diff --git a/go.mod b/go.mod index 9047ad4..6a4cf91 100755 --- a/go.mod +++ b/go.mod @@ -1,17 +1,47 @@ module oc-catalog -go 1.24.6 +go 1.25.0 require ( - cloud.o-forge.io/core/oc-lib v0.0.0-20260223083003-28713536358b - github.com/beego/beego/v2 v2.3.4 + cloud.o-forge.io/core/oc-lib v0.0.0-20260304125443-a426bdf655e1 + github.com/beego/beego/v2 v2.3.8 github.com/smartystreets/goconvey v1.7.2 ) require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.2 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/google/gnostic-models v0.7.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/kr/text v0.2.0 // indirect github.com/libp2p/go-libp2p/core v0.43.0-rc2 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/x448/float16 v0.8.4 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/time v0.9.0 // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + k8s.io/api v0.35.1 // indirect + k8s.io/apimachinery v0.35.1 // indirect + k8s.io/client-go v0.35.1 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect + k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect ) require ( @@ -44,7 +74,7 @@ require ( github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.65.0 // indirect github.com/prometheus/procfs v0.17.0 // indirect - github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/rs/zerolog v1.34.0 // indirect github.com/shiena/ansicolor v0.0.0-20230509054315-a9deabde6e02 // indirect github.com/smartystreets/assertions v1.2.0 // indirect @@ -53,11 +83,11 @@ require ( github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect go.mongodb.org/mongo-driver v1.17.4 // indirect - golang.org/x/crypto v0.39.0 // indirect - golang.org/x/net v0.41.0 - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.26.0 // indirect - google.golang.org/protobuf v1.36.6 // indirect + golang.org/x/crypto v0.44.0 // indirect + golang.org/x/net v0.47.0 + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.31.0 // indirect + google.golang.org/protobuf v1.36.8 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 4dc4ee4..ea56206 100755 --- a/go.sum +++ b/go.sum @@ -20,9 +20,33 @@ cloud.o-forge.io/core/oc-lib v0.0.0-20260218132556-0b41e2505e2f h1:OFuJhi23D/UNw cloud.o-forge.io/core/oc-lib v0.0.0-20260218132556-0b41e2505e2f/go.mod h1:jmyBwmsac/4V7XPL347qawF60JsBCDmNAMfn/ySXKYo= cloud.o-forge.io/core/oc-lib v0.0.0-20260223083003-28713536358b h1:Tx8hvmJJvt8BYNQsKGYuyCVnQHG59dfyYGP0+NDNxVs= cloud.o-forge.io/core/oc-lib v0.0.0-20260223083003-28713536358b/go.mod h1:jmyBwmsac/4V7XPL347qawF60JsBCDmNAMfn/ySXKYo= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304111813-f033182382e7 h1:3FYmZpBIEkE0UB+osjEmf98Y+Cr9Z+vGIQi53xgqfLo= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304111813-f033182382e7/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304112254-6217618e6ce2 h1:JivVC15CRYWNvyTpZIB5A9uWuek4FsNyZqZBjqKLUTE= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304112254-6217618e6ce2/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304113411-3e0f369850a9 h1:pIio/xf/0YpvVmgTewVcX1Z/ugaHB/ll/5+Rp3yEkUc= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304113411-3e0f369850a9/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304114006-ae7e297622ed h1:ecX0XrRws+q/Z2D7sKuT3f7rUO+OHWzj3yWWhp3v7rs= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304114006-ae7e297622ed/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304114347-334de8ca2e8f h1:1qD7JxBhVEg4hirvEOEHAcpM/xH2IKT9bL0OwtxOpxQ= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304114347-334de8ca2e8f/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304120253-473dc6266021 h1:zjcexVGP7EnzlFRDH0DDIzuypAIiPo0MGLqwka7vKs4= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304120253-473dc6266021/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304121501-b47b51126a11 h1:e+fNy5MJTnp8Lh4e2HNAtoQvfGVIFmqKbYSOAwUzXa4= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304121501-b47b51126a11/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304123105-f1eaf497aa8a h1:skbfEiMJIlJKOgyvaOwZ8eb+PwcJOD7+WasfN/9IhAc= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304123105-f1eaf497aa8a/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304124314-5d18512f67ec h1:YHyM8+nQ2T82EF2k0eWGqfuaPVFl4vHShc3MBcqJPQ0= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304124314-5d18512f67ec/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304125143-2bfcfb5736b3 h1:MwaSiGPc7N2HXLr/hQm7LIFJIzxJlAYHUbRtooWfSFA= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304125143-2bfcfb5736b3/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304125443-a426bdf655e1 h1:bvVWoPSoxVmLm1l4d/upLHTOkif1hbg5dCnEczgrwew= +cloud.o-forge.io/core/oc-lib v0.0.0-20260304125443-a426bdf655e1/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/beego/beego/v2 v2.3.4 h1:HurQEOGIEhLlPFCTR6ZDuQkybrUl2Ag2i6CdVD2rGiI= github.com/beego/beego/v2 v2.3.4/go.mod h1:5cqHsOHJIxkq44tBpRvtDe59GuVRVv/9/tyVDxd5ce4= +github.com/beego/beego/v2 v2.3.8 h1:wplhB1pF4TxR+2SS4PUej8eDoH4xGfxuHfS7wAk9VBc= +github.com/beego/beego/v2 v2.3.8/go.mod h1:8vl9+RrXqvodrl9C8yivX1e6le6deCK6RWeq8R7gTTg= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/biter777/countries v1.7.5 h1:MJ+n3+rSxWQdqVJU8eBy9RqcdH6ePPn4PJHocVWUa+Q= @@ -41,10 +65,24 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvw github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw= github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= +github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/etcd-io/etcd v3.3.17+incompatible/go.mod h1:cdZ77EstHBwVtD6iTgzgvogwcjo9m4iOqoijouPJ4bs= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY= github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -56,6 +94,8 @@ github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAu github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -68,13 +108,20 @@ github.com/goraz/onion v0.1.3/go.mod h1:XEmz1XoBz+wxTgWB8NwuvRm4RAu3vKxvrmYtzK+X github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= @@ -84,6 +131,8 @@ github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjS github.com/libp2p/go-libp2p/core v0.43.0-rc2 h1:1X1aDJNWhMfodJ/ynbaGLkgnC8f+hfBIqQDrzxFZOqI= github.com/libp2p/go-libp2p/core v0.43.0-rc2/go.mod h1:NYeJ9lvyBv9nbDk2IuGb8gFKEOkIv/W5YRIy1pAJB2Q= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= @@ -95,9 +144,13 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -125,6 +178,7 @@ github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUO github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= @@ -138,9 +192,16 @@ github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:s github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= @@ -152,11 +213,17 @@ github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfS github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.17.4 h1:jUorfmVzljjr0FLzYQsGP8cgN/qzzxlY9Vh0C9KFXVw= go.mongodb.org/mongo-driver v1.17.4/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/crypto v0.44.0 h1:A97SsFvM3AIwEEmTBiaxPPTYpDC47w720rdiiUvgoAU= +golang.org/x/crypto v0.44.0/go.mod h1:013i+Nw79BMiQiMsOPcVCB5ZIJbYkerPrGnOa00tvmc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -165,10 +232,16 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -181,14 +254,22 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= +golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -196,10 +277,37 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.35.1 h1:0PO/1FhlK/EQNVK5+txc4FuhQibV25VLSdLMmGpDE/Q= +k8s.io/api v0.35.1/go.mod h1:28uR9xlXWml9eT0uaGo6y71xK86JBELShLy4wR1XtxM= +k8s.io/apimachinery v0.35.1 h1:yxO6gV555P1YV0SANtnTjXYfiivaTPvCTKX6w6qdDsU= +k8s.io/apimachinery v0.35.1/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= +k8s.io/client-go v0.35.1 h1:+eSfZHwuo/I19PaSxqumjqZ9l5XiTEKbIaJ+j1wLcLM= +k8s.io/client-go v0.35.1/go.mod h1:1p1KxDt3a0ruRfc/pG4qT/3oHmUj1AhSHEcxNSGg+OA= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/infrastructure/nats.go b/infrastructure/nats.go index 58c9e8b..5c7f9a9 100644 --- a/infrastructure/nats.go +++ b/infrastructure/nats.go @@ -2,6 +2,7 @@ package infrastructure import ( "encoding/json" + "fmt" "slices" oclib "cloud.o-forge.io/core/oc-lib" @@ -58,6 +59,7 @@ func ListenNATS() { } p, err := resources.ToResource(int(resp.Datatype), resp.Payload) if err == nil { + fmt.Println("SearchStream", p) SearchStream[resp.User] <- p // TODO when do we update it in our catalog ? } }, diff --git a/routers/commentsRouter.go b/routers/commentsRouter.go index 21e58ee..f8121da 100755 --- a/routers/commentsRouter.go +++ b/routers/commentsRouter.go @@ -52,15 +52,6 @@ func init() { Filters: nil, Params: nil}) - beego.GlobalControllerRouter["oc-catalog/controllers:ComputeController"] = append(beego.GlobalControllerRouter["oc-catalog/controllers:ComputeController"], - beego.ControllerComments{ - Method: "SearchDecentralized", - Router: `/decentralized/:type/search/:search[get]`, - AllowHTTPMethods: []string{"get"}, - MethodParams: param.Make(), - Filters: nil, - Params: nil}) - beego.GlobalControllerRouter["oc-catalog/controllers:ComputeController"] = append(beego.GlobalControllerRouter["oc-catalog/controllers:ComputeController"], beego.ControllerComments{ Method: "Search", @@ -115,15 +106,6 @@ func init() { Filters: nil, Params: nil}) - beego.GlobalControllerRouter["oc-catalog/controllers:DataController"] = append(beego.GlobalControllerRouter["oc-catalog/controllers:DataController"], - beego.ControllerComments{ - Method: "SearchDecentralized", - Router: `/decentralized/:type/search/:search[get]`, - AllowHTTPMethods: []string{"get"}, - MethodParams: param.Make(), - Filters: nil, - Params: nil}) - beego.GlobalControllerRouter["oc-catalog/controllers:DataController"] = append(beego.GlobalControllerRouter["oc-catalog/controllers:DataController"], beego.ControllerComments{ Method: "Search", @@ -304,15 +286,6 @@ func init() { Filters: nil, Params: nil}) - beego.GlobalControllerRouter["oc-catalog/controllers:ProcessingController"] = append(beego.GlobalControllerRouter["oc-catalog/controllers:ProcessingController"], - beego.ControllerComments{ - Method: "SearchDecentralized", - Router: `/decentralized/:type/search/:search[get]`, - AllowHTTPMethods: []string{"get"}, - MethodParams: param.Make(), - Filters: nil, - Params: nil}) - beego.GlobalControllerRouter["oc-catalog/controllers:ProcessingController"] = append(beego.GlobalControllerRouter["oc-catalog/controllers:ProcessingController"], beego.ControllerComments{ Method: "Search", @@ -376,15 +349,6 @@ func init() { Filters: nil, Params: nil}) - beego.GlobalControllerRouter["oc-catalog/controllers:ResourceController"] = append(beego.GlobalControllerRouter["oc-catalog/controllers:ResourceController"], - beego.ControllerComments{ - Method: "SearchDecentralized", - Router: `/decentralized/:type/search/:search`, - AllowHTTPMethods: []string{"get"}, - MethodParams: param.Make(), - Filters: nil, - Params: nil}) - beego.GlobalControllerRouter["oc-catalog/controllers:ResourceController"] = append(beego.GlobalControllerRouter["oc-catalog/controllers:ResourceController"], beego.ControllerComments{ Method: "Search", @@ -439,15 +403,6 @@ func init() { Filters: nil, Params: nil}) - beego.GlobalControllerRouter["oc-catalog/controllers:StorageController"] = append(beego.GlobalControllerRouter["oc-catalog/controllers:StorageController"], - beego.ControllerComments{ - Method: "SearchDecentralized", - Router: `/decentralized/:type/search/:search[get]`, - AllowHTTPMethods: []string{"get"}, - MethodParams: param.Make(), - Filters: nil, - Params: nil}) - beego.GlobalControllerRouter["oc-catalog/controllers:StorageController"] = append(beego.GlobalControllerRouter["oc-catalog/controllers:StorageController"], beego.ControllerComments{ Method: "Search", @@ -520,15 +475,6 @@ func init() { Filters: nil, Params: nil}) - beego.GlobalControllerRouter["oc-catalog/controllers:WorkflowController"] = append(beego.GlobalControllerRouter["oc-catalog/controllers:WorkflowController"], - beego.ControllerComments{ - Method: "SearchDecentralized", - Router: `/decentralized/:type/search/:search[get]`, - AllowHTTPMethods: []string{"get"}, - MethodParams: param.Make(), - Filters: nil, - Params: nil}) - beego.GlobalControllerRouter["oc-catalog/controllers:WorkflowController"] = append(beego.GlobalControllerRouter["oc-catalog/controllers:WorkflowController"], beego.ControllerComments{ Method: "Search", diff --git a/routers/router.go b/routers/router.go index 2b05056..15cba08 100755 --- a/routers/router.go +++ b/routers/router.go @@ -8,11 +8,38 @@ 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", @@ -67,4 +94,12 @@ 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())) } diff --git a/ws.go b/ws.go new file mode 100644 index 0000000..a0bd567 --- /dev/null +++ b/ws.go @@ -0,0 +1,106 @@ +//go:build ignore + +package main + +import ( + "encoding/json" + "flag" + "fmt" + "log" + "os" + "os/signal" + "time" + + "golang.org/x/net/websocket" +) + +func main() { + timeout := flag.Int("timeout", 10, "secondes sans message avant de quitter") + flag.Parse() + + args := flag.Args() + // Exemples de routes WS disponibles : + // ws://localhost:8087/oc/resource/decentralized/all/search/ + // ws://localhost:8087/oc/compute/decentralized/all/search/ + // ws://localhost:8087/oc/data/decentralized/all/search/ + // ws://localhost:8087/oc/processing/decentralized/all/search/ + // ws://localhost:8087/oc/storage/decentralized/all/search/ + // ws://localhost:8087/oc/workflow/decentralized/all/search/ + url := "ws://localhost:8087/oc/resource/decentralized/all/search/demo" + token := "" + + if len(args) >= 1 { + url = args[0] + } + if len(args) >= 2 { + token = args[1] + } + + origin := "http://localhost/" + config, err := websocket.NewConfig(url, origin) + if err != nil { + log.Fatalf("Config invalide : %v", err) + } + if token != "" { + config.Header.Set("Authorization", "Bearer "+token) + fmt.Printf("Token : %s...\n", token[:min(20, len(token))]) + } + + fmt.Printf("Connexion à : %s\n", url) + ws, err := websocket.DialConfig(config) + if err != nil { + log.Fatalf("Impossible de se connecter : %v", err) + } + defer ws.Close() + fmt.Println("Connecté — en attente de messages...\n") + + stop := make(chan os.Signal, 1) + signal.Notify(stop, os.Interrupt) + + msgs := make(chan string) + errs := make(chan error, 1) + + go func() { + for { + var raw string + if err := websocket.Message.Receive(ws, &raw); err != nil { + errs <- err + return + } + msgs <- raw + } + }() + + idleTimer := time.NewTimer(time.Duration(*timeout) * time.Second) + defer idleTimer.Stop() + + for { + select { + case <-stop: + fmt.Println("\nInterruption — fermeture.") + return + case err := <-errs: + fmt.Printf("Connexion fermée : %v\n", err) + return + case <-idleTimer.C: + fmt.Printf("Timeout (%ds) — aucun message reçu, fermeture.\n", *timeout) + return + case raw := <-msgs: + idleTimer.Reset(time.Duration(*timeout) * time.Second) + var data any + if err := json.Unmarshal([]byte(raw), &data); err == nil { + b, _ := json.MarshalIndent(data, "", " ") + fmt.Println(string(b)) + } else { + fmt.Printf("Message brut : %s\n", raw) + } + } + } +} + +func min(a, b int) int { + if a < b { + return a + } + return b +}