@escapenavigator/types 1.10.128 → 1.10.130

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/agregator/agregator-city.ro.d.ts +25 -0
  2. package/dist/agregator/agregator-city.ro.js +8 -0
  3. package/dist/agregator/agregator-questroom-card.ro.d.ts +14 -1
  4. package/dist/agregator/agregator-questroom-card.ro.js +4 -2
  5. package/dist/city/city.ro.d.ts +3 -0
  6. package/dist/city/update-city.dto.d.ts +13 -0
  7. package/dist/city/update-city.dto.js +19 -0
  8. package/dist/email-builder/index.d.ts +18 -0
  9. package/dist/email-builder/index.js +48 -20
  10. package/dist/emails/index.d.ts +21 -0
  11. package/dist/openapi/morty/morty-attraction.ro.d.ts +26 -0
  12. package/dist/openapi/morty/morty-attraction.ro.js +91 -0
  13. package/dist/openapi/morty/morty-attractions-query.dto.d.ts +8 -0
  14. package/dist/openapi/morty/morty-attractions-query.dto.js +29 -0
  15. package/dist/openapi/morty/morty-booking.ro.d.ts +13 -0
  16. package/dist/openapi/morty/morty-booking.ro.js +45 -0
  17. package/dist/openapi/morty/morty-create-booking.dto.d.ts +42 -0
  18. package/dist/openapi/morty/morty-create-booking.dto.js +122 -0
  19. package/dist/openapi/morty/morty-timeslot.ro.d.ts +49 -0
  20. package/dist/openapi/morty/morty-timeslot.ro.js +129 -0
  21. package/dist/openapi/morty/morty-timeslots-query.dto.d.ts +21 -0
  22. package/dist/openapi/morty/morty-timeslots-query.dto.js +48 -0
  23. package/dist/openapi/shared/openapi-questroom.ro.d.ts +2 -0
  24. package/dist/openapi/shared/openapi-questroom.ro.js +4 -0
  25. package/dist/order/create-order.dto.d.ts +12 -0
  26. package/dist/order/create-order.dto.js +6 -0
  27. package/dist/profile/action/create-profile-action.dto.d.ts +4 -3
  28. package/dist/profile/action/create-profile-action.dto.js +16 -8
  29. package/dist/profile/birthday-marketing/birthday-marketing.dto.d.ts +6 -0
  30. package/dist/profile/birthday-marketing/birthday-marketing.dto.js +6 -0
  31. package/dist/profile/create-profile.dto.d.ts +0 -9
  32. package/dist/profile/create-profile.dto.js +0 -63
  33. package/dist/profile/cross-sale/cross-sale.dto.d.ts +8 -0
  34. package/dist/profile/cross-sale/cross-sale.dto.js +6 -0
  35. package/dist/profile/cross-sale/cross-sale.ro.d.ts +2 -0
  36. package/dist/profile/cross-sale/cross-sale.ro.js +4 -0
  37. package/dist/profile/custom-client-booking-email/custom-client-booking-email.dto.d.ts +11 -0
  38. package/dist/profile/custom-client-booking-email/custom-client-booking-email.dto.js +6 -0
  39. package/dist/profile/custom-client-booking-email/custom-client-booking-email.ro.d.ts +9 -0
  40. package/dist/profile/custom-client-booking-email/custom-client-booking-email.ro.js +4 -0
  41. package/dist/profile/marketing-email/preview-campaign-v2.dto.d.ts +37 -0
  42. package/dist/profile/marketing-email/preview-campaign-v2.dto.js +43 -1
  43. package/dist/profile/profile-crm/create-profile-crm.dto.d.ts +3 -0
  44. package/dist/profile/profile-crm/create-profile-crm.dto.js +22 -0
  45. package/dist/profile/update-profile-commission.dto.d.ts +11 -0
  46. package/dist/profile/update-profile-commission.dto.js +71 -0
  47. package/dist/questroom/create-questroom-admin.dto.d.ts +1 -0
  48. package/dist/questroom/create-questroom-admin.dto.js +6 -0
  49. package/dist/questroom/create-questroom.dto.d.ts +1 -0
  50. package/dist/questroom/create-questroom.dto.js +9 -0
  51. package/dist/questroom/questroom-admin.ro.d.ts +17 -0
  52. package/dist/questroom/questroom-admin.ro.js +61 -0
  53. package/dist/questroom/questroom-light.ro.d.ts +1 -0
  54. package/dist/questroom/questroom-light.ro.js +4 -0
  55. package/dist/questroom/questrooms-list-admin.ro.d.ts +2 -0
  56. package/dist/questroom/questrooms-list-admin.ro.js +8 -0
  57. package/dist/questroom-scenario-email/create-questroom-scenario-email.dto.d.ts +13 -0
  58. package/dist/questroom-scenario-email/create-questroom-scenario-email.dto.js +6 -0
  59. package/dist/questroom-scenario-email/questroom-scenario-email.ro.d.ts +2 -0
  60. package/dist/questroom-scenario-email/questroom-scenario-email.ro.js +4 -0
  61. package/dist/shared/source.enum.d.ts +1 -0
  62. package/dist/shared/source.enum.js +1 -0
  63. package/dist/slot/slot.ro.d.ts +1 -0
  64. package/dist/slot-rule/create-rule.dto.d.ts +2 -0
  65. package/dist/slot-rule/create-rule.dto.js +30 -0
  66. package/dist/slot-rule/defailt-rule.d.ts +2 -0
  67. package/dist/slot-rule/defailt-rule.js +2 -0
  68. package/dist/slot-rule/rule.ro.d.ts +2 -0
  69. package/dist/slot-rule/rule.ro.js +8 -0
  70. package/dist/subway-station/subway-station.ro.d.ts +43 -0
  71. package/dist/subway-station/subway-station.ro.js +2 -0
  72. package/dist/tsconfig.build.tsbuildinfo +1 -1
  73. package/dist/user/task/user-task.dto.d.ts +2 -2
  74. package/dist/user/task/user-task.ro.d.ts +1 -0
  75. package/dist/user/task/user-task.ro.js +4 -0
  76. package/package.json +2 -2
