| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- /** Роль пользователя в системе: суперадмин, модератор, арендодатель, исполнитель или заказчик */
- 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<User, 'id' | 'name' | 'avatar_url'>
- 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<User, 'id' | 'name' | 'avatar_url'>
- 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<T> {
- 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 }[]
- }
|