Перейти к содержанию

P2-005 Запросы на создание организаций

Метаданные

Поле Значение
Фаза Phase 2: Core
Статус done
Приоритет critical
Связь с roadmap Roadmap - Организации

Контекст

Бизнес-контекст

Создание организации требует одобрения администратора платформы (FR-3.1). Это защищает от спама и обеспечивает качество организаторов на платформе. После одобрения пользователь может создать организацию и стать её владельцем.

Технический контекст

  • OrganizationRequest — глобальная таблица (без tenant_id)
  • Админ платформы видит все запросы
  • После одобрения пользователь создаёт Organization
  • Organization.id используется как tenant_id для всех связанных данных

Связанные документы: - User Service — API endpoints - Domain Model - OrganizationRequest - Role Model — роль Админа платформы - User Journeys - Journey 3 - User Journeys - Journey 8

Цель

Реализовать процесс запроса на создание организации с одобрением администратором.

Definition of Ready (DoR)

  • [x] Контекст понятен и описан
  • [x] Цель сформулирована
  • [x] Acceptance Criteria определены
  • [x] Технические детали проработаны
  • [x] Зависимости определены и разрешены
  • [x] Нет блокеров

Acceptance Criteria

Подача запроса

  • [x] Пользователь может подать запрос на создание организации (POST /api/v1/organization-requests)
  • [x] Запрос содержит: название, slug (URL), описание
  • [x] Slug проверяется на уникальность (среди организаций и pending запросов)
  • [x] Slug валидируется: только lowercase, цифры, дефис; длина 3-50 символов
  • [x] Пользователь может иметь только один pending запрос
  • [x] Пользователь видит статус своего запроса

Рассмотрение админом

  • [x] Админ видит список всех pending запросов (GET /api/v1/organization-requests)
  • [x] Админ может одобрить запрос (POST /api/v1/organization-requests/{id}/approve)
  • [x] Админ может отклонить запрос с указанием причины (POST /api/v1/organization-requests/{id}/reject)
  • [x] События публикуются в RabbitMQ при одобрении/отклонении
  • [x] Уведомления пользователю (реализовано в P2-014: OrganizationRequestApprovedEvent, OrganizationRequestRejectedEvent)

После одобрения

  • [x] Одобренный пользователь может создать организацию
  • [x] Slug из запроса резервируется до создания организации (7 дней)
  • [x] При создании организации пользователь становится OWNER (см. P2-006)

Definition of Done (DoD)

  • [x] Все Acceptance Criteria выполнены
  • [x] Код написан согласно code style проекта
  • [x] Unit тесты написаны
  • [x] Integration тесты написаны
  • [x] Миграции созданы с rollback
  • [x] Опубликованы events в RabbitMQ (organization.request.created, organization.request.approved/rejected)
  • [x] Code review пройден
  • [x] CI/CD pipeline проходит

Технические детали

Затрагиваемые компоненты

  • [x] Backend: user-service-api, user-service-service, user-service-db
  • [ ] Frontend: форма запроса, страница статуса, админ-панель
  • [x] Database: таблица organization_requests
  • [ ] Infrastructure: —

Модель данных

См. Domain Model - OrganizationRequest

CREATE TABLE user_service.organization_requests (
    id UUID PRIMARY KEY,
    user_id UUID NOT NULL REFERENCES user_service.users(id),
    name VARCHAR(255) NOT NULL,
    slug VARCHAR(50) NOT NULL,
    description TEXT,
    status VARCHAR(20) NOT NULL DEFAULT 'PENDING', -- PENDING, APPROVED, REJECTED
    reviewed_by UUID REFERENCES user_service.users(id),
    review_comment TEXT,
    reviewed_at TIMESTAMP,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT unique_pending_slug UNIQUE (slug, status)
        WHERE status = 'PENDING'
);

API Endpoints

POST   /api/v1/organization-requests           — подать запрос
GET    /api/v1/organization-requests           — список (админ: все, user: свои)
GET    /api/v1/organization-requests/{id}      — детали запроса
POST   /api/v1/organization-requests/{id}/approve — одобрить (админ)
POST   /api/v1/organization-requests/{id}/reject  — отклонить (админ)

RabbitMQ Events

  • organization.request.created — для уведомления админов
  • organization.request.approved — для уведомления пользователя
  • organization.request.rejected — для уведомления пользователя

Зависимости

Блокирует

  • P2-006 CRUD организаций
  • P2-014 Уведомления (события для отправки)

Зависит от

  • P2-001 User entity и авторизация

Out of Scope

  • Автоматическое одобрение
  • Платные планы организаций
  • Верификация организаций (синяя галочка)

Заметки

  • В Phase 2 админ-панель может быть простой (список запросов)
  • Роль ADMIN определяется в БД (отдельная таблица или флаг в users)
  • Уведомления админам о новых запросах — через Telegram (если подключен)