Описание

Написать REST API для управления списком задач на Go с использованием фреймворка Echo. Проект объединяет всё что мы изучили: типы данных, структуры, интерфейсы, конкурентность, контекст и работу с HTTP.


Требования

Что нужно реализовать

Приложение должно хранить задачи в памяти (обычный map) и предоставлять REST API для работы с ними.

Модель задачи:

json
{ "id": 1, "title": "Купить молоко", "done": false, "created_at": "2024-01-15T10:30:00Z" }

Эндпоинты

МетодURLОписание
GET/api/todosПолучить все задачи
GET/api/todos/:idПолучить задачу по ID
POST/api/todosСоздать задачу
PUT/api/todos/:idОбновить задачу
DELETE/api/todos/:idУдалить задачу
GET/healthПроверка что сервер жив

Детали каждого эндпоинта

POST /api/todos — создать задачу

Тело запроса:

json
{ "title": "Купить молоко" }

Успешный ответ 201 Created:

json
{ "id": 1, "title": "Купить молоко", "done": false, "created_at": "..." }

Ошибка если title пустой 400 Bad Request:

json
{ "error": "title is required" }

GET /api/todos — получить все задачи

Успешный ответ 200 OK:

json
[ { "id": 1, "title": "Купить молоко", "done": false, "created_at": "..." }, { "id": 2, "title": "Позвонить маме", "done": true, "created_at": "..." } ]

Если задач нет — вернуть пустой массив [], не null.


GET /api/todos/:id — получить задачу по ID

Успешный ответ 200 OK:

json
{ "id": 1, "title": "Купить молоко", "done": false, "created_at": "..." }

Ошибка если не найдена 404 Not Found:

json
{ "error": "todo not found" }

PUT /api/todos/:id — обновить задачу

Тело запроса (оба поля опциональны):

json
{ "title": "Купить хлеб", "done": true }

Успешный ответ 200 OK — возвращает обновлённую задачу.

Ошибка если не найдена 404 Not Found:

json
{ "error": "todo not found" }

DELETE /api/todos/:id — удалить задачу

Успешный ответ 204 No Content — пустое тело.

Ошибка если не найдена 404 Not Found:

json
{ "error": "todo not found" }

GET /health — health check

Успешный ответ 200 OK:

json
{ "status": "ok" }

Технические требования

  • Фреймворк: Echo v4
  • Хранилище: map в памяти — никаких баз данных
  • Конкурентный доступ к map защищён через sync.RWMutex
  • ID задач генерируются автоматически и увеличиваются последовательно
  • Сервер запускается на порту :8080
  • Сервер поддерживает Graceful Shutdown (SIGINT/SIGTERM)
  • Middleware: Logger и Recover из echo/middleware

Что не нужно

  • База данных
  • Аутентификация
  • Пагинация
  • Сложная архитектура — можно всё в одном файле main.go

Как тестировать через Postman

Postman — инструмент для тестирования API. Позволяет отправлять HTTP-запросы и смотреть ответы без написания кода.

Установка

Скачать с postman.com — есть версия для Windows, Mac и Linux. Также есть веб-версия без установки.

Базовое использование

Создать задачу:

  1. Выбрать метод POST
  2. URL: http://localhost:8080/api/todos
  3. Вкладка BodyrawJSON
  4. Вставить тело: {"title": "Купить молоко"}
  5. Нажать Send

Получить все задачи:

  1. Метод GET
  2. URL: http://localhost:8080/api/todos
  3. Нажать Send

Обновить задачу:

  1. Метод PUT
  2. URL: http://localhost:8080/api/todos/1
  3. Body → raw → JSON: {"done": true}
  4. Нажать Send

Удалить задачу:

  1. Метод DELETE
  2. URL: http://localhost:8080/api/todos/1
  3. Нажать Send

Коллекция запросов

В Postman можно сохранить все запросы в коллекцию — кнопка Save после каждого запроса. Это удобно чтобы не вводить URL каждый раз заново.


Фронтенд для проверки

Сохрани этот файл как index.html рядом с проектом и открой в браузере. Он автоматически подключается к серверу на localhost:8080:Вот что у нас есть для ученика:

Фронтенд умеет:

  • Показывать статус сервера (online/offline) через /health
  • Создавать задачи (Enter или кнопка)
  • Отмечать выполненными через PUT /api/todos/:id
  • Удалять через DELETE /api/todos/:id
  • Фильтровать: Все / Активные / Выполненные
  • Показывать лог всех запросов к API с методом, статусом и временем ответа

Инструкция для ученика:

  1. Написать сервер согласно требованиям
  2. Запустить: go run main.go
  3. Открыть index.html в браузере
  4. Параллельно смотреть в Postman детали запросов/ответов