Skip to content

Latest commit

 

History

History
325 lines (225 loc) · 21.3 KB

technical_requirements.md

File metadata and controls

325 lines (225 loc) · 21.3 KB

1. Цель проекта

Цель проекта — разработать систему донатов для авторов (далее Система). Автор сможет создавать в Системе разные типы подписок, управлять их стоимостью, а также выкладывать контент для разных типов подписок. Помимо этого в Системе должна быть предусмотрена интеграция с Telegram чатом, в котором могут находиться только подписчики с определённым уровнем подписки.

2. Описание системы

Система состоит из следующих основных функциональных блоков:

  1. Регистрация, аутентификация и авторизация
  2. Функционал для автора
  3. Функционал оплаты подписки или разового платежа и главной страницы
  4. Функционал для подписчика
  5. Функционал интеграции с Telegram
  6. Уведомления о новых постах

2.1. Типы пользователей

Система предусматривает два типа пользователей системы: автор и подписчик. Автор создаёт подписки и выкладывает контент, подписчики в соответствии со своим уровнем подписки получают доступ к разрешённому для них контенту и возможно Telegram чату.

2.2. Регистрация

Система, как минимум в своей первой версии, не предполагается как SaaS для разных Авторов. Одна конкретная инсталляция Системы привязана к одному конкретному автору/проекту/каналу. При этом за счёт открытого исходного кода Систему может скачать и развернуть любой желающий.

Таким образом, ведение разных каналов/авторов в рамках одной инсталляции Системы пока не подразумевается.

Процесс заведения автора в инсталляции Системы может быть реализован в первой версии не в интерфейсе Системы, а при помощи команды на сервере, это допускается. Этой команде заведения автора должны быть переданы на вход следующие данные:

  • email — обязательное поле
  • пароль — обязательное поле

Процесс заведения автора через команду на сервере должен быть описан в документации Системы.

Процесс регистрации подписчиков, конечно, должен быть реализован в интерфейсах Системы. При регистрации подписчика должны быть запрошены следующие поля:

  • email — обязательное поле
  • имя и фамилия — обязательное поле
  • телефон — опциональное поле

После отправки формы регистрации подписчика ему на email приходит письмо с первым кодом, по которому он может войти. Аутентификация будет происходить по разовым кодам, приходящим на email.

2.3. Аутентификация автора и подписчиков

Аутентификация автора и подписчиков осуществляется по email и одноразовому паролю (или по одноразовой ссылке), который приходит на этот email (как реализовано при входе в Skype у Microsoft).

2.4. Функционал для автора

Автор после аутентификации (ввода логина и пароля) получает доступ к своему автороскому функционалу в Системе. Этот функционал состоит из следующих блоков:

  1. Редактирование данных профиля
  2. Заведение и редактирование типов подписок
  3. Заведение и редактирование контента
  4. Заведение и редактирование целей
  5. Рассылки
  6. Аналитика

2.4.1. Редактирование профиля

В этом разделе у автора есть возможность редактирования данных своего профиля — email, название проекта, описание проекта, соц сети. Возможные соц сети:

  • YouTube
  • Instagram
  • Facebook
  • VK
  • Linkedin
  • Twitch

Должна быть возможность сменить пароль, подтвердив свой старый пароль.

Если дизайн Системы будет подразумевать какие-то изображения для кастомизации страницы Системы, то эти изображения тоже должны редактироваться из профиля автора.

2.4.2. Заведение и редактирование типов подписки

По каждому типу подписки задаются:

  • название подписки
  • описание подписки
  • возможно — обложка подписки для использования где-то в дизайне покупки той или иной подписки
  • стоимость ежемесячной подписки в рублях
  • доступ в Telegram для этой подписки — для некоторых типов подписки будет доступен чат в Telegram

Должна быть возможность (опциональная) задать скидки за покупку подписки на 3, 6 и 12 месяцев. Скидка задаётся в рублях за это покупаемое количество месяцев.

2.4.3. Заведение и редактирование контента

