hh-contracts 0.0.85 → 0.0.86
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/AGENTS.md +70 -65
- package/README.md +12 -1
- package/build/translate/contracts/index.js +2 -1
- package/build/translate/contracts/translate-object.contract.js +65 -0
- package/build/translate/contracts/{batch-translate.contract.js → translate-text.contract.js} +13 -17
- package/build/translate/translate.api.js +2 -1
- package/build/translate/translate.schemas.js +42 -0
- package/package.json +1 -1
- package/translate/contracts/index.ts +2 -1
- package/translate/contracts/translate-object.contract.ts +52 -0
- package/translate/contracts/translate-text.contract.ts +24 -0
- package/translate/translate.api.ts +2 -1
- package/translate/translate.schemas.ts +7 -0
- package/translate/contracts/batch-translate.contract.ts +0 -29
package/AGENTS.md
CHANGED
|
@@ -1,66 +1,71 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
## 1.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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.
|
|
66
71
|
- 1.0 — первоначальная версия каркаса.
|
package/README.md
CHANGED
|
@@ -1 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
## Обзор системы
|
|
2
|
+
|
|
3
|
+
Система управления отелем состоит из 8 основных компонентов (не монорепо):
|
|
4
|
+
|
|
5
|
+
1. **Контракты** - типизированные API контракты - ts package - zod
|
|
6
|
+
2. **Общий API** - централизованный backend - nestjs CQRS DDD (mysaas.com/api)
|
|
7
|
+
3. **Клиент на локальном сервере отеля** - клиент(подключется к api websocket или брокер собщений у устанавливается на локальный сервер в гостинице) позволяющий интегрироваться с сервером гостиничной программы отеля и получать из нее данные - go или nestjs или C#
|
|
8
|
+
4. **Админка** - административная панель - react - chakra-ui (admin.mysaas.com)
|
|
9
|
+
5. **Приложение персонала** - управление услугами, тарифами, администрирование отеля - react - chakra-ui (app.mysaas.com)
|
|
10
|
+
6. **Сайт отеля и приложение сервисов для гостей** - сайты отелей (hotel1.mysaas.com, hotel2.mysaas.com если у телей есть свой домены то приложение открывается по адресу - hotel1.com hotel2.com) и сервисы(просмотр и заказ услуг) (services.hotel1.mysaas.com, services.hotel2.mysaas.com если у телей есть свой домены то приложение открывается по адресу - services.hotel1.com services.hotel2.com) - nextjs - chakra-ui сайты отелей
|
|
11
|
+
7. **Лэндинг** - сайт самого сервиса - nextjs - chakra-ui
|
|
12
|
+
8. **Digital Signage (экраны/плеер)** — отдельный PWA/SPA‑клиент для экранов (ресепшн, лобби, лифты, конференц‑залы и т. д.) с оффлайн‑кэшем и режимом киоска; управление контентом через **admin** и быстрые действия через **app**. Домены: player.mysaas.com, screens.hotel1.com.
|
|
@@ -14,4 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./
|
|
17
|
+
__exportStar(require("./translate-text.contract"), exports);
|
|
18
|
+
__exportStar(require("./translate-object.contract"), exports);
|
|
@@ -0,0 +1,65 @@
|
|
|
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.TranslateObjectContract = void 0;
|
|
37
|
+
const z = __importStar(require("zod"));
|
|
38
|
+
const common_1 = require("../../common");
|
|
39
|
+
const translate_api_1 = require("../translate.api");
|
|
40
|
+
const permissions_1 = require("../../permissions");
|
|
41
|
+
const roles_1 = require("../../roles");
|
|
42
|
+
const translate_schemas_1 = require("../translate.schemas");
|
|
43
|
+
const makeReqVariant = (entity, schema) => translate_schemas_1.BaseTranslateSchema.extend({ entity: z.literal(entity), object: schema });
|
|
44
|
+
const makeResVariant = (entity, schema) => z.object({
|
|
45
|
+
entity: z.literal(entity),
|
|
46
|
+
translations: z.partialRecord(common_1.LanguageKeysSchema, schema),
|
|
47
|
+
});
|
|
48
|
+
const TranslateObjectRequestVariants = [
|
|
49
|
+
makeReqVariant(common_1.ENTITIES.permissions, permissions_1.PermissionTranslationsSchema),
|
|
50
|
+
makeReqVariant(common_1.ENTITIES.roles, roles_1.RoleTranslationsSchema),
|
|
51
|
+
];
|
|
52
|
+
const TranslateObjectResponseVariants = [
|
|
53
|
+
makeResVariant(common_1.ENTITIES.permissions, permissions_1.PermissionTranslationsSchema),
|
|
54
|
+
makeResVariant(common_1.ENTITIES.roles, roles_1.RoleTranslationsSchema),
|
|
55
|
+
];
|
|
56
|
+
const TranslateObjectContractRequestSchema = z.discriminatedUnion('entity', TranslateObjectRequestVariants);
|
|
57
|
+
const TranslateObjectContractResponseSchema = z.discriminatedUnion('entity', TranslateObjectResponseVariants);
|
|
58
|
+
var TranslateObjectContract;
|
|
59
|
+
(function (TranslateObjectContract) {
|
|
60
|
+
TranslateObjectContract.getUrl = translate_api_1.TRANSLATE_API.object;
|
|
61
|
+
TranslateObjectContract.endpoint = translate_api_1.TRANSLATE_CONTROLLER.endpoints.object;
|
|
62
|
+
TranslateObjectContract.httpMethod = common_1.HTTP_METHODS.post;
|
|
63
|
+
TranslateObjectContract.RequestSchema = TranslateObjectContractRequestSchema;
|
|
64
|
+
TranslateObjectContract.ResponseSchema = TranslateObjectContractResponseSchema;
|
|
65
|
+
})(TranslateObjectContract || (exports.TranslateObjectContract = TranslateObjectContract = {}));
|
package/build/translate/contracts/{batch-translate.contract.js → translate-text.contract.js}
RENAMED
|
@@ -33,26 +33,22 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.
|
|
36
|
+
exports.TranslateTextContract = void 0;
|
|
37
37
|
const z = __importStar(require("zod"));
|
|
38
38
|
const common_1 = require("../../common");
|
|
39
39
|
const translate_api_1 = require("../translate.api");
|
|
40
|
-
const
|
|
40
|
+
const translate_schemas_1 = require("../translate.schemas");
|
|
41
|
+
const TranslateTextContractRequestSchema = translate_schemas_1.BaseTranslateSchema.extend({
|
|
41
42
|
text: z.string().min(1),
|
|
42
|
-
fromLang: common_1.LanguageKeysSchema,
|
|
43
|
-
toLangs: z.array(common_1.LanguageKeysSchema).min(1),
|
|
44
43
|
});
|
|
45
|
-
const
|
|
46
|
-
.
|
|
47
|
-
.partial();
|
|
48
|
-
const BatchTranslateContractResponseSchema = z.object({
|
|
49
|
-
translations: TranslationsSchema,
|
|
44
|
+
const TranslateTextContractResponseSchema = z.object({
|
|
45
|
+
translations: z.partialRecord(common_1.LanguageKeysSchema, z.string().min(1).nullable()),
|
|
50
46
|
});
|
|
51
|
-
var
|
|
52
|
-
(function (
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
})(
|
|
47
|
+
var TranslateTextContract;
|
|
48
|
+
(function (TranslateTextContract) {
|
|
49
|
+
TranslateTextContract.getUrl = translate_api_1.TRANSLATE_API.batch;
|
|
50
|
+
TranslateTextContract.endpoint = translate_api_1.TRANSLATE_CONTROLLER.endpoints.batch;
|
|
51
|
+
TranslateTextContract.httpMethod = common_1.HTTP_METHODS.post;
|
|
52
|
+
TranslateTextContract.RequestSchema = TranslateTextContractRequestSchema;
|
|
53
|
+
TranslateTextContract.ResponseSchema = TranslateTextContractResponseSchema;
|
|
54
|
+
})(TranslateTextContract || (exports.TranslateTextContract = TranslateTextContract = {}));
|
|
@@ -0,0 +1,42 @@
|
|
|
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.BaseTranslateSchema = void 0;
|
|
37
|
+
const z = __importStar(require("zod"));
|
|
38
|
+
const common_1 = require("../common");
|
|
39
|
+
exports.BaseTranslateSchema = z.object({
|
|
40
|
+
fromLang: common_1.LanguageKeysSchema,
|
|
41
|
+
toLangs: z.array(common_1.LanguageKeysSchema).min(1),
|
|
42
|
+
});
|
package/package.json
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './translate-text.contract';
|
|
2
|
+
export * from './translate-object.contract';
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
import { HTTP_METHODS, LanguageKeysSchema, ENTITIES } from '../../common';
|
|
3
|
+
import { TRANSLATE_API, TRANSLATE_CONTROLLER } from '../translate.api';
|
|
4
|
+
import { PermissionTranslationsSchema } from '../../permissions';
|
|
5
|
+
import { RoleTranslationsSchema } from '../../roles';
|
|
6
|
+
import { BaseTranslateSchema } from '../translate.schemas';
|
|
7
|
+
|
|
8
|
+
const makeReqVariant = <E extends (typeof ENTITIES)[keyof typeof ENTITIES], S extends z.ZodTypeAny>(
|
|
9
|
+
entity: E,
|
|
10
|
+
schema: S,
|
|
11
|
+
) => BaseTranslateSchema.extend({ entity: z.literal(entity), object: schema });
|
|
12
|
+
|
|
13
|
+
const makeResVariant = <E extends (typeof ENTITIES)[keyof typeof ENTITIES], S extends z.ZodTypeAny>(
|
|
14
|
+
entity: E,
|
|
15
|
+
schema: S,
|
|
16
|
+
) =>
|
|
17
|
+
z.object({
|
|
18
|
+
entity: z.literal(entity),
|
|
19
|
+
translations: z.partialRecord(LanguageKeysSchema, schema),
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const TranslateObjectRequestVariants = [
|
|
23
|
+
makeReqVariant(ENTITIES.permissions, PermissionTranslationsSchema),
|
|
24
|
+
makeReqVariant(ENTITIES.roles, RoleTranslationsSchema),
|
|
25
|
+
] as const;
|
|
26
|
+
|
|
27
|
+
const TranslateObjectResponseVariants = [
|
|
28
|
+
makeResVariant(ENTITIES.permissions, PermissionTranslationsSchema),
|
|
29
|
+
makeResVariant(ENTITIES.roles, RoleTranslationsSchema),
|
|
30
|
+
] as const;
|
|
31
|
+
|
|
32
|
+
const TranslateObjectContractRequestSchema = z.discriminatedUnion(
|
|
33
|
+
'entity',
|
|
34
|
+
TranslateObjectRequestVariants,
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
const TranslateObjectContractResponseSchema = z.discriminatedUnion(
|
|
38
|
+
'entity',
|
|
39
|
+
TranslateObjectResponseVariants,
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
export namespace TranslateObjectContract {
|
|
43
|
+
export const getUrl = TRANSLATE_API.object;
|
|
44
|
+
export const endpoint = TRANSLATE_CONTROLLER.endpoints.object;
|
|
45
|
+
export const httpMethod = HTTP_METHODS.post;
|
|
46
|
+
|
|
47
|
+
export const RequestSchema = TranslateObjectContractRequestSchema;
|
|
48
|
+
export type TRequest = z.infer<typeof RequestSchema>;
|
|
49
|
+
|
|
50
|
+
export const ResponseSchema = TranslateObjectContractResponseSchema;
|
|
51
|
+
export type TResponse = z.infer<typeof ResponseSchema>;
|
|
52
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
import { HTTP_METHODS, LanguageKeysSchema } from '../../common';
|
|
3
|
+
import { TRANSLATE_API, TRANSLATE_CONTROLLER } from '../translate.api';
|
|
4
|
+
import { BaseTranslateSchema } from '../translate.schemas';
|
|
5
|
+
|
|
6
|
+
const TranslateTextContractRequestSchema = BaseTranslateSchema.extend({
|
|
7
|
+
text: z.string().min(1),
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
const TranslateTextContractResponseSchema = z.object({
|
|
11
|
+
translations: z.partialRecord(LanguageKeysSchema, z.string().min(1).nullable()),
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
export namespace TranslateTextContract {
|
|
15
|
+
export const getUrl = TRANSLATE_API.batch;
|
|
16
|
+
export const endpoint = TRANSLATE_CONTROLLER.endpoints.batch;
|
|
17
|
+
export const httpMethod = HTTP_METHODS.post;
|
|
18
|
+
|
|
19
|
+
export const RequestSchema = TranslateTextContractRequestSchema;
|
|
20
|
+
export type TRequest = z.infer<typeof RequestSchema>;
|
|
21
|
+
|
|
22
|
+
export const ResponseSchema = TranslateTextContractResponseSchema;
|
|
23
|
+
export type TResponse = z.infer<typeof ResponseSchema>;
|
|
24
|
+
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import * as z from 'zod';
|
|
2
|
-
import { HTTP_METHODS, LanguageKeysSchema, LANGUAGE_KEYS } from '../../common';
|
|
3
|
-
import { TRANSLATE_API, TRANSLATE_CONTROLLER } from '../translate.api';
|
|
4
|
-
|
|
5
|
-
const BatchTranslateContractRequestSchema = z.object({
|
|
6
|
-
text: z.string().min(1),
|
|
7
|
-
fromLang: LanguageKeysSchema,
|
|
8
|
-
toLangs: z.array(LanguageKeysSchema).min(1),
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
const TranslationsSchema = z
|
|
12
|
-
.object(Object.fromEntries(LANGUAGE_KEYS.map(l => [l, z.string().min(1).nullable()])))
|
|
13
|
-
.partial();
|
|
14
|
-
|
|
15
|
-
const BatchTranslateContractResponseSchema = z.object({
|
|
16
|
-
translations: TranslationsSchema,
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
export namespace BatchTranslateContract {
|
|
20
|
-
export const getUrl = TRANSLATE_API.batch;
|
|
21
|
-
export const endpoint = TRANSLATE_CONTROLLER.endpoints.batch;
|
|
22
|
-
export const httpMethod = HTTP_METHODS.post;
|
|
23
|
-
|
|
24
|
-
export const RequestSchema = BatchTranslateContractRequestSchema;
|
|
25
|
-
export type TRequest = z.infer<typeof RequestSchema>;
|
|
26
|
-
|
|
27
|
-
export const ResponseSchema = BatchTranslateContractResponseSchema;
|
|
28
|
-
export type TResponse = z.infer<typeof ResponseSchema>;
|
|
29
|
-
}
|