diff --git a/README.en.md b/README.en.md
index 2e73307..9fd2204 100644
--- a/README.en.md
+++ b/README.en.md
@@ -16,5 +16,19 @@ This solution is inspired by the project Documentation
+
+
+ Testing and development workspace
+
+
+
+
+
If you are interested in internal information about the team and our intentions, visit our Wiki.
diff --git a/README.es.md b/README.es.md
index c61075a..44c722d 100644
--- a/README.es.md
+++ b/README.es.md
@@ -16,6 +16,20 @@ Esta solución se inspira en el proyecto. Documentación
+
+
+ Espacio de trabajo de pruebas y desarrollo
+
+
+
+
+
Si está interesado en información interna sobre el equipo y nuestras intenciones, visite nuestro Wiki.
diff --git a/README.md b/README.md
index 21a2558..4cc398d 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,20 @@ Esta solução tem como inspirações o projeto Documentação
+
+
+ Workspace de testes e desenvolvimento
+
+
+
+
+
Caso você tenha interesse em informações internas sobre o time e nossas pretensões acesse nossa Wiki.
diff --git a/backend/services/controller/internal/api/api.go b/backend/services/controller/internal/api/api.go
index fc19bb0..14f9d7f 100644
--- a/backend/services/controller/internal/api/api.go
+++ b/backend/services/controller/internal/api/api.go
@@ -3,6 +3,7 @@ package api
import (
"encoding/json"
"github.com/gorilla/mux"
+ "github.com/leandrofars/oktopus/internal/api/middleware"
"github.com/leandrofars/oktopus/internal/db"
"github.com/leandrofars/oktopus/internal/mtp"
usp_msg "github.com/leandrofars/oktopus/internal/usp_message"
@@ -39,8 +40,15 @@ 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")
+ r.HandleFunc("/device/{sn}/set", a.deviceUpdateMsg).Methods("PUT")
+
+ r.Use(func(handler http.Handler) http.Handler {
+ return middleware.Middleware(handler)
+ })
srv := &http.Server{
Addr: "0.0.0.0:" + a.Port,
@@ -74,27 +82,60 @@ func (a *Api) retrieveDevices(w http.ResponseWriter, r *http.Request) {
return
}
+func (a *Api) deviceCreateMsg(w http.ResponseWriter, r *http.Request) {
+ vars := mux.Vars(r)
+ sn := vars["sn"]
+ 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.NewCreateMsg(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: %s", msg.Header.MsgId)
+ json.NewEncoder(w).Encode(msg.Body.GetResponse().GetAddResp())
+ return
+ case <-time.After(time.Second * 5):
+ log.Printf("Request %s Timed Out", msg.Header.MsgId)
+ w.WriteHeader(http.StatusGatewayTimeout)
+ json.NewEncoder(w).Encode("Request Timed Out")
+ return
+ }
+}
+
func (a *Api) deviceGetMsg(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
- }
+
+ a.deviceExists(sn, w)
+
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)
+
+ err := json.NewDecoder(r.Body).Decode(&receiver)
if err != nil {
log.Println(err)
w.WriteHeader(http.StatusBadRequest)
@@ -115,19 +156,121 @@ func (a *Api) deviceGetMsg(w http.ResponseWriter, r *http.Request) {
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: %s", msg.Header.MsgId)
+ json.NewEncoder(w).Encode(msg.Body.GetResponse().GetGetResp())
+ return
+ case <-time.After(time.Second * 5):
+ log.Printf("Request %s Timed Out", msg.Header.MsgId)
+ 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)
+ log.Printf("Received Msg: %s", msg.Header.MsgId)
+ json.NewEncoder(w).Encode(msg.Body.GetResponse().GetDeleteResp())
return
case <-time.After(time.Second * 5):
- log.Printf("Request Timed Out")
+ log.Printf("Request %s Timed Out", msg.Header.MsgId)
w.WriteHeader(http.StatusGatewayTimeout)
json.NewEncoder(w).Encode("Request Timed Out")
return
}
}
+
+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: %s", msg.Header.MsgId)
+ json.NewEncoder(w).Encode(msg.Body.GetResponse().GetSetResp())
+ return
+ case <-time.After(time.Second * 5):
+ log.Printf("Request %s Timed Out", msg.Header.MsgId)
+ 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/api/middleware/middleware.go b/backend/services/controller/internal/api/middleware/middleware.go
new file mode 100644
index 0000000..97edbe4
--- /dev/null
+++ b/backend/services/controller/internal/api/middleware/middleware.go
@@ -0,0 +1,12 @@
+package middleware
+
+import "net/http"
+
+func Middleware(next http.Handler) http.Handler {
+ return http.HandlerFunc(
+ func(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ next.ServeHTTP(w, r)
+ },
+ )
+}
diff --git a/backend/services/controller/internal/utils/utils.go b/backend/services/controller/internal/utils/utils.go
index c636c4b..b40be73 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,39 @@ 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,
+ },
+ },
+ },
+ },
+ }
+}
+
+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,
+ },
+ },
+ },
+ },
+ }
+}