ocr-voronezh.ru: платформа для спортивного сообщества
Сделал в одиночку платформу записи на тренировки для сообщества OCR Voronezh. С 1 сентября ей пользуются около 300 атлетов.
Я давно тренируюсь с ребятами из OCR Voronezh. Это сообщество людей, которые бегают гонки с препятствиями и вместе готовятся к стартам. Тренировки собирались в чатах: тренер пишет время и место, все отвечают плюсиками, а дальше как повезёт. Кто-то не приходил, кто-то приходил сверх лимита, детей записывали родители в личных сообщениях.
Мне захотелось сделать для друзей нормальный инструмент, и я сделал ocr-voronezh.ru. Он работает с 1 сентября, сейчас там около 300 атлетов. Продукт, интерфейс, бэкенд, инфраструктуру и релизы я делал один.
Под капотом React и TypeScript на фронтенде, Node.js на бэкенде и serverless-сервисы Yandex Cloud. Я выбрал serverless сознательно: в будни нагрузки почти нет, а в субботу утром все разом записываются на тренировки, и платить за простаивающие серверы ради этих пиков не хотелось. Инфраструктура описана в Terraform, тест и прод разделены. Каждый релиз сначала проходит автотесты на тестовом окружении и только потом уходит в прод, а если что-то пошло не так, откатывается сам. Когда системой каждый день пользуются знакомые тебе люди, ронять её неловко.
Войти можно через Яндекс ID в один клик. Если человек раньше зарегистрировался по почте, вход через Яндекс привяжется к его профилю, второй аккаунт не появится.
Ролей три: атлет, тренер и админ. Атлет записывается на тренировки и встаёт в лист ожидания, если мест нет. Тренер ведёт своё расписание, включая регулярные серии вроде «вторник и четверг до конца декабря», видит, кто придёт, и публикует новости. Админ управляет тренерами и может разом передать все занятия одного тренера другому. Права проверяются на сервере, а если у человека забрали роль, это срабатывает сразу, без ожидания, пока истечёт его сессия.
Дольше всего я думал над детьми, потому что детская группа в сообществе большая. Отдельной роли «родитель» я заводить не стал. Родитель здесь обычный атлет, который добавил детей в свой профиль, и аккаунт ребёнку не нужен. При записи он выбирает, кого записать: себя или ребёнка. Если мест нет, ребёнок встаёт в очередь и попадёт в список, как только кто-то откажется. Тренер видит имя ребёнка и телефон родителя, раньше это выяснялось в личке. Согласия на обработку данных и на фото оформлены по 152-ФЗ, причём согласие на съёмку даётся на каждого ребёнка отдельно.
Больше всего мне нравится, как получилось с Telegram. У сообщества два канала, и тренеры привыкли писать туда. Просить их дублировать посты на сайте было бы бесполезно, поэтому сайт сам забирает новые посты из каналов и показывает их в ленте вместе с фото. Тренеры пишут туда же, куда и раньше. Только теперь у фразы «завтра в 19:00 функционалка» есть лимит мест и список участников.
Сайт: ocr-voronezh.ru. Каналы сообщества: @heroleaguetraining_vrn и @gonka_titanov_vrn.