@@ -10,6 +10,31 @@ export declare class AgregatorCityRO {
10
10
  country: CountriesEnum;
11
11
  coordinates: [number, number];
12
12
  questroomsCount: number;
13
+ /**
14
+ * Сколько квестов реально показывается на странице города. Для
15
+ * городов-центров (`isAgglomeration = true`) это сумма собственных
16
+ * + всех городов-спутников (`parentCityId = this.id`); для всех
17
+ * остальных совпадает с `questroomsCount`. Считается на лету в
18
+ * `AgregatorCityController.findCityBySlug` / `findPopularCitiesByCountry`
19
+ * через `cityService.getEffectiveQuestroomsCountMap`, чтобы цифра
20
+ * совпала с тем, что отдаёт `cityOtherQuestrooms` (там фильтр
21
+ * `cityId IN (getAgglomerationCityIds(rootId))` по той же иерархии).
22
+ *
23
+ * Поле опциональное: только основные ручки (страница города и
24
+ * popular-cities) считают его сейчас. «Тяжёлые» листинги
25
+ * (`findCitiesByCountry`, `cityOtherQuestrooms.city`) пока отдают
26
+ * `undefined` — фронт должен делать `effectiveQuestroomsCount ??
27
+ * questroomsCount` как fallback.
28
+ */
29
+ effectiveQuestroomsCount?: number;
30
+ /**
31
+ * Город — центр агломерации. Используется фронтом для решения,
32
+ * показывать ли блок «другие города агломерации» / подпись «и
33
+ * пригороды», а также для тонкой настройки SEO-страниц. Поле
34
+ * опциональное по тем же причинам, что и `effectiveQuestroomsCount`
35
+ * — приходит только из ручек, которые явно проставляют.
36
+ */
37
+ isAgglomeration?: boolean;
13
38
  reviewsCount: number;
14
39
  rate: number;
15
40
  slug: string;
@@ -73,6 +73,14 @@ __decorate([
73
73
  (0, class_transformer_1.Expose)(),
74
74
  __metadata("design:type", Number)
75
75
  ], AgregatorCityRO.prototype, "questroomsCount", void 0);
76
+ __decorate([
77
+ (0, class_transformer_1.Expose)(),
78
+ __metadata("design:type", Number)
79
+ ], AgregatorCityRO.prototype, "effectiveQuestroomsCount", void 0);
80
+ __decorate([
81
+ (0, class_transformer_1.Expose)(),
82
+ __metadata("design:type", Boolean)
83
+ ], AgregatorCityRO.prototype, "isAgglomeration", void 0);
76
84
  __decorate([
77
85
  (0, class_transformer_1.Expose)(),
78
86
  __metadata("design:type", Number)
@@ -1,11 +1,24 @@
1
1
  import { ProfileCurrencyEnum } from '../profile/enum/profile-currency';
2
2
  import { QuestroomTypeEnum } from '../questroom/enum/questroom-type.enum';
3
3
  import { Languages } from '../shared/enum/languages.enum';
4
+ import { SubwayLineRO } from '../subway-station/subway-station.ro';
4
5
  export declare class AgregatorQuestroomLocation {
5
6
  id: number;
6
7
  coordinates: [number, number];
8
+ /**
9
+ * Название ближайшей станции метро (из `location.subwayStation`).
10
+ * Endpoint, отдающий `AgregatorQuestroomCardRO`, должен включать
11
+ * `'location.subwayStation'` в `relations`, иначе придёт `undefined`.
12
+ */
7
13
  subwayTitle?: string;
8
- subwayColor?: string;
14
+ /**
15
+ * Все ветки метро на этой станции (для пересадочных — несколько).
16
+ * Каждый элемент — `{ color: '#RRGGBB' | null, ref: 'U3' | null }`.
17
+ * Массив отсортирован в `overpass-import.ts.sortLines`: сначала
18
+ * цветные, дальше по `ref` алфавитно. На фронте рендерить как
19
+ * `lines.map(l => <Circle color={l.color}/>)` + `l.ref`.
20
+ */
21
+ subwayLines?: SubwayLineRO[];
9
22
  }
10
23
  export declare class AgregatorQuestroomCardRO {
11
24
  id: number;
@@ -37,12 +37,14 @@ __decorate([
37
37
  ], AgregatorQuestroomLocation.prototype, "coordinates", void 0);
38
38
  __decorate([
39
39
  (0, class_transformer_1.Expose)(),
40
+ (0, class_transformer_1.Transform)(({ obj }) => { var _a, _b; return (_b = (_a = obj === null || obj === void 0 ? void 0 : obj.subwayStation) === null || _a === void 0 ? void 0 : _a.title) !== null && _b !== void 0 ? _b : undefined; }),
40
41
  __metadata("design:type", String)
41
42
  ], AgregatorQuestroomLocation.prototype, "subwayTitle", void 0);
42
43
  __decorate([
43
44
  (0, class_transformer_1.Expose)(),
44
- __metadata("design:type", String)
45
- ], AgregatorQuestroomLocation.prototype, "subwayColor", void 0);
45
+ (0, class_transformer_1.Transform)(({ obj }) => { var _a, _b; return (_b = (_a = obj === null || obj === void 0 ? void 0 : obj.subwayStation) === null || _a === void 0 ? void 0 : _a.lines) !== null && _b !== void 0 ? _b : undefined; }),
46
+ __metadata("design:type", Array)
47
+ ], AgregatorQuestroomLocation.prototype, "subwayLines", void 0);
46
48
  class AgregatorQuestroomCardRO {
47
49
  }
48
50
  exports.AgregatorQuestroomCardRO = AgregatorQuestroomCardRO;
@@ -16,4 +16,7 @@ export type CityRO = {
16
16
  partnerQuestroomsCount: number;
17
17
  verified: boolean;
18
18
  locales?: CityLocaleRO[];
19
+ isAgglomeration: boolean;
20
+ hasSubway: boolean;
21
+ parentCityId: number | null;
19
22
  };
@@ -5,4 +5,17 @@ export declare class UpdateCityDto {
5
5
  country: CountriesEnum;
6
6
  photo: string;
7
7
  locales?: UpdateCityLocaleDto[];
8
+ /**
9
+ * Центр агломерации. Семантические инварианты (плоская иерархия,
10
+ * валидный parent, та же страна) проверяются на бэке в
11
+ * `validateAgglomerationChange`, отсюда — только базовая type-validation.
12
+ */
13
+ isAgglomeration?: boolean;
14
+ /** В городе есть метро. Управляет fetch-ом Places API для локаций. */
15
+ hasSubway?: boolean;
16
+ /**
17
+ * Город-родитель в агломерации. `null` снимает привязку.
18
+ * Положительное число — id центра в той же стране (валидируется на бэке).
19
+ */
20
+ parentCityId?: number | null;
8
21
  }
@@ -41,3 +41,22 @@ __decorate([
41
41
  (0, class_transformer_1.Expose)(),
42
42
  __metadata("design:type", Array)
43
43
  ], UpdateCityDto.prototype, "locales", void 0);
44
+ __decorate([
45
+ (0, class_validator_1.IsOptional)(),
46
+ (0, class_validator_1.IsBoolean)(),
47
+ (0, class_transformer_1.Expose)(),
48
+ __metadata("design:type", Boolean)
49
+ ], UpdateCityDto.prototype, "isAgglomeration", void 0);
50
+ __decorate([
51
+ (0, class_validator_1.IsOptional)(),
52
+ (0, class_validator_1.IsBoolean)(),
53
+ (0, class_transformer_1.Expose)(),
54
+ __metadata("design:type", Boolean)
55
+ ], UpdateCityDto.prototype, "hasSubway", void 0);
56
+ __decorate([
57
+ (0, class_validator_1.IsOptional)(),
58
+ (0, class_validator_1.IsInt)(),
59
+ (0, class_validator_1.Min)(1),
60
+ (0, class_transformer_1.Expose)(),
61
+ __metadata("design:type", Number)
62
+ ], UpdateCityDto.prototype, "parentCityId", void 0);
@@ -125,10 +125,28 @@ export type EmailContentJsonV2 = {
125
125
  theme?: EmailThemeV2;
126
126
  };
127
127
  export declare const isEmailContentJsonV2: (raw: unknown) => raw is EmailContentJsonV2;
128
+ /**
129
+ * Дефолтная тема для seed'а пустого шаблона и для конверсии legacy
130
+ * HTML в v2. Экспортирована, чтобы конвертеры/миграции могли собирать
131
+ * `EmailContentJsonV2` с идентичной темой — иначе после миграции на
132
+ * v2 шаблоны визуально отличались бы от seed'а.
133
+ */
134
+ export declare const DEFAULT_EMAIL_THEME: EmailThemeV2;
128
135
  export declare const createEmptyEmailContent: () => EmailContentJsonV2;
129
136
  export type CreateDefaultEmailContentOptions = {
130
137
  logo?: string | null;
131
138
  };
139
+ /**
140
+ * Image-нода с предустановленным логотипом. Используется и в seed'е
141
+ * чистого шаблона (`createDefaultEmailContent`), и при конверсии
142
+ * legacy HTML в v2 (`@escapenavigator/utils/dist/email-builder/from-html`):
143
+ * чтобы во всех v2-документах лого выглядел одинаково (выравнивание,
144
+ * размер, alt).
145
+ *
146
+ * Возвращает `null` если логотипа нет — caller сам решает, добавлять
147
+ * пустоту в `doc.content` или нет.
148
+ */
149
+ export declare const createLogoNode: (logo?: string | null) => Record<string, unknown> | null;
132
150
  export declare const createDefaultEmailContent: (options?: CreateDefaultEmailContentOptions) => EmailContentJsonV2;
133
151
  export declare const normalizeEmailTheme: (raw: unknown) => EmailThemeV2 | undefined;
134
152
  /**
@@ -11,7 +11,7 @@
11
11
  * for transactional emails that are NOT user-editable.
12
12
  */
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.EmailScope = exports.normalizeEmailTheme = exports.createDefaultEmailContent = exports.createEmptyEmailContent = exports.isEmailContentJsonV2 = exports.resolveEmailThemeColors = exports.deriveEmailTextColors = exports.EMAIL_CONTENT_VERSION_V2 = void 0;
14
+ exports.EmailScope = exports.normalizeEmailTheme = exports.createDefaultEmailContent = exports.createLogoNode = exports.createEmptyEmailContent = exports.DEFAULT_EMAIL_THEME = exports.isEmailContentJsonV2 = exports.resolveEmailThemeColors = exports.deriveEmailTextColors = exports.EMAIL_CONTENT_VERSION_V2 = void 0;
15
15
  exports.EMAIL_CONTENT_VERSION_V2 = 'v2';
16
16
  /**
17
17
  * Compute the relative luminance of an opaque hex color in [0, 1].
@@ -104,7 +104,13 @@ const isEmailContentJsonV2 = (raw) => {
104
104
  ((_a = raw.doc) === null || _a === void 0 ? void 0 : _a.type) === 'doc';
105
105
  };
106
106
  exports.isEmailContentJsonV2 = isEmailContentJsonV2;
107
- const DEFAULT_EMAIL_THEME = {
107
+ /**
108
+ * Дефолтная тема для seed'а пустого шаблона и для конверсии legacy
109
+ * HTML в v2. Экспортирована, чтобы конвертеры/миграции могли собирать
110
+ * `EmailContentJsonV2` с идентичной темой — иначе после миграции на
111
+ * v2 шаблоны визуально отличались бы от seed'а.
112
+ */
113
+ exports.DEFAULT_EMAIL_THEME = {
108
114
  body: {
109
115
  backgroundColor: '#000000',
110
116
  paddingTop: '0px',
@@ -147,28 +153,50 @@ const MUTED_TEXT_MARK = { type: 'textStyle', attrs: { color: '#9CA3AF' } };
147
153
  const createEmptyEmailContent = () => ({
148
154
  version: exports.EMAIL_CONTENT_VERSION_V2,
149
155
  doc: { type: 'doc', content: [] },
150
- theme: DEFAULT_EMAIL_THEME,
156
+ theme: exports.DEFAULT_EMAIL_THEME,
151
157
  });
152
158
  exports.createEmptyEmailContent = createEmptyEmailContent;
159
+ /**
160
+ * Бренд, используемый в `alt`/`title` для логотипа. Захардкожен — это
161
+ * не персонализированное имя профиля (которое подставляется через
162
+ * `{profile.title}` переменную), а fallback-надпись на случай, когда
163
+ * картинка не загрузилась.
164
+ */
165
+ const BRAND = 'Escape Navigator';
166
+ /**
167
+ * Image-нода с предустановленным логотипом. Используется и в seed'е
168
+ * чистого шаблона (`createDefaultEmailContent`), и при конверсии
169
+ * legacy HTML в v2 (`@escapenavigator/utils/dist/email-builder/from-html`):
170
+ * чтобы во всех v2-документах лого выглядел одинаково (выравнивание,
171
+ * размер, alt).
172
+ *
173
+ * Возвращает `null` если логотипа нет — caller сам решает, добавлять
174
+ * пустоту в `doc.content` или нет.
175
+ */
176
+ const createLogoNode = (logo) => {
177
+ if (!logo)
178
+ return null;
179
+ return {
180
+ type: 'image',
181
+ attrs: {
182
+ src: logo,
183
+ alt: BRAND,
184
+ title: BRAND,
185
+ width: 100,
186
+ height: 'auto',
187
+ alignment: 'left',
188
+ borderRadius: 0,
189
+ externalLink: '',
190
+ },
191
+ };
192
+ };
193
+ exports.createLogoNode = createLogoNode;
153
194
  const createDefaultEmailContent = (options = {}) => {
154
195
  const { logo } = options;
155
- const brand = 'Escape Navigator';
156
196
  const content = [];
157
- if (logo) {
158
- content.push({
159
- type: 'image',
160
- attrs: {
161
- src: logo,
162
- alt: brand,
163
- title: brand,
164
- width: 100,
165
- height: 'auto',
166
- alignment: 'left',
167
- borderRadius: 0,
168
- externalLink: '',
169
- },
170
- });
171
- }
197
+ const logoNode = (0, exports.createLogoNode)(logo);
198
+ if (logoNode)
199
+ content.push(logoNode);
172
200
  content.push({
173
201
  type: 'heading',
174
202
  attrs: { level: 1, textAlign: 'left' },
@@ -256,7 +284,7 @@ const createDefaultEmailContent = (options = {}) => {
256
284
  return {
257
285
  version: exports.EMAIL_CONTENT_VERSION_V2,
258
286
  doc: { type: 'doc', content },
259
- theme: DEFAULT_EMAIL_THEME,
287
+ theme: exports.DEFAULT_EMAIL_THEME,
260
288
  };
261
289
  };
262
290
  exports.createDefaultEmailContent = createDefaultEmailContent;
@@ -98,6 +98,27 @@ export type EmailDataV2 = EmailContentJsonV2 & {
98
98
  */
99
99
  extra?: Record<string, string>;
100
100
  };
101
+ /**
102
+ * Block-level HTML payloads keyed by `variable.id` inside doc's
103
+ * `htmlCodeBlock` nodes (e.g. legacy `orderDetailsHtml`). Used for
104
+ * transactional templates where part of the body is a server-built
105
+ * table/grid that can't be expressed as TipTap structurally. The
106
+ * renderer splices the raw HTML in place of the entire
107
+ * `<p>{{marker}}</p>` produced for the block node, so block markup
108
+ * (`<table>`/`<div>`) sits at the top level of the body and not
109
+ * nested inside `<p>` (Outlook breaks that).
110
+ *
111
+ * Keys that are not present in the doc are silently ignored —
112
+ * the sender doesn't have to know which placeholders the user
113
+ * actually kept in their template.
114
+ *
115
+ * NB: `photos` is NO LONGER in this channel — it now flows as an
116
+ * editable `image`-node with `src=photos` (see `migratePhotosToImage`
117
+ * in `from-html.ts`). `servicesList` (the up-sale list) used to live
118
+ * here too, but the whole feature was removed; old templates that
119
+ * still contain `{servicesList}` are silently dropped by the converter.
120
+ */
121
+ blockPayloads?: Record<string, string>;
101
122
  };
102
123
  export type SendEmailData = EmailDataV1 | EmailDataV2;
103
124
  export type SendEmailRequestParams = {
@@ -0,0 +1,26 @@
1
+ import { QuestroomTypeEnum } from '../../questroom/enum/questroom-type.enum';
2
+ declare class MortyAttractionLocation {
3
+ address: string;
4
+ longitude: number | null;
5
+ latitude: number | null;
6
+ phone: string;
7
+ timeZone: string;
8
+ }
9
+ /**
10
+ * Описание аттракциона (квеста), которое отдаётся в Morty по запросу
11
+ * `GET /morty/attractions`. Содержит публично-разрешённые поля квеста
12
+ * + сводную информацию по локации/таймзоне.
13
+ */
14
+ export declare class MortyAttractionRO {
15
+ id: number;
16
+ title: string;
17
+ slug: string;
18
+ photo: string;
19
+ type: QuestroomTypeEnum;
20
+ description?: string;
21
+ playersMin: number;
22
+ playersMax: number;
23
+ profile_id: number | null;
24
+ location: MortyAttractionLocation;
25
+ }
26
+ export {};
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.MortyAttractionRO = void 0;
13
+ /* eslint-disable max-classes-per-file */
14
+ const class_transformer_1 = require("class-transformer");
15
+ const questroom_type_enum_1 = require("../../questroom/enum/questroom-type.enum");
16
+ class MortyAttractionLocation {
17
+ }
18
+ __decorate([
19
+ (0, class_transformer_1.Expose)(),
20
+ (0, class_transformer_1.Transform)(({ value }) => value ? value.split(',').slice(0, -1).join(',').trim() : ''),
21
+ __metadata("design:type", String)
22
+ ], MortyAttractionLocation.prototype, "address", void 0);
23
+ __decorate([
24
+ (0, class_transformer_1.Expose)(),
25
+ (0, class_transformer_1.Transform)(({ obj }) => { var _a, _b, _c; return (_c = (_b = (_a = obj === null || obj === void 0 ? void 0 : obj.coordinates) === null || _a === void 0 ? void 0 : _a.coordinates) === null || _b === void 0 ? void 0 : _b[0]) !== null && _c !== void 0 ? _c : null; }),
26
+ __metadata("design:type", Number)
27
+ ], MortyAttractionLocation.prototype, "longitude", void 0);
28
+ __decorate([
29
+ (0, class_transformer_1.Expose)(),
30
+ (0, class_transformer_1.Transform)(({ obj }) => { var _a, _b, _c; return (_c = (_b = (_a = obj === null || obj === void 0 ? void 0 : obj.coordinates) === null || _a === void 0 ? void 0 : _a.coordinates) === null || _b === void 0 ? void 0 : _b[1]) !== null && _c !== void 0 ? _c : null; }),
31
+ __metadata("design:type", Number)
32
+ ], MortyAttractionLocation.prototype, "latitude", void 0);
33
+ __decorate([
34
+ (0, class_transformer_1.Expose)(),
35
+ __metadata("design:type", String)
36
+ ], MortyAttractionLocation.prototype, "phone", void 0);
37
+ __decorate([
38
+ (0, class_transformer_1.Expose)(),
39
+ __metadata("design:type", String)
40
+ ], MortyAttractionLocation.prototype, "timeZone", void 0);
41
+ /**
42
+ * Описание аттракциона (квеста), которое отдаётся в Morty по запросу
43
+ * `GET /morty/attractions`. Содержит публично-разрешённые поля квеста
44
+ * + сводную информацию по локации/таймзоне.
45
+ */
46
+ class MortyAttractionRO {
47
+ }
48
+ exports.MortyAttractionRO = MortyAttractionRO;
49
+ __decorate([
50
+ (0, class_transformer_1.Expose)(),
51
+ __metadata("design:type", Number)
52
+ ], MortyAttractionRO.prototype, "id", void 0);
53
+ __decorate([
54
+ (0, class_transformer_1.Expose)(),
55
+ __metadata("design:type", String)
56
+ ], MortyAttractionRO.prototype, "title", void 0);
57
+ __decorate([
58
+ (0, class_transformer_1.Expose)(),
59
+ __metadata("design:type", String)
60
+ ], MortyAttractionRO.prototype, "slug", void 0);
61
+ __decorate([
62
+ (0, class_transformer_1.Expose)(),
63
+ __metadata("design:type", String)
64
+ ], MortyAttractionRO.prototype, "photo", void 0);
65
+ __decorate([
66
+ (0, class_transformer_1.Expose)(),
67
+ __metadata("design:type", String)
68
+ ], MortyAttractionRO.prototype, "type", void 0);
69
+ __decorate([
70
+ (0, class_transformer_1.Expose)(),
71
+ (0, class_transformer_1.Transform)(({ value }) => value !== null && value !== void 0 ? value : null),
72
+ __metadata("design:type", String)
73
+ ], MortyAttractionRO.prototype, "description", void 0);
74
+ __decorate([
75
+ (0, class_transformer_1.Expose)(),
76
+ __metadata("design:type", Number)
77
+ ], MortyAttractionRO.prototype, "playersMin", void 0);
78
+ __decorate([
79
+ (0, class_transformer_1.Expose)(),
80
+ __metadata("design:type", Number)
81
+ ], MortyAttractionRO.prototype, "playersMax", void 0);
82
+ __decorate([
83
+ (0, class_transformer_1.Expose)(),
84
+ (0, class_transformer_1.Transform)(({ obj }) => { var _a; return (_a = obj === null || obj === void 0 ? void 0 : obj.profileId) !== null && _a !== void 0 ? _a : null; }),
85
+ __metadata("design:type", Number)
86
+ ], MortyAttractionRO.prototype, "profile_id", void 0);
87
+ __decorate([
88
+ (0, class_transformer_1.Expose)(),
89
+ (0, class_transformer_1.Type)(() => MortyAttractionLocation),
90
+ __metadata("design:type", MortyAttractionLocation)
91
+ ], MortyAttractionRO.prototype, "location", void 0);
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `GET /morty/attractions?profile_id=…` — опциональная фильтрация по
3
+ * профилю. Без параметра возвращаем все профили с включённым флагом
4
+ * `morty=true` и активной партнёрской программой.
5
+ */
6
+ export declare class MortyAttractionsQueryDto {
7
+ profile_id?: number;
8
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.MortyAttractionsQueryDto = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ /**
16
+ * `GET /morty/attractions?profile_id=…` — опциональная фильтрация по
17
+ * профилю. Без параметра возвращаем все профили с включённым флагом
18
+ * `morty=true` и активной партнёрской программой.
19
+ */
20
+ class MortyAttractionsQueryDto {
21
+ }
22
+ exports.MortyAttractionsQueryDto = MortyAttractionsQueryDto;
23
+ __decorate([
24
+ (0, class_transformer_1.Expose)(),
25
+ (0, class_validator_1.IsOptional)(),
26
+ (0, class_transformer_1.Transform)(({ value }) => (value === undefined || value === null ? value : Number(value))),
27
+ (0, class_validator_1.IsPositive)(),
28
+ __metadata("design:type", Number)
29
+ ], MortyAttractionsQueryDto.prototype, "profile_id", void 0);
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Ответ на `POST /morty/bookings` / `DELETE /morty/bookings/:id`.
3
+ * `confirmation_code` — наш внутренний `order.code`, который клиент
4
+ * увидит в письме и сможет назвать на ресепшене.
5
+ */
6
+ export declare class MortyBookingRO {
7
+ success: boolean;
8
+ booking_id: number;
9
+ external_booking_id: string;
10
+ confirmation_code: string;
11
+ status: 'confirmed' | 'cancelled' | 'failed';
12
+ message?: string;
13
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.MortyBookingRO = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ /**
15
+ * Ответ на `POST /morty/bookings` / `DELETE /morty/bookings/:id`.
16
+ * `confirmation_code` — наш внутренний `order.code`, который клиент
17
+ * увидит в письме и сможет назвать на ресепшене.
18
+ */
19
+ class MortyBookingRO {
20
+ }
21
+ exports.MortyBookingRO = MortyBookingRO;
22
+ __decorate([
23
+ (0, class_transformer_1.Expose)(),
24
+ __metadata("design:type", Boolean)
25
+ ], MortyBookingRO.prototype, "success", void 0);
26
+ __decorate([
27
+ (0, class_transformer_1.Expose)(),
28
+ __metadata("design:type", Number)
29
+ ], MortyBookingRO.prototype, "booking_id", void 0);
30
+ __decorate([
31
+ (0, class_transformer_1.Expose)(),
32
+ __metadata("design:type", String)
33
+ ], MortyBookingRO.prototype, "external_booking_id", void 0);
34
+ __decorate([
35
+ (0, class_transformer_1.Expose)(),
36
+ __metadata("design:type", String)
37
+ ], MortyBookingRO.prototype, "confirmation_code", void 0);
38
+ __decorate([
39
+ (0, class_transformer_1.Expose)(),
40
+ __metadata("design:type", String)
41
+ ], MortyBookingRO.prototype, "status", void 0);
42
+ __decorate([
43
+ (0, class_transformer_1.Expose)(),
44
+ __metadata("design:type", String)
45
+ ], MortyBookingRO.prototype, "message", void 0);
@@ -0,0 +1,42 @@
1
+ export declare class MortyCustomerDto {
2
+ first_name: string;
3
+ last_name: string;
4
+ email: string;
5
+ phone: string;
6
+ }
7
+ export declare class MortyBookingPaymentDto {
8
+ /**
9
+ * Сумма оплаты на стороне Morty в основной валюте (не minor units).
10
+ */
11
+ amount: number;
12
+ currency?: string;
13
+ transaction_id?: string;
14
+ }
15
+ /**
16
+ * `POST /morty/bookings` — Morty создаёт у нас бронь.
17
+ *
18
+ * Поле `timeslot_id` — это id из `MortyTimeslotRO.id` (наш внутренний
19
+ * slot.id). По нему мы достаём profileId, questroomId, тариф и т.д.
20
+ *
21
+ * `external_booking_id` — id брони на стороне Morty (используем как
22
+ * `order.otherId` для идемпотентности и для отмен по тому же id).
23
+ *
24
+ * `paid` — Morty оплатил бронь (т.е. деньги ушли клиенту через Morty,
25
+ * а не через наш кассовый/виджетный путь). Помечаем заказ как
26
+ * `otherPayment=true`, чтобы он не дёргал наши Stripe/CloudPayments.
27
+ */
28
+ export declare class MortyCreateBookingDto {
29
+ timeslot_id: string;
30
+ external_booking_id: string;
31
+ players: number;
32
+ customer: MortyCustomerDto;
33
+ comment?: string;
34
+ paid?: boolean;
35
+ payment?: MortyBookingPaymentDto;
36
+ /**
37
+ * Произвольные доп. поля, которые Morty может прислать (промокоды,
38
+ * метаданные клиента и т.п.). Игнорируется на нашей стороне в
39
+ * текущей версии.
40
+ */
41
+ extras?: unknown[];
42
+ }