kleinTodo/server/handler/syncHandler.go

83 lines
2.1 KiB
Go
Raw Normal View History

2025-07-26 23:31:00 +02:00
package handler
import (
"encoding/json"
"net/http"
2025-08-23 13:28:48 +02:00
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common"
"gitea.kleinsense.nl/DariusKlein/kleinTodo/common/jwt"
2025-07-26 23:31:00 +02:00
)
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
}
2025-08-23 21:51:33 +02:00
serverTodos := store.GetTodoMap(user)
2025-07-26 23:31:00 +02:00
var response = common.SyncResponse{
SyncedTodos: []common.Todo{},
MisMatchingTodos: []common.MisMatchingTodo{},
}
for _, clientTodo := range todoList.Todos {
serverTodo, exists := serverTodos[clientTodo.Name]
2026-01-11 19:04:18 +01:00
if !exists {
if clientTodo.Deleted {
continue
}
2025-07-26 23:31:00 +02:00
err = clientTodo.Store(store, user)
if handleError(w, http.StatusInternalServerError, err) {
return
}
serverTodos[clientTodo.Name] = clientTodo
2026-01-11 19:04:18 +01:00
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 {
2025-07-26 23:31:00 +02:00
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
}
}