diff --git a/precode.go b/precode.go index d082d83..197a151 100644 --- a/precode.go +++ b/precode.go @@ -1,6 +1,8 @@ package main import ( + "bytes" + "encoding/json" "fmt" "net/http" @@ -40,13 +42,99 @@ var tasks = map[string]Task{ } // Ниже напишите обработчики для каждого эндпоинта -// ... + +// обработчик 1 +func getTasks(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) + _, err = w.Write(resp) + if err != nil { + fmt.Println("failed to write responce", err.Error()) + return + } +} + +// обработчик 2 +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.StatusInternalServerError) + return + } + if err = json.Unmarshal(buf.Bytes(), &task); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + if _, ex := tasks[task.ID]; ex { + http.Error(w, "Задача с таким ID уже существует", http.StatusConflict) + return + } + + tasks[task.ID] = task + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusCreated) +} + +// обработчик 3 +func getTaskForId(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.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + + _, err = w.Write(resp) + if err != nil { + fmt.Printf("Ошибка записи: %v", err) + } + +} + +// обработчик 4 +func taskDel(w http.ResponseWriter, r *http.Request) { + id := chi.URLParam(r, "id") + + _, ok := tasks[id] + if !ok { + http.Error(w, "Не удалось удалить задачу. Отсутствует запрашиваемая задача.", http.StatusBadRequest) + return + } + + delete(tasks, id) + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) +} func main() { r := chi.NewRouter() // здесь регистрируйте ваши обработчики - // ... + //обработчик 1 + r.Get("/tasks", getTasks) + //обработчик 2 + r.Post("/tasks", postTask) + //обработчик 3 + r.Get("/tasks/{id}", getTaskForId) + //обработчик 4 + r.Delete("/tasks/{id}", taskDel) if err := http.ListenAndServe(":8080", r); err != nil { fmt.Printf("Ошибка при запуске сервера: %s", err.Error())