From 4c916bdab95c1ed63f0cb9fbbaf24872a468de26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leandro=20Ant=C3=B4nio=20Farias=20Machado?= Date: Fri, 28 Apr 2023 08:17:10 -0300 Subject: [PATCH] feat: api tr369 SET function for device #5 --- .../services/controller/internal/api/api.go | 48 ++++++++++++++++++- .../controller/internal/utils/utils.go | 18 +++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/backend/services/controller/internal/api/api.go b/backend/services/controller/internal/api/api.go index ee89b3c..dcecc77 100644 --- a/backend/services/controller/internal/api/api.go +++ b/backend/services/controller/internal/api/api.go @@ -43,6 +43,7 @@ func StartApi(a Api) { 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") + r.HandleFunc("/device/{sn}/set", a.deviceUpdateMsg).Methods("PUT") srv := &http.Server{ Addr: "0.0.0.0:" + a.Port, @@ -83,7 +84,7 @@ func (a *Api) deviceCreateMsg(w http.ResponseWriter, r *http.Request) { var receiver usp_msg.Add - err := json.NewDecoder(r.Body).Decode(&receiver) + err := json.NewDecoder(r.Body).Decode(receiver) if err != nil { log.Println(err) w.WriteHeader(http.StatusBadRequest) @@ -211,6 +212,51 @@ func (a *Api) deviceDeleteMsg(w http.ResponseWriter, r *http.Request) { } } +func (a *Api) deviceUpdateMsg(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + sn := vars["sn"] + a.deviceExists(sn, w) + + var receiver usp_msg.Set + + err := json.NewDecoder(r.Body).Decode(&receiver) + if err != nil { + log.Println(err) + w.WriteHeader(http.StatusBadRequest) + return + } + + msg := utils.NewSetMsg(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().GetSetResp()) + 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 { diff --git a/backend/services/controller/internal/utils/utils.go b/backend/services/controller/internal/utils/utils.go index 4609161..b40be73 100644 --- a/backend/services/controller/internal/utils/utils.go +++ b/backend/services/controller/internal/utils/utils.go @@ -97,3 +97,21 @@ func NewDelMsg(getStuff usp_msg.Delete) usp_msg.Msg { }, } } + +func NewSetMsg(updateStuff usp_msg.Set) usp_msg.Msg { + return usp_msg.Msg{ + Header: &usp_msg.Header{ + MsgId: uuid.NewString(), + MsgType: usp_msg.Header_SET, + }, + Body: &usp_msg.Body{ + MsgBody: &usp_msg.Body_Request{ + Request: &usp_msg.Request{ + ReqType: &usp_msg.Request_Set{ + Set: &updateStuff, + }, + }, + }, + }, + } +}