diff --git a/precode.go b/precode.go index d082d83..12e593f 100644 --- a/precode.go +++ b/precode.go @@ -1,6 +1,8 @@ package main import ( + "bytes" + "encoding/json" "fmt" "net/http" @@ -39,17 +41,103 @@ var tasks = map[string]Task{ }, } -// Ниже напишите обработчики для каждого эндпоинта -// ... +func getTasks(w http.ResponseWriter, r *http.Request) { + // сериализуем данные из слайса tasks + resp, err := json.Marshal(tasks) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + // в заголовок записываем тип контента, у нас это данные в формате JSON + w.Header().Set("Content-Type", "application/json") + // так как все успешно, то статус OK + w.WriteHeader(http.StatusOK) + // записываем сериализованные в JSON данные в тело ответа + 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 + } + + tasks[task.ID] = task + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusCreated) +} + +func getTask(w http.ResponseWriter, r *http.Request) { + id := chi.URLParam(r, "id") + + task, ok := tasks[id] + if !ok { + http.Error(w, "Задача не найдена", http.StatusNoContent) + 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) +} + +func deleteTask(w http.ResponseWriter, r *http.Request) { + id := chi.URLParam(r, "id") + + task, ok := tasks[id] + if !ok { + http.Error(w, "Задача не найдена", http.StatusNoContent) + return + } + delete(tasks, id) + 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) +} func main() { + // создаём новый роутер r := chi.NewRouter() - // здесь регистрируйте ваши обработчики - // ... + // регистрируем в роутере эндпоинт `/tasks` с методом GET, для которого используется обработчик `gettasks` + r.Get("/tasks", getTasks) + + // регистрируем в роутере эндпоинт `/tasks` с методом POST, для которого используется обработчик `posttask` + r.Post("/tasks", postTask) + // регистрируем в роутере эндпоинт `/task/{id}` с методом GET, для которого используется обработчик `gettask` + r.Get("/task/{id}", getTask) + // регистрируем в роутере эндпоинт `/tasks/{id}` с методом DELETE, для которого используется обработчик `deleteTask` + r.Get("/tasks/{id}", deleteTask) + + // запускаем сервер if err := http.ListenAndServe(":8080", r); err != nil { fmt.Printf("Ошибка при запуске сервера: %s", err.Error()) return } } + +//wefwefewf