Бот

Техническое задание — MVP

Маркетплейс картин: доска объявлений с комиссией, платными объявлениями и подписной моделью для авторов

Содержание

  1. Цель и описание MVP
  2. Роли пользователей
  3. Нефункциональные требования
  4. KPI запуска
  5. User Stories
  6. API-контракты
  7. Модель данных (ERD)
  8. Юридические требования

1. Цель и описание MVP

MVP представляет собой доску объявлений и мини-маркетплейс для продажи картин и художественных работ. Платформа позволяет авторам размещать работы на продажу, а покупателям — находить и приобретать картины с защитой транзакций через эскроу-платежи. Монетизация осуществляется через комиссию с продаж, платные объявления (выделение в поиске) и подписную модель для авторов с расширенными возможностями.

Ключевые принципы: простота публикации (до 5 минут на объявление), безопасные платежи (эскроу до подтверждения получения), соблюдение законодательства РФ (ФЗ-152, оферта, правила ОРИ при наличии переписки).

2. Роли пользователей

👁️
Гость
👤
Пользователь
(покупатель)
🎨
Продавец
(автор)
🛡️
Модератор
⚙️
Админ
📋
Бухгалтер
/ Юрист
РольПрава
ГостьПросмотр объявлений, поиск, фильтрация, регистрация
ПользовательПрофиль, адреса доставки, способы оплаты, покупки, отзывы, жалобы
ПродавецВсе права пользователя + создание объявлений, управление витриной, вывод средств, статистика
МодераторМодерация объявлений, обработка жалоб, блокировка контента
АдминПолный доступ: пользователи, выплаты, настройки комиссий, отчёты
Бухгалтер/ЮристПросмотр транзакций, актов, юридических документов (read-only + экспорт)

3. Нефункциональные требования

  1. HTTPS обязательно на всех страницах и API-endpoints
  2. Соответствие ФЗ-152: согласие на обработку ПДн при регистрации, политика конфиденциальности, право на удаление данных
  3. Локализация БД на территории РФ (при использовании российских платёжных провайдеров — требование ЦБ)
  4. Защита от XSS, CSRF, SQL-инъекций; параметризованные запросы, CSP-заголовки
  5. Согласия в стиле GDPR для международных пользователей (cookie-баннер, право на портативность данных)
  6. SSR для публичных страниц (SEO, индексация объявлений)
  7. Время отклика API: p95 менее 500 мс для основных операций
  8. Доступность: WCAG 2.1 AA (контрастность, alt-тексты, навигация с клавиатуры)
  9. Автоматическое резервное копирование БД: ежедневные бэкапы с хранением 30 дней
  10. Горизонтальное масштабирование: stateless API, контейнеризация (Docker)

4. KPI запуска (первые 3 месяца)

1 000
регистраций
100
платных объявлений
50
покупок
15%
конверсия в покупку

5. User Stories

Authorization / Users

P0
US-01: Как гость, я могу зарегистрироваться по email и через соцсети (VK, Google), чтобы получить аккаунт на платформе.
P0
US-02: Как пользователь, я могу восстановить пароль по email/SMS, чтобы вернуть доступ к аккаунту.
P1
US-03: Как пользователь, я могу включить двухфакторную аутентификацию для защиты аккаунта.

Profiles

P0
US-04: Как продавец, я могу создать профиль: ФИО/ник, фото, описание, контакты, реквизиты для вывода средств.
P0
US-05: Как покупатель, я могу хранить адреса доставки и привязанные способы оплаты (через платёжного провайдера, без хранения PAN).

Listings / Объявления

P0
US-06: Как продавец, я могу создать объявление: заголовок, описание, категория, цена, несколько фото, состояние, авторские права (чекбокс), варианты доставки, тип продажи (прямая/торг).
P0
US-07: Как гость/покупатель, я могу просматривать объявления и фильтровать по категории, цене, городу и тегам.
P1
US-08: Как продавец, я могу выделить объявление платной услугой для показа вверху результатов.

Search & Navigation

P1
US-09: Полнотекстовый поиск по объявлениям с поддержкой фильтров, сортировки, пагинации и тегов.

Payments & Orders

P0
US-10: Как покупатель, я могу оплатить товар картой/СБП/наложенным платежом; платформа удерживает комиссию и переводит остаток продавцу после подтверждения доставки.
P0
US-11: Как продавец, я могу запросить вывод средств на привязанный кошелёк/банковский счёт после получения оплаты.
P0
US-12: Админ может просматривать все транзакции, инициировать возврат и разрешать споры.

