65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
package handler
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"reflect"
|
|
|
|
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common"
|
|
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common/jwt"
|
|
)
|
|
|
|
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
|
|
}
|
|
|
|
serverTodos := store.GetTodoMap(user)
|
|
|
|
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
|
|
}
|
|
}
|