diff --git a/apps/backend/nest-cli.json b/apps/backend/nest-cli.json index 56167b3..82f7afe 100644 --- a/apps/backend/nest-cli.json +++ b/apps/backend/nest-cli.json @@ -1,4 +1,13 @@ { "collection": "@nestjs/schematics", - "sourceRoot": "src" + "sourceRoot": "src", + "compilerOptions": { + "assets": [ + { + "include": "modules/tbank/proto/contracts/**/*", + "outDir": "dist" + } + ], + "watchAssets": true + } } diff --git a/apps/backend/src/modules/tbank/services/tbank-client.service.spec.ts b/apps/backend/src/modules/tbank/services/tbank-client.service.spec.ts index e74067b..4c556ba 100644 --- a/apps/backend/src/modules/tbank/services/tbank-client.service.spec.ts +++ b/apps/backend/src/modules/tbank/services/tbank-client.service.spec.ts @@ -35,6 +35,12 @@ describe('TBankClientService', () => { }); }); + it('creates service clients from vendored proto contracts', () => { + const service = new TBankClientService(config); + + expect(() => service.getServiceClient('UsersService')).not.toThrow(); + }); + it('throws integration unavailable when token is missing', async () => { const missingConfig = { get: vi.fn((key: string, fallback?: unknown) => diff --git a/apps/backend/src/modules/tbank/services/tbank-client.service.ts b/apps/backend/src/modules/tbank/services/tbank-client.service.ts index ab2b4cb..a818747 100644 --- a/apps/backend/src/modules/tbank/services/tbank-client.service.ts +++ b/apps/backend/src/modules/tbank/services/tbank-client.service.ts @@ -17,6 +17,7 @@ import { } from '@grpc/grpc-js'; import { loadSync } from '@grpc/proto-loader'; import PQueue from 'p-queue'; +import { existsSync } from 'node:fs'; import { join } from 'node:path'; import { TBANK_PROTO_FILES, TBANK_PROTO_PACKAGE } from '../tbank.config'; @@ -44,19 +45,29 @@ export class TBankClientService { intervalCap: this.configService.get('app.tbank.rateLimitPerSecond', 5), }); - const protoRoot = join(__dirname, '..', 'proto', 'contracts'); - const definition = loadSync(Object.values(TBANK_PROTO_FILES), { - includeDirs: [protoRoot], - keepCase: false, - longs: String, - enums: String, - defaults: true, - oneofs: true, - }); + const protoRoot = this.resolveProtoRoot(); + const definition = loadSync( + Object.values(TBANK_PROTO_FILES).map((fileName) => join(protoRoot, fileName)), + { + includeDirs: [protoRoot], + keepCase: false, + longs: String, + enums: String, + defaults: true, + oneofs: true, + }, + ); this.packageDefinition = loadPackageDefinition(definition); } + private resolveProtoRoot(): string { + const distProtoRoot = join(__dirname, '..', 'proto', 'contracts'); + if (existsSync(distProtoRoot)) return distProtoRoot; + + return join(process.cwd(), 'src', 'modules', 'tbank', 'proto', 'contracts'); + } + createMetadata(): Metadata { const token = this.configService.get('app.tbank.token', ''); if (!token) {