package main import ( "bytes" "context" "encoding/json" "fmt" "io" "log" "maps" "net/http" "gitea.kleinsense.nl/DariusKlein/kleinTodo/client/todo/httpClient" "gitea.kleinsense.nl/DariusKlein/kleinTodo/common" "github.com/urfave/cli/v3" ) // Sync Command func Sync() *cli.Command { return &cli.Command{ Name: "sync", Usage: "sync with kleinTodo server", Action: syncAction, Flags: loginFlags(), } } // syncAction logic for Template func syncAction(context context.Context, c *cli.Command) error { store, err := common.GetTodoDataStore() if err != nil { return err } serverTodos := store.GetTodos(cfg.Server.Credentials.Username) var todos []common.Todo for todo := range maps.Values(serverTodos) { todos = append(todos, todo) } payload, err := json.Marshal(common.TodoList{Todos: todos}) if err != nil { return fmt.Errorf("error marshaling credentials: %w", err) } req, err := http.NewRequest("POST", cfg.Server.Url, bytes.NewBuffer(payload)) if err != nil { return fmt.Errorf("error creating request: %w", err) } req.Header.Set("Content-Type", "application/json") resp, err := httpClient.GetHttpClient(cfg.Server.Token).Do(req) if err != nil { return fmt.Errorf("error sending request: %w", err) } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { return fmt.Errorf("failed to read response body: %w", err) } if resp.StatusCode != http.StatusOK { return fmt.Errorf("request failed with status %d: %s", resp.StatusCode, string(body)) } var response common.SyncResponse if err := json.Unmarshal(body, &response); err != nil { return fmt.Errorf("failed to decode successful response: %w", err) } prettyJSON, err := json.MarshalIndent(response, "", " ") if err != nil { log.Fatalf("Failed to generate json: %s", err) } // Print the string version of the byte slice. fmt.Printf("%s\n", prettyJSON) return nil }