dndex/server/dump.go

63 lines
1.5 KiB
Go

package server
import (
"encoding/json"
"local/dndex/server/auth"
"local/dndex/storage/entity"
"local/dndex/storage/operator"
"net/http"
"gopkg.in/mgo.v2/bson"
)
func (rest *REST) dump(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
rest.dumpOut(w, r)
case http.MethodPost:
rest.dumpIn(w, r)
default:
rest.respNotFound(w)
}
}
func (rest *REST) dumpOut(w http.ResponseWriter, r *http.Request) {
scope := rest.scope(r)
entities, err := rest.g.List(r.Context(), scope.Namespace)
if err != nil {
rest.respError(w, err)
}
for i := len(entities) - 1; i >= 0; i-- {
if entities[i].ID == auth.UserKey {
if i < len(entities)-1 {
entities = append(entities[:i], entities[i+1:]...)
} else {
entities = entities[:i]
}
}
}
rest.respMap(w, scope.Namespace, entities)
}
func (rest *REST) dumpIn(w http.ResponseWriter, r *http.Request) {
scope := rest.scope(r)
var request map[string][]entity.One
if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
rest.respBadRequest(w, err.Error())
return
}
for namespace, ones := range request {
if namespace == scope.Namespace {
for _, one := range ones {
if err := rest.g.Insert(r.Context(), scope.Namespace, one); err != nil {
if err := rest.g.Update(r.Context(), scope.Namespace, bson.M{entity.ID: one.ID}, operator.SetMany{Value: one}); err != nil {
rest.respError(w, err)
return
}
}
}
}
}
rest.entitiesGetN(w, r)
}