Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 115 additions & 5 deletions precode.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
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"`
Expand Down Expand Up @@ -39,15 +40,124 @@ var tasks = map[string]Task{
},
}

// Ниже напишите обработчики для каждого эндпоинта
// ...
// Обработчик для получения всех задач:
func getTasks(w http.ResponseWriter, r *http.Request) {
// сериализуем данные из мапы tasks
resp, err := json.Marshal(tasks)

// статус 500 Internal Server Error
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}

// запись в заголовок
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
}

// десериализуем данные из мапы tasks
if err = json.Unmarshal(buf.Bytes(), &tasks); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}

tasks[task.ID] = task

// запись в заголовок
w.Header().Set("Content-Type", "application/json")

// статус 201 Created
w.WriteHeader(http.StatusCreated)
}

// Обработчик для получения задачи по ID:
func getTask(w http.ResponseWriter, r *http.Request) {
// id из url праметра
id := chi.URLParam(r, "id")

// проверка на наличие задачи в мапе tasks
task, ok := tasks[id]

// статус 400 Bad Request
if !ok {
http.Error(w, "Задача не найдена", http.StatusBadRequest)
return
}

// сериализуем данные из мапы tasks
resp, err := json.Marshal(task)

// статус 400 Bad Request
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}

// запись в заголовок
w.Header().Set("Content-Type", "application/json")

// статус OK
w.WriteHeader(http.StatusOK)

// запись сериализованных данных json в тело ответа
w.Write(resp)
}

// Обработчик удаления задачи по ID:
func deleteTask(w http.ResponseWriter, r *http.Request) {
// id из url праметра
id := chi.URLParam(r, "id")

// проверка на наличие задачи в мапе tasks
_, ok := tasks[id]

// статус 400 Bad Request
if !ok {
http.Error(w, "Задача не найдена", http.StatusBadRequest)
return
}

//удаление задачи по id
delete(tasks, id)

// статус OK
w.WriteHeader(http.StatusOK)
}

func main() {
// роутер
r := chi.NewRouter()

// здесь регистрируйте ваши обработчики
// ...
// Обработчик для получения всех задач
r.Get("/tasks", getTasks)

// Обработчик для отправки задачи на сервер
r.Post("/tasks", postTask)

// Обработчик для получения задачи по id
r.Get("/tasks/{id}", getTask)

// Обработчик удаления задачи по id
r.Delete("/tasks/{id}", deleteTask)

// сервер
if err := http.ListenAndServe(":8080", r); err != nil {
fmt.Printf("Ошибка при запуске сервера: %s", err.Error())
return
Expand Down