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 } 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 } }