feat: add/create + delete api #5

This commit is contained in:
Leandro Antônio Farias Machado 2023-04-27 00:16:04 -03:00
parent 46743ab279
commit 3bc6fb3d33
2 changed files with 151 additions and 23 deletions

View File

@ -39,8 +39,10 @@ func StartApi(a Api) {
r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
return return
}) })
r.HandleFunc("/devices", a.retrieveDevices) r.HandleFunc("/devices", a.retrieveDevices).Methods("GET")
r.HandleFunc("/devices/{sn}/get", a.deviceGetMsg) 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{ srv := &http.Server{
Addr: "0.0.0.0:" + a.Port, Addr: "0.0.0.0:" + a.Port,
@ -74,34 +76,21 @@ func (a *Api) retrieveDevices(w http.ResponseWriter, r *http.Request) {
return 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) vars := mux.Vars(r)
sn := vars["sn"] sn := vars["sn"]
_, err := a.Db.RetrieveDevice(sn) a.deviceExists(sn, w)
if err != nil {
if err == mongo.ErrNoDocuments { var receiver usp_msg.Add
w.WriteHeader(http.StatusBadRequest)
json.NewEncoder(w).Encode("No device with serial number " + sn + " was found") err := json.NewDecoder(r.Body).Decode(&receiver)
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)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
w.WriteHeader(http.StatusBadRequest) w.WriteHeader(http.StatusBadRequest)
return return
} }
msg := utils.NewGetMsg(receiver) msg := utils.NewCreateMsg(receiver)
encodedMsg, err := proto.Marshal(&msg) encodedMsg, err := proto.Marshal(&msg)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
@ -122,7 +111,7 @@ func (a *Api) deviceGetMsg(w http.ResponseWriter, r *http.Request) {
select { select {
case msg := <-a.MsgQueue[msg.Header.MsgId]: case msg := <-a.MsgQueue[msg.Header.MsgId]:
log.Printf("Received Msg") log.Printf("Received Msg")
json.NewEncoder(w).Encode(msg) json.NewEncoder(w).Encode(msg.Body.GetResponse().GetAddResp())
return return
case <-time.After(time.Second * 5): case <-time.After(time.Second * 5):
log.Printf("Request Timed Out") log.Printf("Request Timed Out")
@ -131,3 +120,106 @@ func (a *Api) deviceGetMsg(w http.ResponseWriter, r *http.Request) {
return 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
}
}

View File

@ -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 { func NewGetMsg(getStuff usp_msg.Get) usp_msg.Msg {
return usp_msg.Msg{ return usp_msg.Msg{
Header: &usp_msg.Header{ 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,
},
},
},
},
}
}