Контент, публикуемый автором, может представлять собой форматированный текст с возможность, как миниум, выделения текста жирным, курсивом, подчеркнутым, перечеркнутым. Возможно стоит добавить возможность создания заголовков разного размера для структурирования длинного текстового контента.

Должна быть возможность добавления списков и изображений в контент поста, а также возможность прикрепления файлов.

У каждого поста должен быть заголовок.

Должна быть возможность создать тизер поста — обложку и текст описания о том, что находится в этому посте. Этот тизер будет виден гостям (не прошедшим аутентификацию пользователям Системы), а также тем, чьего уровня подписки не хватает для просмотра поста.

Также для каждого поста должен быть задан уровень подписки, при которой этот пост можно читать. Помимо платных уровней подписки должен быть виден уровень подписки «открыт для всех» — такие открытые для всех посты будут видны всем пользователям Системы, в том числе не прошедшим аутентификацию гостям.

Также для поста должна быть возможность задать отдельную цену. То есть некоторые посты могут быть куплены только отдельно за единичный платёж или могут быть и куплены отдельны, и быть доступны в составе одной из подписок.

Частями поста является сам контент и тизер. Тизер — это то, что видит на главной странице как тот, кто имеет доступ к посту, так и тот, кто не имеет доступ к посту. По клику на тизер открывается пост и у того, кто имеет доступ к посту.

В сам контент может вставляться: текст с форматированием (заголовки, жирный, курсивный, перечеркнутый текст), изображения (загружаются с компьютера), видео с YouTube (показываются в стандартном встроенном YouTube плеере), аудио (загружаются с компьютера, проигрываются во строенном в Систему аудио плеере, поддерживается только MP3 формат). Также должна быть возможность прикрепить произвольный загруженный с компьютера файл — для подписчиков он будет отображаться как ссылка на загрузку этого файла.

2.4.4. Заведение и редактирование целей

Автор может осуществлять в Системе сбор на какую-то цель. Для этого он создаёт (и может отредактировать впоследствии) цель, в рамках которой задаётся:

  • описание цели — небольшой текст с описанием того, на что собираются деньги
  • сумма к сбору в рублях

На публичной странице цель отображается с описанием и текущим прогрессом например, «107 775 из 130 000 руб. собрано»

Целей может быть несколько. Оплата цели — это разовый платёж, не рекуррентный, то есть не списывающийся ежемесячно.

2.4.5. Рассылки

Автор может осуществлять email рассылки из Системы. Задаётся текст письма, редактор аналогичен тому, что используется при создании постов, выбирается, кому отправить письмо — бесплатным подписчикам или подписчикам какого-то уровня или всем. Можно выбрать несколько вариантов, например, бесплатным подписчикам и подписчикам такого-то уровня.

2.4.6. Аналитика

Автор видит следующую аналитику:

  1. Абсолютное и относительное количество подписчиков в разных уровнях подписки. Возможно в виде диаграмы pie-chart.

  2. Платежи — списком, плюс экспорт в Excel всех платежей. Колонки: дата-время платежа, сумма платежа, период (для подписок, а не разовых платежей), подписчик — id (это длинный хеш из 32 символов, можно показывать по наведению мыши), имя, email.

2.5. Функционал оплаты подписки или разового платежа и главной страницы

Главная страница Системы — это список постов автора. Есть смотрит гость, то он видит только тизеры постов и посты, открытые для всех. На этой же странице видны возможные варианты подписки — с названием каждой подписки, описанием её, возможностью доступа в Telegram чат и ценой. Рядом с каждым типом подписки — кнопка Подписаться, ведущая на интерфейс входа или регистрации подписчика и последующей оплаты.

Рядом с каждым тизером скрытого поста должен отображаться необходимый для просмотра поста уровень подписки — или возможность купить этот отдельный пост за выставленную для него цену.

Пагинация постов осуществляется кнопкой «Показать ещё» внизу под уже показанными постами. Нажатие этой кнопки приводит к подгрузке и отображению более старых постов. Новые посты показываются сверху, старые — снизу.

Также должна быть возможность ставить лайки постам — возможность доступна только подписчикам. Количество лайков видно всем.

