From 3bc6fb3d336a88e1bb6a68b641fc1ee8136ba861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leandro=20Ant=C3=B4nio=20Farias=20Machado?= Date: Thu, 27 Apr 2023 00:16:04 -0300 Subject: [PATCH] feat: add/create + delete api #5 --- .../services/controller/internal/api/api.go | 138 +++++++++++++++--- .../controller/internal/utils/utils.go | 36 +++++ 2 files changed, 151 insertions(+), 23 deletions(-) diff --git a/backend/services/controller/internal/api/api.go b/backend/services/controller/internal/api/api.go index fc19bb0..ee89b3c 100644 --- a/backend/services/controller/internal/api/api.go +++ b/backend/services/controller/internal/api/api.go @@ -39,8 +39,10 @@ func StartApi(a Api) { r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { return }) - r.HandleFunc("/devices", a.retrieveDevices) - r.HandleFunc("/devices/{sn}/get", a.deviceGetMsg) + r.HandleFunc("/devices", a.retrieveDevices).Methods("GET") + r.HandleFunc("/device/{sn}/get", a.deviceGetMsg).Methods("PUT") + r.HandleFunc("/device/{sn}/add", a.deviceCreateMsg).Methods("PUT") + r.HandleFunc("/device/{sn}/del", a.deviceDeleteMsg).Methods("PUT") srv := &http.Server{ Addr: "0.0.0.0:" + a.Port, @@ -74,34 +76,21 @@ func (a *Api) retrieveDevices(w http.ResponseWriter, r *http.Request) { return } -func (a *Api) deviceGetMsg(w http.ResponseWriter, r *http.Request) { +func (a *Api) deviceCreateMsg(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) sn := vars["sn"] - _, err := a.Db.RetrieveDevice(sn) - if err != nil { - if err == mongo.ErrNoDocuments { - w.WriteHeader(http.StatusBadRequest) - json.NewEncoder(w).Encode("No device with serial number " + sn + " was found") - return - } - w.WriteHeader(http.StatusInternalServerError) - return - } - var receiver usp_msg.Get - //data := []byte(`{"param_paths": {'Device.DeviceInfo.'},"max_depth": 2}`) - //data := []byte("'opa'") - //var jsonBlob = []byte(`{ - // "param_paths": ["Device.DeviceInfo.","Device.ManagementServer."], - // "max_depth": 2 - //}`) - err = json.NewDecoder(r.Body).Decode(receiver) + a.deviceExists(sn, w) + + var receiver usp_msg.Add + + err := json.NewDecoder(r.Body).Decode(&receiver) if err != nil { log.Println(err) w.WriteHeader(http.StatusBadRequest) return } - msg := utils.NewGetMsg(receiver) + msg := utils.NewCreateMsg(receiver) encodedMsg, err := proto.Marshal(&msg) if err != nil { log.Println(err) @@ -122,7 +111,7 @@ func (a *Api) deviceGetMsg(w http.ResponseWriter, r *http.Request) { select { case msg := <-a.MsgQueue[msg.Header.MsgId]: log.Printf("Received Msg") - json.NewEncoder(w).Encode(msg) + json.NewEncoder(w).Encode(msg.Body.GetResponse().GetAddResp()) return case <-time.After(time.Second * 5): log.Printf("Request Timed Out") @@ -131,3 +120,106 @@ func (a *Api) deviceGetMsg(w http.ResponseWriter, r *http.Request) { return } } + +func (a *Api) deviceGetMsg(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + sn := vars["sn"] + + a.deviceExists(sn, w) + + var receiver usp_msg.Get + + err := json.NewDecoder(r.Body).Decode(&receiver) + if err != nil { + log.Println(err) + w.WriteHeader(http.StatusBadRequest) + return + } + + msg := utils.NewGetMsg(receiver) + encodedMsg, err := proto.Marshal(&msg) + if err != nil { + log.Println(err) + w.WriteHeader(http.StatusBadRequest) + return + } + + record := utils.NewUspRecord(encodedMsg, sn) + tr369Message, err := proto.Marshal(&record) + if err != nil { + log.Fatalln("Failed to encode tr369 record:", err) + } + + a.MsgQueue[msg.Header.MsgId] = make(chan usp_msg.Msg) + a.Broker.Publish(tr369Message, "oktopus/v1/agent/"+sn, "oktopus/v1/api/"+sn) + + select { + case msg := <-a.MsgQueue[msg.Header.MsgId]: + log.Printf("Received Msg") + json.NewEncoder(w).Encode(msg.Body.GetResponse().GetGetResp()) + return + case <-time.After(time.Second * 5): + log.Printf("Request Timed Out") + w.WriteHeader(http.StatusGatewayTimeout) + json.NewEncoder(w).Encode("Request Timed Out") + return + } +} + +func (a *Api) deviceDeleteMsg(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + sn := vars["sn"] + a.deviceExists(sn, w) + + var receiver usp_msg.Delete + + err := json.NewDecoder(r.Body).Decode(&receiver) + if err != nil { + log.Println(err) + w.WriteHeader(http.StatusBadRequest) + return + } + + msg := utils.NewDelMsg(receiver) + encodedMsg, err := proto.Marshal(&msg) + if err != nil { + log.Println(err) + w.WriteHeader(http.StatusBadRequest) + return + } + + record := utils.NewUspRecord(encodedMsg, sn) + tr369Message, err := proto.Marshal(&record) + if err != nil { + log.Fatalln("Failed to encode tr369 record:", err) + } + + //a.Broker.Request(tr369Message, usp_msg.Header_GET, "oktopus/v1/agent/"+sn, "oktopus/v1/get/"+sn) + a.MsgQueue[msg.Header.MsgId] = make(chan usp_msg.Msg) + a.Broker.Publish(tr369Message, "oktopus/v1/agent/"+sn, "oktopus/v1/api/"+sn) + + select { + case msg := <-a.MsgQueue[msg.Header.MsgId]: + log.Printf("Received Msg") + json.NewEncoder(w).Encode(msg.Body.GetResponse().GetDeleteResp()) + return + case <-time.After(time.Second * 5): + log.Printf("Request Timed Out") + w.WriteHeader(http.StatusGatewayTimeout) + json.NewEncoder(w).Encode("Request Timed Out") + return + } +} + +func (a *Api) deviceExists(sn string, w http.ResponseWriter) { + _, err := a.Db.RetrieveDevice(sn) + if err != nil { + if err == mongo.ErrNoDocuments { + w.WriteHeader(http.StatusBadRequest) + json.NewEncoder(w).Encode("No device with serial number " + sn + " was found") + return + } + w.WriteHeader(http.StatusInternalServerError) + return + } +} diff --git a/backend/services/controller/internal/utils/utils.go b/backend/services/controller/internal/utils/utils.go index c636c4b..4609161 100644 --- a/backend/services/controller/internal/utils/utils.go +++ b/backend/services/controller/internal/utils/utils.go @@ -44,6 +44,24 @@ func NewUspRecord(p []byte, toId string) usp_record.Record { } } +func NewCreateMsg(createStuff usp_msg.Add) usp_msg.Msg { + return usp_msg.Msg{ + Header: &usp_msg.Header{ + MsgId: uuid.NewString(), + MsgType: usp_msg.Header_ADD, + }, + Body: &usp_msg.Body{ + MsgBody: &usp_msg.Body_Request{ + Request: &usp_msg.Request{ + ReqType: &usp_msg.Request_Add{ + Add: &createStuff, + }, + }, + }, + }, + } +} + func NewGetMsg(getStuff usp_msg.Get) usp_msg.Msg { return usp_msg.Msg{ Header: &usp_msg.Header{ @@ -61,3 +79,21 @@ func NewGetMsg(getStuff usp_msg.Get) usp_msg.Msg { }, } } + +func NewDelMsg(getStuff usp_msg.Delete) usp_msg.Msg { + return usp_msg.Msg{ + Header: &usp_msg.Header{ + MsgId: uuid.NewString(), + MsgType: usp_msg.Header_DELETE, + }, + Body: &usp_msg.Body{ + MsgBody: &usp_msg.Body_Request{ + Request: &usp_msg.Request{ + ReqType: &usp_msg.Request_Delete{ + Delete: &getStuff, + }, + }, + }, + }, + } +}