refactor: enforce enum machine codes
Use owner enums for error and T-Bank protocol values with ESLint regression checks. Preserve open wire fallbacks and keep protocol imports independent of DI and Prisma. Verified npm ci, verify, 226 unit tests, 262 isolated e2e tests and unchanged OpenAPI.
This commit is contained in:
+10
-4
@@ -160,10 +160,11 @@ HTTP/e2e naming и расположение — в [Testing](conventions/testing
|
||||
|
||||
`*.module.ts` задаёт DI boundary; `*.api.ts` перечисляет используемые другими
|
||||
модулями providers, функции и типы. Внешний production import идёт через этот
|
||||
API или файл Nest module. Чистые `integrations/tbank/decimal.ts` и
|
||||
API или файл Nest module. Чистые `integrations/tbank/decimal.ts`,
|
||||
`integrations/tbank/tbank-protocol.ts`, `integrations/tbank/tbank-error-code.ts` и
|
||||
`modules/investments/operations/domain/operations-sync-plan.ts` — отдельные
|
||||
публичные входы для protobuf conversion и interval rules: импорт расчётов
|
||||
не загружает DI/Prisma.
|
||||
публичные входы для protobuf conversion, protocol/error vocabulary и interval
|
||||
rules: импорт этих значений и расчётов не загружает DI/Prisma.
|
||||
Внутри модуля используй прямые локальные импорты.
|
||||
Tests могут импортировать внутренний owner для проверки поведения и mocks.
|
||||
Новый export требует текущего потребителя; controller и persistence остаются
|
||||
@@ -251,7 +252,12 @@ OpenAPI enum metadata и runtime validation должны читать тот ж
|
||||
Исключения для индексов, default values, enum/type declarations и readonly
|
||||
properties заданы в ESLint config. Test fixtures/expected values остаются inline,
|
||||
остальные lint правила продолжают действовать. Numeric policy получает предметное имя и единицы;
|
||||
semantic magic strings проверяются conventions/review без нового инструмента.
|
||||
Machine codes и protocol values задаются строковыми enum у владельца.
|
||||
`no-restricted-syntax` запрещает inline-коды и значения известных protocol families
|
||||
в production TS; `no-unsafe-enum-comparison` проверяет сравнения enum.
|
||||
Внешние открытые строки проверяются на boundary без cast и без потери unknown fallback.
|
||||
Tests сохраняют независимые literal wire assertions; обычный текст и env keys
|
||||
не считаются кодами. Новые словари требуют проверки владельца и расширения selectors.
|
||||
|
||||
## Logging
|
||||
|
||||
|
||||
@@ -29,7 +29,8 @@ owner и 1–3 примера. Код показывает механизм; с
|
||||
## Domain values
|
||||
|
||||
Finite business vocabulary принадлежит одному domain/module/entity owner.
|
||||
Переиспользуй его symbols; для нового словаря без аналога — `as const` + union.
|
||||
Переиспользуй его symbols; для machine codes и protocol values используй
|
||||
строковые `enum`, для структуры с разными payload — discriminated union.
|
||||
Сохраняй wire values; generated/external enums не переписывай вручную.
|
||||
Numeric policy называй по смыслу и единицам. Индексы, `Math.max(value, 0)` и
|
||||
обычные labels не выноси в constants без semantic benefit.
|
||||
|
||||
@@ -22,7 +22,9 @@ RPC, credentials/access и resilience. Эти владельцы не объед
|
||||
|
||||
Преобразование provider records происходит на boundary: например,
|
||||
`tbank-portfolio.mapper.ts` и `bond-money.mapper.ts`; protobuf decimal helper
|
||||
остаётся отдельным чистым входом integration. Domain получает внутренние
|
||||
остаётся отдельным чистым входом integration. `tbank-protocol.ts` и
|
||||
`tbank-error-code.ts` также импортируются напрямую: их enums и guards
|
||||
не должны загружать DI/Prisma через service exports. Domain получает внутренние
|
||||
значения и не импортирует gRPC/SDK types. Не добавляй новый adapter на каждый
|
||||
client или mapper для простого копирования полей. Даты/units/nano разбираются
|
||||
на границе клиента/его mapping, а не становятся моделью чистых расчётов.
|
||||
|
||||
Reference in New Issue
Block a user