Сервис для управления номерами отеля и бронированиями.
make build
make run
Если приложение запускается впервые, необходимо применить миграции к базе данных:
make migrate_up
Для миграций используется golang-migrate/migrate CLI.
make run_test
- Тело запроса/ответа - в формате JSON.
- В случае ошибки возвращается необходимый HTTP код, в теле содержится описание ошибки (пример:
{"error": "something went wrong"}
).
Добавление номера отеля.
- Параметры тела запроса:
- description - текстовое описание,
- price - цена за ночь.
- Тело ответа:
- room_id - идентификатор номера отеля.
Пример
Запрос:
curl -X POST localhost:9000/rooms/ \
-H "Content-Type: application/json" \
-d '{
"description": "The Best Room",
"price": 9000
}'
Ответ:
{
"room_id": 144
}
Удаление номера отеля.
- Параметры пути запроса:
- id - идентификатор номера отеля.
Пример
Запрос:
curl -X DELETE localhost:9000/rooms/144
Получение списка номеров отеля.
- Параметры строки запроса:
- sort - поле, по которому производится сортировка:
- id - по идентификатору (по дате добавления),
- price - по цене.
- sort - поле, по которому производится сортировка:
- Тело ответа:
- список номеров отеля.
- Для сортировки по убыванию необходимо добавить знак минус перед значением поля (-id или -price).
- По умолчанию (если параметр sort пуст или отсутствует) сортировка осуществляется по id по возрастанию.
Пример
Запрос:
curl -X GET localhost:9000/rooms/?sort=-price
Ответ:
[
{
"room_id": 2,
"description": "description2",
"price": 5000
},
{
"room_id": 3,
"description": "description3",
"price": 3000
},
{
"room_id": 1,
"description": "description1",
"price": 1000
},
]
Добавление бронирования номера отеля.
- Параметры тела запроса:
- room_id - идентификатор номера отеля,
- date_start - дата начала бронирования,
- date_end - дата окончания бронирования.
- Тело ответа:
- booking_id - идентификатор бронирования.
Ограничения (из условия): нет проверки на доступность номера отеля в выбранное время.
Пример
Запрос:
curl -X POST localhost:9000/bookings/ \
-H "Content-Type: application/json" \
-d '{
"room_id": 144,
"date_start": "2021-12-30",
"date_end": "2022-01-02"
}'
Ответ:
{
"booking_id": 121
}
Удаление бронирования номера отеля.
- Параметры запроса:
- id - идентификатор бронирования.
Пример
Запрос:
curl -X DELETE localhost:9000/bookings/121
Получение списка бронирований номера отеля.
- Параметры строки запроса:
- room_id - идентификатор номера отеля.
- Тело ответа:
- список бронирований.
Список сортируется по дате начала (date_start).
Пример
Запрос:
curl -X GET localhost:9000/bookings/?room_id=144
Ответ:
[
{
"booking_id": 289,
"date_start": "2021-01-04",
"date_end": "2021-01-08"
},
{
"booking_id": 121,
"date_start": "2021-12-30",
"date_end": "2022-01-02"
},
{
"booking_id": 256,
"date_start": "2022-03-01",
"date_end": "2022-03-12"
},
]
- Следование дизайну REST JSON API.
- Подход "Чистой Архитектуры" и техника внедрения зависимости.
- Работа с фреймворком fiber.
- Работа с БД Postgres с использованием библиотеки sqlx и написанием SQL запросов.
- Конфигурация приложения - библиотека viper.
- Реализация Graceful Shutdown.
- Запуск из Docker.
- Юнит-тестирование с помощью моков - библиотеки testify, mock.
- Непрерывная интеграция, запуск тестов в Travis CI, анализ и покрытие в Scrutinizer CI.
Структура проекта
.
├── pkg
│ ├── model // основные структуры
│ ├── handler // обработчики запросов
│ ├── service // бизнес-логика
│ └── repository // взаимодействие с БД
├── cmd // точка входа в приложение
├── scripts // SQL файлы с миграциями
└── configs // файлы конфигурации