SPEC.md 8.5 KB

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

Обзор проекта

Сервис онлайн-карты с отметками мест для фотосъёмки, аренды фотостудий и найма фотографов. Цель: запуск в России, затем международная экспансия.

Стек технологий

  • Фронтенд: Next.js 14+ (App Router), React 18, TypeScript, Tailwind CSS
  • Бэкенд: Go 1.22+, Chi router, PostgreSQL (pgx), Redis
  • Аутентификация: JWT (access + refresh токены), bcrypt
  • Карты: Leaflet + OSM (основной), MapLibre GL (запасной)
  • Платежи: CloudPayments (РФ), Stripe (международные)
  • Файлы: S3-совместимое хранилище (MinIO локально, Selectel/Cloudflare R2 в проде)
  • Деплой: Docker, docker-compose, GitHub Actions CI/CD

Архитектура

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Next.js   │────▶│   Go API    │────▶│ PostgreSQL  │
│  (Фронтенд) │     │  (Бэкенд)   │     │  (Основная) │
└─────────────┘     └─────────────┘     └─────────────┘
                           │                    │
                           ▼                    ▼
                    ┌─────────────┐     ┌─────────────┐
                    │    Redis    │     │   MinIO/S3  │
                    │  (Кеш,      │     │  (Картинки) │
                    │   Сессии)   │     │             │
                    └─────────────┘     └─────────────┘

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

Роль Ключ Разрешения
Суперадминистратор superadmin Полный доступ, управление всеми пользователями и системой
Модератор moderator Управление местами, пользователями (кроме админов и модераторов), модерация
Арендодатель landlord Добавление/редактирование своих студий (требует подтверждения)
Исполнитель executor Добавление/редактирование своих услуг (фото/видеосъёмка)
Заказчик customer Добавление/редактирование своих мест (требует подтверждения)
Гость guest Только просмотр карты, карточки мест недоступны

Типы мест

  1. Место (place) — публичные локации для самостоятельной съёмки
  2. Студия (studio) — арендуемые фотостудии с бронированием

Карточка места (PlaceCard)

  • Основная информация: название, описание, адрес, координаты
  • Информация о доступе: как добраться, парковка, общественный транспорт
  • Медиа: фотогалерея, обложка
  • Атрибуты: теги (стили съёмки), характеристики (освещение, пространство, оборудование)
  • Рейтинг и отзывы
  • Только для студий: цены, кнопка бронирования, ссылка на услуги исполнителей

Карточка услуги (ServiceCard) — для Исполнителей

  • Информация об услуге: название, описание, цена, длительность
  • Профиль исполнителя: биография, портфолио, рейтинг, отзывы
  • Теги: стили фотосъёмки
  • Контакты / интеграция бронирования

Пользовательские сценарии

Гость (неавторизован)

  1. Видит полноэкранную схематическую карту
  2. Видит своё местоположение (геолокация)
  3. Видит других посетителей как зелёные выпуклые точки (некликабельные)
  4. Не может нажимать на маркеры мест
  5. Кнопка: «Зарегистрируйтесь, чтобы исследовать места»

Авторизованный пользователь (любая роль, кроме Гостя)

  1. Видит все опубликованные маркеры на карте
  2. Может фильтровать: тип, теги, рейтинг, характеристики, ценовой диапазон
  3. Клик по маркеру → открывается PlaceCard / StudioCard
  4. StudioCard: кнопка «Забронировать» → переход к бронированию
  5. Может добавлять места (Заказчик) или студии (Арендодатель) → отправка на модерацию

Арендодатель

  1. Форма «Добавить студию» → создаётся черновик
  2. Модератор/Админ проверяет → публикует или отклоняет
  3. Редактирование требует повторного подтверждения

Заказчик

  1. Форма «Добавить место» → создаётся черновик
  2. Модератор/Админ проверяет → публикует или отклоняет

Исполнитель

  1. Создаёт карточку услуги (ServiceCard)
  2. Публикуется сразу или после лёгкой модерации
  3. Привязывается к карточкам студий

Провайдеры карт

  • Карта: Leaflet + OpenStreetMap (через Nominatim для геокодинга)
  • Тайлы: OpenStreetMap (бесплатно, без ключа)
  • Геокодинг: Nominatim OpenStreetMap API (GeocodeReverse handler)

Платежи (CloudPayments)

  • Студии: ежемесячная плата за размещение или комиссия с бронирований
  • Исполнители: плата за продвижение
  • Пользователи: донаты / премиум-функции (расширенные фильтры, сохранённые места)
  • Виджет для разовых и регулярных платежей, вебхуки для статусов

Безопасность

  • Ограничение запросов (in-memory rate limiter с очисткой старых записей)
  • CORS, Helmet/CSP заголовки
  • Валидация ввода (go-playground/validator)
  • Параметризованные SQL-запросы (pgx)
  • Валидация загружаемых файлов (тип, размер)
  • Мягкое удаление (deleted_at)
  • Проверка владельца ресурса: изменение/удаление места, услуги или брони доступно только владельцу, модератору или суперадминистратору
  • JWT-аутентификация: access token (15 мин) + refresh token (30 дней, X-Refresh-Token заголовок)

Окружения

  • Локальное: docker-compose (PostgreSQL, Redis, MinIO, Бэкенд, Фронтенд)
  • Стенд: один сервер, Docker Compose, Let's Encrypt
  • Продакшн: Kubernetes или Docker Swarm, CDN, WAF

Планы на будущее

  • Мобильные приложения (React Native / Expo)
  • ML-рекомендации мест
  • Партнёрская программа для фотографов
  • Redis-кеширование для карты и списков
  • Геопоиск по радиусу с использованием PostGIS
  • Модерация услуг исполнителей
  • Система уведомлений (email/push)