An open API service indexing awesome lists of open source software.

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

Awesome Lists containing this project

README

          

# Сервис бронирования столиков в ресторанах

[![Go Report Card](https://goreportcard.com/badge/github.com/tmrrwnxtsn/aero-table-booking-api)](https://goreportcard.com/report/github.com/tmrrwnxtsn/aero-table-booking-api)
[![codebeat badge](https://codebeat.co/badges/71e2f5e5-9e6b-405d-baf9-7cc8b5037330)](https://codebeat.co/projects/github-com-tmrrwnxtsn-aero-table-booking-api-master)
[![Go Reference](https://pkg.go.dev/badge/github.com/tmrrwnxtsn/aero-table-booking-api.svg)](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)