diff --git a/README.md b/README.md index bdcc9eb..415886f 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,96 @@ -# 🏢 OfficeSpace - Приложение для бронирования рабочих мест +# НТО 2025. II отборочный этап. Командные задания — Backend Решение +## 📖 Предыстория -### Эндпоинты сервера +В компании S есть возможность бронирования мест в пространствах, предназначенных под общее использование (open-space). На данный момент для бронирования места используются различные способы бронирования, разработанные в каждом офисе индивидуально. +Администрации компании S требуется мобильное приложение, как для рядовых сотрудников, так и для администрации с возможностью просмотра забронированных мест. -| Метод | Путь | Описание | -|-------|------|-----------| -| `GET` | `api/{code}/auth` | Проверка авторизации | -| `GET` | `api/{code}/info` | Получение информации о пользователе | -| `GET` | `api/{code}/booking` | Получение доступных для бронирования мест | -| `POST` | `api/{code}/book` | Создание нового бронирования | +## 📑 Технологический стек -### Примеры ответов +- Java 17 +- Spring Boot +- H2 +- Liquibase -**Информация о пользователе:** -```json -{ - "name": "Иванов Петр Федорович", - "photoUrl": "https://example.com/photo.jpg", - "booking": { - "2025-01-05": {"id": 1, "place": "102"}, - "2025-01-06": {"id": 2, "place": "209.13"} - } -} -``` -**Доступные для бронирования места:** -```json -{ - "2025-01-05": [ - {"id": 1, "place": "102"}, - {"id": 2, "place": "209.13"} - ] -} -``` -**Swagger-ui:** -http://localhost:8080/swagger-ui/index.html#/ +## 🛠️ Техническое задание + +Требуется разработать серверное приложение на Java с использованием Spring Boot, которое работает на основе протокола HTTP и взаимодействует с клиентами благодаря RESTful API. + +Для хранения данных о сотрудниках и их посещениях должна использоваться реляционная база данных (H2). Схема БД должна создаваться liquibase-скриптами. ID-поля всех сущностей, сохраняемых в базе, должны выдаваться на уровне БД. Стратегия генерации ID - автоинкремент (1, 2, 3, 4…) + +Сотрудникам не нужно регистрироваться, все данные в базе должны быть предзаполнены liquibase-скриптами при запуске серверного приложения. Данные для предзаполнения таблиц представлены ниже. + +Картинки для аватаров пользователей не должны храниться в БД. Должны быть сохранены лишь URL-адреса на ресурсы, откуда в последующем мобильное приложение загрузит соответствующее изображение. + +Сервер разрабатывается на основе предоставляемой заготовки проекта. Версии зависимостей и сами зависимости изменяться не должны. + + +## 📂 Правила работы с проектом-заготовкой + +В предоставленном проекте необходимо изучить, но никак не модифицировать, не перемещать и не удалять следующие файлы: +- `pom.xml` +- `application.yml` +- все файлы из `db.changelog` + +Кроме описанных выше файлов, в проекте уже созданы основные классы-сущности и добавлены пустые классы всех слоев. В этих классах необходимо будет написать программный код и добавить аннотации для реализации описанного задания. Наименования классов и прочий код уже написанный в предоставляемом проекте **изменять/удалять не нужно, необходимо их доработать**. Добавлять свои дополнительные классы в проект можно. + +Создание таблиц в БД и предзаполнение их требуемыми данными уже реализовано в заготовке при помощи liquibase. В одной из сущностей добавлены аннотации для реализации связи “один ко многим”, обратите внимание, что в проекте потребуется еще связь данного типа. + + +## 🌐 Где необходимо разместить сервер + +Серверное приложение должно быть разработано и протестировано локально (**не требуется** размещать сервер удаленно и осуществлять его функционирование 24/7). + + +## 📋 Технические требования к серверу и его ответам клиенту + +Для конфигурирования Вашего сервера (его хоста/IP адреса) используйте константы из файла `Constants.kt`. + +| **Тип запроса** | **Путь** | **Описание** | **Параметры/Тело** | **Ответы** | +|-----------------|-----------------------|---------------------------|--------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **GET** | `api//auth` | Проверка авторизации | `` - код для входа | `400` - что-то пошло не так
`401` - кода не существует
`200` - данный код существует - можно пользоваться приложением | +| **GET** | `api//info` | Получение информации о пользователе | `` - код для входа | `400` - что-то пошло не так
`401` - кода не существует
`200` - ОК
{
"name":"Иванов Петр Федорович",
"photoUrl":"",
"booking":{
"2025-01-05": {"id":1,"place":"102"},
"2025-01-06": {"id":2,"place":"209.13"},
"2025-01-09": {"id":3,"place":"Зона 51. 50"}
}
}
| +| **GET** | `api//booking` | Получение доступных для бронирования мест | `` - код для входа | `400` - что-то пошло не так
`401` - кода не существует
`200` - ОК
{
"2025-01-05": [{"id": 1, "place": "102"},{"id": 2, "place": "209.13"}],
"2025-01-06": [{"id": 3, "place": "Зона 51. 50"}],
"2025-01-07": [{"id": 1, "place": "102"},{"id": 2, "place": "209.13"}],
"2025-01-08": [{"id": 2, "place": "209.13"}]
}
**Список дат ограничен текущим + 3 днями** (ответ от сервера содержит 4 дня со свободными местами для каждого) +| **POST** | `api//book` | Создание нового бронирования | `` - код для входа
Тело:
{
“date”: “2025-01-05”,
“placeId”: 1
}
|`400` - что-то пошло не так
`401` - кода не существует
`409` - уже забронировано
`201` - бронирование успешно создано + + +## 📊 Пример данных + +Таблица сотрудников: + +| **id** | **name** | **code** | **photo_url** | +|--------|-----------|---------------------------------|---------------------------------------------------------------------------------------------| +| 1 | Ivanov Ivan | 1111 | https://catalog-cdn.detmir.st/media/2fe02057f9915e72a378795d32c79ea9.jpeg | +| 2 | Petrov Petr | 2222 | https://catalog-cdn.detmir.st/media/2fe02057f9915e72a378795d32c79ea9.jpeg | +| 3 | Kozlov Oleg | 3333 | https://catalog-cdn.detmir.st/media/2fe02057f9915e72a378795d32c79ea9.jpeg | +| 4 | Smirnova Anna | 4444 | https://catalog-cdn.detmir.st/media/2fe02057f9915e72a378795d32c79ea9.jpeg | + + +Таблица мест для бронирования: + +| **id** | **place_name** | +|--------|-----------------| +| 1 | K-19 | +| 2 | M-16 | +| 3 | T-1 | + + +Таблица бронирований: + +| **id** | **date** | **place_id** | **employee_id** | +|--------|-----------|--------------|------------------| +| 1 | 2025-11-08 | 1 | 1 | +| 2 | 2025-11-10 | 2 | 2 | + + +# 📝 Решение + +Работу необходимо осуществлять в предоставленном проекте-заготовке (шаблоне). +Когда завершите разработку, создайте пулреквест и запустите workflow в учебной системе. + + +## ✅ Особенности оценивания + +При тестировании сервера на него поочередно отправляются команды, описанные в API и ожидаются определенные корректные ответы. +Сервер и приложение тестируются независимо. +