Skip to content

REST API application for managing task lists (todo lists)

License

Notifications You must be signed in to change notification settings

AnatoliyBr/todo-app

Repository files navigation

TODO-APP

Описание

REST API приложение для ведения списков задач (todo-списков).

Функционал

Данное серверное (backend) приложение предоставляет API для регистрации и аутентификации пользователя, а также работы с todo-списками и отдельными задачами внутри них.

Структура REST API

Публичные endpoint'ы, доступные всем:

POST /users - регистрация пользователя
POST /tokens - аутентификация пользователя и выдача JWT

Приватные endpoint'ы, доступные только аутентифицированным пользователям:

GET /profile - просмотр профиля пользователя

POST /lists - создание списка
GET /lists - просмотр всех списков

GET /lists/{id} - просмотр списка
PUT /lists/{id} - редактирование списка
DELETE /lists/{id} - удаление списка

POST /lists/{id}/tasks - добавление задачи в список
GET /lists/{id}/tasks - просмотр всех задач в списке

GET /tasks/{id} - просмотр задачи в списке
PUT /tasks/{id} - редактирование задачи в списке  
DELETE /tasks/{id} - удаление задачи из списка

Схема базы данных

Архитектура

Структура проекта

├── cmd
|   ├── app
|
├── configs
├── internal
|   ├── app
|   ├── controller
|   ├── entity
|   ├── store
|   ├── usecase
|
├── migrations
├── .env
├── .gitignore
├── Makefile
├── README.md
├── go.mod
├── go.sum

Запуск и отладка

Все команды, используемые в процессе разработки и тестирования, фиксировались в Makefile.

Чтобы поднять проект, необходимо выполнить две задачи из Makefile:

make compose-build
make compose-up

Техническая статья

todo_paper.md - файл со статьей

Примеры запросов

Регистрация

Регистрация пользователя:

curl --location --request POST http://localhost:8080/users \
--data-raw '{
    "email":"user@example.org",
    "password":"password"
}'

Пример ответа:

{
    "user_id":1,
    "email":"user@example.org"
}

Аутентификация

Аутентификация пользователя и выдача JWT:

curl --location --request POST http://localhost:8080/tokens \
--data-raw '{
    "email":"user@example.org",
    "password":"password"
}' -v

Пример ответа:

HTTP/1.1 200 OK
Set-Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE2OTM3NjY5OTB9.FhxzjhKtylOZQYrpG88r_lH7-kssye9IWh7UsZ8_t6k
X-Request-Id: f7e4e8ab-ac7f-4266-b683-d35564927fc7
Date: Sun, 03 Sep 2023 18:44:50 GMT
Content-Length: 0

Просмотр профиля

Просмотр профиля аутентифицированного пользователя:

curl --location --request GET http://localhost:8080/profile \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE2OTM3NjY5OTB9.FhxzjhKtylOZQYrpG88r_lH7-kssye9IWh7UsZ8_t6k'

Пример ответа:

{
    "user_id":1,
    "email":"user@example.org"
}

Создание списка

Создание списка задач:

curl --location --request POST http://localhost:8080/lists \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE2OTM3NjY5OTB9.FhxzjhKtylOZQYrpG88r_lH7-kssye9IWh7UsZ8_t6k' \
--data-raw '{
  "list_title":"test title 1"
}'

Пример ответа:

{
    "list_id": 1,
    "list_title": "TEST TITLE 1",
    "user_id": 1
}

Просмотр всех списков

Просмотр всех списков задач:

curl --location --request GET http://localhost:8080/lists \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE2OTM3NjY5OTB9.FhxzjhKtylOZQYrpG88r_lH7-kssye9IWh7UsZ8_t6k'

Пример ответа:

[
    {
        "list_id": 1,
        "list_title": "TEST TITLE 1"
    },
    {
        "list_id": 2,
        "list_title": "TEST TITLE 2"
    }
]

Просмотр списка

Просмотр списка задач по идентификатору:

curl --location --request GET http://localhost:8080/lists/1 \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE2OTM3NjY5OTB9.FhxzjhKtylOZQYrpG88r_lH7-kssye9IWh7UsZ8_t6k'

Пример ответа:

{
    "list_id": 1,
    "list_title": "TEST TITLE 1",
    "user_id": 1
}

Редактирование списка

Редактирование названия списка задач по идентификатору:

curl --location --request PUT http://localhost:8080/lists/1 \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE2OTM3NjY5OTB9.FhxzjhKtylOZQYrpG88r_lH7-kssye9IWh7UsZ8_t6k' \
--data-raw '{
  "list_title":"test title 2"
}'

Пример ответа:

{
    "list_id": 1,
    "list_title": "TEST TITLE 2",
    "user_id": 1
}