package controllers import ( "net/http" "oc-catalog/infrastructure" oclib "cloud.o-forge.io/core/oc-lib" 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" "golang.org/x/net/websocket" ) // Operations about compute type GeneralController struct { beego.Controller } // @Title GetAll // @Description find compute by id // @Param file formData file true "File to upload" // @Success 200 {compute} models.workflow // @Failure 406 {string} string "Bad request" // @router / [get] func (o *GeneralController) GetAll() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) file, _, err := o.Ctx.Request.FormFile("file") if err != nil { o.Data["json"] = map[string]interface{}{ "data": nil, "code": 406, "error": err.Error(), } o.ServeJSON() return } newWorkflow := &w.Workflow{} req := &tools.APIRequest{ Username: user, PeerID: peerID, Groups: groups, } newWorkflow, err = newWorkflow.ExtractFromPlantUML(file, req) if err != nil { o.Data["json"] = map[string]interface{}{ "data": nil, "code": 406, "error": err.Error(), } o.ServeJSON() return } o.Data["json"] = map[string]interface{}{ "data": newWorkflow, "code": 200, "error": nil, } o.ServeJSON() } func Websocket(user string, groups []string, dataType int, w http.ResponseWriter, r *http.Request) { websocket.Handler(func(ws *websocket.Conn) { defer func() { ws.Close() infrastructure.SearchMu.Lock() if ch, ok := infrastructure.SearchStream[user]; ok { close(ch) delete(infrastructure.SearchStream, user) } infrastructure.SearchMu.Unlock() infrastructure.EmitNATS(user, groups, tools.PropalgationMessage{ Action: tools.PB_CLOSE_SEARCH, DataType: dataType, }) }() for msg := range infrastructure.SearchStream[user] { if websocket.JSON.Send(ws, msg) != nil { return } } }).ServeHTTP(w, r) }