diff --git a/go.mod b/go.mod index 823e921..ee26be2 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,5 @@ module github.com/Yandex-Practicum/go-rest-api-homework -go 1.20 +go 1.23 -require github.com/go-chi/chi/v5 v5.0.10 // indirect +require github.com/go-chi/chi/v5 v5.1.0 diff --git a/go.sum b/go.sum index b2b392c..a435a1e 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,4 @@ github.com/go-chi/chi/v5 v5.0.10 h1:rLz5avzKpjqxrYwXNfmjkrYYXOyLJd37pz53UFHC6vk= github.com/go-chi/chi/v5 v5.0.10/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= diff --git a/precode.go b/precode.go index d082d83..a3f0706 100644 --- a/precode.go +++ b/precode.go @@ -1,10 +1,11 @@ package main import ( + "bytes" + "encoding/json" "fmt" - "net/http" - "github.com/go-chi/chi/v5" + "net/http" ) // Task ... @@ -41,12 +42,87 @@ var tasks = map[string]Task{ // Ниже напишите обработчики для каждого эндпоинта // ... +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 { + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} + +func postTasks(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 + } + if _, ok := tasks[task.ID]; ok { + http.Error(w, "Задача уже создана", 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) { + taskID := chi.URLParam(r, "id") + task, ok := tasks[taskID] + if !ok { + http.Error(w, fmt.Sprintf("task not found: %s", taskID), 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) + _, err = w.Write(resp) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } +} + +func deleteTask(w http.ResponseWriter, r *http.Request) { + taskID := chi.URLParam(r, "id") + _, ok := tasks[taskID] + if !ok { + http.Error(w, fmt.Sprintf("task not found: %s", taskID), http.StatusBadRequest) + } + delete(tasks, taskID) + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + +} func main() { r := chi.NewRouter() // здесь регистрируйте ваши обработчики // ... + r.Get("/tasks", getTasks) + r.Post("/tasks", postTasks) + r.Get("/tasks/{id}", getTask) + r.Delete("/tasks/{id}", deleteTask) if err := http.ListenAndServe(":8080", r); err != nil { fmt.Printf("Ошибка при запуске сервера: %s", err.Error())