Content Moderation

P0
US-13: Объявления проходят модерацию: статусы draft → pending → published → blocked. Флаг авторских прав, жалобы, лог действий модератора.

Notifications & Messaging

P1
US-14: Email-уведомления: регистрация, покупка, комментарий, статус заказа. Внутренняя форма контакта между покупателем и продавцом (с учётом требований ОРИ).

Analytics for Authors

P2
US-15: Продавец видит статистику: просмотры, обращения, продажи, доходы за период.

Admin Panel

P0
US-16: Управление пользователями, объявлениями, выплатами, платными услугами, отчёты и настройки комиссий.

Legal / Docs

P0
US-17: Страницы: Оферта, Политика конфиденциальности, Правила публикации, Cookie-Notice; согласие пользователя при регистрации.

6. API-контракты

Auth

POST/api/auth/register
Регистрация нового пользователя
In: {email, password, name, captcha, ref} → Out: 201 {user, token}
POST/api/auth/login
Авторизация
In: {email, password} → Out: 200 {token, refreshToken, user}
POST/api/auth/refresh
Обновление JWT-токена
In: {refreshToken} → Out: 200 {token}
POST/api/auth/reset-password
Запрос на сброс пароля
In: {email} → Out: 200 {ok}
GET/api/auth/me
Текущий пользователь (JWT)
Out: 200 {user}

Users

GET/api/users/{id}
Профиль пользователя
Out: 200 {profile}
PATCH/api/users/{id}
Обновление профиля (RBAC: владелец или админ)
In: {name, bio, photo, payoutDetails} → Out: 200 {profile}

Listings

POST/api/listings
Создание объявления
In: {title, description, price, currency, photos[], category, tags[], delivery_options, visibility} → Out: 201 {listing}
GET/api/listings
Список объявлений с фильтрами
Query: q, category, min_price, max_price, city, tag, sort, page, per_page → Out: 200 {items[], meta}
GET/api/listings/{id}
Детали объявления
Out: 200 {listing}
PATCH/api/listings/{id}
Редактирование объявления
In: {title, description, price, ...} → Out: 200 {listing}
DELETE/api/listings/{id}
Удаление объявления
Out: 204

Orders / Payments

POST/api/orders
Создание заказа и инициация платежа
In: {listing_id, buyer_id, delivery_option, payment_method} → Out: 201 {order, payment_url}
POST/api/payments/webhook
Webhook от платёжного провайдера
In: {event, payment_id, status, ...} → Out: 200 {ok}
GET/api/orders/{id}
Статус заказа
Out: 200 {order, payment_status}
POST/api/orders/{id}/dispute
Открытие спора
In: {reason, description} → Out: 201 {dispute}

Payouts

POST/api/payouts/request
Запрос на вывод средств
In: {seller_id, amount, payout_method, details} → Out: 201 {payout}
GET/api/payouts
История выплат продавца
Out: 200 {items}

Admin

GET/api/admin/users
Список пользователей (фильтры)
GET/api/admin/listings
Модерация объявлений
GET/api/admin/transactions
Все транзакции
GET/api/admin/reports
Отчёты (доходы, активность)

Справочники & Webhooks

GET/api/categories
Дерево категорий
GET/api/tags
Облако тегов
GET/api/cities
Список городов
POST/api/webhooks/payments
Webhook платежей (подпись HMAC)
POST/api/webhooks/delivery/status
Статус доставки (СДЭК и пр.)

Требования к контрактам: JSON REST, документация в OpenAPI/Swagger, защита JWT+RBAC, вебхуки подписываются HMAC-SHA256.

7. Модель данных (ERD)

СущностьКлючевые поляСвязи
usersid, email, name, role, created_at→ listings (1:N), → orders (1:N)
profilesid, user_id, bio, photo, payout_details→ users (1:1)
listingsid, seller_id, title, description, price, category, status, photos→ users (N:1), → orders (1:N)
categoriesid, name, parent_id, slug→ categories (self-ref)
tagsid, name, slug↔ listings (M:N via listing_tags)
ordersid, listing_id, buyer_id, status, total, commission→ listings (N:1), → users (N:1)
paymentsid, order_id, provider, amount, status, ext_id→ orders (1:1)
payoutsid, seller_id, amount, status, method→ users (N:1)
disputesid, order_id, reason, status, resolution→ orders (1:1)
notificationsid, user_id, type, payload, read→ users (N:1)
moderation_logid, listing_id, moderator_id, action, reason→ listings, → users
promo_servicesid, listing_id, type, expires_at→ listings (N:1)