hh-contracts 0.0.97 → 0.0.99
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.
- package/build/hotels/hotel.models.js +4 -4
- package/build/hotels/integrations/contracts/find-all-hotel-integrations.contract.js +1 -0
- package/build/hotels/integrations/hotel-integration.model.js +2 -2
- package/build/permissions/permission.models.js +3 -2
- package/build/permissions/permisson-conditions.model.js +41 -0
- package/build/tenants/contracts/resolve-tenant.contract.js +35 -1
- package/hotels/hotel.models.ts +4 -4
- package/hotels/integrations/contracts/find-all-hotel-integrations.contract.ts +4 -1
- package/hotels/integrations/hotel-integration.model.ts +2 -2
- package/package.json +1 -1
- package/permissions/permission.models.ts +3 -2
- package/permissions/permisson-conditions.model.ts +7 -0
- package/tenants/contracts/resolve-tenant.contract.ts +1 -1
- package/AGENTS.md +0 -71
- package/CHANGELOG.md +0 -5
|
@@ -38,17 +38,17 @@ const z = __importStar(require("zod"));
|
|
|
38
38
|
const common_1 = require("../common");
|
|
39
39
|
exports.HotelSchema = z.object({
|
|
40
40
|
slug: common_1.SlugSchema,
|
|
41
|
-
chainId: common_1.UuidSchema.optional(),
|
|
41
|
+
chainId: common_1.UuidSchema.nullable().optional(),
|
|
42
42
|
status: z.enum(common_1.AppStatuses.HOTEL_VALUES).optional(), // сервер может проставить дефолт
|
|
43
|
-
category: z.string().min(1).max(64).optional(),
|
|
43
|
+
category: z.string().min(1).max(64).nullable().optional(),
|
|
44
44
|
timezone: common_1.TimezoneSchema,
|
|
45
45
|
currency: z.string().length(3),
|
|
46
46
|
defaultLang: z.enum(common_1.LANGUAGE_KEYS),
|
|
47
47
|
availableLangs: z.array(z.enum(common_1.LANGUAGE_KEYS)),
|
|
48
|
-
stars: z.number().int().min(1).max(5).optional(),
|
|
48
|
+
stars: z.number().int().min(1).max(5).nullable().optional(),
|
|
49
49
|
checkInFrom: common_1.IsoTimeSchema,
|
|
50
50
|
checkOutUntil: common_1.IsoTimeSchema,
|
|
51
|
-
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
51
|
+
metadata: z.record(z.string(), z.unknown()).nullable().optional(),
|
|
52
52
|
});
|
|
53
53
|
exports.HotelPersistedSchema = exports.HotelSchema.required({ status: true }).extend({
|
|
54
54
|
id: common_1.UuidSchema,
|
|
@@ -43,5 +43,6 @@ var FindAllHotelIntegrationsContract;
|
|
|
43
43
|
FindAllHotelIntegrationsContract.getUrl = hotel_integrations_api_1.HOTEL_INTEGRATIONS_API.findAll;
|
|
44
44
|
FindAllHotelIntegrationsContract.endpoint = hotel_integrations_api_1.HOTEL_INTEGRATIONS_CONTROLLER.endpoints.findAll;
|
|
45
45
|
FindAllHotelIntegrationsContract.httpMethod = common_1.HTTP_METHODS.get;
|
|
46
|
+
FindAllHotelIntegrationsContract.RequestSchema = common_1.SearchSchema;
|
|
46
47
|
FindAllHotelIntegrationsContract.ResponseSchema = z.array(hotel_integration_model_1.HotelIntegrationSchema);
|
|
47
48
|
})(FindAllHotelIntegrationsContract || (exports.FindAllHotelIntegrationsContract = FindAllHotelIntegrationsContract = {}));
|
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.HotelIntegrationCredentialSchema = exports.HotelIntegrationConnectionSchema = exports.
|
|
36
|
+
exports.HotelIntegrationCredentialSchema = exports.HotelIntegrationConnectionSchema = exports.HotelIntegrationAssignSchema = exports.HotelIntegrationDetailSchema = exports.HotelIntegrationWriteSchema = exports.HotelIntegrationPersistedSchema = exports.HotelIntegrationSchema = exports.HotelIntegrationConfigSchema = void 0;
|
|
37
37
|
const z = __importStar(require("zod"));
|
|
38
38
|
const common_1 = require("../../common");
|
|
39
39
|
const constants_1 = require("../constants");
|
|
@@ -59,7 +59,7 @@ exports.HotelIntegrationDetailSchema = exports.HotelIntegrationPersistedSchema.o
|
|
|
59
59
|
secretHash: true,
|
|
60
60
|
secretSalt: true,
|
|
61
61
|
});
|
|
62
|
-
exports.
|
|
62
|
+
exports.HotelIntegrationAssignSchema = z
|
|
63
63
|
.object({
|
|
64
64
|
id: z.uuid(),
|
|
65
65
|
integrationId: z.uuid(),
|
|
@@ -36,12 +36,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.PermissionListItemSchema = exports.PermissionDetailSchema = exports.PermissionWriteSchema = exports.PermissionTranslationsSchema = exports.PermissionPersistedSchema = exports.PermissionSchema = void 0;
|
|
37
37
|
const z = __importStar(require("zod"));
|
|
38
38
|
const common_1 = require("../common");
|
|
39
|
+
const permisson_conditions_model_1 = require("./permisson-conditions.model");
|
|
39
40
|
exports.PermissionSchema = z.object({
|
|
40
41
|
action: z.enum(common_1.AppAbility.ACTION_VALUES),
|
|
41
42
|
subject: z.enum(common_1.AppAbility.SUBJECT_VALUES),
|
|
42
|
-
conditions:
|
|
43
|
+
conditions: permisson_conditions_model_1.PermissionConditionFlagsSchema,
|
|
43
44
|
});
|
|
44
|
-
exports.PermissionPersistedSchema = exports.PermissionSchema.
|
|
45
|
+
exports.PermissionPersistedSchema = exports.PermissionSchema.extend({
|
|
45
46
|
id: common_1.UuidSchema,
|
|
46
47
|
...common_1.TimestampSchema.shape,
|
|
47
48
|
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PermissionConditionFlagsSchema = void 0;
|
|
37
|
+
const z = __importStar(require("zod"));
|
|
38
|
+
exports.PermissionConditionFlagsSchema = z.object({
|
|
39
|
+
hotelFilter: z.boolean().default(false),
|
|
40
|
+
userFilter: z.boolean().default(false),
|
|
41
|
+
});
|
|
@@ -1,6 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.ResolveTenantContract = void 0;
|
|
37
|
+
const z = __importStar(require("zod"));
|
|
4
38
|
const common_1 = require("../../common");
|
|
5
39
|
const tenants_api_1 = require("../tenants.api");
|
|
6
40
|
const tenant_model_1 = require("../tenant.model");
|
|
@@ -13,10 +47,10 @@ const ResolveTenantResponseSchema = tenant_model_1.TenantPersistedSchema.omit({
|
|
|
13
47
|
}).extend({
|
|
14
48
|
...hotels_1.HotelPersistedSchema.pick({
|
|
15
49
|
slug: true,
|
|
16
|
-
hasServices: true,
|
|
17
50
|
defaultLang: true,
|
|
18
51
|
availableLangs: true,
|
|
19
52
|
}).shape,
|
|
53
|
+
hasServices: z.boolean(),
|
|
20
54
|
canonical: tenant_model_1.CanonicalSchema.nullable().optional(),
|
|
21
55
|
});
|
|
22
56
|
var ResolveTenantContract;
|
package/hotels/hotel.models.ts
CHANGED
|
@@ -12,17 +12,17 @@ import {
|
|
|
12
12
|
|
|
13
13
|
export const HotelSchema = z.object({
|
|
14
14
|
slug: SlugSchema,
|
|
15
|
-
chainId: UuidSchema.optional(),
|
|
15
|
+
chainId: UuidSchema.nullable().optional(),
|
|
16
16
|
status: z.enum(AppStatuses.HOTEL_VALUES).optional(), // сервер может проставить дефолт
|
|
17
|
-
category: z.string().min(1).max(64).optional(),
|
|
17
|
+
category: z.string().min(1).max(64).nullable().optional(),
|
|
18
18
|
timezone: TimezoneSchema,
|
|
19
19
|
currency: z.string().length(3),
|
|
20
20
|
defaultLang: z.enum(LANGUAGE_KEYS),
|
|
21
21
|
availableLangs: z.array(z.enum(LANGUAGE_KEYS)),
|
|
22
|
-
stars: z.number().int().min(1).max(5).optional(),
|
|
22
|
+
stars: z.number().int().min(1).max(5).nullable().optional(),
|
|
23
23
|
checkInFrom: IsoTimeSchema,
|
|
24
24
|
checkOutUntil: IsoTimeSchema,
|
|
25
|
-
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
25
|
+
metadata: z.record(z.string(), z.unknown()).nullable().optional(),
|
|
26
26
|
});
|
|
27
27
|
export type THotel = z.infer<typeof HotelSchema>;
|
|
28
28
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as z from 'zod';
|
|
2
|
-
import { HTTP_METHODS } from '../../../common';
|
|
2
|
+
import { HTTP_METHODS, SearchSchema } from '../../../common';
|
|
3
3
|
import { HOTEL_INTEGRATIONS_API, HOTEL_INTEGRATIONS_CONTROLLER } from '../hotel-integrations.api';
|
|
4
4
|
import { HotelIntegrationSchema } from '../hotel-integration.model';
|
|
5
5
|
|
|
@@ -8,6 +8,9 @@ export namespace FindAllHotelIntegrationsContract {
|
|
|
8
8
|
export const endpoint = HOTEL_INTEGRATIONS_CONTROLLER.endpoints.findAll;
|
|
9
9
|
export const httpMethod = HTTP_METHODS.get;
|
|
10
10
|
|
|
11
|
+
export const RequestSchema = SearchSchema;
|
|
12
|
+
export type TRequest = z.infer<typeof RequestSchema>;
|
|
13
|
+
|
|
11
14
|
export const ResponseSchema = z.array(HotelIntegrationSchema);
|
|
12
15
|
export type TResponse = z.infer<typeof ResponseSchema>;
|
|
13
16
|
|
|
@@ -37,7 +37,7 @@ export const HotelIntegrationDetailSchema = HotelIntegrationPersistedSchema.omit
|
|
|
37
37
|
});
|
|
38
38
|
export type THotelIntegrationDetail = z.infer<typeof HotelIntegrationDetailSchema>;
|
|
39
39
|
|
|
40
|
-
export const
|
|
40
|
+
export const HotelIntegrationAssignSchema = z
|
|
41
41
|
.object({
|
|
42
42
|
id: z.uuid(),
|
|
43
43
|
integrationId: z.uuid(),
|
|
@@ -46,7 +46,7 @@ export const HotelIntegrationHotelSchema = z
|
|
|
46
46
|
isActive: z.boolean().default(true),
|
|
47
47
|
})
|
|
48
48
|
.extend(TimestampSchema.shape);
|
|
49
|
-
export type
|
|
49
|
+
export type THotelIntegrationAssign = z.infer<typeof HotelIntegrationAssignSchema>;
|
|
50
50
|
|
|
51
51
|
export const HotelIntegrationConnectionSchema = z
|
|
52
52
|
.object({
|
package/package.json
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import * as z from 'zod';
|
|
2
2
|
import { AppAbility, TimestampSchema, UuidSchema, makeTranslations } from '../common';
|
|
3
|
+
import { PermissionConditionFlagsSchema } from './permisson-conditions.model';
|
|
3
4
|
|
|
4
5
|
export const PermissionSchema = z.object({
|
|
5
6
|
action: z.enum(AppAbility.ACTION_VALUES),
|
|
6
7
|
subject: z.enum(AppAbility.SUBJECT_VALUES),
|
|
7
|
-
conditions:
|
|
8
|
+
conditions: PermissionConditionFlagsSchema,
|
|
8
9
|
});
|
|
9
10
|
export type TPermission = z.infer<typeof PermissionSchema>;
|
|
10
11
|
|
|
11
|
-
export const PermissionPersistedSchema = PermissionSchema.
|
|
12
|
+
export const PermissionPersistedSchema = PermissionSchema.extend({
|
|
12
13
|
id: UuidSchema,
|
|
13
14
|
...TimestampSchema.shape,
|
|
14
15
|
});
|
|
@@ -12,10 +12,10 @@ const ResolveTenantResponseSchema = TenantPersistedSchema.omit({
|
|
|
12
12
|
}).extend({
|
|
13
13
|
...HotelPersistedSchema.pick({
|
|
14
14
|
slug: true,
|
|
15
|
-
hasServices: true,
|
|
16
15
|
defaultLang: true,
|
|
17
16
|
availableLangs: true,
|
|
18
17
|
}).shape,
|
|
18
|
+
hasServices: z.boolean(),
|
|
19
19
|
canonical: CanonicalSchema.nullable().optional(),
|
|
20
20
|
});
|
|
21
21
|
|
package/AGENTS.md
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
AGENTS.md — инструкции для Codex/LLM-агентов
|
|
2
|
-
|
|
3
|
-
## 1. Контекст проекта
|
|
4
|
-
|
|
5
|
-
`hh-contracts` — типизированное ядро контрактов для всей платформы управления отелями. Репозиторий публикуется как npm‑пакет и содержит только исходные типы/схемы (`*.ts`) и скомпилированный артефакт в `build/`. Любые изменения в доменных сервисах должны начинаться здесь.
|
|
6
|
-
|
|
7
|
-
### Основные каталоги
|
|
8
|
-
|
|
9
|
-
- `common/` — общие константы, вспомогательные схемы и утилиты. Использовать их при любой возможности вместо дублирования.
|
|
10
|
-
- `*/contracts/` — файловая зона для REST/gRPC/WebSocket контрактов конкретного домена (roles, permissions, tenants и т. д.).
|
|
11
|
-
- `*/index.ts` — публичные реэкспорты. Добавляя новый файл, обязательно обновляйте соответствующий `index.ts`.
|
|
12
|
-
- `build/` — артефакты TypeScript‑компиляции. **Не редактировать вручную.**
|
|
13
|
-
|
|
14
|
-
## 2. Роли агентов
|
|
15
|
-
|
|
16
|
-
- **Contracts Agent** — отвечает за модели и схемы. Любая доработка (добавление сущности, изменение поля, экспорт типов) выполняется через него.
|
|
17
|
-
- Если создаётся новый тип агента, описать его в этом файле и зафиксировать правила в разделе 5.
|
|
18
|
-
|
|
19
|
-
## 3. Правила разработки
|
|
20
|
-
|
|
21
|
-
1. **Single Source of Truth**. Типы, перечисления, схемы валидируются и объявляются здесь. Копирование структур из других сервисов запрещено.
|
|
22
|
-
2. **Zod v4.** Использовать только `zod@^4`. Схемы пишем декларативно, избегая `any`. Для произвольных словарей применять `z.record` с ограничениями.
|
|
23
|
-
3. **Строгая типизация.** `tsconfig.json` находится в strict‑режиме. Новые файлы не должны снижать строгие настройки.
|
|
24
|
-
4. **Именование:**
|
|
25
|
-
- Файлы схем — `*.schema.ts` или `*.contract.ts` в зависимости от назначения.
|
|
26
|
-
- Типы, полученные из схем, объявлять через `export type TSome = z.infer<typeof SomeSchema>;`.
|
|
27
|
-
- Enum‑образные наборы значений хранить в `common/constants`, экспортировать через `as const` и соответствующий `z.enum`.
|
|
28
|
-
5. **Повторное использование:** сначала ищите подходящую схему в `common/models` и `common/constants`. При необходимости расширяйте через `.extend(...)` или `.merge(...)`.
|
|
29
|
-
6. **Версионирование:** после любых изменений обновляйте `package.json` вручную только по согласованию. Как минимум фиксируйте запись в Changelog (см. раздел 6).
|
|
30
|
-
7. **Документация контрактов:** не нужно составлять документацию контрактов.
|
|
31
|
-
8. **Переводы:** схемы переводов для сущностей хранятся рядом со схемами сущностей. `translate/` — эндпоинт для переводов. умеет работать как с отдельными строками, так и с полными наборами переводов для сущности. в случшае добавления сущности с переводами нужно обновить TranslateObjectContract - `translate/contracts/translate-object.contract.ts`
|
|
32
|
-
9. **Не оставляйте TODO** без описания задачи. Используйте формат `// TODO(#issue-id): описание`.
|
|
33
|
-
|
|
34
|
-
## 4. Рабочий процесс для задач
|
|
35
|
-
|
|
36
|
-
1. **Анализ**
|
|
37
|
-
- Изучите существующие схемы домена.
|
|
38
|
-
- Определите, какие общие константы/типажи можно переиспользовать.
|
|
39
|
-
2. **Дизайн**
|
|
40
|
-
- При сложных задачах сначала предложите структуру (таблица полей, связи, вариативность).
|
|
41
|
-
- Согласуйте новые enum/константы и ключи переводов.
|
|
42
|
-
3. **Реализация**
|
|
43
|
-
- Создайте/обновите схемы, типы, константы и индексы.
|
|
44
|
-
- Проверьте, что экспорты доступны из корня пакета (`index.ts`).
|
|
45
|
-
4. **Проверка**
|
|
46
|
-
- Выполните `npm run build` перед коммитом.
|
|
47
|
-
- Убедитесь, что сгенерированный `build/` совпадает с ожиданиями (git diff должен показывать изменения только при добавлении новых файлов/типов).
|
|
48
|
-
5. **Ответ**
|
|
49
|
-
- В финальном сообщении используйте структуру Summary + Testing.
|
|
50
|
-
- Каждое тестовое действие сопровождайте командой и результатом.
|
|
51
|
-
|
|
52
|
-
## 5. Требования к коду
|
|
53
|
-
|
|
54
|
-
- Отсутствие магических строк: используйте константы.
|
|
55
|
-
- Для дат и меток времени используйте `TimestampSchema`.
|
|
56
|
-
- Обязательные поля явно помечать `z.string()` и т. п.; опциональные — через `.optional()` или `z.nullable()`.
|
|
57
|
-
- Для массивов всегда задавайте схему элементов (`z.array(SomeSchema)`).
|
|
58
|
-
- Если поле может принимать несколько форматов, используйте `z.union` с понятными вариантами.
|
|
59
|
-
- Обязательный минимум тестового покрытия — пример использования схемы в виде объектной литералы или демо‑валидации в комментарии.
|
|
60
|
-
|
|
61
|
-
## 6. Чек-лист перед PR
|
|
62
|
-
|
|
63
|
-
- [ ] Все новые сущности экспортируются из соответствующего `index.ts`.
|
|
64
|
-
- [ ] Нет изменений в `build/` (если только намеренно не обновляли после `npm run build`).
|
|
65
|
-
- [ ] Запущен `npm run build` без ошибок.
|
|
66
|
-
- [ ] Changelog дополнен.
|
|
67
|
-
|
|
68
|
-
## 7. Changelog
|
|
69
|
-
|
|
70
|
-
- 1.1 — актуализированы инструкции, добавлены требования к структуре ответов и чек-лист перед PR.
|
|
71
|
-
- 1.0 — первоначальная версия каркаса.
|
package/CHANGELOG.md
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
## Unreleased
|
|
4
|
-
- Расширены модели интеграций отелей: добавлены схемы маршрутизации, состояния подключений и статусы учётных данных для поддержки брокерного обмена.
|
|
5
|
-
- Контракт поиска интеграций переименован в `findAll`, запрос теперь поддерживает только фильтр по `alias` без пагинации.
|