72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
|
|
package handler
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common"
|
||
|
|
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common/jwt"
|
||
|
|
"net/http"
|
||
|
|
"reflect"
|
||
|
|
)
|
||
|
|
|
||
|
|
func SyncHandler(w http.ResponseWriter, r *http.Request) {
|
||
|
|
user, err := jwt.GetVerifiedUser(r)
|
||
|
|
if handleError(w, http.StatusUnauthorized, err) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
var todoList common.TodoList
|
||
|
|
err = json.NewDecoder(r.Body).Decode(&todoList)
|
||
|
|
if handleError(w, http.StatusBadRequest, err) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
store, err := common.GetTodoDataStore()
|
||
|
|
if handleError(w, http.StatusInternalServerError, err) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
storedTodoJsons := store.GetAllFromBucket(user)
|
||
|
|
|
||
|
|
serverTodos := make(map[string]common.Todo)
|
||
|
|
for key, val := range storedTodoJsons {
|
||
|
|
var todo common.Todo
|
||
|
|
if json.Unmarshal([]byte(val), &todo) == nil {
|
||
|
|
serverTodos[key] = todo
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
var response = common.SyncResponse{
|
||
|
|
SyncedTodos: []common.Todo{},
|
||
|
|
MisMatchingTodos: []common.MisMatchingTodo{},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, clientTodo := range todoList.Todos {
|
||
|
|
serverTodo, exists := serverTodos[clientTodo.Name]
|
||
|
|
|
||
|
|
if !exists {
|
||
|
|
err = clientTodo.Store(store, user)
|
||
|
|
if handleError(w, http.StatusInternalServerError, err) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
serverTodos[clientTodo.Name] = clientTodo
|
||
|
|
} else {
|
||
|
|
if !reflect.DeepEqual(serverTodo, clientTodo) {
|
||
|
|
response.MisMatchingTodos = append(response.MisMatchingTodos, common.MisMatchingTodo{
|
||
|
|
ServerTodo: serverTodo,
|
||
|
|
LocalTodo: clientTodo,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, todo := range serverTodos {
|
||
|
|
response.SyncedTodos = append(response.SyncedTodos, todo)
|
||
|
|
}
|
||
|
|
|
||
|
|
w.Header().Set("Content-Type", "application/json")
|
||
|
|
err = json.NewEncoder(w).Encode(response)
|
||
|
|
if handleError(w, http.StatusInternalServerError, err) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
}
|