@escapenavigator/types 2.0.33 → 2.0.34

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.
@@ -2,6 +2,11 @@ import { WidgetBookingFiledEnum } from '../widget/enum/widget-booking-filed.enum
2
2
  import { ClientTypeEnum } from './emun/client-type.enum';
3
3
  export declare class ClientFormDto {
4
4
  clientType: ClientTypeEnum;
5
+ /**
6
+ * `fields` приходит извне и может отсутствовать, поэтому все `ValidateIf` ниже
7
+ * обращаются к нему через `?.`: иначе предикат падает TypeError внутри
8
+ * ValidationPipe и клиент получает 500 вместо 400 (ESCAPE-NAVIGATOR-API-R6).
9
+ */
5
10
  fields: WidgetBookingFiledEnum[];
6
11
  email: string;
7
12
  birthday: string;
@@ -30,25 +30,26 @@ __decorate([
30
30
  ], ClientFormDto.prototype, "fields", void 0);
31
31
  __decorate([
32
32
  (0, class_validator_1.IsEmail)(),
33
- (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.EMAIL)),
33
+ (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && (fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.EMAIL))),
34
34
  (0, class_transformer_1.Transform)(({ value }) => value === null || value === void 0 ? void 0 : value.trim().toLowerCase()),
35
35
  (0, class_transformer_1.Expose)(),
36
36
  __metadata("design:type", String)
37
37
  ], ClientFormDto.prototype, "email", void 0);
38
38
  __decorate([
39
- (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.MINOR || fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.BIRTHDAY)),
39
+ (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.MINOR ||
40
+ (fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.BIRTHDAY))),
40
41
  (0, is_not_blank_1.IsNotBlank)(),
41
42
  (0, class_transformer_1.Expose)(),
42
43
  __metadata("design:type", String)
43
44
  ], ClientFormDto.prototype, "birthday", void 0);
44
45
  __decorate([
45
- (0, class_validator_1.ValidateIf)(({ fields }) => fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.NAME)),
46
+ (0, class_validator_1.ValidateIf)(({ fields }) => fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.NAME)),
46
47
  (0, is_not_blank_1.IsNotBlank)(),
47
48
  (0, class_transformer_1.Expose)(),
48
49
  __metadata("design:type", String)
49
50
  ], ClientFormDto.prototype, "name", void 0);
50
51
  __decorate([
51
- (0, class_validator_1.ValidateIf)(({ fields }) => fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.SURNAME)),
52
+ (0, class_validator_1.ValidateIf)(({ fields }) => fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.SURNAME)),
52
53
  (0, is_not_blank_1.IsNotBlank)(),
53
54
  (0, class_transformer_1.Expose)(),
54
55
  __metadata("design:type", String)
@@ -65,25 +66,25 @@ __decorate([
65
66
  __metadata("design:type", Boolean)
66
67
  ], ClientFormDto.prototype, "sendAds", void 0);
67
68
  __decorate([
68
- (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.PHONE)),
69
+ (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && (fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.PHONE))),
69
70
  (0, is_not_blank_1.IsNotBlank)(),
70
71
  (0, class_transformer_1.Expose)(),
71
72
  __metadata("design:type", String)
72
73
  ], ClientFormDto.prototype, "phone", void 0);
73
74
  __decorate([
74
- (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.ADDRESS)),
75
+ (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && (fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.ADDRESS))),
75
76
  (0, is_not_blank_1.IsNotBlank)(),
76
77
  (0, class_transformer_1.Expose)(),
77
78
  __metadata("design:type", String)
78
79
  ], ClientFormDto.prototype, "address", void 0);
79
80
  __decorate([
80
- (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.ADDRESS)),
81
+ (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && (fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.ADDRESS))),
81
82
  (0, is_not_blank_1.IsNotBlank)(),
82
83
  (0, class_transformer_1.Expose)(),
83
84
  __metadata("design:type", String)
84
85
  ], ClientFormDto.prototype, "postcode", void 0);
