https://github.com/tmrrwnxtsn/restaurant-table-booking-app
:cake: An application for booking tables in restaurants with a RESTful API and user interface
https://github.com/tmrrwnxtsn/restaurant-table-booking-app
bootstrap5 docker-compose go golang golang-template migrations postgresql restful-api
Last synced: 4 months ago
JSON representation
:cake: An application for booking tables in restaurants with a RESTful API and user interface
- Host: GitHub
- URL: https://github.com/tmrrwnxtsn/restaurant-table-booking-app
- Owner: tmrrwnxtsn
- License: mit
- Created: 2022-06-09T08:55:54.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2022-06-24T21:05:05.000Z (about 4 years ago)
- Last Synced: 2025-12-17T16:14:11.271Z (6 months ago)
- Topics: bootstrap5, docker-compose, go, golang, golang-template, migrations, postgresql, restful-api
- Language: Go
- Homepage:
- Size: 147 KB
- Stars: 1
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Сервис бронирования столиков в ресторанах
[](https://goreportcard.com/report/github.com/tmrrwnxtsn/aero-table-booking-api)
[](https://codebeat.co/projects/github-com-tmrrwnxtsn-aero-table-booking-api-master)
[](https://pkg.go.dev/github.com/tmrrwnxtsn/aero-table-booking-api)
Тестовое задание на стажировку в [Aero](https://aeroidea.ru/).
## Содержание
- [Задание](#Задание)
- [Подготовка](#Подготовка)
- [Запуск](#Запуск)
- [Эндпойнты](#Эндпойнты)
- [Структура](#Структура)
- [Зависимости](#Зависимости)
## Задание
Представь знакомую всем ситуацию. Ты собираешься с друзьями в ресторан и хочешь забронировать столик. В вашем городе
открыты 3 ресторана: «Каравелла», «Молодость», «Мясо и Салат» (любые совпадения случайны).
**У ресторанов свои особенности:**
1. «Каравелла»:
— 10 столиков: 6 столиков вмещает до 4 человек. 2 столика вмещают до 3 человек. 2 столика вмещает до 2 человек;
— Среднее время ожидания блюда: 30 минут;
— Средний чек: 2000 рублей.
2. «Молодость»
— 3 столика, каждый из которых вмещает 3 человека;
— Среднее время ожидания блюда: 15 минут;
— Средний чек: 1000 рублей.
3. «Мясо и Салат»
— 6 столиков: 2 столика вмещает до 8 человек. 4 столика вмещают до 3 человек;
— Среднее время ожидания блюда: 60 минут;
— Средний чек: 1500 рублей.
**Необходимо создать небольшую систему бронирования столиков.** Предусматриваются следующие шаги:
1. Пользователь указывает количество человек и желаемое время посещения ресторана.
2. Время брони - 2 часа. Рестораны работают с 9:00 до 23:00 (Последнюю бронь можно создать на 21:00).
3. Сдвигать столики - можно.
4. Система предлагает доступные варианты (рестораны).
5. Необходимо указывать актуальное количество свободных мест.
6. Необходимо отсортировать подходящие варианты по возрастанию среднего времени ожидания и среднего чека.
7. Необходимо скрывать недоступные варианты.
8. Пользователь указывает имя и номер телефона и завершает процесс бронирования.
**В качестве результата ожидается** ссылка на github-репозиторий, в котором находятся:
- [x] http-сервер, который общается с миром на языке REST API.
- [x] readme.md-файл, в котором подробно описана инструкция по установке системы
— Все действия по установке должны быть автоматизированы (= вызов команд)
- [x] sql-дамп базы данных.
**Нужно не забыть:**
- [x] Проверить входные параметры. Сделать защиту от дурака.
- [x] Написать много комментариев к коду.
- [x] Проверить полученный результат дважды (а лучше трижды).
**Будет круто, если** (но совсем не критично, если не получится):
- [x] В качестве БД ты выберешь postgres.
- [x] Сделаешь визуальный интерфейс. Можно сверстать самому или использовать готовые решения.
- [x] Напишешь код на php или go (вообще идеально).
- [x] Используешь docker-compose.
- [x] Вынесешь все настройки подключения к базе в переменные окружения (env-параметры).
## Подготовка
Сервис состоит из двух компонентов: API сервер и база данных PostgreSQL, поэтому для его успешной работы необходимо
установить следующее ПО:
- [Go](https://golang.org/doc/install) >=1.17;
- [Docker](https://www.docker.com/get-started) >=20.10.14
## Запуск
После установки необходимого ПО необходимо скачать исходный код сервиса и перейти в директорию с исходным кодом:
```shell
git clone https://github.com/tmrrwnxtsn/restaurant-table-booking-app.git
cd restaurant-table-booking-app
```
Автоматизация запуска системы осуществляется
средствами [Makefile](https://github.com/tmrrwnxtsn/aero-table-booking-api/blob/master/Makefile)
и [docker-compose.yml](https://github.com/tmrrwnxtsn/aero-table-booking-api/blob/master/docker-compose.yml). **Перед
запуском рекомендуется обратить внимание на переменные, указанные в этих файлах, и изменить их, если потребуется**.
Также следует обратить внимание на конфигурационный
файл [configs/local.yml](https://github.com/tmrrwnxtsn/aero-table-booking-api/blob/master/configs/local.yml) и внести
необходимые правки.
Если возникнет необходимость задать соответствующие переменные среды окружения, то они должны добавляться с префиксом *
API_*, например, *API_BIND_ADDR* (
см. [docker-compose.yml](https://github.com/tmrrwnxtsn/aero-table-booking-api/blob/master/docker-compose.yml)):
```
API_BIND_ADDR - адрес, на котором запускается сервис
API_DSN - строка подключения к базе данных PostgreSQL
API_LOG_LEVEL - уровень логгирования
```
### [Docker Compose](https://docs.docker.com/compose/gettingstarted/)
Как было упомянуто выше, система запускается с помощью Docker. Оба компонента системы (API сервер и БД) разворачиваются
в отдельных Docker-контейнерах. Настройки компонентов указываются в
[docker-compose.yml](https://github.com/tmrrwnxtsn/aero-table-booking-api/blob/master/docker-compose.yml). При запуске
системы автоматически применяется предварительно созданный дамп
БД ([dumps/dump-202206160937-1.sql](https://github.com/tmrrwnxtsn/aero-table-booking-api/blob/master/dumps/dump-202206160937-1.sql))
, чтобы при взаимодействии с системой в ней уже были данные.
Чтобы запустить систему, необходимо ввести следующую команду:
```shell
# запуск компонентов в отдельных Docker-контейнерах
make compose-up
```
## Эндпойнты
После успешного запуска сервиса по адресу `http://localhost:8080` будет доступен пользовательский интерфейс системы.
Для того, чтобы посмотреть список доступных эндпойнтов, по адресу `http://localhost:8080/swagger/index.html` реализована
Swagger-документация.
Ниже описаны возможности RESTful API сервера.
### Работа с ресторанами
* `POST /api/v1/restaurants/`: создание ресторана
* `GET /api/v1/restaurants/`: получение списка всех ресторанов
* `GET /api/v1/restaurants/{restaurant_id}`: получение ресторана по его ID
* `PATCH /api/v1/restaurants/{restaurant_id}`: обновление ресторана по его ID
* `DELETE /api/v1/restaurants/{restaurant_id}`: удаление ресторана по его ID
### Работа со столиками в ресторанах
* `POST /api/v1/restaurants/{restaurant_id}/tables`: создание столика в ресторане
* `GET /api/v1/restaurants/{restaurant_id}/tables`: получение всех столиков ресторана
* `GET /api/v1/tables/{table_id}`: получение столика по его ID
* `PATCH /api/v1/tables/{table_id}`: обновление столика по его ID
* `DELETE /api/v1/tables/{table_id}`: удаление столика по его ID
### Работа с бронями
* `POST /api/v1/restaurants/{restaurant_id}/bookings`: создание брони в ресторане
* `GET /api/v1/restaurants/{restaurant_id}/bookings`: получение всех броней, оформленных в ресторане
## Структура
Ниже представлена структура сервиса (по папкам) с кратким описанием.
```
├── cmd основные приложения проекта
│ └── apiserver приложение API сервера
├── configs конфигурационные файлы для различных сред развёртывания
├── docs сгенерированная Swagger-документация
├── dumps дампы базы данных
├── internal внутренний код приложения
│ └── apiserver внутренний код API сервера
│ ├── config работа с конфигурационными данными
│ ├── handler маршрутизация HTTP-запросов
│ ├── model модели/сущности приложения
│ ├── server HTTP-сервер, используемый для обработки запросов
│ ├── service слой бизнес-логики
│ └── store слой хранения данных
├── migrations миграции базы данных
├── pkg внешний код приложения
├── scripts скрипты для операций над сервисом
├── testdata тестовые данные для БД
└── website файлы для веб-сайта
```
Компоновка пакетов в данном проекте осуществлялась в соответствии с популярным макетом организации Go-проектов
– [Standard Go Project Layout](https://github.com/golang-standards/project-layout/blob/master/README_ru.md).
## Зависимости
* Маршрутизация: [chi](https://github.com/go-chi/chi)
* Доступ к базе данных: database/sql (стандартная библиотека)
* Драйвер PostgreSQL: [pq](https://github.com/lib/pq)
* Миграции базы данных: [golang-migrate](https://github.com/golang-migrate/migrate)
* Логгирование: [logrus](https://github.com/sirupsen/logrus)
* Генерация Swagger-документации: [swag](https://github.com/swaggo/swag)