/** Роль пользователя в системе: суперадмин, модератор, арендодатель, исполнитель или заказчик */ export type UserRole = 'superadmin' | 'moderator' | 'landlord' | 'executor' | 'customer' /** Статус пользователя: активен, заблокирован или ожидает верификации */ export type UserStatus = 'active' | 'banned' | 'pending_verification' /** * Пользователь платформы * @property id - Уникальный идентификатор * @property email - Электронная почта * @property role - Роль в системе * @property status - Текущий статус * @property name - Отображаемое имя (опционально) * @property avatar_url - Ссылка на аватар (опционально) * @property phone - Номер телефона (опционально) * @property bio - Краткая биография (опционально) * @property country - Страна (опционально) * @property created_at - Дата регистрации */ export interface User { id: string email: string role: UserRole status: UserStatus name?: string avatar_url?: string phone?: string bio?: string country?: string created_at: string } /** Тип объекта: обычное место или студия */ export type PlaceType = 'place' | 'studio' /** Статус места: черновик, на модерации, опубликовано, отклонено или в архиве */ export type PlaceStatus = 'draft' | 'pending_moderation' | 'published' | 'rejected' | 'archived' /** * Географические координаты * @property lat - Широта * @property lng - Долгота */ export interface Coordinates { lat: number lng: number } /** * Место или студия для фотосъёмок * @property id - Уникальный идентификатор * @property type - Тип объекта (место или студия) * @property title - Название * @property description - Описание (опционально) * @property address - Адрес (опционально) * @property coordinates - Географические координаты * @property cover_image - URL обложки (опционально) * @property images - Массив URL изображений * @property access_info - Информация о доступе (опционально) * @property rating - Рейтинг * @property reviews_count - Количество отзывов * @property tags - Список тегов * @property features - Список характеристик * @property status - Статус публикации * @property owner - Владелец (id, name, avatar_url) * @property pricing - Ценообразование для студий (опционально) * @property booking_url - Ссылка на бронирование (опционально) * @property executor_services - Услуги исполнителей (опционально) * @property created_at - Дата создания * @property updated_at - Дата обновления (опционально) */ export interface Place { id: string type: PlaceType title: string description?: string address?: string coordinates: Coordinates cover_image?: string images: string[] access_info?: string rating: number reviews_count: number tags: Tag[] features: Feature[] status: PlaceStatus owner: Pick pricing?: { hourly_rate: number currency: string min_hours: number } booking_url?: string executor_services?: ExecutorService[] created_at: string updated_at?: string } /** * Услуга, предоставляемая исполнителем на месте съёмки * @property id - Уникальный идентификатор * @property title - Название услуги * @property price - Стоимость * @property currency - Валюта * @property duration_minutes - Длительность в минутах (опционально) * @property executor_name - Имя исполнителя */ export interface ExecutorService { id: string title: string price: number currency: string duration_minutes?: number executor_name: string } /** * Тег (стиль съёмки) * @property id - Уникальный идентификатор (slug) * @property name - Отображаемое название * @property category - Категория тега (опционально) */ export interface Tag { id: string name: string category?: string } /** * Характеристика места (напр. парковка, гримёрка) * @property id - Уникальный идентификатор (slug) * @property name - Отображаемое название * @property category - Категория (опционально) * @property icon - Иконка (опционально) */ export interface Feature { id: string name: string category?: string icon?: string } /** * Услуга фотографа / исполнителя * @property id - Уникальный идентификатор * @property executor_id - Идентификатор исполнителя * @property title - Название услуги * @property description - Описание (опционально) * @property price - Стоимость * @property currency - Валюта * @property duration_minutes - Длительность в минутах (опционально) * @property tags - Связанные теги * @property rating - Рейтинг * @property reviews_count - Количество отзывов * @property portfolio_images - Фото портфолио * @property status - Статус публикации * @property created_at - Дата создания */ export interface Service { id: string executor_id: string title: string description?: string price: number currency: string duration_minutes?: number tags: Tag[] rating: number reviews_count: number portfolio_images: string[] status: 'draft' | 'published' | 'archived' created_at: string } /** * Отзыв на место или услугу * @property id - Уникальный идентификатор * @property user - Автор отзыва (id, name, avatar_url) * @property rating - Оценка * @property text - Текст отзыва (опционально) * @property created_at - Дата создания */ export interface Review { id: string user: Pick rating: number text?: string created_at: string } /** * Бронирование студии или места * @property id - Уникальный идентификатор * @property place_id - Идентификатор места * @property start_time - Время начала * @property end_time - Время окончания * @property status - Статус бронирования * @property total_price - Общая стоимость (опционально) * @property currency - Валюта * @property comment - Комментарий (опционально) */ export interface Booking { id: string place_id: string start_time: string end_time: string status: 'pending' | 'confirmed' | 'cancelled' | 'completed' total_price?: number currency: string comment?: string } /** * Ответ API с пагинацией на основе курсора * @template T - Тип элементов списка * @property data - Массив элементов * @property next_cursor - Курсор для следующей страницы (опционально) * @property has_more - Есть ли ещё элементы */ export interface PaginatedResponse { data: T[] next_cursor?: string has_more: boolean } /** * Структура ошибки API (соответствует RFC 7807 Problem Details) * @property type - URI типа ошибки * @property title - Краткое описание ошибки * @property status - HTTP-статус * @property detail - Подробное описание * @property instance - URI экземпляра ошибки (опционально) * @property errors - Ошибки валидации полей (опционально) */ export interface ApiError { type: string title: string status: number detail: string instance?: string errors?: { field: string; message: string }[] }