From 3dc66ca9fc57977ff3c4ca966ee54531a3262e82 Mon Sep 17 00:00:00 2001 From: supppppppbro <113025477+supppppppbro@users.noreply.github.com> Date: Thu, 23 Nov 2023 12:49:12 +0300 Subject: [PATCH 1/5] init --- precode.go | 117 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 107 insertions(+), 10 deletions(-) diff --git a/precode.go b/precode.go index d082d83..c33adf4 100644 --- a/precode.go +++ b/precode.go @@ -1,18 +1,19 @@ package main import ( + "bytes" + "encoding/json" "fmt" "net/http" "github.com/go-chi/chi/v5" ) -// Task ... type Task struct { - ID string `json:"id"` - Description string `json:"description"` - Note string `json:"note"` - Applications []string `json:"applications"` + ID string `json:"id"` // ID задачи + Description string `json:"description"` // Заголовок + Note string `json:"note"` // Описание задачи + Applications []string `json:"applications"` // Приложения, которыми будете пользоваться } var tasks = map[string]Task{ @@ -28,7 +29,7 @@ var tasks = map[string]Task{ }, "2": { ID: "2", - Description: "Протестировать финальное задание с помощью Postmen", + Description: "Протестировать финальное задание с помощью Postman", Note: "Лучше это делать в процессе разработки, каждый раз, когда запускаешь сервер и проверяешь хендлер", Applications: []string{ "VS Code", @@ -39,15 +40,111 @@ var tasks = map[string]Task{ }, } -// Ниже напишите обработчики для каждого эндпоинта -// ... +// Получить все задачи +func getAllTasks(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + + resp, err := json.Marshal(tasks) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + w.WriteHeader(http.StatusOK) + w.Write(resp) +} + +// Получить задачу по ID +func getTaskByID(w http.ResponseWriter, r *http.Request) { + id := chi.URLParam(r, "id") + + task, ok := tasks[id] + if !ok { + http.Error(w, "Задача не найдена", http.StatusNotFound) + 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 createTask(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 + } + + // Декодирование JSON в структуру Task + if err = json.Unmarshal(buf.Bytes(), &task); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + // Проверка наличия ID у задачи + if task.ID == "" { + http.Error(w, "ID задачи обязателен", http.StatusBadRequest) + return + } + + // Сохранение задачи + tasks[task.ID] = task + + // Отправка ответа с созданной задачей + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusCreated) + resp, err := json.Marshal(task) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + w.Write(resp) +} + +// Удалить задачу по ID +func deleteTaskByID(w http.ResponseWriter, r *http.Request) { + id := chi.URLParam(r, "id") + + if _, exists := tasks[id]; !exists { + http.Error(w, "Задача не найдена", http.StatusBadRequest) + return + } + + delete(tasks, id) + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + resp, err := json.Marshal(map[string]string{"message": "Задача удалена"}) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + w.Write(resp) +} func main() { + // создаем новый роутер r := chi.NewRouter() - // здесь регистрируйте ваши обработчики - // ... + // регистрируем эндпоинты + r.Get("/tasks", getAllTasks) + r.Get("/tasks/{id}", getTaskByID) + r.Post("/tasks", createTask) + r.Delete("/tasks/{id}", deleteTaskByID) + // запускаем сервер if err := http.ListenAndServe(":8080", r); err != nil { fmt.Printf("Ошибка при запуске сервера: %s", err.Error()) return From 2236f8427ab2e3a6ac6879027b520941afcf3e12 Mon Sep 17 00:00:00 2001 From: Rinat Kaumov Date: Tue, 19 Nov 2024 15:41:15 +0300 Subject: [PATCH 2/5] init --- .idea/.gitignore | 8 ++++++++ .idea/.name | 1 + .idea/go-rest-api-homework.iml | 9 +++++++++ .idea/modules.xml | 8 ++++++++ .idea/vcs.xml | 6 ++++++ 5 files changed, 32 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/go-rest-api-homework.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..2a677c6 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +precode.go \ No newline at end of file diff --git a/.idea/go-rest-api-homework.iml b/.idea/go-rest-api-homework.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/go-rest-api-homework.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..5002cd0 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file From f96392ad90f87680bb021e891cc009fc162a7ad3 Mon Sep 17 00:00:00 2001 From: Rinat Kaumov Date: Tue, 19 Nov 2024 15:45:49 +0300 Subject: [PATCH 3/5] init --- precode.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/precode.go b/precode.go index c33adf4..efa2ada 100644 --- a/precode.go +++ b/precode.go @@ -40,7 +40,6 @@ var tasks = map[string]Task{ }, } -// Получить все задачи func getAllTasks(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") @@ -54,7 +53,6 @@ func getAllTasks(w http.ResponseWriter, r *http.Request) { w.Write(resp) } -// Получить задачу по ID func getTaskByID(w http.ResponseWriter, r *http.Request) { id := chi.URLParam(r, "id") @@ -75,34 +73,28 @@ func getTaskByID(w http.ResponseWriter, r *http.Request) { w.Write(resp) } -// Создать задачу func createTask(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 } - // Декодирование JSON в структуру Task if err = json.Unmarshal(buf.Bytes(), &task); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } - // Проверка наличия ID у задачи if task.ID == "" { http.Error(w, "ID задачи обязателен", http.StatusBadRequest) return } - // Сохранение задачи tasks[task.ID] = task - // Отправка ответа с созданной задачей w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) resp, err := json.Marshal(task) From b92df71d2535664cb7d3116f01c875dc8f4d5593 Mon Sep 17 00:00:00 2001 From: Rinat Kaumov Date: Wed, 20 Nov 2024 00:01:53 +0300 Subject: [PATCH 4/5] init --- precode.go | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/precode.go b/precode.go index efa2ada..abdb43c 100644 --- a/precode.go +++ b/precode.go @@ -50,7 +50,7 @@ func getAllTasks(w http.ResponseWriter, r *http.Request) { } w.WriteHeader(http.StatusOK) - w.Write(resp) + _, _ = w.Write(resp) } func getTaskByID(w http.ResponseWriter, r *http.Request) { @@ -58,7 +58,7 @@ func getTaskByID(w http.ResponseWriter, r *http.Request) { task, ok := tasks[id] if !ok { - http.Error(w, "Задача не найдена", http.StatusNotFound) + http.Error(w, "Задача не найдена", http.StatusNoContent) // 204 No Content return } @@ -70,7 +70,7 @@ func getTaskByID(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) - w.Write(resp) + _, _ = w.Write(resp) } func createTask(w http.ResponseWriter, r *http.Request) { @@ -93,19 +93,16 @@ func createTask(w http.ResponseWriter, r *http.Request) { return } - tasks[task.ID] = task - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusCreated) - resp, err := json.Marshal(task) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) + if _, exists := tasks[task.ID]; exists { + http.Error(w, "Задача с таким ID уже существует", http.StatusConflict) // 409 Conflict return } - w.Write(resp) + + tasks[task.ID] = task + + w.WriteHeader(http.StatusCreated) // 201 Created } -// Удалить задачу по ID func deleteTaskByID(w http.ResponseWriter, r *http.Request) { id := chi.URLParam(r, "id") @@ -116,27 +113,17 @@ func deleteTaskByID(w http.ResponseWriter, r *http.Request) { delete(tasks, id) - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - resp, err := json.Marshal(map[string]string{"message": "Задача удалена"}) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - w.Write(resp) + w.WriteHeader(http.StatusOK) // 200 OK } func main() { - // создаем новый роутер r := chi.NewRouter() - // регистрируем эндпоинты r.Get("/tasks", getAllTasks) r.Get("/tasks/{id}", getTaskByID) r.Post("/tasks", createTask) r.Delete("/tasks/{id}", deleteTaskByID) - // запускаем сервер if err := http.ListenAndServe(":8080", r); err != nil { fmt.Printf("Ошибка при запуске сервера: %s", err.Error()) return From 230b47174d94e2f17075e0c0dc97b2c4bdaba5e9 Mon Sep 17 00:00:00 2001 From: Rinat Kaumov Date: Wed, 20 Nov 2024 00:01:53 +0300 Subject: [PATCH 5/5] init --- precode.go | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/precode.go b/precode.go index efa2ada..abdb43c 100644 --- a/precode.go +++ b/precode.go @@ -50,7 +50,7 @@ func getAllTasks(w http.ResponseWriter, r *http.Request) { } w.WriteHeader(http.StatusOK) - w.Write(resp) + _, _ = w.Write(resp) } func getTaskByID(w http.ResponseWriter, r *http.Request) { @@ -58,7 +58,7 @@ func getTaskByID(w http.ResponseWriter, r *http.Request) { task, ok := tasks[id] if !ok { - http.Error(w, "Задача не найдена", http.StatusNotFound) + http.Error(w, "Задача не найдена", http.StatusNoContent) // 204 No Content return } @@ -70,7 +70,7 @@ func getTaskByID(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) - w.Write(resp) + _, _ = w.Write(resp) } func createTask(w http.ResponseWriter, r *http.Request) { @@ -93,19 +93,16 @@ func createTask(w http.ResponseWriter, r *http.Request) { return } - tasks[task.ID] = task - - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusCreated) - resp, err := json.Marshal(task) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) + if _, exists := tasks[task.ID]; exists { + http.Error(w, "Задача с таким ID уже существует", http.StatusConflict) // 409 Conflict return } - w.Write(resp) + + tasks[task.ID] = task + + w.WriteHeader(http.StatusCreated) // 201 Created } -// Удалить задачу по ID func deleteTaskByID(w http.ResponseWriter, r *http.Request) { id := chi.URLParam(r, "id") @@ -116,27 +113,17 @@ func deleteTaskByID(w http.ResponseWriter, r *http.Request) { delete(tasks, id) - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - resp, err := json.Marshal(map[string]string{"message": "Задача удалена"}) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - w.Write(resp) + w.WriteHeader(http.StatusOK) // 200 OK } func main() { - // создаем новый роутер r := chi.NewRouter() - // регистрируем эндпоинты r.Get("/tasks", getAllTasks) r.Get("/tasks/{id}", getTaskByID) r.Post("/tasks", createTask) r.Delete("/tasks/{id}", deleteTaskByID) - // запускаем сервер if err := http.ListenAndServe(":8080", r); err != nil { fmt.Printf("Ошибка при запуске сервера: %s", err.Error()) return