Разработать API для авторизации, аутентификации, создания, редактирования и удаления списков дел/покупок по id пользователя, а так же редактирования и удаления самих списков.
- Следование дизайну REST API.
- Подход "Чистой Архитектуры" и техника внедрения зависимости.
- Работа с фреймворком gin-gonic/gin.
- Работа с СУБД Postgres с использованием библиотеки sqlx и написанием SQL запросов.
- Конфигурация приложения - библиотека viper.
- Запуск бд из Docker. Структура проекта:
.
├── pkg
│ ├── handler // обработчики запросов
│ ├── service // бизнес-логика
│ └── repository // взаимодействие с БД
├── cmd // точка входа в приложение
├── schema // SQL файлы с миграциями
├── configs // файлы конфигурации
-
POST /auth/sign-up - авторизация пользователя по имени, логину и паролю.
- Тело запроса:
- name - имя пользователя.
- login - логин пользователя.
- password - пароль.
- Тело запроса:
-
POST /auth/sign-in - аутентификация пользователя по логину и паролю. Пользователь получает bearer токен сроком действия 24 часа.
- Тело запроса:
- login - логин пользователя.
- password - пароль.
- Тело запроса:
-
POST /api/lists - создание списка дел.
- Тело запроса:
- title - название.
- description - описание.
- Тело запроса:
-
GET /api/lists - получение всех списков дел.
-
GET /api/lists/id - получение списка дел по id.
-
PUT /api/lists/id - изменение списка дел по id.
- Тело запроса:
- title - название.
- description - описание.
- Тело запроса:
-
DELETE /api/lists/id - удаление списка дел по id.
-
POST /api/lists/id/items - создание дел внутри списка.
- Тело запроса:
- title - название.
- description - описание.
- Тело запроса:
-
GET /api/list/id/items - получение дел списка.
-
GET /api/items/:id - получение конкретного дела по id.
-
PUT /api/items/:id - редактирование дела по id.
- Тело запроса:
- title - название.
- description - описание.
- done - статус выполнения.
- Тело запроса:
-
DELETE /api/items/:id - удаление дела по id.
go run cmd/main.go
Если приложение запускается впервые, необходимо применить миграции к базе данных:
docker pull postgres
docker run --name=balance-db -e POSTGRES_PASSWORD='qwerty' -p 5436:5432 -d --rm postgres
migrate -path ./schema -database 'postgres://postgres:qwerty@localhost:5436/postgres?sslmode=disable' up
go mod tidy
Запросы сгенерированы из Postman.
Запрос:
{
"name" : "fedor",
"username" : "fshmidt",
"password" : "qwerty"
}
Тело ответа:
{"id":1}
Запрос:
{
"username" : "fshmidt",
"password" : "qwerty"
}
Тело ответа:
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NzM5NzcxMzcsImlhdCI6MTY3MzkzMzkzNywidXNlcl9pZCI6M30.FueN9GuYJPgbcIJLPxxk6X0gkzb5QFh7faxF9Ch2Dak"}
Запрос:
{
"title" : "Купить",
"description" : "до пятницы"
}
Тело ответа:
{"id": 1}
Тело ответа:
{
"data": [
{
"id": 2,
"title": "Купить",
"description": "до пятницы"
},
{
"id": 1,
"title": "Продать",
"description": "до субботы"
}
]
}
Тело ответа:
{
"id": 2,
"title": "Купить",
"description": "до пятницы"
}
Запрос:
{
"title" : "Продать",
"description" : "до субботы"
}
Тело ответа:
{"status": "ok"}
Тело ответа:
{"status": "ok"}
Тело запроса:
{
"title" : "квартира",
"description" : "3-комнатная"
}
Тело ответа:
{
"id": 1
}
Тело ответа:
[
{
"id": 1,
"title": "квартира",
"description": "3-комнатная",
"done": false
},
{
"id": 2,
"title": "магнитола",
"description": "импортная",
"done": false
}
]
Тело ответа:
{
"id": 1,
"title": "квартира",
"description": "3-комнатная",
"done": false
}
Запрос:
{
"title": "квартира",
"done": true
}
Тело ответа:
{
"status": "ok"
}
Тело ответа:
{
"status": "ok"
}