From 63463c4157ce61faf0c000d21d51edffb2659a9a Mon Sep 17 00:00:00 2001 From: Andrey Kabanov Date: Wed, 23 Oct 2024 22:45:36 +0300 Subject: [PATCH 1/2] first commit --- precode.go | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/precode.go b/precode.go index d082d83..1a01aea 100644 --- a/precode.go +++ b/precode.go @@ -1,6 +1,8 @@ package main import ( + "bytes" + "encoding/json" "fmt" "net/http" @@ -40,13 +42,84 @@ var tasks = map[string]Task{ } // Ниже напишите обработчики для каждого эндпоинта -// ... + +// Обработчик для всех задач (метод GET) endpoint /tasks +func allTasks(res http.ResponseWriter, req *http.Request) { + + resp, err := json.Marshal(tasks) + if err != nil { + http.Error(res, err.Error(), http.StatusInternalServerError) + return + } + res.Header().Set("Content-type", "application/json") + res.WriteHeader(http.StatusOK) + res.Write(resp) +} + +// Обработчик для отаправки запросов на сервер (метод Post) endpoint /tasks +func postTasks(res http.ResponseWriter, req *http.Request) { + + var task Task + var buff bytes.Buffer + + _, err := buff.ReadFrom(req.Body) + if err != nil { + http.Error(res, err.Error(), http.StatusBadRequest) + return + } + + if err = json.Unmarshal(buff.Bytes(), &task); err != nil { + http.Error(res, err.Error(), http.StatusBadRequest) + return + } + + tasks[task.ID] = task + res.Header().Set("Content-type", "application/json") + res.WriteHeader(http.StatusCreated) +} + +// Обработчик для получения задач по ID (метод GET) endpoint /tasks/{id} +func idTasks(res http.ResponseWriter, req *http.Request) { + id := chi.URLParam(req, "id") + task, ok := tasks[id] + if !ok { + http.Error(res, "Задача не найдена", http.StatusNoContent) + return + } + + resp, err := json.Marshal(task) + if err != nil { + http.Error(res, err.Error(), http.StatusBadRequest) + return + } + + res.Header().Set("Content-type", "application/json") + res.Write(resp) +} + +// Обработчик удаления задач по ID (метод DELETE) endpoint /tasks/{id} +func delTasks(res http.ResponseWriter, req *http.Request) { + id := chi.URLParam(req, "id") + _, ok := tasks[id] + if !ok { + http.Error(res, "Задача не найдена", http.StatusNoContent) + return + } + + delete(tasks, id) + res.Header().Set("Content-type", "application/json") + res.WriteHeader(http.StatusOK) +} func main() { r := chi.NewRouter() // здесь регистрируйте ваши обработчики // ... + r.Get("/tasks", allTasks) + r.Post("/tasks", postTasks) + r.Get("/tasks/{id}", idTasks) + r.Delete("/tasks/{id}", delTasks) if err := http.ListenAndServe(":8080", r); err != nil { fmt.Printf("Ошибка при запуске сервера: %s", err.Error()) From 2b057b481ce96874f09a0103e95cdd121db0ba87 Mon Sep 17 00:00:00 2001 From: Andrey Kabanov Date: Mon, 4 Nov 2024 11:39:02 +0300 Subject: [PATCH 2/2] second commit --- precode.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/precode.go b/precode.go index 1a01aea..b8e68ec 100644 --- a/precode.go +++ b/precode.go @@ -53,7 +53,7 @@ func allTasks(res http.ResponseWriter, req *http.Request) { } res.Header().Set("Content-type", "application/json") res.WriteHeader(http.StatusOK) - res.Write(resp) + _, _ = res.Write(resp) } // Обработчик для отаправки запросов на сервер (метод Post) endpoint /tasks @@ -72,7 +72,11 @@ func postTasks(res http.ResponseWriter, req *http.Request) { http.Error(res, err.Error(), http.StatusBadRequest) return } - + // Здесь проверяем начличие задачи + if _, exists := tasks[task.ID]; exists { + http.Error(res, "Эта задача уже существует", http.StatusBadRequest) + return + } tasks[task.ID] = task res.Header().Set("Content-type", "application/json") res.WriteHeader(http.StatusCreated) @@ -83,12 +87,14 @@ func idTasks(res http.ResponseWriter, req *http.Request) { id := chi.URLParam(req, "id") task, ok := tasks[id] if !ok { + // Здесь проверяем начличие задачи http.Error(res, "Задача не найдена", http.StatusNoContent) return } resp, err := json.Marshal(task) if err != nil { + // Здесь возвращаем ошибку в соответствии с заданием http.Error(res, err.Error(), http.StatusBadRequest) return } @@ -102,12 +108,14 @@ func delTasks(res http.ResponseWriter, req *http.Request) { id := chi.URLParam(req, "id") _, ok := tasks[id] if !ok { + // Здесь проверяем наличие задачи http.Error(res, "Задача не найдена", http.StatusNoContent) return } delete(tasks, id) res.Header().Set("Content-type", "application/json") + // Возвращем статус в соответствии с заданием res.WriteHeader(http.StatusOK) }