Роли и доступ
- admin: полный доступ, управляет конфигурациями геозон, видит все хабы.
- logist: создает/редактирует маршруты в пределах разрешенных хабов, отправляет на согласование.
- security: просмотр/согласование, может оставлять предложение маршрута.
- user: только для чтения.
- Доступ к данным фильтруется по “hub” (один или список).
Ключевые функции
- Карта:
- Отображение векторных геозон (слои/tilesets) с фильтром по хабам.
- Переключатель “Показать/Скрыть геозоны”, подписи (центроиды) и попап с паспортом поля.
- Украиноязычные подписи базовых слоев.
- Поиск населенных пунктов, переключатель стилей карты.
- Тонкая “сетка дорог” как отдельный слой.
- Маршрут:
- Клик-на-карте добавляет точки; трасса прокладывается по дорогам; разбивка на части.
- Две “линейки” (старт/финиш) для ручных участков, их расстояние добавляется к общему.
- Редактирование: вставить после, удалить точку, очистить маршрут/линейки.
- Подсчет км в реальном времени.
- Импорт/экспорт JSON и KML.
- База маршрутов:
- Сохранение/обновление, предотвращение дубликатов.
- Поиск: префиксный + “содержит” (n-граммы), пагинация/дозагрузка.
- Отображение выбранного маршрута на карте, предварительный просмотр.
- Согласование:
- Статусы draft/pending/approved/rejected, комментарий, ревизии.
- Предложение маршрута от службы безопасности (отдельный оверлей), принять/отклонить.
- Уведомления в интерфейсе (локальные), опционально внешний канал уведомлений.
- Админ-утилиты:
- Редактор конфигурации tilesets (key, url, source-layer, hubs, enabled).
- GeoJSON-Builder: рисование/редактирование полигонов, экспорт; просмотр tilesets как на главной.
Данные и модели (обобщенно)
- БД (документоориентированная или SQL с похожими сущностями):
- routes: { name, fromCode, toCode, fromLabel, toLabel, fromName, toName, routeType, purpose, hub, points[], startRuler[], endRuler[], distance_km, routeKey, approval{}, proposal{}, updatedAt, createdBy…; индексные поля: nameLower, fromLabelLower, toLabelLower, fromNameLower, toNameLower, …Ngrams, searchNgrams }.
- users: { role, allowedHubs[] | all }.
- config/tilesets: массив элементов { key, url, layer, hubs[], enabled }.
- logists: { id, name, active, sort }.
- route_logs: { routeId, type, ts, actor, summary }.
- routeKeys (опционально): { routeId, … } для уникальных кодов маршрутов.
- Объектное хранилище (опционально): geozones/all.geojson (как альтернатива tilesets).
Интеграции (исполнитель выбирает поставщиков)
- Карта: векторные тайлы, стили, геокодирование, построение маршрутов по дорогам.
- Идентификация: email/пароль или другой стандартный провайдер.
- База данных: документы/таблицы с возможностью индексов и поиска префиксом.
- Хостинг статики и CDN.
- Легкий бекенд/API или serverless функции для:
- сохранения маршрута с проверкой токена,
- отправки внешних уведомлений (например, в мессенджер).
- Объектное хранилище (если нужны GeoJSON-файлы).
Нефункциональные требования
- Разграничение доступа по ролям и хабам (чтение/запись/удаление).
- Кеш/офлайн-устойчивость для справочников и списков (по возможности).
- Безопасность: защита от XSS, защищенные заголовки, rate-limit на API, проверка ID токена.
- Производительность: карта плавная на десктопе и мобильных, запросы ленивые, debounce.
- Журналирование изменений маршрутов (короткий и детальный итог изменений).
UI/экраны
- Главная с картой: панель создания, панель базы, панель согласования, доки сверху/снизу.
- Админ: редактор tilesets.
- Админ: GeoJSON-Builder.
- Экспорт/Импорт.
- Страница просмотра маршрута (review) по ссылке.
Поиск и индексы (обобщенно)
- Префиксные индексы: nameLower, fromLabelLower, toLabelLower.
- Дополнительно n-граммы (nameNgrams, fromNgrams, toNgrams, searchNgrams) для contains.
- Фильтр по hub в запросах.
- Нужно описать необходимые индексы для выбранной БД.
Безопасность (обобщенно)
- Никаких секретов в клиентском коде/репозитории.
- Токен карты — публичный, но ограниченный доменами.
- Правила доступа в БД: чтение/запись по ролям и allowedHubs.
- API: проверка ID токена, CORS, Helmet/заголовки, лимиты.
- CSP/Referrer-Policy/HSTS на проде.
Deliverables
- Готовое веб-приложение (статические файлы + минимальный API/функции).
- Документация:
- Схемы данных и перечень индексов.
- Инструкции по развертыванию (локально/прод).
- Описание конфигов (env), токенов и ограничений.
- Набор тестовых данных (несколько маршрутов, tilesets-конфиг).
- Короткое видео или скринкаст флоу: создание → сохранение → поиск → согласование.
Критерии приемки
- Пользователь с ролью logist создает маршрут, сохраняет, подает на согласование; видит только свои хабы.
- admin изменяет конфиг tilesets, сразу видит обновленные слои на карте и в Builder.
- Работает поиск (префикс + contains), просмотр и предварительный просмотр маршрута.
- Предложение от security отображается и может быть принято/отклонено.
- Геозоны скрыты по умолчанию; подписи и попапы работают под фильтром хабов.
Что должно определить/предложить исполнитель
- Конкретных поставщиков: карты (векторные тайлы/маршруты/геокодирование), аутентификация, БД, хостинг статики, серверless/API, объектное хранилище, канал уведомлений.
- План и смету инфраструктуры (бесплатные/платные лимиты).
- Схему деплоя/CI и мониторинг.
- Детали авторизации (сессии, ротация ключей, политика паролей).
Дополнительно (опционально)
- Расширенный аудит безопасности.
- Миграция данных GeoJSON → tilesets.
- Резервирование уникальных кодов маршрутов через транзакции/очереди.
- Темизация UI, локализации.