index.ts 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. /** Роль пользователя в системе: суперадмин, модератор, арендодатель, исполнитель или заказчик */
  2. export type UserRole = 'superadmin' | 'moderator' | 'landlord' | 'executor' | 'customer'
  3. /** Статус пользователя: активен, заблокирован или ожидает верификации */
  4. export type UserStatus = 'active' | 'banned' | 'pending_verification'
  5. /**
  6. * Пользователь платформы
  7. * @property id - Уникальный идентификатор
  8. * @property email - Электронная почта
  9. * @property role - Роль в системе
  10. * @property status - Текущий статус
  11. * @property name - Отображаемое имя (опционально)
  12. * @property avatar_url - Ссылка на аватар (опционально)
  13. * @property phone - Номер телефона (опционально)
  14. * @property bio - Краткая биография (опционально)
  15. * @property country - Страна (опционально)
  16. * @property created_at - Дата регистрации
  17. */
  18. export interface User {
  19. id: string
  20. email: string
  21. role: UserRole
  22. status: UserStatus
  23. name?: string
  24. avatar_url?: string
  25. phone?: string
  26. bio?: string
  27. country?: string
  28. created_at: string
  29. }
  30. /** Тип объекта: обычное место или студия */
  31. export type PlaceType = 'place' | 'studio'
  32. /** Статус места: черновик, на модерации, опубликовано, отклонено или в архиве */
  33. export type PlaceStatus = 'draft' | 'pending_moderation' | 'published' | 'rejected' | 'archived'
  34. /**
  35. * Географические координаты
  36. * @property lat - Широта
  37. * @property lng - Долгота
  38. */
  39. export interface Coordinates {
  40. lat: number
  41. lng: number
  42. }
  43. /**
  44. * Место или студия для фотосъёмок
  45. * @property id - Уникальный идентификатор
  46. * @property type - Тип объекта (место или студия)
  47. * @property title - Название
  48. * @property description - Описание (опционально)
  49. * @property address - Адрес (опционально)
  50. * @property coordinates - Географические координаты
  51. * @property cover_image - URL обложки (опционально)
  52. * @property images - Массив URL изображений
  53. * @property access_info - Информация о доступе (опционально)
  54. * @property rating - Рейтинг
  55. * @property reviews_count - Количество отзывов
  56. * @property tags - Список тегов
  57. * @property features - Список характеристик
  58. * @property status - Статус публикации
  59. * @property owner - Владелец (id, name, avatar_url)
  60. * @property pricing - Ценообразование для студий (опционально)
  61. * @property booking_url - Ссылка на бронирование (опционально)
  62. * @property executor_services - Услуги исполнителей (опционально)
  63. * @property created_at - Дата создания
  64. * @property updated_at - Дата обновления (опционально)
  65. */
  66. export interface Place {
  67. id: string
  68. type: PlaceType
  69. title: string
  70. description?: string
  71. address?: string
  72. coordinates: Coordinates
  73. cover_image?: string
  74. images: string[]
  75. access_info?: string
  76. rating: number
  77. reviews_count: number
  78. tags: Tag[]
  79. features: Feature[]
  80. status: PlaceStatus
  81. owner: Pick<User, 'id' | 'name' | 'avatar_url'>
  82. pricing?: {
  83. hourly_rate: number
  84. currency: string
  85. min_hours: number
  86. }
  87. booking_url?: string
  88. executor_services?: ExecutorService[]
  89. created_at: string
  90. updated_at?: string
  91. }
  92. /**
  93. * Услуга, предоставляемая исполнителем на месте съёмки
  94. * @property id - Уникальный идентификатор
  95. * @property title - Название услуги
  96. * @property price - Стоимость
  97. * @property currency - Валюта
  98. * @property duration_minutes - Длительность в минутах (опционально)
  99. * @property executor_name - Имя исполнителя
  100. */
  101. export interface ExecutorService {
  102. id: string
  103. title: string
  104. price: number
  105. currency: string
  106. duration_minutes?: number
  107. executor_name: string
  108. }
  109. /**
  110. * Тег (стиль съёмки)
  111. * @property id - Уникальный идентификатор (slug)
  112. * @property name - Отображаемое название
  113. * @property category - Категория тега (опционально)
  114. */
  115. export interface Tag {
  116. id: string
  117. name: string
  118. category?: string
  119. }
  120. /**
  121. * Характеристика места (напр. парковка, гримёрка)
  122. * @property id - Уникальный идентификатор (slug)
  123. * @property name - Отображаемое название
  124. * @property category - Категория (опционально)
  125. * @property icon - Иконка (опционально)
  126. */
  127. export interface Feature {
  128. id: string
  129. name: string
  130. category?: string
  131. icon?: string
  132. }
  133. /**
  134. * Услуга фотографа / исполнителя
  135. * @property id - Уникальный идентификатор
  136. * @property executor_id - Идентификатор исполнителя
  137. * @property title - Название услуги
  138. * @property description - Описание (опционально)
  139. * @property price - Стоимость
  140. * @property currency - Валюта
  141. * @property duration_minutes - Длительность в минутах (опционально)
  142. * @property tags - Связанные теги
  143. * @property rating - Рейтинг
  144. * @property reviews_count - Количество отзывов
  145. * @property portfolio_images - Фото портфолио
  146. * @property status - Статус публикации
  147. * @property created_at - Дата создания
  148. */
  149. export interface Service {
  150. id: string
  151. executor_id: string
  152. title: string
  153. description?: string
  154. price: number
  155. currency: string
  156. duration_minutes?: number
  157. tags: Tag[]
  158. rating: number
  159. reviews_count: number
  160. portfolio_images: string[]
  161. status: 'draft' | 'published' | 'archived'
  162. created_at: string
  163. }
  164. /**
  165. * Отзыв на место или услугу
  166. * @property id - Уникальный идентификатор
  167. * @property user - Автор отзыва (id, name, avatar_url)
  168. * @property rating - Оценка
  169. * @property text - Текст отзыва (опционально)
  170. * @property created_at - Дата создания
  171. */
  172. export interface Review {
  173. id: string
  174. user: Pick<User, 'id' | 'name' | 'avatar_url'>
  175. rating: number
  176. text?: string
  177. created_at: string
  178. }
  179. /**
  180. * Бронирование студии или места
  181. * @property id - Уникальный идентификатор
  182. * @property place_id - Идентификатор места
  183. * @property start_time - Время начала
  184. * @property end_time - Время окончания
  185. * @property status - Статус бронирования
  186. * @property total_price - Общая стоимость (опционально)
  187. * @property currency - Валюта
  188. * @property comment - Комментарий (опционально)
  189. */
  190. export interface Booking {
  191. id: string
  192. place_id: string
  193. start_time: string
  194. end_time: string
  195. status: 'pending' | 'confirmed' | 'cancelled' | 'completed'
  196. total_price?: number
  197. currency: string
  198. comment?: string
  199. }
  200. /**
  201. * Ответ API с пагинацией на основе курсора
  202. * @template T - Тип элементов списка
  203. * @property data - Массив элементов
  204. * @property next_cursor - Курсор для следующей страницы (опционально)
  205. * @property has_more - Есть ли ещё элементы
  206. */
  207. export interface PaginatedResponse<T> {
  208. data: T[]
  209. next_cursor?: string
  210. has_more: boolean
  211. }
  212. /**
  213. * Структура ошибки API (соответствует RFC 7807 Problem Details)
  214. * @property type - URI типа ошибки
  215. * @property title - Краткое описание ошибки
  216. * @property status - HTTP-статус
  217. * @property detail - Подробное описание
  218. * @property instance - URI экземпляра ошибки (опционально)
  219. * @property errors - Ошибки валидации полей (опционально)
  220. */
  221. export interface ApiError {
  222. type: string
  223. title: string
  224. status: number
  225. detail: string
  226. instance?: string
  227. errors?: { field: string; message: string }[]
  228. }