diff --git a/common/todo.go b/common/todo.go index 1185d09..5ab6fb0 100644 --- a/common/todo.go +++ b/common/todo.go @@ -80,3 +80,10 @@ func (t Todo) IsEqual(other Todo) bool { t.Owner == other.Owner && t.Deleted == other.Deleted } + +func (t Todo) IsEqualIgnoringStatus(other Todo) bool { + return t.Name == other.Name && + t.Description == other.Description && + t.Owner == other.Owner && + t.Deleted == other.Deleted +} diff --git a/server/handler/syncHandler.go b/server/handler/syncHandler.go index 5d3730e..27dffb4 100644 --- a/server/handler/syncHandler.go +++ b/server/handler/syncHandler.go @@ -35,19 +35,33 @@ func SyncHandler(w http.ResponseWriter, r *http.Request) { for _, clientTodo := range todoList.Todos { serverTodo, exists := serverTodos[clientTodo.Name] - if clientTodo.Deleted && clientTodo.LastModified.After(serverTodo.LastModified) { - err = store.RemoveValueFromBucket(user, clientTodo.Name) - if handleError(w, http.StatusInternalServerError, err) { - return + if !exists { + if clientTodo.Deleted { + continue } - } else if !exists { err = clientTodo.Store(store, user) if handleError(w, http.StatusInternalServerError, err) { return } serverTodos[clientTodo.Name] = clientTodo - } else { - if !serverTodo.IsEqual(clientTodo) { + continue + } + if clientTodo.Deleted { + if clientTodo.LastModified.After(serverTodo.LastModified) { + err = store.RemoveValueFromBucket(user, clientTodo.Name) + if handleError(w, http.StatusInternalServerError, err) { + return + } + delete(serverTodos, clientTodo.Name) + } + } else if !serverTodo.IsEqual(clientTodo) { + if serverTodo.IsEqualIgnoringStatus(clientTodo) && clientTodo.LastModified.After(serverTodo.LastModified) { + err = clientTodo.Store(store, user) + if handleError(w, http.StatusInternalServerError, err) { + return + } + serverTodos[clientTodo.Name] = clientTodo + } else { response.MisMatchingTodos = append(response.MisMatchingTodos, common.MisMatchingTodo{ ServerTodo: serverTodo, LocalTodo: clientTodo,