From 17e28172e0b5bd0e8bb5805797228aa591eda07e Mon Sep 17 00:00:00 2001 From: Viacheslav Dmitriev Date: Sun, 2 Mar 2025 11:54:15 +0300 Subject: [PATCH] serv todo --- precode.go | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/precode.go b/precode.go index d082d83..186af0d 100644 --- a/precode.go +++ b/precode.go @@ -1,6 +1,8 @@ package main import ( + "bytes" + "encoding/json" "fmt" "net/http" @@ -40,13 +42,93 @@ var tasks = map[string]Task{ } // Ниже напишите обработчики для каждого эндпоинта -// ... +// ... ok +// обработчик для вывода списка всех задач +func getTasks(w http.ResponseWriter, r *http.Request) { + // сериализвуем данные из слайса task + resp, err := json.Marshal(tasks) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") // в загловоке указываем тип контента в форате JSON + w.WriteHeader(http.StatusOK) + w.Write(resp) +} + +// обработчик для добавления задач на сервер +func postTask(w http.ResponseWriter, r *http.Request) { + var task Task + var buf bytes.Buffer + + if r.Body == nil { + http.Error(w, "Тело запроса не может быть пустым", http.StatusBadRequest) + return + } + + _, 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 + } + + tasks[task.ID] = task + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusCreated) + json.NewEncoder(w).Encode(task) +} + +// обработчик для получения таска по ID +func getTask(w http.ResponseWriter, r *http.Request) { + id := chi.URLParam(r, "id") + + task, ok := tasks[id] + if !ok { + http.Error(w, "Задача не найдена", http.StatusBadRequest) + return + } + + resp, err := json.Marshal(task) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write(resp) +} + +// обработчки дудаления задачи по ID +func deleteTask(w http.ResponseWriter, r *http.Request) { + id := chi.URLParam(r, "id") + + //проверяем есть ли такой ID в мапе задач + if _, ok := tasks[id]; !ok { + http.Error(w, "Невозможно удалить то, чего нет", http.StatusBadRequest) + return + } + + delete(tasks, id) + w.WriteHeader(http.StatusOK) + +} func main() { r := chi.NewRouter() // здесь регистрируйте ваши обработчики // ... + r.Get("/tasks", getTasks) // создали роутер для списка всех задач + r.Post("/tasks", postTask) //создали роутер для добавления задач на сервер + r.Get("/tasks/{id}", getTask) + r.Delete("/tasks/{id}", deleteTask) if err := http.ListenAndServe(":8080", r); err != nil { fmt.Printf("Ошибка при запуске сервера: %s", err.Error())