Должна быть возможность подписаться без оплаты. Таким людям будут приходить апдейты на почту.

При оплате подписки должна быть возможность оплатить сразу за 3, 6 или 12 месяцев (автор может настроить скидки на такие платежи).

Количество подписчиков должно показываться общим числом (и платные, и бесплатные) где-то на той же главной странице Системы.

У каждого поста должна быть своя постоянная ссылка, которую можно куда-то себе сохранить. Идентификатор поста, зашитый в ссылке, должен представлять собой UUID, не int число, чтобы нельзя было понять количество постов в системе.

2.5.1. Рекуррентные платежи

Рекуррентные платежи должны списываться через 30 дней после предыдущей оплаты. Если снять платёж не удалось — в течение ближайших 5 дней должна осуществляться ежедневная попытка списать сумму. В течение этих 5 дней доступ сохраняется, а подписчик получает после каждой неуспешной попытки письмо на email. После успешного снятия суммы за подписку подписчик также получает письмо на email.

После 5 дней неуспешных попыток списать сумму подписка останавливается и подписчик теряет доступ к постам и возможно Telegram чату (если чат входил в его подписку).

Шаблоны писем не редактируется в интерфейсах Системы, жёстко зашиты в самой системе и их можно отредактировать только изменяя эти шаблоны в коде Системы.

2.6. Функционал для подписчика

Подписчик может смотреть посты и ставить им лайки, а также повышать свой уровень подписки и покупать отдельным платежом посты, не входящие в его подписку.

Комментариев под постами не подразумевается. Шеринг постов не подразумевается как отдельная кнопка — кто хочет пошерить, сделает это путём публикации ссылки. Можно отдельно показать только избранные посты.

Каждый пост можно добавить в избранное. В разделе избранное у подписчика должна быть возможность создавать тематические списки. При добавлении поста в избранное показать чек-боксами эти списки, в этот момент подписчик может сразу поместить пост в один из них.

Также у подписчика должна быть возможность на странице своего профиля отредактировать его данные (email, сменить пароль) и отменить подписку, что приведёт к остановке рекуррентных ежемесячных платежей и после даты окончания оплаченного периода подписчик становится бесплатным подписчиком.

В профиле должна быть возможность отключить email сообщения от системы.

2.7. Функционал интеграции с Telegram

Система должна управлять подписчиками в одном конкретном чате. После того, как у подписчика закончилась подписка, у него должен пропасть доступ и к чату.

Доступ к чату будет не на всех подписках, это конфигурируется автором в интерфейсе заведения и редактирования подписок.

2.8. Уведомления о новых постах

Автоматически подписчикам должны приходить уведомления на Email о всех новых постах автора в Системе. Подписчики могут отменить эти и другие письма настройкой в профиле.

3. Предлагаемый стек технологий

Для реализации системы предлагается следующий стек технологий:

  • Бэкенд:
    • Язык Python
    • Фреймворк FastAPI
    • БД PostgreSQL
    • SQLAlchemy ORM
    • Alembic для миграций
    • Aiogram для интеграции с Telegram
  • Фронтенд:
    • React
    • TypeScript

Для интернет-эквайринга рассматриваются Тинькофф и CloudPayments, в ходе проекта надо сравнить технические возможности платформ и комиссии за платежи. Важно иметь возможность оплаты с Google Pay и Apple Pay, в том числе рекуррентные платежи (если Google Pay и Apple Pay позволяют такое делать, уточнить в ходе проекта). Важно открыть в эквайринге другие страны для возможности приёма оплаты не только из РФ, но и из стран СНГ и других стран. Обсудить это в ходе проекта с эквайрингом.

Хранение файлов и изображений, загружаемых автором, должно осуществляться в S3-совместимом хранилище.

4. Требования к дизайну

Минимализм, лаконичность, акцент на контент. Белый фон. Должен присутствовать логотип Системы где-то на странице. Логотип надо разработать в рамках этого проекта.

В нижней части страницы (в подвале) должно быть написано:

«Работает на Open Source» со ссылкой на GitHub проекта.