From 3312082a0a542558432d24eaee726b4edd419d7d Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Wed, 4 Nov 2026 00:34:54 +0300 Subject: [PATCH] refactor: expose upcoming-events public api and guard its boundary (WealthLedger/backend#163) --- eslint.config.mjs | 38 +++++++++++-------- .../tbank-sync/tbank-hourly.scheduler.ts | 2 +- .../upcoming-events/upcoming-events.api.ts | 1 + src/openapi.ts | 2 +- 4 files changed, 26 insertions(+), 17 deletions(-) create mode 100644 src/modules/investments/upcoming-events/upcoming-events.api.ts diff --git a/eslint.config.mjs b/eslint.config.mjs index d5a9e23..794ef23 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -15,6 +15,18 @@ import globals from 'globals'; import tseslint from 'typescript-eslint'; const tests = ['**/*.spec.ts', 'test/**/*.ts']; +const guardedModules = [ + { + name: 'tbank-sync', + except: [ + './tbank-sync.api.ts', + './tbank-sync.dto.ts', + './tbank-sync.module.ts', + './tbank-sync-repository.module.ts', + ], + }, + { name: 'upcoming-events', except: ['./upcoming-events.api.ts', './upcoming-events.module.ts'] }, +]; const prismaImports = [ '@prisma/*', '**/generated/prisma/**', '**/prisma.service', ]; @@ -212,24 +224,20 @@ export default defineConfig( '@typescript-eslint/no-unsafe-enum-comparison': 'error', }, }, - { - files: ['src/**/*.ts'], - ignores: [...tests, 'src/modules/investments/tbank-sync/**'], + // Separate rule so it does not replace layer-specific no-restricted-imports configs. + // A module may import its own internals, so each guarded module gets a block without its zone. + ...[undefined, ...guardedModules].map((own) => ({ + files: own ? [`src/modules/investments/${own.name}/**/*.ts`] : ['src/**/*.ts'], + ignores: own ? tests : [...tests, ...guardedModules.map(({ name }) => `src/modules/investments/${name}/**`)], rules: { - // Separate rule so it does not replace layer-specific no-restricted-imports configs. 'import-x/no-restricted-paths': ['error', { - zones: [{ + zones: guardedModules.filter((module) => module !== own).map(({ except, name }) => ({ target: './src', - from: './src/modules/investments/tbank-sync', - except: [ - './tbank-sync.api.ts', - './tbank-sync.dto.ts', - './tbank-sync.module.ts', - './tbank-sync-repository.module.ts', - ], - message: 'Use tbank-sync.api for cross-module access.', - }], + from: `./src/modules/investments/${name}`, + except, + message: `Use ${name}.api for cross-module access.`, + })), }], }, - }, + })), ); diff --git a/src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts b/src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts index 058700d..13d59c0 100644 --- a/src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts +++ b/src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts @@ -11,7 +11,7 @@ import { import { PrismaService } from '../../../prisma/prisma.service'; import { BrokerageOperationsSyncService } from '../operations/operations.api'; import { PortfolioService } from '../portfolio/portfolio.api'; -import { UpcomingEventsService } from '../upcoming-events/upcoming-events.service'; +import { UpcomingEventsService } from '../upcoming-events/upcoming-events.api'; import { HOURLY_CAUSE_INTERRUPTED, type HourlyCause, diff --git a/src/modules/investments/upcoming-events/upcoming-events.api.ts b/src/modules/investments/upcoming-events/upcoming-events.api.ts new file mode 100644 index 0000000..deef34b --- /dev/null +++ b/src/modules/investments/upcoming-events/upcoming-events.api.ts @@ -0,0 +1 @@ +export { EventsErrorCode, UpcomingEventsService } from './upcoming-events.service'; diff --git a/src/openapi.ts b/src/openapi.ts index 0857d4d..9c7e665 100644 --- a/src/openapi.ts +++ b/src/openapi.ts @@ -10,7 +10,7 @@ import { BankErrorCode } from './modules/banking/bank-cards/application/bank-car import { IncomeErrorCode } from './modules/investments/income/income-period'; import { InstrumentErrorCode } from './modules/investments/instruments/domain/instrument-error-code'; import { OperationErrorCode } from './modules/investments/operations/domain/operation-error-code'; -import { EventsErrorCode } from './modules/investments/upcoming-events/upcoming-events.service'; +import { EventsErrorCode } from './modules/investments/upcoming-events/upcoming-events.api'; export const API_PREFIX = 'api/v1'; -- 2.54.0