183 lines
18 KiB
Markdown
183 lines
18 KiB
Markdown
# Инженерный тур заключительного этапа
|
||
|
||
## 📖 Предыстория
|
||
В компании S есть возможность бронирования мест в пространствах, предназначенных под общее использование (open-space). На данный момент для бронирования места используются различные способы бронирования, разработанные в каждом офисе индивидуально.
|
||
Администрации компании S требуется мобильное приложение, как для рядовых сотрудников, так и для администрации с возможностью просмотра забронированных мест.
|
||
|
||
## 📑 Системные требования к приложению
|
||
- Минимальная версия ОС: Android 9.0 (API 28)
|
||
- Целевая версия ОС: Android 16 (API 36)
|
||
- Работоспособность приложения для платформ: mobile (смартфоны), tablet (планшеты)
|
||
- Поддерживаемая ориентация: portrait (портретная), landscape (альбомная)
|
||
- Поддержка языков: русский, английский
|
||
- Разрешения: доступ к интернету
|
||
|
||
### Технический стек для frontend:
|
||
- Kotlin
|
||
- Ktor
|
||
- MVVM/MVI
|
||
|
||
### Технический стек для backend:
|
||
- Java 17
|
||
- Spring Boot
|
||
- PostgreSQL
|
||
- Liquibase
|
||
- Docker
|
||
- H2
|
||
|
||
### Технический стек и платформы для дизайнеров:
|
||
- PenPot
|
||
- Material Design
|
||
- Compose
|
||
- Auto Layout
|
||
- Interactive Prototypes
|
||
|
||
## 📂 Оцениваемые артефакты работы
|
||
- Репозиторий команды клиентской части приложения в Gitea.
|
||
- Репозиторий команды серверной части приложения в Gitea.
|
||
- Файл доски с макетом клиентской части приложения в разделе Releases репозитория команды на Gitea. Файл должен быть с расширением .penpot.
|
||
- Релизный APK-файл приложения в разделе Releases репозитория команды на Gitea.
|
||
- FatJar-файл для запуска серверного приложения для заданий: 0, 1 и 2. FatJar-файл необходимо разместить в разделе Releases репозитория команды на Gitea.
|
||
На 3-ем задании необходимо добавить Docker-файл для приложения и Docker-compose (с двумя контейнерами: PostgreSQL и само серверное приложение), с помощью которого можно развернуть и запустить серверную часть.
|
||
|
||
**Важно**: если серверное приложение переведено на PostgreSQL, то наличие Docker-compose обязательно.
|
||
|
||
|
||
Описанные выше артефакты оцениваются на каждом чекпоинте. APK-файл и JAR-файл должны иметь следующее имена: Client_vN.apk и Server_vN.jar, где N — номер Чекпоинта.
|
||
|
||
## ❗️ Чекпоинты
|
||
Чекпоинт — фиксированный момент времени, в который начинается техническая экспертиза решения задания инженерного тура.
|
||
|
||
Каждый чекпоинт содержит описание функциональности, которую необходимо реализовать участникам.
|
||
|
||
Расписание чекпоинтов представлено ниже:
|
||
|
||
**Чекпоинт 0 — 24.02 в 19:00**
|
||
|
||
**Чекпоинт 1 — 25.02 в 14:00**
|
||
|
||
**Чекпоинт 2 — 25.02 в 19:00**
|
||
|
||
**Чекпоинт3 — 26.02 в 14:30**
|
||
|
||
## 🛠 Техническое задание
|
||
Требуется доработать нативное мобильное приложение, выполненное в рамках второго отборочного этапа.
|
||
|
||
Ссылки на проекты-заготовки:
|
||
|
||
Клиентская часть: https://gitnto.innovationcampus.ru/NTO-2026/NTO-2026-Android-TeamTask-Template
|
||
|
||
Серверная часть: https://gitnto.innovationcampus.ru/NTO-2026/NTO-2026-Backend-TeamTask-Template
|
||
|
||
|
||
Верстка приложения должна полностью соответствовать макетам в PenPot. Соответствие макетам является обязательным и оценивается на каждом чекпоинте. В PenPot необходимо отдельно оформить палитру цветов, используемые шрифты и типографику, типы кнопок во всех состояниях, поля ввода во всех состояниях, а также элементы навигации.
|
||
|
||
Приложение должно поддерживать дневную и ночную темы.
|
||
|
||
Интерфейс обязан корректно адаптироваться к динамическому изменению ширины экрана и перестраивать компоновку без потери состояния. Состояние экранов и пользовательский ввод должны сохраняться при повороте устройства.
|
||
|
||
## Задание 0. Развертывание исходных данных (~2 часа)
|
||
**Дедлайн сдачи артефактов: 24.02 в 19:00**
|
||
|
||
Цель: настроить среду для последующей работы.
|
||
|
||
Необходимо создать форки исходных репозиториев-заготовок в организации вашей команды в Gitea, а затем собрать все необходимые артефакты для оценивания работы.
|
||
|
||
На доске в PenPot необходимо отдельно оформить палитру цветов, используемые шрифты и типографику (UI Kit).
|
||
|
||
## Задание 1. Усиливаем безопасность (~3 часа)
|
||
**Дедлайн сдачи артефактов: 25.02 в 14:00**
|
||
|
||
Цель: повысить безопасность системы авторизации, поскольку приложение в будущем будет опубликовано для широкой аудитории.
|
||
|
||
Требования:
|
||
|
||
- Заменить текущую систему ввода кода на логин и пароль.
|
||
- Имплементировать один из протоколов авторизации (OAuth, CAS или т.п.)
|
||
- Новый алгоритм авторизации должен быть поддержан во всем функционале приложения.
|
||
- Предусмотреть возможность обработки ошибок во время авторизации, таких как отсутствие интернета у устройства и т.п.
|
||
- Предусмотреть все состояния UI: пустые поля, ошибки валидации, ошибка "Неверный логин/пароль", состояние загрузки при запросе к серверу, состояние блокировки после 5 неудачных попыток.
|
||
- Хранить авторизационные данные в защищенном хранилище или зашифрованном виде.
|
||
- Предотвратить перебор логина и пароля на стороне клиента (уменьшить вредоносный трафик). Перебором считается ввод неверных данных более 5 раз. Добавить визуальную обратную связь пользователю при зафиксированном переборе пароля.
|
||
- На уровне ОС ограничить возможность записи экрана и создания скриншотов (при поддержке ОС).
|
||
- Доработать UI Kit.
|
||
|
||
Ограничения:
|
||
|
||
- Логин должен включать в себя следующий набор символов: .; a-z; A-Z; 0-9;
|
||
- Пароль должен:
|
||
- состоять не менее чем из 8 символов;
|
||
- не повторять один и тот же символ 3 и более раз;
|
||
- содержать не менее 1 спецсимвола;
|
||
- не содержать в себе 3 и более символа из логина. Например, если логин user, то пароль не может содержать следующий набор символов: use, Use, ser, sEr и тп. Регистр значения не имеет.
|
||
|
||
Поощряется добавление любых иных мер, усиливающих безопасность учетной записи.
|
||
|
||
**Для прохождения на код-ревью, в приложение должны выполняться следующие сценарии:**
|
||
- Корректная работа без интернета
|
||
- Ввод неверных данных
|
||
- Успешный вход
|
||
|
||
|
||
## Задание 2. Режим работы “Комната для переговоров” (~4 часа)
|
||
**Дедлайн сдачи артефактов: 25.02 в 19:00**
|
||
|
||
Предыстория:
|
||
|
||
На текущем этапе компания принимает решение установить специальные устройства непосредственно у переговорных комнат — планшеты, которые будут служить отдельной точкой доступа к системе бронирования.
|
||
Цель установки таких устройств — упростить и ускорить процесс резервирования переговорных комнат для сотрудников прямо на месте, без необходимости использования мобильных телефонов или компьютеров. Такие устройства предназначены показать расписание переговорки в реальном времени и дать возможность мгновенно забронировать комнату на оставшееся время текущего дня, если она свободна.
|
||
Новые устройства работают в режиме специальной роли — «Комната для переговоров». При этом их функционал ограничен по сравнению с мобильным приложением и ориентирован именно на просмотр расписания и быструю бронь.
|
||
|
||
<img src="./img/room.png" alt="drawing" width="400"/>
|
||
<img src="./img/pad.png" alt="drawing" width="400"/>
|
||
|
||
|
||
|
||
Цель: реализовать новую роль устройства — «Комната для переговоров», предназначенную для устройств, расположенных непосредственно у переговорных комнат. Эта роль должна позволять просматривать расписание переговорной комнаты и быстро бронировать её на остаток текущего дня при условии, что переговорка свободна.
|
||
|
||
Требования:
|
||
- Реализовать новую роль “Комната для переговоров”:
|
||
- Добавить в систему новую роль — «Комната для переговоров». Пользователи, обладающие этой ролью, будут иметь ограниченный набор разрешённых действий и уникальный интерфейс, отличающийся от ролей обычных сотрудников.
|
||
- Обеспечить разграничение прав и функционала приложения в зависимости от роли пользователя, сохраняя при этом существующую структуру ролей и добавляя новую роль «Комната для переговоров» без нарушения текущей логики.
|
||
- Реализовать просмотр расписания переговорной комнаты:
|
||
- На экране устройства должен отображаться актуальный календарь бронирований текущей переговорной комнаты на сегодня и ближайшие 3 дня.
|
||
- Интерфейс должен быть максимально информативным и обновляться автоматически с заданной периодичностью (например, раз в 1 минуту или мгновенно, при использовании сокетов).
|
||
- Добавить функцию мгновенного бронирования:
|
||
- В случае, если переговорная комната свободна на остаток текущего дня, должно быть доступно мгновенное бронирование до конца этого дня.
|
||
- Кнопка «Забронировать» должна быть явной и активной только если помещение сейчас свободно. Бронирование возможно только на текущее дату.
|
||
- При нажатии на кнопку происходит мгновенное бронирование на пользователя данной комнаты через API, и обновление интерфейса. В случае, если комната уже забронирована - выводится соответствующее сообщение.
|
||
- Кнопка “Освободить” должна быть явной и активной только если помещение сейчас забронировано и занято. По нажатию на данную кнопку текущая бронь удаляется.
|
||
- Обработать ошибки. В случае отсутствия связи с сервером или ошибок при бронировании, интерфейс должен отображать соответствующее сообщение об ошибке и при этом сохранять доступ к просмотру расписания.
|
||
- Адаптировать интерфейс. Необходимо учесть, что рядом с кабинетами зачастую расположены планшеты в альбомной ориентации.
|
||
|
||
**Для прохождения на код-ревью, в приложение должны выполняться следующие сценарии:**
|
||
- Работа без интернета
|
||
- Ввод неверных данных
|
||
- Успешный вход
|
||
- На экране отображается и обновляется в течение 1 минуты статус бронирования комнаты
|
||
- Существуют и работают кнопки действий (забронировать и освободить)
|
||
- На экране отображается расписания комнаты
|
||
|
||
## Задание 3. Доработка функционала
|
||
Требуется обеспечить полную реализацию и верификацию всех заявленных на предыдущих этапах задач.
|
||
|
||
### ⚠️ КРИТИЧЕСКОЕ ТЕХНИЧЕСКОЕ ТРЕБОВАНИЕ ⚠️
|
||
|
||
**ОБЯЗАТЕЛЬНО ЗАМЕНИТЕ IP-АДРЕС И ПОРТ В ИСХОДНОМ КОДЕ НА АКТУАЛЬНЫЕ ЗНАЧЕНИЯ. ОТСУТСТВИЕ ДАННЫХ ИЗМЕНЕНИЙ ПРИВЕДЕТ К НЕВОЗМОЖНОСТИ ПОДКЛЮЧЕНИЯ К СИСТЕМЕ.**
|
||
|
||
### ❗️ В разделе Releases необходимо загрузить следующие артефакты❗️
|
||
|
||
- APK-файл (для тестирования клиентской части на мобильных устройствах).
|
||
- FatJAR (для запуска серверной части приложения).
|
||
- Файл проекта Penpot (**обязательно с расширением .penpot, а не ссылкой**).
|
||
|
||
🔐 Для обеспечения возможности тестирования вашего продукта необходимо предоставить учетные данные (логин и пароль). Данная информация должна быть размещена одним из следующих способов:
|
||
- В файле README;
|
||
- В описании релиза.
|
||
|
||
**😡 При отсутсвии каких-либо материалов — балл за чекпоинт равен 0.**
|
||
|
||
Взлетаем🚀
|
||
|
||
<img src="./img/experts.jpeg" alt="drawing" width="400"/>
|