Две стороны одного голосования
Участнику нужно выбрать номинанта в нужной номинации и увидеть свой голос. Организатору — вести номинации и номинантов, задавать период голосования и получать статистику.
Эти действия связаны: система должна сохранить и учесть голос участника, а организатору — показать статистику по номинациям и номинантам. Сервер проверяет правила голосования перед сохранением выбора.
Мой вклад
Я разработал интерфейс участника, серверную часть, хранение голосов и интеграцию с Telegram Bot API. Связал интерфейс, сервер, хранение данных и интеграцию с Telegram: участник делает выбор, сервер проверяет правила и сохраняет голос, интеграция проверяет подписку на обязательные каналы. Сохранённые голоса учитываются в статистике организатора.
Как проходит один голос
- Вход через Telegram. Участник открывает приложение, а сервер проверяет данные запуска и связывает действия с его Telegram-аккаунтом.
- Номинация и текущий выбор. Участник открывает номинацию, видит доступных номинантов и собственный текущий голос. Он выбирает, кого поддержать.
- Проверка подписки. В пользовательском сценарии предусмотрена проверка подписки на обязательные каналы через Telegram Bot API.
- Проверка правил голосования. Сервер проверяет период голосования, активность номинации и принадлежность номинанта к ней. Если голос уже есть, учитывает, разрешено ли менять выбор.
- Сохранение и учёт голоса. Система сохраняет текущий выбор и обновляет счётчик номинанта. После успешного ответа участник видит обновлённые данные номинации и свой голос.
Сервер проверяет, допустим ли выбор, прежде чем сохранить голос. Сохранённые голоса учитываются в статистике по номинациям и номинантам, которую организатор просматривает в отдельной веб-панели.
Сменить выбор — не добавить ещё один голос
В приложении также предусмотрены отмена голоса и переголосование. Возможность сменить выбор зависит от настроек голосования.
Проверка подписки через Telegram
Сведения о подписке находятся вне платформы. Чтобы проверить обязательные каналы, сервис обращается к Telegram Bot API и получает статус членства аккаунта.
Успешный результат может повторно использоваться в течение пользовательской сессии: проверка не выполняется заново при каждом сохранении голоса. Она помогает включить условие подписки в сценарий участия, но не является полной защитой от накрутки. Связь с Telegram-аккаунтом также не удостоверяет, что за каждым аккаунтом стоит отдельный человек.
Отдельные инструменты организатора
Для управления предусмотрена отдельная веб-панель со своим входом. В ней организатор работает с номинациями и номинантами, меняет настройки и просматривает статистику. Административные экраны не встроены в участнический Mini App.
На серверной стороне предусмотрено управление номинациями, номинантами и обязательными каналами, периодом голосования, разрешением смены выбора и видимостью результатов. Эти настройки определяют правила процесса; состав элементов веб-панели и серверных возможностей при этом различается.
Так участник сосредоточен на выборе, а организатор — на ведении голосования. Для просмотра статистики не нужно превращать пользовательский экран в административный.
Статистику по номинациям и номинантам можно выгрузить из панели в CSV и дальше работать с ней в табличном виде.
Результат
Получился связанный сценарий голосования: участник голосует в Telegram Mini App, система сохраняет и учитывает его голос, а организатор получает статистику по номинациям и номинантам. Отдельная веб-панель даёт инструменты управления голосованием и выгрузку статистики в CSV.
Этот проект показывает мой опыт соединения пользовательского интерфейса, серверных правил, хранения данных и внешней интеграции для одной задачи — принять и учесть голоса участников и предоставить организатору статистику.
Подтверждённых замеров экономии времени, вовлечённости или финансового эффекта для этого кейса у меня нет.
Технологии
React, TypeScript, Telegram Mini App, FastAPI, SQLAlchemy, Telegram Bot API.