summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2017-05-07 19:19:42 +0200
committerChristian Pointner <equinox@spreadspace.org>2017-05-07 19:19:42 +0200
commit2f162eb303181b3297f2717e13f09598b6c4085e (patch)
treeae79efc0b3e94a825718eea53f7c5aa3d6371f37
parentcleaned up web api _bulk vs normal (diff)
implemented post updates
-rw-r--r--src/hub/src/spreadspace.org/sfive/s5srvWeb.go99
1 files changed, 50 insertions, 49 deletions
diff --git a/src/hub/src/spreadspace.org/sfive/s5srvWeb.go b/src/hub/src/spreadspace.org/sfive/s5srvWeb.go
index efe2ff4..d098626 100644
--- a/src/hub/src/spreadspace.org/sfive/s5srvWeb.go
+++ b/src/hub/src/spreadspace.org/sfive/s5srvWeb.go
@@ -34,8 +34,8 @@ package sfive
import (
"encoding/json"
- // "io"
"fmt"
+ "io"
"net"
"net/http"
"path"
@@ -189,7 +189,7 @@ func webUpdateGet(srv *Server, id int, w http.ResponseWriter, r *http.Request) {
// get list of updates (as json array)
-type webUpdatesResponse struct {
+type webUpdatesGetResponse struct {
Updates []DataUpdateFull `json:"updates"`
}
@@ -199,7 +199,7 @@ func webUpdatesGet(srv *Server, w http.ResponseWriter, r *http.Request) {
sendWebResponse(w, http.StatusBadRequest, webErrorResponse{err.Error()})
}
- resp := webUpdatesResponse{}
+ resp := webUpdatesGetResponse{}
if resp.Updates, err = srv.store.GetUpdatesAfter(after, limit); err != nil {
sendWebResponse(w, http.StatusInternalServerError, webErrorResponse{err.Error()})
return
@@ -234,58 +234,59 @@ func webUpdatesGetBulk(srv *Server, w http.ResponseWriter, r *http.Request) {
// post one update
+type webUpdatesPostResponse struct {
+ NumUpdates int `json:"num-updates"`
+}
+
func webUpdatePost(srv *Server, w http.ResponseWriter, r *http.Request) {
- // TODO: implement this!
-
- // decoder := NewStatelessDecoder(r.Body)
- // data, err := decoder.Decode()
- // if err != nil && err != io.EOF {
- // s5l.Printf("web: failed to decode: %v\n", err)
- // http.Error(w, fmt.Sprintf("failed to read/decode update message: %v", err), http.StatusBadRequest)
- // return
- // }
-
- // if err = srv.Append(data); err != nil {
- // http.Error(w, fmt.Sprintf("failed to store data: %s", err), http.StatusInternalServerError)
- // } else {
- // fmt.Fprintf(w, "1 update successfully stored.")
- // }
-
- sendWebResponse(w, http.StatusNotImplemented, webErrorResponse{"posting signle update data not yet implemented!"})
+ decoder := NewStatelessDecoder(r.Body)
+ value, err := decoder.Decode()
+ if err != nil {
+ sendWebResponse(w, http.StatusBadRequest, webErrorResponse{"error while decoding update: " + err.Error()})
+ return
+ }
+
+ if err = srv.Append(value); err != nil {
+ sendWebResponse(w, http.StatusInternalServerError, webErrorResponse{err.Error()})
+ return
+ }
+
+ sendWebResponse(w, http.StatusOK, webUpdatesPostResponse{1})
}
// post multiple updates in bulk mode
func webUpdatesPostBulk(srv *Server, w http.ResponseWriter, r *http.Request) {
- // TODO: implement this!
-
- // decoder, err := NewStatefulDecoder(r.Body)
- // if err != nil {
- // http.Error(w, fmt.Sprintf("failed to read/decode init message: %v", err), http.StatusBadRequest)
- // return
- // }
-
- // data := []DataUpdateFull{}
- // for {
- // value, err := decoder.Decode()
- // if err != nil {
- // if err != io.EOF {
- // http.Error(w, fmt.Sprintf("failed to read/decode update message: %v", err), http.StatusBadRequest)
- // return
- // }
- // // TODO: check for temporary error?
- // return
- // }
- // data = append(data, value)
- // }
-
- // if err = srv.AppendMany(data); err != nil {
- // http.Error(w, fmt.Sprintf("failed to store data: %s", err), http.StatusInternalServerError)
- // } else {
- // fmt.Fprintf(w, "%d update(s) successfully stored.", len(data))
- // }
-
- sendWebResponse(w, http.StatusNotImplemented, webErrorResponse{"posting bulk update data not yet implemented!"})
+ decoder, err := NewStatefulDecoder(r.Body)
+ if err != nil && err != io.EOF {
+ sendWebResponse(w, http.StatusBadRequest, webErrorResponse{"failed to read/decode init message: " + err.Error()})
+ return
+ }
+
+ values := []DataUpdateFull{}
+ for {
+ value, err := decoder.Decode()
+ if err != nil {
+ if err != io.EOF {
+ sendWebResponse(w, http.StatusBadRequest, webErrorResponse{"failed to read/decode data message: " + err.Error()})
+ return
+ }
+ break
+ }
+ values = append(values, value)
+ }
+ numValues := len(values)
+ if numValues < 1 {
+ sendWebResponse(w, http.StatusBadRequest, webErrorResponse{"got no data messages"})
+ return
+ }
+
+ if err = srv.AppendMany(values); err != nil {
+ sendWebResponse(w, http.StatusInternalServerError, webErrorResponse{err.Error()})
+ return
+ }
+
+ sendWebResponse(w, http.StatusOK, webUpdatesPostResponse{numValues})
}
//