X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=dmaap-mediator-producer%2Finternal%2Fserver%2Fserver.go;h=79646c29a30de120bda47d265b6f076365dde6e2;hb=46a0fd717e5f49ebae6cb2c4fbcf54f0e329dc86;hp=ca30d73ec60c9aa476ddfb84597dd4de7b1cb486;hpb=ba96d847ab72a882bfe3acd39bc70c8f544f094a;p=nonrtric.git diff --git a/dmaap-mediator-producer/internal/server/server.go b/dmaap-mediator-producer/internal/server/server.go index ca30d73e..79646c29 100644 --- a/dmaap-mediator-producer/internal/server/server.go +++ b/dmaap-mediator-producer/internal/server/server.go @@ -21,20 +21,80 @@ package server import ( + "encoding/json" "fmt" + "io/ioutil" "net/http" + + "github.com/gorilla/mux" + "oransc.org/nonrtric/dmaapmediatorproducer/internal/jobs" ) -func StatusHandler(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != "/" { - http.Error(w, "404 not found.", http.StatusNotFound) +const StatusPath = "/status" +const AddJobPath = "/jobs" +const jobIdToken = "infoJobId" +const deleteJobPath = AddJobPath + "/{" + jobIdToken + "}" + +type ProducerCallbackHandler struct { + jobsManager jobs.JobsManager +} + +func NewProducerCallbackHandler(jm jobs.JobsManager) *ProducerCallbackHandler { + return &ProducerCallbackHandler{ + jobsManager: jm, + } +} + +func NewRouter(jm jobs.JobsManager) *mux.Router { + callbackHandler := NewProducerCallbackHandler(jm) + r := mux.NewRouter() + r.HandleFunc(StatusPath, statusHandler).Methods(http.MethodGet).Name("status") + r.HandleFunc(AddJobPath, callbackHandler.addInfoJobHandler).Methods(http.MethodPost).Name("add") + r.HandleFunc(deleteJobPath, callbackHandler.deleteInfoJobHandler).Methods(http.MethodDelete).Name("delete") + r.NotFoundHandler = ¬FoundHandler{} + r.MethodNotAllowedHandler = &methodNotAllowedHandler{} + return r +} + +func statusHandler(w http.ResponseWriter, r *http.Request) { + // Just respond OK to show the server is alive for now. Might be extended later. +} + +func (h *ProducerCallbackHandler) addInfoJobHandler(w http.ResponseWriter, r *http.Request) { + b, readErr := ioutil.ReadAll(r.Body) + if readErr != nil { + http.Error(w, fmt.Sprintf("Unable to read body due to: %v", readErr), http.StatusBadRequest) return } + jobInfo := jobs.JobInfo{} + if unmarshalErr := json.Unmarshal(b, &jobInfo); unmarshalErr != nil { + http.Error(w, fmt.Sprintf("Invalid json body. Cause: %v", unmarshalErr), http.StatusBadRequest) + return + } + if err := h.jobsManager.AddJobFromRESTCall(jobInfo); err != nil { + http.Error(w, fmt.Sprintf("Invalid job info. Cause: %v", err), http.StatusBadRequest) + } +} - if r.Method != "GET" { - http.Error(w, "Method is not supported.", http.StatusNotFound) +func (h *ProducerCallbackHandler) deleteInfoJobHandler(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + id, ok := vars[jobIdToken] + if !ok { + http.Error(w, "Must provide infoJobId.", http.StatusBadRequest) return } - fmt.Fprintf(w, "All is well!") + h.jobsManager.DeleteJobFromRESTCall(id) +} + +type notFoundHandler struct{} + +func (h *notFoundHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + http.Error(w, "404 not found.", http.StatusNotFound) +} + +type methodNotAllowedHandler struct{} + +func (h *methodNotAllowedHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + http.Error(w, "Method is not supported.", http.StatusMethodNotAllowed) }