85
86
  __decorate([
86
- (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.ADDRESS)),
87
+ (0, class_validator_1.ValidateIf)(({ fields, clientType }) => clientType === client_type_enum_1.ClientTypeEnum.ADULT && (fields === null || fields === void 0 ? void 0 : fields.includes(widget_booking_filed_enum_1.WidgetBookingFiledEnum.ADDRESS))),
87
88
  (0, is_not_blank_1.IsNotBlank)(),
88
89
  (0, class_transformer_1.Expose)(),
89
90
  __metadata("design:type", String)
@@ -32,8 +32,15 @@ export type ParsedQuest = {
32
32
  /** Возраст, как он написан на сайте (до приведения к лестнице). */
33
33
  minAgeRaw?: number;
34
34
  type?: QuestroomTypeEnum;
35
- /** Тематические теги квеста. */
35
+ /**
36
+ * Итоговый набор тегов, который уедет в карточку. У сматченного квеста это
37
+ * теги из базы плюс найденные на сайте, дальше их правит модератор.
38
+ */
36
39
  tags?: TagsEnum[];
40
+ /** Что нашёл на сайте парсер — показывается модератору рядом с итогом. */
41
+ parsedTags?: TagsEnum[];
42
+ /** Теги сматченного квеста в базе: видно, что именно заменяется. */
43
+ existingTags?: TagsEnum[];
37
44
  /** Важная информация для посетителей (ограничения, что взять с собой). */
38
45
  importantInfo?: string;
39
46
  /**
@@ -61,8 +68,16 @@ export type ParsedQuest = {
61
68
  * известного размера группы). Показывается модератору, в каталог не идёт.
62
69
  */
63
70
  priceNote?: string;
64
- /** URL фото с сайта-источника (в S3 загружаются при применении). */
71
+ /**
72
+ * Фото, которые уедут в карточку: с сайта-источника у нового квеста плюс
73
+ * добавленные модератором. Первое становится обложкой, в S3 загружаются
74
+ * при применении.
75
+ */
65
76
  photos?: string[];
77
+ /** Что нашёл на сайте парсер — чтобы вернуть список после смены привязки. */
78
+ parsedPhotos?: string[];
79
+ /** Фото сматченного квеста в базе: новые доливаются к ним, а не затирают. */
80
+ existingPhotos?: string[];
66
81
  /** URL страницы квеста. */
67
82
  sourceUrl?: string;
68
83
  /** ID существующего квеста, если сматчен (для диффа). */
@@ -71,6 +86,12 @@ export type ParsedQuest = {
71
86
  matchCandidates?: ParseMatchCandidate[];
72
87
  /** Исключён модератором из применения. */
73
88
  excluded?: boolean;
89
+ /**
90
+ * Поля, которые модератор поправил руками. Применяются, даже если парсер
91
+ * по ним расхождения не нашёл: важную информацию и теги он находит редко,
92
+ * а вписать их при разборе задачи всё равно нужно.
93
+ */
94
+ editedFields?: string[];
74
95
  };
75
96
  export type ParsedLocation = {
76
97
  address: string;
@@ -1,4 +1,9 @@
1
1
  export declare class CreateProfileContactDto {
2
+ /**
3
+ * `profile-contact.name` — NOT NULL в БД, и контакт без имени всё равно
4
+ * бесполезен: сохранение «только ссылки» падало 500 из БД вместо
5
+ * валидации формы (ESCAPE-NAVIGATOR-API-Q3).
6
+ */
2
7
  name: string;
3
8
  facebook: string;
4
9
  linkedin: string;
@@ -12,11 +12,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.CreateProfileContactDto = void 0;
13
13
  const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
+ const is_not_blank_1 = require("../../shared/is-not-blank");
15
16
  class CreateProfileContactDto {
16
17
  }
17
18
  exports.CreateProfileContactDto = CreateProfileContactDto;
18
19
  __decorate([
19
- (0, class_validator_1.IsOptional)(),
20
+ (0, is_not_blank_1.IsNotBlank)(),
20
21
  (0, class_transformer_1.Expose)(),
21
22
  __metadata("design:type", String)
22
23
  ], CreateProfileContactDto.prototype, "name", void 0);
@@ -24,13 +24,16 @@ exports.MARKETING_AUTOMATION_CAPABILITIES = {
24
24
  supportsSendImmediately: false,
25
25
  supportsDiscount: true,
26
26
  },
27
+ // `min: 0` — «поздравить в сам день рождения»: тик крутится каждый час и
28
+ // отправляет в 09:00 по календарю компании, поэтому нулевое смещение
29
+ // работает так же, как любое другое (см. MarketingAutomationBirthdayService).
27
30
  [marketing_automation_type_enum_1.MarketingAutomationTypeEnum.BIRTHDAY_ADULT]: {
28
- timing: { direction: 'before', unit: 'days', min: 2, max: 7, default: 3 },
31
+ timing: { direction: 'before', unit: 'days', min: 0, max: 7, default: 3 },
29
32
  supportsSendImmediately: false,
30
33
  supportsDiscount: true,
31
34
  },
32
35
  [marketing_automation_type_enum_1.MarketingAutomationTypeEnum.BIRTHDAY_CHILD]: {
33
- timing: { direction: 'before', unit: 'days', min: 2, max: 7, default: 3 },
36
+ timing: { direction: 'before', unit: 'days', min: 0, max: 7, default: 3 },
34
37
  supportsSendImmediately: false,
35
38
  supportsDiscount: true,
36
39
  },
@@ -6,8 +6,8 @@
6
6
  * Здесь умышленно НЕТ направления (до/после события) и единицы
7
7
  * (часы/дни) для `sendOffset` — это свойство ТИПА, а не записи, и
8
8
  * живёт в `MARKETING_AUTOMATION_CAPABILITIES`. Границы значения
9
- * (min/max) валидируются динамически по типу там же, поэтому тут
10
- * достаточно базовой проверки «положительное целое».
9
+ * (min/max) тоже свойство типа, поэтому тут достаточно базовой
10
+ * проверки «неотрицательное целое».
11
11
  */
12
12
  export declare class MarketingAutomationConfigDto {
13
13
  /**
@@ -17,6 +17,12 @@ export declare class MarketingAutomationConfigDto {
17
17
  * Для `retargeting` — часы после покидания бронирования (дефолт 24).
18
18
  * `undefined` — у типов без настраиваемого тайминга
19
19
  * (`custom_booking` — транзакционно).
20
+ *
21
+ * 0 — «в день самого события»: для поздравлений с днём рождения это
22
+ * штатный сценарий (письмо уходит в сам ДР в 09:00 по календарю
23
+ * компании), поэтому здесь `@Min(0)`, а не `@IsPositive`. Типы, где 0
24
+ * не имеет смысла, защищены своим `timing.min` — планировщик кламмит
25
+ * значение при расчёте `sendAt` (`clampSendOffset`).
20
26
  */
21
27
  sendOffset?: number;
22
28
  /**
@@ -20,8 +20,8 @@ const class_validator_1 = require("class-validator");
20
20
  * Здесь умышленно НЕТ направления (до/после события) и единицы
21
21
  * (часы/дни) для `sendOffset` — это свойство ТИПА, а не записи, и
22
22
  * живёт в `MARKETING_AUTOMATION_CAPABILITIES`. Границы значения
23
- * (min/max) валидируются динамически по типу там же, поэтому тут
24
- * достаточно базовой проверки «положительное целое».
23
+ * (min/max) тоже свойство типа, поэтому тут достаточно базовой
24
+ * проверки «неотрицательное целое».
25
25
  */
26
26
  class MarketingAutomationConfigDto {
27
27
  }
@@ -29,7 +29,7 @@ exports.MarketingAutomationConfigDto = MarketingAutomationConfigDto;
29
29
  __decorate([
30
30
  (0, class_validator_1.IsOptional)(),
31
31
  (0, class_validator_1.IsInt)(),
32
- (0, class_validator_1.IsPositive)(),
32
+ (0, class_validator_1.Min)(0),
33
33
  (0, class_transformer_1.Expose)(),
34
34
  __metadata("design:type", Number)
35
35
  ], MarketingAutomationConfigDto.prototype, "sendOffset", void 0);
@@ -2,8 +2,8 @@ import { MarketingAutomationTiming } from './marketing-automation-capabilities';
2
2
  /**
3
3
  * Единый источник правды для расчёта тайминга автоматизаций.
4
4
  *
5
- * Величина смещения хранится в `config.sendOffset` (всегда положительное
6
- * число), а направление (`before`/`after`) и единица (`hours`/`days`)
5
+ * Величина смещения хранится в `config.sendOffset` (неотрицательное число;
6
+ * 0 = в день события), а направление (`before`/`after`) и единица (`hours`/`days`)
7
7
  * задаются типом письма через `MARKETING_AUTOMATION_CAPABILITIES`. Функция
8
8
  * сводит их к знаковому смещению В ЧАСАХ относительно опорного события
9
9
  * (для order-linked — `order.utcDate`, т.е. дата игры):
@@ -5,8 +5,8 @@ exports.clampSendOffset = clampSendOffset;
5
5
  /**
6
6
  * Единый источник правды для расчёта тайминга автоматизаций.
7
7
  *
8
- * Величина смещения хранится в `config.sendOffset` (всегда положительное
9
- * число), а направление (`before`/`after`) и единица (`hours`/`days`)
8
+ * Величина смещения хранится в `config.sendOffset` (неотрицательное число;
9
+ * 0 = в день события), а направление (`before`/`after`) и единица (`hours`/`days`)
10
10
  * задаются типом письма через `MARKETING_AUTOMATION_CAPABILITIES`. Функция
11
11
  * сводит их к знаковому смещению В ЧАСАХ относительно опорного события
12
12
  * (для order-linked — `order.utcDate`, т.е. дата игры):
@@ -24,7 +24,8 @@ export declare class QueryAdminProfileDto {
24
24
  techStatus?: ProfileTechStatusEnum;
25
25
  country?: CountriesEnum;
26
26
  city?: number;
27
- crm?: string;
27
+ /** Прежняя CRM компании (`profile.crm`); фильтр в админке — мультиселект. */
28
+ crm?: string | string[];
28
29
  lastEmailSendId?: string;
29
30
  notlastEmailSendId?: string;
30
31
  integrationType?: ProfileIntegrationTypeEnum;
@@ -82,7 +82,7 @@ __decorate([
82
82
  ], QueryAdminProfileDto.prototype, "city", void 0);
83
83
  __decorate([
84
84
  (0, class_transformer_1.Expose)(),
85
- __metadata("design:type", String)
85
+ __metadata("design:type", Object)
86
86
  ], QueryAdminProfileDto.prototype, "crm", void 0);
87
87
  __decorate([
88
88
  (0, class_transformer_1.Expose)(),