diff --git a/client/src/app/features/changelog/changelog.component.ts b/client/src/app/features/changelog/changelog.component.ts index f39e6b0..d35a2c6 100644 --- a/client/src/app/features/changelog/changelog.component.ts +++ b/client/src/app/features/changelog/changelog.component.ts @@ -1,9 +1,10 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { MergeComponent } from '../merge/merge.component'; import { HttpClient } from '@angular/common/http'; import { environment } from 'src/environments/environment.development'; import { CommonModule } from '@angular/common'; import { FetchLogService } from 'src/app/shared/services/fetch-log.service'; +import { WebsocketService } from 'src/app/shared/services/websocket.service'; @Component({ selector: 'app-changelog', @@ -21,52 +22,64 @@ export class ChangelogComponent { constructor( private httpClient: HttpClient, + private wss: WebsocketService ){ this.fetchLoglist(); - this.translateLogDirToString(); + // this.translateLogDirToString(); } + public fetchLoglist(): string[]{ // TODO: Fetch changelog.html // fetch("/changelog") let dirlist: any[] = [] - this.httpClient.get(environment.api+"/listFileInDir/changelog", { - withCredentials: true - }).subscribe({ - next: (value) => { - console.log(value) - if(typeof value === "object" && value !== null){ - if("dirs" in value){ - console.log("dirs", value) - // dirlist.push(...(value as {dirs: unknown[]})["dirs"]); - this.displayableLogs = value.dirs as any[]; - } - } - }, - error: (err) => { - console.error('Error fetch json: ',err); - } - }) - // console.log(dirlist); - this.httpClient.get(environment.api+"/listFileInDir/merge", { - withCredentials: true - }).subscribe({ - next: (value) => { - console.log(value) - if(typeof value === "object" && value !== null){ - if("dirs" in value){ - console.log("dirs", value) - // dirlist.push(...(value as {dirs: unknown[]})["dirs"]); - this.displayableMergeJson = value.dirs as any[]; - } - } - }, - error: (err) => { - console.error('Error fetch json: ',err); - } + + this.wss.connect(environment.wsapi+"/listFileInDir"); + this.wss.send({ + "topic": "changelog", }) + let response = this.wss.data; + console.log(response); + + // this.httpClient.get(environment.api+"/listFileInDir/changelog", { + // withCredentials: true + // }).subscribe({ + // next: (value) => { + // console.log(value) + // if(typeof value === "object" && value !== null){ + // if("dirs" in value){ + // console.log("dirs", value) + // // dirlist.push(...(value as {dirs: unknown[]})["dirs"]); + // this.displayableLogs = value.dirs as any[]; + // } + // } + // }, + // error: (err) => { + // console.error('Error fetch json: ',err); + // } + // }) + // // console.log(dirlist); + + // this.httpClient.get(environment.api+"/listFileInDir/merge", { + // withCredentials: true + // }).subscribe({ + // next: (value) => { + // console.log(value) + // if(typeof value === "object" && value !== null){ + // if("dirs" in value){ + // console.log("dirs", value) + // // dirlist.push(...(value as {dirs: unknown[]})["dirs"]); + // this.displayableMergeJson = value.dirs as any[]; + // } + // } + // }, + // error: (err) => { + // console.error('Error fetch json: ',err); + // } + // }) + return dirlist; } diff --git a/client/src/environments/environment.development.ts b/client/src/environments/environment.development.ts index dd9d9ef..53fafeb 100644 --- a/client/src/environments/environment.development.ts +++ b/client/src/environments/environment.development.ts @@ -1,4 +1,5 @@ export const environment = { production: false, api: 'http://localhost:8080', + wsapi: 'ws://localhost:8080' }; diff --git a/server/go.mod b/server/go.mod index 2cc6893..1961a0c 100644 --- a/server/go.mod +++ b/server/go.mod @@ -8,6 +8,8 @@ require ( golang.org/x/oauth2 v0.12.0 ) +require github.com/gorilla/websocket v1.5.0 // indirect + require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect diff --git a/server/go.sum b/server/go.sum index cb2565c..ee0c9e3 100644 --- a/server/go.sum +++ b/server/go.sum @@ -123,6 +123,8 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= diff --git a/server/server.go b/server/server.go index 1de8d25..2448d08 100644 --- a/server/server.go +++ b/server/server.go @@ -23,15 +23,21 @@ import ( "github.com/go-chi/chi/v5" "github.com/go-chi/cors" + "github.com/gorilla/websocket" "github.com/spf13/viper" "go.uber.org/zap" "golang.org/x/oauth2" ) var ( - Log = logger.GetInstance() - + Log = logger.GetInstance() python_api_lock sync.Mutex + + upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + CheckOrigin: func(r *http.Request) bool { return true }, + } ) func loadConfig(path string) (*config.ServerConfig, error) { @@ -336,60 +342,98 @@ func (s *Server) createHandler() { // json.NewEncoder(w).Encode(map[string][]string{"dirs": displayable}) // }) - r.Get("/listFileInDir/*", func(w http.ResponseWriter, r *http.Request) { + r.Get("/listFileInDir", func(w http.ResponseWriter, r *http.Request) { - // target_dir, err := os.ReadDir("cofffeemachineConfig") + // socket + socket, err := upgrader.Upgrade(w, r, nil) + + if err != nil { + Log.Error("Error while trying to upgrade socket: ", zap.Error(err)) + return + } + + // TODO: Change to websocket for better performance + for { + msg_type, msg, err := socket.ReadMessage() + + if err != nil { + Log.Warn("Idle ", zap.Any("status", err)) + return + } + + var msgPayload map[string]interface{} + + err = json.Unmarshal(msg, &msgPayload) + if err != nil { + Log.Error("Error while trying to unmarshal message: ", zap.Error(err)) + return + } + + // topic := msgPayload["topic"].(string) + + Log.Info("Receive message: ", zap.Any("msg_type", msg_type), zap.Any("msg", msgPayload)) + + response, err := json.Marshal(map[string]interface{}{ + "message": "ok", + }) + if err != nil { + Log.Error("Error at marshalling response: ", zap.Error(err)) + return + } + // respons to client + socket.WriteMessage(msg_type, response) + } // spl - spl_path := strings.Split(r.RequestURI, "/") - if len(spl_path) > 3 { - Log.Warn("Unexpected depth: ", - zap.String("path", r.RequestURI), - zap.String("depth", fmt.Sprintf("%d", len(spl_path)))) - } + // spl_path := strings.Split(r.RequestURI, "/") + // if len(spl_path) > 3 { + // Log.Warn("Unexpected depth: ", + // zap.String("path", r.RequestURI), + // zap.String("depth", fmt.Sprintf("%d", len(spl_path)))) + // } - if spl_path[2] == "" { - Log.Error("Empty target dir", zap.String("path", r.RequestURI)) - } + // if spl_path[2] == "" { + // Log.Error("Empty target dir", zap.String("path", r.RequestURI)) + // } - Log.Debug("Split path = ", zap.Any("paths", spl_path)) + // Log.Debug("Split path = ", zap.Any("paths", spl_path)) - // Log.Info("Target dir: ", zap.String("dir", "cofffeemachineConfig")) + // // Log.Info("Target dir: ", zap.String("dir", "cofffeemachineConfig")) - main_folder := "cofffeemachineConfig" - target_path := main_folder + "/" + spl_path[2] + // main_folder := "cofffeemachineConfig" + // target_path := main_folder + "/" + spl_path[2] - dir, err := os.ReadDir(target_path) - if err != nil { - Log.Error("Error while trying to read dir: ", zap.String("dir", target_path), zap.Error(err)) - http.Error(w, err.Error(), http.StatusInternalServerError) - } + // dir, err := os.ReadDir(target_path) + // if err != nil { + // Log.Error("Error while trying to read dir: ", zap.String("dir", target_path), zap.Error(err)) + // http.Error(w, err.Error(), http.StatusInternalServerError) + // } - // File ext - file_ext := ".json" - switch spl_path[2] { - case "changelog": - file_ext = ".html" - break - case "merge": - file_ext = ".json" - break - } - Log.Debug("Set file ext = ", zap.String("file_ext", file_ext)) + // // File ext + // file_ext := ".json" + // switch spl_path[2] { + // case "changelog": + // file_ext = ".html" + // break + // case "merge": + // file_ext = ".json" + // break + // } + // Log.Debug("Set file ext = ", zap.String("file_ext", file_ext)) - displayable := make([]string, 0) - for _, file := range dir { - if strings.Contains(file.Name(), file_ext) { - Log.Debug("Found file: ", zap.String("file", file.Name())) - displayable = append(displayable, file.Name()[:len(file.Name())-len(filepath.Ext(file.Name()))]) - } - } + // displayable := make([]string, 0) + // for _, file := range dir { + // if strings.Contains(file.Name(), file_ext) { + // Log.Debug("Found file: ", zap.String("file", file.Name())) + // displayable = append(displayable, file.Name()[:len(file.Name())-len(filepath.Ext(file.Name()))]) + // } + // } - // send back - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(map[string][]string{"dirs": displayable}) - Log.Debug("Scan dir completed < ", zap.String("path", r.RequestURI)) + // // send back + // w.Header().Set("Content-Type", "application/json") + // w.WriteHeader(http.StatusOK) + // json.NewEncoder(w).Encode(map[string][]string{"dirs": displayable}) + // Log.Debug("Scan dir completed < ", zap.String("path", r.RequestURI)) }) // Recipe Router