diff --git a/precode.go b/precode.go index d082d83..8fac530 100644 --- a/precode.go +++ b/precode.go @@ -1,13 +1,14 @@ package main import ( + "bytes" + "encoding/json" "fmt" "net/http" "github.com/go-chi/chi/v5" ) -// Task ... type Task struct { ID string `json:"id"` Description string `json:"description"` @@ -39,14 +40,92 @@ var tasks = map[string]Task{ }, } -// Ниже напишите обработчики для каждого эндпоинта -// ... +// функция выдает в консоль сообщение об ошибке, если метод w.Write не был завершен корректно +func writeErrorLog(b int, err error) { + if err != nil { + fmt.Printf("Ошибка при обработке запроса: %v\n", err) + } +} + +func getAllTasks(w http.ResponseWriter, r *http.Request) { + resp, err := json.Marshal(tasks) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + writeErrorLog(w.Write(resp)) +} + +func postTask(w http.ResponseWriter, r *http.Request) { + var task Task + var buf bytes.Buffer + + _, err := buf.ReadFrom(r.Body) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + if err = json.Unmarshal(buf.Bytes(), &task); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + w.Header().Set("Content-Type", "application/json") + + //проверка на дубликат + _, idExist := tasks[task.ID] + if idExist { + fmt.Printf("таск с ID: %s уже существует\n", task.ID) + w.WriteHeader(http.StatusNotModified) + } else { + tasks[task.ID] = task + w.WriteHeader(http.StatusCreated) + } +} + +func getOneTask(w http.ResponseWriter, r *http.Request) { + id := chi.URLParam(r, "id") + + task, ok := tasks[id] + if !ok { + http.Error(w, "Нет задачи с таким ID", http.StatusNoContent) + return + } + + resp, err := json.Marshal(task) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + writeErrorLog(w.Write(resp)) +} + +func deleteOneTask(w http.ResponseWriter, r *http.Request) { + id := chi.URLParam(r, "id") + bufferTask, ok := tasks[id] + if !ok { + //StatusnoContent вроде подходит лучше, но строгая формулировка просит вернуть код 400 + http.Error(w, "Нет задачи с таким ID", http.StatusBadRequest) + return + } + delete(tasks, id) + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + fmt.Printf("Удален таск с ID=%s (%s)\n", id, bufferTask.Description) +} func main() { r := chi.NewRouter() - // здесь регистрируйте ваши обработчики - // ... + r.Get("/tasks", getAllTasks) + r.Post("/tasks", postTask) + r.Get("/tasks/{id}", getOneTask) + r.Delete("/tasks/{id}", deleteOneTask) if err := http.ListenAndServe(":8080", r); err != nil { fmt.Printf("Ошибка при запуске сервера: %s", err.Error())