diff --git a/package.json b/package.json index 822929f..782c42e 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,16 @@ "description": "", "author": "", "private": true, + "imports": { + "#generated/*": { + "development": "./dist-dev/generated/*", + "default": "./dist/generated/*" + }, + "#src/*": { + "development": "./dist-dev/src/*", + "default": "./dist/src/*" + } + }, "license": "UNLICENSED", "engines": { "node": "v24.22.1" @@ -14,8 +24,8 @@ "openapi:check": "npm run build && node scripts/generate-openapi.cjs --check", "format": "npm run lint:fix", "start": "nest start", - "start:dev": "NODE_ENV=development nest start --watch --path tsconfig.dev.json", - "start:debug": "NODE_ENV=development nest start --debug --watch --path tsconfig.dev.json", + "start:dev": "NODE_ENV=development NODE_OPTIONS=--conditions=development nest start --watch --path tsconfig.dev.json", + "start:debug": "NODE_ENV=development NODE_OPTIONS=--conditions=development nest start --debug --watch --path tsconfig.dev.json", "start:prod": "node dist/src/main.js", "lint": "npm run lint:check", "lint:check": "eslint . --max-warnings=0", @@ -131,6 +141,10 @@ } }, "jest": { + "moduleNameMapper": { + "^#generated/(.*)$": "/../generated/$1", + "^#src/(.*)$": "/$1" + }, "moduleFileExtensions": [ "js", "json", diff --git a/src/integrations/tbank/instrument-metadata.repository.ts b/src/integrations/tbank/instrument-metadata.repository.ts index f2a568a..ace5c0f 100644 --- a/src/integrations/tbank/instrument-metadata.repository.ts +++ b/src/integrations/tbank/instrument-metadata.repository.ts @@ -5,7 +5,8 @@ import { isDeepStrictEqual } from 'node:util'; import type { TbankInstrumentLookup as MetadataLookupRow, TbankInstrument as MetadataRow, -} from '../../../generated/prisma/client'; +} from '#generated/prisma/client'; + import type { TbankInstrument } from './tbank.client'; import { PrismaService } from '../../prisma/prisma.service'; diff --git a/src/integrations/tbank/tbank-sync-claim.ts b/src/integrations/tbank/tbank-sync-claim.ts index 2445398..d8282e3 100644 --- a/src/integrations/tbank/tbank-sync-claim.ts +++ b/src/integrations/tbank/tbank-sync-claim.ts @@ -1,4 +1,5 @@ -import type { Prisma } from '../../../generated/prisma/client'; +import type { Prisma } from '#generated/prisma/client'; + import type { TbankSyncAttempt } from './tbank-access.service'; const NO_UPDATED_ROWS = 0; diff --git a/src/modules/auth/application/auth.service.spec.ts b/src/modules/auth/application/auth.service.spec.ts index b9e4930..b471e7f 100644 --- a/src/modules/auth/application/auth.service.spec.ts +++ b/src/modules/auth/application/auth.service.spec.ts @@ -9,7 +9,7 @@ jest.mock('bcrypt', () => ({ compare: jest.fn(() => Promise.resolve(true)), })); -jest.mock('../../../prisma/prisma.service', () => ({ +jest.mock('#src/prisma/prisma.service', () => ({ PrismaService: class PrismaService {}, })); diff --git a/src/modules/auth/application/auth.service.ts b/src/modules/auth/application/auth.service.ts index 2462d24..69cdfcc 100644 --- a/src/modules/auth/application/auth.service.ts +++ b/src/modules/auth/application/auth.service.ts @@ -7,9 +7,10 @@ import { JwtService } from '@nestjs/jwt'; import * as bcrypt from 'bcrypt'; import { createHash, randomUUID } from 'crypto'; -import type { Session, User } from '../../../../generated/prisma/client'; +import type { Session, User } from '#generated/prisma/client'; + +import { HttpErrorCode } from '#src/common/error-code'; -import { HttpErrorCode } from '../../../common/error-code'; import { AuthRepository } from '../infrastructure/auth.repository'; import { AuthErrorCode } from './auth-error-code'; import { AuthenticationResult, AuthUser, RefreshPayload } from './auth.types'; diff --git a/src/modules/auth/infrastructure/auth.repository.ts b/src/modules/auth/infrastructure/auth.repository.ts index afc3515..557a8ca 100644 --- a/src/modules/auth/infrastructure/auth.repository.ts +++ b/src/modules/auth/infrastructure/auth.repository.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; -import { isPrismaErrorCode, PrismaErrorCode } from '../../../prisma/prisma-error-code'; -import { PrismaService } from '../../../prisma/prisma.service'; +import { isPrismaErrorCode, PrismaErrorCode } from '#src/prisma/prisma-error-code'; +import { PrismaService } from '#src/prisma/prisma.service'; const EXPECTED_ROTATED_SESSIONS = 1; diff --git a/src/modules/auth/infrastructure/jwt.strategy.ts b/src/modules/auth/infrastructure/jwt.strategy.ts index ce4cfd9..d274985 100644 --- a/src/modules/auth/infrastructure/jwt.strategy.ts +++ b/src/modules/auth/infrastructure/jwt.strategy.ts @@ -3,8 +3,9 @@ import { ConfigService } from '@nestjs/config'; import { PassportStrategy } from '@nestjs/passport'; import { ExtractJwt, Strategy } from 'passport-jwt'; -import { HttpErrorCode } from '../../../common/error-code'; -import { Environment } from '../../../config/env.validation'; +import { HttpErrorCode } from '#src/common/error-code'; +import { Environment } from '#src/config/env.validation'; + import { AccessPayload } from '../application/auth.types'; @Injectable() diff --git a/src/modules/auth/presentation/auth.controller.ts b/src/modules/auth/presentation/auth.controller.ts index bfa4c5b..4c87ae2 100644 --- a/src/modules/auth/presentation/auth.controller.ts +++ b/src/modules/auth/presentation/auth.controller.ts @@ -20,8 +20,9 @@ import { ApiTags, } from '@nestjs/swagger'; -import { ApiProblemResponses } from '../../../common/decorators/api-safe-error-response.decorator'; -import { HttpErrorCode } from '../../../common/error-code'; +import { ApiProblemResponses } from '#src/common/decorators/api-safe-error-response.decorator'; +import { HttpErrorCode } from '#src/common/error-code'; + import { AuthService, REFRESH_TTL_MS } from '../application/auth.service'; import { AccessPayload, AuthenticationResult } from '../application/auth.types'; import { LoginDto, RegisterDto } from './auth.dto'; diff --git a/src/modules/banking/bank-cards/application/bank-card-input.ts b/src/modules/banking/bank-cards/application/bank-card-input.ts index 0fe28ac..d458182 100644 --- a/src/modules/banking/bank-cards/application/bank-card-input.ts +++ b/src/modules/banking/bank-cards/application/bank-card-input.ts @@ -5,7 +5,8 @@ import { } from '@nestjs/common'; import { createHash } from 'node:crypto'; -import { ISO_DATE_LENGTH, ISO_DATE_START } from '../../../../common/time'; +import { ISO_DATE_LENGTH, ISO_DATE_START } from '#src/common/time'; + import { MAX_CARD_NAME_LENGTH, MAX_OPERATION_DESCRIPTION_LENGTH, diff --git a/src/modules/banking/bank-cards/application/bank-cards.service.ts b/src/modules/banking/bank-cards/application/bank-cards.service.ts index e8db044..494c173 100644 --- a/src/modules/banking/bank-cards/application/bank-cards.service.ts +++ b/src/modules/banking/bank-cards/application/bank-cards.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import type { BankCard, Prisma } from '../../../../../generated/prisma/client'; +import type { BankCard, Prisma } from '#generated/prisma/client'; import { bankBalance } from '../domain/bank-card.calculations'; import { rubMoney } from '../domain/rub-money'; diff --git a/src/modules/banking/bank-cards/application/bank-operations.service.ts b/src/modules/banking/bank-cards/application/bank-operations.service.ts index bd036f0..ed1ca62 100644 --- a/src/modules/banking/bank-cards/application/bank-operations.service.ts +++ b/src/modules/banking/bank-cards/application/bank-operations.service.ts @@ -3,7 +3,7 @@ import { GoneException, Injectable } from '@nestjs/common'; import type { BankCardOperation, Prisma, -} from '../../../../../generated/prisma/client'; +} from '#generated/prisma/client'; import { FIRST_PAGE } from '../domain/bank-card-limits'; import { BankOperationKind } from '../domain/bank-operation-kind'; diff --git a/src/modules/banking/bank-cards/application/get-bank-summary.use-case.spec.ts b/src/modules/banking/bank-cards/application/get-bank-summary.use-case.spec.ts index 104b311..7f49e6d 100644 --- a/src/modules/banking/bank-cards/application/get-bank-summary.use-case.spec.ts +++ b/src/modules/banking/bank-cards/application/get-bank-summary.use-case.spec.ts @@ -1,8 +1,9 @@ -jest.mock('../../../../prisma/prisma.service', () => ({ +jest.mock('#src/prisma/prisma.service', () => ({ PrismaService: class {}, })); -jest.mock('../../../../../generated/prisma/client', () => ({ Prisma: {} })); -import { PrismaService } from '../../../../prisma/prisma.service'; +jest.mock('#generated/prisma/client', () => ({ Prisma: {} })); +import { PrismaService } from '#src/prisma/prisma.service'; + import { BankCardsRepository } from '../infrastructure/bank-cards.repository'; import { GetBankSummaryUseCase } from './get-bank-summary.use-case'; diff --git a/src/modules/banking/bank-cards/domain/bank-card.calculations.ts b/src/modules/banking/bank-cards/domain/bank-card.calculations.ts index cba24a7..6496c86 100644 --- a/src/modules/banking/bank-cards/domain/bank-card.calculations.ts +++ b/src/modules/banking/bank-cards/domain/bank-card.calculations.ts @@ -1,4 +1,5 @@ -import { ISO_DATE_LENGTH, ISO_DATE_START } from '../../../../common/time'; +import { ISO_DATE_LENGTH, ISO_DATE_START } from '#src/common/time'; + import { BankOperationKind } from './bank-operation-kind'; import { ZERO_KOPECKS } from './rub-money'; diff --git a/src/modules/banking/bank-cards/domain/rub-money.ts b/src/modules/banking/bank-cards/domain/rub-money.ts index f435958..a7c896f 100644 --- a/src/modules/banking/bank-cards/domain/rub-money.ts +++ b/src/modules/banking/bank-cards/domain/rub-money.ts @@ -1,6 +1,6 @@ -import type { Money } from '../../../../common/money.types'; +import type { Money } from '#src/common/money.types'; -import { DECIMAL_RADIX, decimalFromString, formatDecimal } from '../../../../common/decimal'; +import { DECIMAL_RADIX, decimalFromString, formatDecimal } from '#src/common/decimal'; export const ZERO_KOPECKS = 0n; diff --git a/src/modules/banking/bank-cards/infrastructure/bank-cards.repository.ts b/src/modules/banking/bank-cards/infrastructure/bank-cards.repository.ts index 3572f6b..add3ba8 100644 --- a/src/modules/banking/bank-cards/infrastructure/bank-cards.repository.ts +++ b/src/modules/banking/bank-cards/infrastructure/bank-cards.repository.ts @@ -1,9 +1,10 @@ import { Injectable } from '@nestjs/common'; import { randomUUID } from 'node:crypto'; -import { BankCard, BankCardOperation, Prisma } from '../../../../../generated/prisma/client'; -import { isPrismaErrorCode, PrismaErrorCode } from '../../../../prisma/prisma-error-code'; -import { PrismaService } from '../../../../prisma/prisma.service'; +import { BankCard, BankCardOperation, Prisma } from '#generated/prisma/client'; +import { isPrismaErrorCode, PrismaErrorCode } from '#src/prisma/prisma-error-code'; +import { PrismaService } from '#src/prisma/prisma.service'; + import { BankErrorCode, conflict, diff --git a/src/modules/banking/bank-cards/presentation/bank-card.dto.ts b/src/modules/banking/bank-cards/presentation/bank-card.dto.ts index defd049..8bced0e 100644 --- a/src/modules/banking/bank-cards/presentation/bank-card.dto.ts +++ b/src/modules/banking/bank-cards/presentation/bank-card.dto.ts @@ -24,7 +24,8 @@ import { ValidateNested, } from 'class-validator'; -import { MoneyDto } from '../../../../common/money.dto'; +import { MoneyDto } from '#src/common/money.dto'; + import { FIRST_PAGE, MAX_CARD_NAME_LENGTH, diff --git a/src/modules/banking/bank-cards/presentation/bank-cards.controller.ts b/src/modules/banking/bank-cards/presentation/bank-cards.controller.ts index 2d55e2c..cd1b767 100644 --- a/src/modules/banking/bank-cards/presentation/bank-cards.controller.ts +++ b/src/modules/banking/bank-cards/presentation/bank-cards.controller.ts @@ -29,8 +29,9 @@ import { import { ApiProblemResponses, ProblemDetailsDto, -} from '../../../../common/decorators/api-safe-error-response.decorator'; -import { AccessPayload, JwtAuthGuard } from '../../../auth/auth.api'; +} from '#src/common/decorators/api-safe-error-response.decorator'; +import { AccessPayload, JwtAuthGuard } from '#src/modules/auth/auth.api'; + import { BankCardsService } from '../application/bank-cards.service'; import { BankOperationsService } from '../application/bank-operations.service'; import { ExpenseCategoriesService } from '../application/expense-categories.service'; diff --git a/src/modules/investments/brokerage-accounts/brokerage-account.dto.ts b/src/modules/investments/brokerage-accounts/brokerage-account.dto.ts index a661d1b..838fea3 100644 --- a/src/modules/investments/brokerage-accounts/brokerage-account.dto.ts +++ b/src/modules/investments/brokerage-accounts/brokerage-account.dto.ts @@ -1,6 +1,7 @@ import { ApiProperty } from '@nestjs/swagger'; -import { MoneyDto } from '../../../common/money.dto'; +import { MoneyDto } from '#src/common/money.dto'; + import { InvestmentResourceMetaDto } from '../investment-resource.dto'; import { PortfolioStructureDto } from '../portfolio/portfolio.api'; import { HourlySyncStatusDto } from '../tbank-sync/tbank-sync.dto'; diff --git a/src/modules/investments/brokerage-accounts/brokerage-accounts.controller.ts b/src/modules/investments/brokerage-accounts/brokerage-accounts.controller.ts index 712fed4..46de791 100644 --- a/src/modules/investments/brokerage-accounts/brokerage-accounts.controller.ts +++ b/src/modules/investments/brokerage-accounts/brokerage-accounts.controller.ts @@ -3,7 +3,8 @@ import type { Request } from 'express'; import { Controller, Get, Req, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiOkResponse, ApiTags } from '@nestjs/swagger'; -import { ApiProblemResponses } from '../../../common/decorators/api-safe-error-response.decorator'; +import { ApiProblemResponses } from '#src/common/decorators/api-safe-error-response.decorator'; + import { AccessPayload, JwtAuthGuard } from '../../auth/auth.api'; import { BrokerageAccountsResourceDto } from './brokerage-account.dto'; import { BrokerageAccountsService } from './brokerage-accounts.service'; diff --git a/src/modules/investments/brokerage-accounts/brokerage-accounts.module.ts b/src/modules/investments/brokerage-accounts/brokerage-accounts.module.ts index 6d1c436..a4ab4f1 100644 --- a/src/modules/investments/brokerage-accounts/brokerage-accounts.module.ts +++ b/src/modules/investments/brokerage-accounts/brokerage-accounts.module.ts @@ -1,6 +1,7 @@ import { Module } from '@nestjs/common'; -import { TbankModule } from '../../../integrations/tbank/tbank.module'; +import { TbankModule } from '#src/integrations/tbank/tbank.module'; + import { AuthModule } from '../../auth/auth.module'; import { PortfolioModule } from '../portfolio/portfolio.module'; import { TbankSyncRepositoryModule } from '../tbank-sync/tbank-sync-repository.module'; diff --git a/src/modules/investments/brokerage-accounts/brokerage-accounts.service.spec.ts b/src/modules/investments/brokerage-accounts/brokerage-accounts.service.spec.ts index 44c54a9..4605b89 100644 --- a/src/modules/investments/brokerage-accounts/brokerage-accounts.service.spec.ts +++ b/src/modules/investments/brokerage-accounts/brokerage-accounts.service.spec.ts @@ -1,4 +1,4 @@ -jest.mock('../../../prisma/prisma.service', () => ({ +jest.mock('#src/prisma/prisma.service', () => ({ PrismaService: class {}, })); import { investmentResourceMeta } from '../investment-resource.mapper'; diff --git a/src/modules/investments/brokerage-accounts/brokerage-accounts.service.ts b/src/modules/investments/brokerage-accounts/brokerage-accounts.service.ts index 1e7e5c0..655db21 100644 --- a/src/modules/investments/brokerage-accounts/brokerage-accounts.service.ts +++ b/src/modules/investments/brokerage-accounts/brokerage-accounts.service.ts @@ -7,7 +7,8 @@ import { formatDecimal, isZero, multiply, -} from '../../../common/decimal'; +} from '#src/common/decimal'; + import { investmentResourceMeta } from '../investment-resource.mapper'; import { sumMoneyByCurrency } from '../portfolio/domain/portfolio-totals'; import { PortfolioPositionDto, PortfolioService } from '../portfolio/portfolio.api'; diff --git a/src/modules/investments/income/income-analytics.controller.ts b/src/modules/investments/income/income-analytics.controller.ts index d72f624..b07edf5 100644 --- a/src/modules/investments/income/income-analytics.controller.ts +++ b/src/modules/investments/income/income-analytics.controller.ts @@ -3,7 +3,8 @@ import type { Request } from 'express'; import { Controller, Get, Param, Query, Req, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiOkResponse, ApiTags } from '@nestjs/swagger'; -import { ApiProblemResponses } from '../../../common/decorators/api-safe-error-response.decorator'; +import { ApiProblemResponses } from '#src/common/decorators/api-safe-error-response.decorator'; + import { AccessPayload, JwtAuthGuard } from '../../auth/auth.api'; import { InvestmentReadQueryDto } from '../investment-resource.dto'; import { diff --git a/src/modules/investments/income/income-analytics.dto.ts b/src/modules/investments/income/income-analytics.dto.ts index a0735f4..f503f07 100644 --- a/src/modules/investments/income/income-analytics.dto.ts +++ b/src/modules/investments/income/income-analytics.dto.ts @@ -1,7 +1,8 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsOptional, Matches } from 'class-validator'; -import { MoneyDto } from '../../../common/money.dto'; +import { MoneyDto } from '#src/common/money.dto'; + import { InvestmentDependencyDto, InvestmentReadQueryDto, diff --git a/src/modules/investments/income/income-analytics.service.spec.ts b/src/modules/investments/income/income-analytics.service.spec.ts index 320befc..72052e4 100644 --- a/src/modules/investments/income/income-analytics.service.spec.ts +++ b/src/modules/investments/income/income-analytics.service.spec.ts @@ -1,4 +1,4 @@ -jest.mock('../../../prisma/prisma.service', () => ({ +jest.mock('#src/prisma/prisma.service', () => ({ PrismaService: class {}, })); jest.mock('../operations/application/brokerage-operations.service', () => ({ diff --git a/src/modules/investments/income/income-analytics.service.ts b/src/modules/investments/income/income-analytics.service.ts index 0e4f4bd..940d39d 100644 --- a/src/modules/investments/income/income-analytics.service.ts +++ b/src/modules/investments/income/income-analytics.service.ts @@ -6,8 +6,9 @@ import { compare, decimalFromString, formatDecimal, -} from '../../../common/decimal'; -import { isTbankProtocolValue, TbankOperationType } from '../../../integrations/tbank/tbank-protocol'; +} from '#src/common/decimal'; +import { isTbankProtocolValue, TbankOperationType } from '#src/integrations/tbank/tbank-protocol'; + import { DateOnlyRange, moscowDate } from '../investment-calendar'; import { investmentResourceMeta } from '../investment-resource.mapper'; import { diff --git a/src/modules/investments/income/income-period.ts b/src/modules/investments/income/income-period.ts index 43d8bcf..8c39280 100644 --- a/src/modules/investments/income/income-period.ts +++ b/src/modules/investments/income/income-period.ts @@ -1,6 +1,7 @@ import { BadRequestException } from '@nestjs/common'; -import { ISO_DATE_LENGTH, ISO_DATE_START, MILLISECONDS_PER_DAY } from '../../../common/time'; +import { ISO_DATE_LENGTH, ISO_DATE_START, MILLISECONDS_PER_DAY } from '#src/common/time'; + import { DateOnlyRange, dateParts, diff --git a/src/modules/investments/instruments/application/candle.service.spec.ts b/src/modules/investments/instruments/application/candle.service.spec.ts index 0660470..96e7d3a 100644 --- a/src/modules/investments/instruments/application/candle.service.spec.ts +++ b/src/modules/investments/instruments/application/candle.service.spec.ts @@ -4,7 +4,7 @@ jest.mock('../infrastructure/candle.repository', () => ({ jest.mock('./catalog-enrichment.service', () => ({ CatalogEnrichmentService: class {}, })); -jest.mock('../../../../integrations/tbank/tbank.api', () => ({ +jest.mock('#src/integrations/tbank/tbank.api', () => ({ TbankAccessService: class {}, TbankClient: class {}, })); diff --git a/src/modules/investments/instruments/application/candle.service.ts b/src/modules/investments/instruments/application/candle.service.ts index 489c4e4..df9e3bb 100644 --- a/src/modules/investments/instruments/application/candle.service.ts +++ b/src/modules/investments/instruments/application/candle.service.ts @@ -5,15 +5,16 @@ import { } from '@nestjs/common'; import { randomUUID } from 'node:crypto'; -import { StructuredLogger } from '../../../../common/logging/structured-logger.service'; -import { MILLISECONDS_PER_DAY } from '../../../../common/time'; -import { isTbankErrorCode, TbankErrorCode } from '../../../../integrations/tbank/tbank-error-code'; +import { StructuredLogger } from '#src/common/logging/structured-logger.service'; +import { MILLISECONDS_PER_DAY } from '#src/common/time'; +import { isTbankErrorCode, TbankErrorCode } from '#src/integrations/tbank/tbank-error-code'; import { TbankAccessService, TbankClient, type TbankShare, type TbankSyncAttempt, -} from '../../../../integrations/tbank/tbank.api'; +} from '#src/integrations/tbank/tbank.api'; + import { investmentResourceMeta } from '../../investment-resource.mapper'; import { candleGaps, diff --git a/src/modules/investments/instruments/application/catalog-discovery.service.ts b/src/modules/investments/instruments/application/catalog-discovery.service.ts index bce90ce..ba3b5c2 100644 --- a/src/modules/investments/instruments/application/catalog-discovery.service.ts +++ b/src/modules/investments/instruments/application/catalog-discovery.service.ts @@ -8,7 +8,8 @@ import { TbankAccessService, TbankClient, tbankSourceTtlMs, -} from '../../../../integrations/tbank/tbank.api'; +} from '#src/integrations/tbank/tbank.api'; + import { investmentResourceMeta } from '../../investment-resource.mapper'; import { InstrumentErrorCode } from '../domain/instrument-error-code'; import { diff --git a/src/modules/investments/instruments/application/catalog-enrichment.service.ts b/src/modules/investments/instruments/application/catalog-enrichment.service.ts index a4da009..457528d 100644 --- a/src/modules/investments/instruments/application/catalog-enrichment.service.ts +++ b/src/modules/investments/instruments/application/catalog-enrichment.service.ts @@ -1,8 +1,8 @@ import { Injectable, NotFoundException } from '@nestjs/common'; import { randomUUID } from 'node:crypto'; -import { StructuredLogger } from '../../../../common/logging/structured-logger.service'; -import { isTbankErrorCode, TbankErrorCode } from '../../../../integrations/tbank/tbank-error-code'; +import { StructuredLogger } from '#src/common/logging/structured-logger.service'; +import { isTbankErrorCode, TbankErrorCode } from '#src/integrations/tbank/tbank-error-code'; import { TbankAccessService, TbankClient, @@ -10,7 +10,8 @@ import { tbankSourceNeedsRefresh, tbankSourceTtlMs, type TbankSyncAttempt, -} from '../../../../integrations/tbank/tbank.api'; +} from '#src/integrations/tbank/tbank.api'; + import { investmentResourceMeta } from '../../investment-resource.mapper'; import { CatalogDiscoveryRepository, diff --git a/src/modules/investments/instruments/application/catalog-selection.ts b/src/modules/investments/instruments/application/catalog-selection.ts index 471dbe4..93dbdb6 100644 --- a/src/modules/investments/instruments/application/catalog-selection.ts +++ b/src/modules/investments/instruments/application/catalog-selection.ts @@ -1,6 +1,6 @@ -import type { TbankShare } from '../../../../integrations/tbank/tbank.api'; +import type { TbankShare } from '#src/integrations/tbank/tbank.api'; -import { TbankInstrumentType } from '../../../../integrations/tbank/tbank-protocol'; +import { TbankInstrumentType } from '#src/integrations/tbank/tbank-protocol'; export const catalogSearchLimit = 30; diff --git a/src/modules/investments/instruments/application/catalog-source.loader.ts b/src/modules/investments/instruments/application/catalog-source.loader.ts index e3b9f08..f9007db 100644 --- a/src/modules/investments/instruments/application/catalog-source.loader.ts +++ b/src/modules/investments/instruments/application/catalog-source.loader.ts @@ -3,13 +3,13 @@ import { Injectable } from '@nestjs/common'; import { decimalFromString, divide, -} from '../../../../common/decimal'; +} from '#src/common/decimal'; import { MILLISECONDS_PER_DAY, MILLISECONDS_PER_SECOND, -} from '../../../../common/time'; -import { type MoexBondEvent, MoexClient } from '../../../../integrations/moex/moex.api'; -import { NcrRatingsClient } from '../../../../integrations/ncr/ncr.api'; +} from '#src/common/time'; +import { type MoexBondEvent, MoexClient } from '#src/integrations/moex/moex.api'; +import { NcrRatingsClient } from '#src/integrations/ncr/ncr.api'; import { type TbankBond, type TbankCandle, @@ -20,7 +20,8 @@ import { type TbankLastPrice, type TbankShare, type TbankSyncAttempt, -} from '../../../../integrations/tbank/tbank.api'; +} from '#src/integrations/tbank/tbank.api'; + import { candleGaps, utcDay } from '../domain/candle-coverage'; import { CandleRepository } from '../infrastructure/candle.repository'; import { diff --git a/src/modules/investments/instruments/application/instrument-market.ts b/src/modules/investments/instruments/application/instrument-market.ts index 53f9c52..cbc01ca 100644 --- a/src/modules/investments/instruments/application/instrument-market.ts +++ b/src/modules/investments/instruments/application/instrument-market.ts @@ -1,9 +1,9 @@ import type { TbankCandle, TbankTimestamp, -} from '../../../../integrations/tbank/tbank.api'; +} from '#src/integrations/tbank/tbank.api'; -import { ISO_DATE_LENGTH, ISO_DATE_START, MILLISECONDS_PER_SECOND } from '../../../../common/time'; +import { ISO_DATE_LENGTH, ISO_DATE_START, MILLISECONDS_PER_SECOND } from '#src/common/time'; const MIN_TIMESTAMP_SECONDS_EXCLUSIVE = 0; diff --git a/src/modules/investments/instruments/application/instrument-position.ts b/src/modules/investments/instruments/application/instrument-position.ts index 6bbc2cb..26b5569 100644 --- a/src/modules/investments/instruments/application/instrument-position.ts +++ b/src/modules/investments/instruments/application/instrument-position.ts @@ -4,8 +4,9 @@ import { divide, formatDecimal, multiply, -} from '../../../../common/decimal'; -import { MoneyDto } from '../../../../common/money.dto'; +} from '#src/common/decimal'; +import { MoneyDto } from '#src/common/money.dto'; + import { PortfolioDto, PortfolioPositionDto, diff --git a/src/modules/investments/instruments/application/public-instrument.spec.ts b/src/modules/investments/instruments/application/public-instrument.spec.ts index 063ea43..0e904a8 100644 --- a/src/modules/investments/instruments/application/public-instrument.spec.ts +++ b/src/modules/investments/instruments/application/public-instrument.spec.ts @@ -1,7 +1,7 @@ import type { TbankBond, TbankShare, -} from '../../../../integrations/tbank/tbank.api'; +} from '#src/integrations/tbank/tbank.api'; import { publicInstrument } from './public-instrument'; diff --git a/src/modules/investments/instruments/application/public-instrument.ts b/src/modules/investments/instruments/application/public-instrument.ts index c35a23b..9b29084 100644 --- a/src/modules/investments/instruments/application/public-instrument.ts +++ b/src/modules/investments/instruments/application/public-instrument.ts @@ -1,7 +1,7 @@ import type { TbankBond, TbankShare, -} from '../../../../integrations/tbank/tbank.api'; +} from '#src/integrations/tbank/tbank.api'; export function publicInstrument(value: TbankBond | TbankShare) { const bond = value as TbankBond; diff --git a/src/modules/investments/instruments/bonds/application/bond-catalog.service.ts b/src/modules/investments/instruments/bonds/application/bond-catalog.service.ts index dbfcee5..d5c0fe6 100644 --- a/src/modules/investments/instruments/bonds/application/bond-catalog.service.ts +++ b/src/modules/investments/instruments/bonds/application/bond-catalog.service.ts @@ -1,9 +1,10 @@ import { Injectable } from '@nestjs/common'; -import type { TbankBond } from '../../../../../integrations/tbank/tbank.api'; +import type { TbankBond } from '#src/integrations/tbank/tbank.api'; + +import { formatDecimal } from '#src/common/decimal'; +import { decimal } from '#src/integrations/tbank/decimal'; -import { formatDecimal } from '../../../../../common/decimal'; -import { decimal } from '../../../../../integrations/tbank/decimal'; import { CatalogDiscoveryService } from '../../application/catalog-discovery.service'; import { timestamp } from '../../application/instrument-market'; import { @@ -14,7 +15,8 @@ import { type IdentifiedBond = TbankBond & { uid: string }; -import { ISO_DATE_LENGTH, ISO_DATE_START } from '../../../../../common/time'; +import { ISO_DATE_LENGTH, ISO_DATE_START } from '#src/common/time'; + import { money } from '../infrastructure/bond-money.mapper'; const MIN_LOT_EXCLUSIVE = 0; diff --git a/src/modules/investments/instruments/bonds/application/bond-income.service.ts b/src/modules/investments/instruments/bonds/application/bond-income.service.ts index 675513a..f4a59b8 100644 --- a/src/modules/investments/instruments/bonds/application/bond-income.service.ts +++ b/src/modules/investments/instruments/bonds/application/bond-income.service.ts @@ -5,19 +5,20 @@ import { divide, formatDecimal, multiply, -} from '../../../../../common/decimal'; -import { ISO_DATE_LENGTH, ISO_DATE_START } from '../../../../../common/time'; -import { isTbankProtocolValue, TbankCouponType } from '../../../../../integrations/tbank/tbank-protocol'; +} from '#src/common/decimal'; +import { ISO_DATE_LENGTH, ISO_DATE_START } from '#src/common/time'; +import { isTbankProtocolValue, TbankCouponType } from '#src/integrations/tbank/tbank-protocol'; import { TbankAccessService, type TbankBond, type TbankCoupon, tbankSourceNeedsRefresh, -} from '../../../../../integrations/tbank/tbank.api'; +} from '#src/integrations/tbank/tbank.api'; import { ForecastService, PortfolioService, -} from '../../../portfolio/portfolio.api'; +} from '#src/modules/investments/portfolio/portfolio.api'; + import { CatalogEnrichmentService, type CatalogPayload, diff --git a/src/modules/investments/instruments/bonds/application/bond-market.service.ts b/src/modules/investments/instruments/bonds/application/bond-market.service.ts index 5902ea8..824248b 100644 --- a/src/modules/investments/instruments/bonds/application/bond-market.service.ts +++ b/src/modules/investments/instruments/bonds/application/bond-market.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import type { TbankBond } from '../../../../../integrations/tbank/tbank.api'; +import type { TbankBond } from '#src/integrations/tbank/tbank.api'; import { add, @@ -9,9 +9,10 @@ import { formatDecimal, multiply, subtract, -} from '../../../../../common/decimal'; -import { ISO_DATE_LENGTH, ISO_DATE_START } from '../../../../../common/time'; -import { decimal } from '../../../../../integrations/tbank/decimal'; +} from '#src/common/decimal'; +import { ISO_DATE_LENGTH, ISO_DATE_START } from '#src/common/time'; +import { decimal } from '#src/integrations/tbank/decimal'; + import { CandleService } from '../../application/candle.service'; import { CatalogEnrichmentService, diff --git a/src/modules/investments/instruments/bonds/application/bond.spec.ts b/src/modules/investments/instruments/bonds/application/bond.spec.ts index fed812e..8c1bd40 100644 --- a/src/modules/investments/instruments/bonds/application/bond.spec.ts +++ b/src/modules/investments/instruments/bonds/application/bond.spec.ts @@ -1,9 +1,9 @@ -import type { PortfolioDto } from '../../../portfolio/portfolio.api'; +import type { PortfolioDto } from '#src/modules/investments/portfolio/portfolio.api'; import { instrumentPosition } from '../../application/instrument-position'; import { bondCoupons, bondMetrics } from './bond-income.service'; import { bondQuote } from './bond-market.service'; -jest.mock('../../../../../prisma/prisma.service', () => ({ +jest.mock('#src/prisma/prisma.service', () => ({ PrismaService: class {}, })); const time = (value: string) => ({ seconds: String(Date.parse(value) / 1000) }); diff --git a/src/modules/investments/instruments/bonds/infrastructure/bond-money.mapper.ts b/src/modules/investments/instruments/bonds/infrastructure/bond-money.mapper.ts index fd115e7..66ca80e 100644 --- a/src/modules/investments/instruments/bonds/infrastructure/bond-money.mapper.ts +++ b/src/modules/investments/instruments/bonds/infrastructure/bond-money.mapper.ts @@ -1,6 +1,6 @@ -import { formatDecimal } from '../../../../../common/decimal'; -import { decimal } from '../../../../../integrations/tbank/decimal'; -import { type TbankMoney } from '../../../../../integrations/tbank/tbank.api'; +import { formatDecimal } from '#src/common/decimal'; +import { decimal } from '#src/integrations/tbank/decimal'; +import { type TbankMoney } from '#src/integrations/tbank/tbank.api'; export function money(value?: TbankMoney) { const currency = value?.currency?.toUpperCase(); diff --git a/src/modules/investments/instruments/bonds/presentation/bond.controller.ts b/src/modules/investments/instruments/bonds/presentation/bond.controller.ts index 1136dca..8750921 100644 --- a/src/modules/investments/instruments/bonds/presentation/bond.controller.ts +++ b/src/modules/investments/instruments/bonds/presentation/bond.controller.ts @@ -11,9 +11,10 @@ import { } from '@nestjs/common'; import { ApiBearerAuth, ApiOkResponse, ApiTags } from '@nestjs/swagger'; -import { ApiProblemResponses } from '../../../../../common/decorators/api-safe-error-response.decorator'; -import { AccessPayload, JwtAuthGuard } from '../../../../auth/auth.api'; -import { InvestmentReadQueryDto } from '../../../investment-resource.dto'; +import { ApiProblemResponses } from '#src/common/decorators/api-safe-error-response.decorator'; +import { AccessPayload, JwtAuthGuard } from '#src/modules/auth/auth.api'; +import { InvestmentReadQueryDto } from '#src/modules/investments/investment-resource.dto'; + import { BondCatalogService } from '../application/bond-catalog.service'; import { BondIncomeService } from '../application/bond-income.service'; import { BondMarketService } from '../application/bond-market.service'; diff --git a/src/modules/investments/instruments/bonds/presentation/bond.dto.ts b/src/modules/investments/instruments/bonds/presentation/bond.dto.ts index a7624c1..27f3e59 100644 --- a/src/modules/investments/instruments/bonds/presentation/bond.dto.ts +++ b/src/modules/investments/instruments/bonds/presentation/bond.dto.ts @@ -1,7 +1,8 @@ import { ApiProperty } from '@nestjs/swagger'; -import { MoneyDto } from '../../../../../common/money.dto'; -import { InvestmentResourceMetaDto } from '../../../investment-resource.dto'; +import { MoneyDto } from '#src/common/money.dto'; +import { InvestmentResourceMetaDto } from '#src/modules/investments/investment-resource.dto'; + import { StockCandlesDto, StockCandlesQueryDto, diff --git a/src/modules/investments/instruments/domain/candle-coverage.ts b/src/modules/investments/instruments/domain/candle-coverage.ts index ef2dad1..dafa484 100644 --- a/src/modules/investments/instruments/domain/candle-coverage.ts +++ b/src/modules/investments/instruments/domain/candle-coverage.ts @@ -1,4 +1,4 @@ -import { MILLISECONDS_PER_DAY } from '../../../../common/time'; +import { MILLISECONDS_PER_DAY } from '#src/common/time'; const FIRST_RANGE_END_INDEX = 1; diff --git a/src/modules/investments/instruments/infrastructure/candle.repository.ts b/src/modules/investments/instruments/infrastructure/candle.repository.ts index 028ce57..bd1ebcd 100644 --- a/src/modules/investments/instruments/infrastructure/candle.repository.ts +++ b/src/modules/investments/instruments/infrastructure/candle.repository.ts @@ -1,18 +1,19 @@ import { Injectable } from '@nestjs/common'; import { createHash, randomUUID } from 'node:crypto'; -import type { Prisma } from '../../../../../generated/prisma/client'; +import type { Prisma } from '#generated/prisma/client'; import { claimSyncWork, lockConnectionGeneration, -} from '../../../../integrations/tbank/tbank-sync-claim'; +} from '#src/integrations/tbank/tbank-sync-claim'; import { isJoinableRunningAttempt, type TbankSyncAttempt, -} from '../../../../integrations/tbank/tbank.api'; -import { PrismaService } from '../../../../prisma/prisma.service'; -import { toJson } from '../../../../prisma/to-json'; +} from '#src/integrations/tbank/tbank.api'; +import { PrismaService } from '#src/prisma/prisma.service'; +import { toJson } from '#src/prisma/to-json'; + import { type CandleRange, confirmedCandleCoverage, diff --git a/src/modules/investments/instruments/infrastructure/catalog-discovery.repository.ts b/src/modules/investments/instruments/infrastructure/catalog-discovery.repository.ts index 59d0c7a..5a17718 100644 --- a/src/modules/investments/instruments/infrastructure/catalog-discovery.repository.ts +++ b/src/modules/investments/instruments/infrastructure/catalog-discovery.repository.ts @@ -2,11 +2,11 @@ import { Injectable } from '@nestjs/common'; import { randomUUID } from 'node:crypto'; import { isDeepStrictEqual } from 'node:util'; -import { TbankErrorCode } from '../../../../integrations/tbank/tbank-error-code'; -import { claimSyncWork, lockConnectionGeneration } from '../../../../integrations/tbank/tbank-sync-claim'; -import { isJoinableRunningAttempt, type TbankBond, type TbankShare, type TbankSyncAttempt } from '../../../../integrations/tbank/tbank.api'; -import { PrismaService } from '../../../../prisma/prisma.service'; -import { toJson } from '../../../../prisma/to-json'; +import { TbankErrorCode } from '#src/integrations/tbank/tbank-error-code'; +import { claimSyncWork, lockConnectionGeneration } from '#src/integrations/tbank/tbank-sync-claim'; +import { isJoinableRunningAttempt, type TbankBond, type TbankShare, type TbankSyncAttempt } from '#src/integrations/tbank/tbank.api'; +import { PrismaService } from '#src/prisma/prisma.service'; +import { toJson } from '#src/prisma/to-json'; const UNCHANGED_REVISION_INCREMENT = 0; const REVISION_INCREMENT = 1; diff --git a/src/modules/investments/instruments/infrastructure/tbank-candle.mapper.ts b/src/modules/investments/instruments/infrastructure/tbank-candle.mapper.ts index 08942ea..27eb641 100644 --- a/src/modules/investments/instruments/infrastructure/tbank-candle.mapper.ts +++ b/src/modules/investments/instruments/infrastructure/tbank-candle.mapper.ts @@ -1,8 +1,10 @@ -import type { TbankCandle } from '../../../../integrations/tbank/tbank.api'; +import type { TbankCandle } from '#src/integrations/tbank/tbank.api'; + +import { formatDecimal } from '#src/common/decimal'; +import { decimal } from '#src/integrations/tbank/decimal'; + import type { SavedCandle } from '../domain/candle-coverage'; -import { formatDecimal } from '../../../../common/decimal'; -import { decimal } from '../../../../integrations/tbank/decimal'; import { timestamp } from '../application/instrument-market'; function toSavedCandle(candle: TbankCandle): SavedCandle { diff --git a/src/modules/investments/instruments/instrument-sources.module.ts b/src/modules/investments/instruments/instrument-sources.module.ts index 6479c41..5545983 100644 --- a/src/modules/investments/instruments/instrument-sources.module.ts +++ b/src/modules/investments/instruments/instrument-sources.module.ts @@ -1,8 +1,9 @@ import { Module } from '@nestjs/common'; -import { MoexModule } from '../../../integrations/moex/moex.module'; -import { NcrModule } from '../../../integrations/ncr/ncr.module'; -import { TbankModule } from '../../../integrations/tbank/tbank.module'; +import { MoexModule } from '#src/integrations/moex/moex.module'; +import { NcrModule } from '#src/integrations/ncr/ncr.module'; +import { TbankModule } from '#src/integrations/tbank/tbank.module'; + import { CandleService } from './application/candle.service'; import { CatalogDiscoveryService } from './application/catalog-discovery.service'; import { CatalogEnrichmentService } from './application/catalog-enrichment.service'; diff --git a/src/modules/investments/instruments/instruments.module.ts b/src/modules/investments/instruments/instruments.module.ts index 92513cf..f983754 100644 --- a/src/modules/investments/instruments/instruments.module.ts +++ b/src/modules/investments/instruments/instruments.module.ts @@ -1,6 +1,7 @@ import { Module } from '@nestjs/common'; -import { TbankModule } from '../../../integrations/tbank/tbank.module'; +import { TbankModule } from '#src/integrations/tbank/tbank.module'; + import { AuthModule } from '../../auth/auth.module'; import { PortfolioModule } from '../portfolio/portfolio.module'; import { BondCatalogService } from './bonds/application/bond-catalog.service'; diff --git a/src/modules/investments/instruments/stocks/application/get-stock-company.use-case.ts b/src/modules/investments/instruments/stocks/application/get-stock-company.use-case.ts index fcc3560..858e1cc 100644 --- a/src/modules/investments/instruments/stocks/application/get-stock-company.use-case.ts +++ b/src/modules/investments/instruments/stocks/application/get-stock-company.use-case.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import type { TbankFundamentals } from '../../../../../integrations/tbank/tbank.api'; +import type { TbankFundamentals } from '#src/integrations/tbank/tbank.api'; import { CatalogEnrichmentService } from '../../application/catalog-enrichment.service'; import { diff --git a/src/modules/investments/instruments/stocks/application/stock-catalog.service.ts b/src/modules/investments/instruments/stocks/application/stock-catalog.service.ts index bb3762a..cb343f4 100644 --- a/src/modules/investments/instruments/stocks/application/stock-catalog.service.ts +++ b/src/modules/investments/instruments/stocks/application/stock-catalog.service.ts @@ -1,9 +1,10 @@ import { Injectable } from '@nestjs/common'; -import type { TbankShare } from '../../../../../integrations/tbank/tbank.api'; +import type { TbankShare } from '#src/integrations/tbank/tbank.api'; + +import { formatDecimal } from '#src/common/decimal'; +import { decimal } from '#src/integrations/tbank/decimal'; -import { formatDecimal } from '../../../../../common/decimal'; -import { decimal } from '../../../../../integrations/tbank/decimal'; import { CatalogDiscoveryService } from '../../application/catalog-discovery.service'; import { timestamp } from '../../application/instrument-market'; import { diff --git a/src/modules/investments/instruments/stocks/application/stock-income.service.ts b/src/modules/investments/instruments/stocks/application/stock-income.service.ts index 18463be..4d9b735 100644 --- a/src/modules/investments/instruments/stocks/application/stock-income.service.ts +++ b/src/modules/investments/instruments/stocks/application/stock-income.service.ts @@ -4,18 +4,19 @@ import { decimalFromString, formatDecimal, multiply, -} from '../../../../../common/decimal'; -import { ISO_DATE_LENGTH, ISO_DATE_START } from '../../../../../common/time'; -import { decimal } from '../../../../../integrations/tbank/decimal'; +} from '#src/common/decimal'; +import { ISO_DATE_LENGTH, ISO_DATE_START } from '#src/common/time'; +import { decimal } from '#src/integrations/tbank/decimal'; import { TbankAccessService, type TbankDividend, tbankSourceNeedsRefresh, -} from '../../../../../integrations/tbank/tbank.api'; +} from '#src/integrations/tbank/tbank.api'; import { ForecastService, PortfolioService, -} from '../../../portfolio/portfolio.api'; +} from '#src/modules/investments/portfolio/portfolio.api'; + import { CatalogEnrichmentService } from '../../application/catalog-enrichment.service'; import { moscowDay, timestamp } from '../../application/instrument-market'; import { instrumentPosition } from '../../application/instrument-position'; diff --git a/src/modules/investments/instruments/stocks/application/stock-market.service.ts b/src/modules/investments/instruments/stocks/application/stock-market.service.ts index e03ad7a..65bb25d 100644 --- a/src/modules/investments/instruments/stocks/application/stock-market.service.ts +++ b/src/modules/investments/instruments/stocks/application/stock-market.service.ts @@ -6,9 +6,10 @@ import { formatDecimal, multiply, subtract, -} from '../../../../../common/decimal'; -import { ISO_DATE_LENGTH, ISO_DATE_START } from '../../../../../common/time'; -import { decimal } from '../../../../../integrations/tbank/decimal'; +} from '#src/common/decimal'; +import { ISO_DATE_LENGTH, ISO_DATE_START } from '#src/common/time'; +import { decimal } from '#src/integrations/tbank/decimal'; + import { CandleService } from '../../application/candle.service'; import { CatalogEnrichmentService, diff --git a/src/modules/investments/instruments/stocks/application/stock-screener.service.spec.ts b/src/modules/investments/instruments/stocks/application/stock-screener.service.spec.ts index f9c264d..9604936 100644 --- a/src/modules/investments/instruments/stocks/application/stock-screener.service.spec.ts +++ b/src/modules/investments/instruments/stocks/application/stock-screener.service.spec.ts @@ -1,10 +1,10 @@ -jest.mock('../../../../../integrations/tbank/tbank.api', () => ({ +jest.mock('#src/integrations/tbank/tbank.api', () => ({ TbankAccessService: class {}, })); import { NotFoundException, ServiceUnavailableException } from '@nestjs/common'; -import type { TbankShare } from '../../../../../integrations/tbank/tbank.api'; +import type { TbankShare } from '#src/integrations/tbank/tbank.api'; import { StockScreenerService } from './stock-screener.service'; diff --git a/src/modules/investments/instruments/stocks/application/stock-screener.service.ts b/src/modules/investments/instruments/stocks/application/stock-screener.service.ts index a36f680..a5ab318 100644 --- a/src/modules/investments/instruments/stocks/application/stock-screener.service.ts +++ b/src/modules/investments/instruments/stocks/application/stock-screener.service.ts @@ -6,11 +6,12 @@ import { } from '@nestjs/common'; import { randomUUID } from 'node:crypto'; -import type { TbankShare } from '../../../../../integrations/tbank/tbank-market.types'; +import type { TbankShare } from '#src/integrations/tbank/tbank-market.types'; + +import { StructuredLogger } from '#src/common/logging/structured-logger.service'; +import { TbankAccessService } from '#src/integrations/tbank/tbank.api'; +import { TbankClient } from '#src/integrations/tbank/tbank.client'; -import { StructuredLogger } from '../../../../../common/logging/structured-logger.service'; -import { TbankAccessService } from '../../../../../integrations/tbank/tbank.api'; -import { TbankClient } from '../../../../../integrations/tbank/tbank.client'; import { selectStockScreenerInstruments, type StockScreenerConditions, diff --git a/src/modules/investments/instruments/stocks/application/stock.spec.ts b/src/modules/investments/instruments/stocks/application/stock.spec.ts index 8aa115c..e1b58fa 100644 --- a/src/modules/investments/instruments/stocks/application/stock.spec.ts +++ b/src/modules/investments/instruments/stocks/application/stock.spec.ts @@ -2,7 +2,7 @@ import { previousClose } from '../../application/instrument-market'; import { metrics } from './get-stock-company.use-case'; import { stockDividends } from './stock-income.service'; import { stockQuote } from './stock-market.service'; -jest.mock('../../../../../prisma/prisma.service', () => ({ +jest.mock('#src/prisma/prisma.service', () => ({ PrismaService: class {}, })); const time = (value: string) => ({ seconds: String(Date.parse(value) / 1000) }); diff --git a/src/modules/investments/instruments/stocks/domain/stock-screener-selection.rules.spec.ts b/src/modules/investments/instruments/stocks/domain/stock-screener-selection.rules.spec.ts index 4271a6e..f6b5e06 100644 --- a/src/modules/investments/instruments/stocks/domain/stock-screener-selection.rules.spec.ts +++ b/src/modules/investments/instruments/stocks/domain/stock-screener-selection.rules.spec.ts @@ -1,4 +1,4 @@ -import type { TbankShare } from '../../../../../integrations/tbank/tbank.api'; +import type { TbankShare } from '#src/integrations/tbank/tbank.api'; import { selectStockScreenerInstruments } from './stock-screener-selection.rules'; diff --git a/src/modules/investments/instruments/stocks/domain/stock-screener-selection.rules.ts b/src/modules/investments/instruments/stocks/domain/stock-screener-selection.rules.ts index d6a659d..2287785 100644 --- a/src/modules/investments/instruments/stocks/domain/stock-screener-selection.rules.ts +++ b/src/modules/investments/instruments/stocks/domain/stock-screener-selection.rules.ts @@ -1,4 +1,4 @@ -import type { TbankShare } from '../../../../../integrations/tbank/tbank.api'; +import type { TbankShare } from '#src/integrations/tbank/tbank.api'; export type StockScreenerCatalog = { asOf: Date; diff --git a/src/modules/investments/instruments/stocks/presentation/stock.controller.ts b/src/modules/investments/instruments/stocks/presentation/stock.controller.ts index 70202bd..4a1fa4a 100644 --- a/src/modules/investments/instruments/stocks/presentation/stock.controller.ts +++ b/src/modules/investments/instruments/stocks/presentation/stock.controller.ts @@ -17,9 +17,10 @@ import { } from '@nestjs/common'; import { ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger'; -import { ApiProblemResponses } from '../../../../../common/decorators/api-safe-error-response.decorator'; -import { AccessPayload, JwtAuthGuard } from '../../../../auth/auth.api'; -import { InvestmentReadQueryDto } from '../../../investment-resource.dto'; +import { ApiProblemResponses } from '#src/common/decorators/api-safe-error-response.decorator'; +import { AccessPayload, JwtAuthGuard } from '#src/modules/auth/auth.api'; +import { InvestmentReadQueryDto } from '#src/modules/investments/investment-resource.dto'; + import { GetStockCompanyUseCase } from '../application/get-stock-company.use-case'; import { StockCatalogService } from '../application/stock-catalog.service'; import { StockIncomeService } from '../application/stock-income.service'; diff --git a/src/modules/investments/instruments/stocks/presentation/stock.dto.ts b/src/modules/investments/instruments/stocks/presentation/stock.dto.ts index 14b0e60..29ad8ff 100644 --- a/src/modules/investments/instruments/stocks/presentation/stock.dto.ts +++ b/src/modules/investments/instruments/stocks/presentation/stock.dto.ts @@ -11,16 +11,16 @@ import { MinLength, } from 'class-validator'; -import { MoneyDto } from '../../../../../common/money.dto'; +import { MoneyDto } from '#src/common/money.dto'; import { MAX_INSTRUMENT_QUERY_LENGTH, MIN_INSTRUMENT_QUERY_LENGTH, -} from '../../../instrument-query'; +} from '#src/modules/investments/instrument-query'; import { InvestmentReadQueryDto, InvestmentResourceMetaDto, -} from '../../../investment-resource.dto'; -import { PortfolioPositionDto } from '../../../portfolio/portfolio.api'; +} from '#src/modules/investments/investment-resource.dto'; +import { PortfolioPositionDto } from '#src/modules/investments/portfolio/portfolio.api'; const MIN_TICKER_LENGTH = 1; const MAX_SCREENER_QUERY_LENGTH = 80; diff --git a/src/modules/investments/operations/application/brokerage-operations-sync.service.ts b/src/modules/investments/operations/application/brokerage-operations-sync.service.ts index bc0a98b..9ae268a 100644 --- a/src/modules/investments/operations/application/brokerage-operations-sync.service.ts +++ b/src/modules/investments/operations/application/brokerage-operations-sync.service.ts @@ -1,11 +1,12 @@ import { Injectable, NotFoundException } from '@nestjs/common'; import { randomUUID } from 'node:crypto'; -import { StructuredLogger } from '../../../../common/logging/structured-logger.service'; -import { MILLISECONDS_PER_SECOND } from '../../../../common/time'; -import { isTbankErrorCode, TbankErrorCode } from '../../../../integrations/tbank/tbank-error-code'; -import { TbankOperationState } from '../../../../integrations/tbank/tbank-protocol'; -import { TbankAccessService, TbankClient } from '../../../../integrations/tbank/tbank.api'; +import { StructuredLogger } from '#src/common/logging/structured-logger.service'; +import { MILLISECONDS_PER_SECOND } from '#src/common/time'; +import { isTbankErrorCode, TbankErrorCode } from '#src/integrations/tbank/tbank-error-code'; +import { TbankOperationState } from '#src/integrations/tbank/tbank-protocol'; +import { TbankAccessService, TbankClient } from '#src/integrations/tbank/tbank.api'; + import { type OperationInterval, operationIntervals, diff --git a/src/modules/investments/operations/application/brokerage-operations.service.ts b/src/modules/investments/operations/application/brokerage-operations.service.ts index 3b7c2c8..4c6dd50 100644 --- a/src/modules/investments/operations/application/brokerage-operations.service.ts +++ b/src/modules/investments/operations/application/brokerage-operations.service.ts @@ -7,7 +7,8 @@ import { TbankAccessService, type TbankOperationItem, tbankSourceTtlMs, -} from '../../../../integrations/tbank/tbank.api'; +} from '#src/integrations/tbank/tbank.api'; + import { dateOnlyBounds, DateOnlyRange } from '../../investment-calendar'; import { investmentResourceMeta } from '../../investment-resource.mapper'; import { ledgerRange } from '../../investment-sync-plan'; diff --git a/src/modules/investments/operations/infrastructure/brokerage-operation.mapper.ts b/src/modules/investments/operations/infrastructure/brokerage-operation.mapper.ts index df9cf0b..27fcce2 100644 --- a/src/modules/investments/operations/infrastructure/brokerage-operation.mapper.ts +++ b/src/modules/investments/operations/infrastructure/brokerage-operation.mapper.ts @@ -1,8 +1,9 @@ -import { formatDecimal } from '../../../../common/decimal'; -import { MILLISECONDS_PER_SECOND } from '../../../../common/time'; -import { decimal } from '../../../../integrations/tbank/decimal'; -import { TbankOperationType } from '../../../../integrations/tbank/tbank-protocol'; -import { TbankMoney, TbankOperationItem } from '../../../../integrations/tbank/tbank.api'; +import { formatDecimal } from '#src/common/decimal'; +import { MILLISECONDS_PER_SECOND } from '#src/common/time'; +import { decimal } from '#src/integrations/tbank/decimal'; +import { TbankOperationType } from '#src/integrations/tbank/tbank-protocol'; +import { TbankMoney, TbankOperationItem } from '#src/integrations/tbank/tbank.api'; + import { type OperationCategory } from '../../operation-category'; import { BrokerageOperationDto } from '../presentation/brokerage-operation.dto'; diff --git a/src/modules/investments/operations/infrastructure/brokerage-operations-read.repository.ts b/src/modules/investments/operations/infrastructure/brokerage-operations-read.repository.ts index 1b4ef1d..e0dfadf 100644 --- a/src/modules/investments/operations/infrastructure/brokerage-operations-read.repository.ts +++ b/src/modules/investments/operations/infrastructure/brokerage-operations-read.repository.ts @@ -5,7 +5,8 @@ import { } from '@nestjs/common'; import { createHash } from 'node:crypto'; -import { PrismaService } from '../../../../prisma/prisma.service'; +import { PrismaService } from '#src/prisma/prisma.service'; + import { dateOnlyBounds, DateOnlyRange, diff --git a/src/modules/investments/operations/infrastructure/brokerage-operations.repository.ts b/src/modules/investments/operations/infrastructure/brokerage-operations.repository.ts index cd1a3f8..4980b68 100644 --- a/src/modules/investments/operations/infrastructure/brokerage-operations.repository.ts +++ b/src/modules/investments/operations/infrastructure/brokerage-operations.repository.ts @@ -2,17 +2,18 @@ import { Injectable, NotFoundException } from '@nestjs/common'; import { createHash, randomUUID } from 'node:crypto'; import { isDeepStrictEqual } from 'node:util'; -import type { Prisma } from '../../../../../generated/prisma/client'; +import type { Prisma } from '#generated/prisma/client'; -import { TbankErrorCode } from '../../../../integrations/tbank/tbank-error-code'; -import { isTbankProtocolValue, TbankOperationState } from '../../../../integrations/tbank/tbank-protocol'; -import { claimSyncWork, lockConnectionGeneration } from '../../../../integrations/tbank/tbank-sync-claim'; +import { TbankErrorCode } from '#src/integrations/tbank/tbank-error-code'; +import { isTbankProtocolValue, TbankOperationState } from '#src/integrations/tbank/tbank-protocol'; +import { claimSyncWork, lockConnectionGeneration } from '#src/integrations/tbank/tbank-sync-claim'; import { isJoinableRunningAttempt, type TbankOperationItem, type TbankOperationsByCursorResponse, -} from '../../../../integrations/tbank/tbank.api'; -import { PrismaService } from '../../../../prisma/prisma.service'; -import { toJson } from '../../../../prisma/to-json'; +} from '#src/integrations/tbank/tbank.api'; +import { PrismaService } from '#src/prisma/prisma.service'; +import { toJson } from '#src/prisma/to-json'; + import { decodeInterval, extendRunningIntent, diff --git a/src/modules/investments/operations/operations.module.ts b/src/modules/investments/operations/operations.module.ts index ecb5b47..fde5bf2 100644 --- a/src/modules/investments/operations/operations.module.ts +++ b/src/modules/investments/operations/operations.module.ts @@ -1,6 +1,7 @@ import { Module } from '@nestjs/common'; -import { TbankModule } from '../../../integrations/tbank/tbank.module'; +import { TbankModule } from '#src/integrations/tbank/tbank.module'; + import { AuthModule } from '../../auth/auth.module'; import { TbankSyncRepositoryModule } from '../tbank-sync/tbank-sync-repository.module'; import { BrokerageOperationsSyncService } from './application/brokerage-operations-sync.service'; diff --git a/src/modules/investments/operations/presentation/brokerage-operation.dto.ts b/src/modules/investments/operations/presentation/brokerage-operation.dto.ts index c349c7d..3b195e4 100644 --- a/src/modules/investments/operations/presentation/brokerage-operation.dto.ts +++ b/src/modules/investments/operations/presentation/brokerage-operation.dto.ts @@ -13,7 +13,8 @@ import { Min, } from 'class-validator'; -import { MoneyDto } from '../../../../common/money.dto'; +import { MoneyDto } from '#src/common/money.dto'; + import { AccountReferenceDto } from '../../account-reference.dto'; import { InvestmentResourceMetaDto } from '../../investment-resource.dto'; import { operationCategories, type OperationCategory } from '../../operation-category'; diff --git a/src/modules/investments/operations/presentation/brokerage-operations.controller.spec.ts b/src/modules/investments/operations/presentation/brokerage-operations.controller.spec.ts index 66196a5..886a905 100644 --- a/src/modules/investments/operations/presentation/brokerage-operations.controller.spec.ts +++ b/src/modules/investments/operations/presentation/brokerage-operations.controller.spec.ts @@ -1,4 +1,4 @@ -jest.mock('../../../../prisma/prisma.service', () => ({ +jest.mock('#src/prisma/prisma.service', () => ({ PrismaService: class PrismaService {}, })); diff --git a/src/modules/investments/operations/presentation/brokerage-operations.controller.ts b/src/modules/investments/operations/presentation/brokerage-operations.controller.ts index 66d1a38..a3156e8 100644 --- a/src/modules/investments/operations/presentation/brokerage-operations.controller.ts +++ b/src/modules/investments/operations/presentation/brokerage-operations.controller.ts @@ -3,8 +3,9 @@ import type { Request } from 'express'; import { Controller, Get, Param, Query, Req, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiOkResponse, ApiTags } from '@nestjs/swagger'; -import { ApiProblemResponses } from '../../../../common/decorators/api-safe-error-response.decorator'; -import { AccessPayload, JwtAuthGuard } from '../../../auth/auth.api'; +import { ApiProblemResponses } from '#src/common/decorators/api-safe-error-response.decorator'; +import { AccessPayload, JwtAuthGuard } from '#src/modules/auth/auth.api'; + import { BrokerageOperationsService } from '../application/brokerage-operations.service'; import { BrokerageOperationsQueryDto, diff --git a/src/modules/investments/portfolio/application/forecast.service.ts b/src/modules/investments/portfolio/application/forecast.service.ts index 3394e3d..b481ae2 100644 --- a/src/modules/investments/portfolio/application/forecast.service.ts +++ b/src/modules/investments/portfolio/application/forecast.service.ts @@ -1,8 +1,9 @@ import { Injectable } from '@nestjs/common'; +import { add, decimalFromString, formatDecimal } from '#src/common/decimal'; + import type { InvestmentResourceMetaDto } from '../../investment-resource.dto'; -import { add, decimalFromString, formatDecimal } from '../../../../common/decimal'; import { investmentResourceMeta } from '../../investment-resource.mapper'; import { ForecastRepository, diff --git a/src/modules/investments/portfolio/application/portfolio.service.spec.ts b/src/modules/investments/portfolio/application/portfolio.service.spec.ts index 70166da..8b7b0e8 100644 --- a/src/modules/investments/portfolio/application/portfolio.service.spec.ts +++ b/src/modules/investments/portfolio/application/portfolio.service.spec.ts @@ -1,5 +1,5 @@ import assert from 'node:assert/strict'; -jest.mock('../../../../prisma/prisma.service', () => ({ +jest.mock('#src/prisma/prisma.service', () => ({ PrismaService: class {}, })); import { PortfolioDto } from '../presentation/portfolio.dto'; diff --git a/src/modules/investments/portfolio/application/portfolio.service.ts b/src/modules/investments/portfolio/application/portfolio.service.ts index 43d5229..b6d298c 100644 --- a/src/modules/investments/portfolio/application/portfolio.service.ts +++ b/src/modules/investments/portfolio/application/portfolio.service.ts @@ -4,10 +4,10 @@ import { } from '@nestjs/common'; import { randomUUID } from 'node:crypto'; -import type { Prisma } from '../../../../../generated/prisma/client'; +import type { Prisma } from '#generated/prisma/client'; -import { StructuredLogger } from '../../../../common/logging/structured-logger.service'; -import { isTbankErrorCode, TbankErrorCode } from '../../../../integrations/tbank/tbank-error-code'; +import { StructuredLogger } from '#src/common/logging/structured-logger.service'; +import { isTbankErrorCode, TbankErrorCode } from '#src/integrations/tbank/tbank-error-code'; import { InstrumentMetadataService, metadataKey, @@ -17,7 +17,8 @@ import { type TbankMoney, type TbankPortfolio, tbankSourceTtlMs, -} from '../../../../integrations/tbank/tbank.api'; +} from '#src/integrations/tbank/tbank.api'; + import { investmentResourceMeta } from '../../investment-resource.mapper'; import { hourlyAttempt, diff --git a/src/modules/investments/portfolio/application/position-classification.service.spec.ts b/src/modules/investments/portfolio/application/position-classification.service.spec.ts index 4b26d44..3b4ac6b 100644 --- a/src/modules/investments/portfolio/application/position-classification.service.spec.ts +++ b/src/modules/investments/portfolio/application/position-classification.service.spec.ts @@ -1,8 +1,9 @@ import { NotFoundException } from '@nestjs/common'; -jest.mock('../../../../prisma/prisma.service', () => ({ PrismaService: class {} })); -import { TbankErrorCode } from '../../../../integrations/tbank/tbank-error-code'; -import { InstrumentIdType } from '../../../../integrations/tbank/tbank-protocol'; +jest.mock('#src/prisma/prisma.service', () => ({ PrismaService: class {} })); +import { TbankErrorCode } from '#src/integrations/tbank/tbank-error-code'; +import { InstrumentIdType } from '#src/integrations/tbank/tbank-protocol'; + import { PositionClassificationService } from './position-classification.service'; describe('PositionClassificationService', () => { diff --git a/src/modules/investments/portfolio/application/position-classification.service.ts b/src/modules/investments/portfolio/application/position-classification.service.ts index 1832f6a..828a87c 100644 --- a/src/modules/investments/portfolio/application/position-classification.service.ts +++ b/src/modules/investments/portfolio/application/position-classification.service.ts @@ -1,12 +1,13 @@ import { Injectable, NotFoundException } from '@nestjs/common'; -import { isZero } from '../../../../common/decimal'; -import { StructuredLogger } from '../../../../common/logging/structured-logger.service'; -import { MILLISECONDS_PER_DAY } from '../../../../common/time'; -import { decimal } from '../../../../integrations/tbank/decimal'; -import { isTbankErrorCode, TbankErrorCode } from '../../../../integrations/tbank/tbank-error-code'; -import { InstrumentIdType } from '../../../../integrations/tbank/tbank-protocol'; -import { metadataKey, TbankClient, type TbankPortfolio } from '../../../../integrations/tbank/tbank.api'; +import { isZero } from '#src/common/decimal'; +import { StructuredLogger } from '#src/common/logging/structured-logger.service'; +import { MILLISECONDS_PER_DAY } from '#src/common/time'; +import { decimal } from '#src/integrations/tbank/decimal'; +import { isTbankErrorCode, TbankErrorCode } from '#src/integrations/tbank/tbank-error-code'; +import { InstrumentIdType } from '#src/integrations/tbank/tbank-protocol'; +import { metadataKey, TbankClient, type TbankPortfolio } from '#src/integrations/tbank/tbank.api'; + import { PositionClassificationRepository } from '../infrastructure/position-classification.repository'; export type Classification = { issuer: null | { id: string; name: string }; sector: null | string }; diff --git a/src/modules/investments/portfolio/domain/portfolio-structure.ts b/src/modules/investments/portfolio/domain/portfolio-structure.ts index 7498ff6..9b92249 100644 --- a/src/modules/investments/portfolio/domain/portfolio-structure.ts +++ b/src/modules/investments/portfolio/domain/portfolio-structure.ts @@ -1,11 +1,11 @@ -import type { Money } from '../../../../common/money.types'; +import type { Money } from '#src/common/money.types'; import { add, DECIMAL_RADIX, decimalFromString, formatDecimal, -} from '../../../../common/decimal'; +} from '#src/common/decimal'; const ZERO_AMOUNT = 0n; const INITIAL_UNVALUED_COUNT = 0; diff --git a/src/modules/investments/portfolio/domain/portfolio-totals.ts b/src/modules/investments/portfolio/domain/portfolio-totals.ts index da81680..25cdd2a 100644 --- a/src/modules/investments/portfolio/domain/portfolio-totals.ts +++ b/src/modules/investments/portfolio/domain/portfolio-totals.ts @@ -1,10 +1,10 @@ -import type { Money } from '../../../../common/money.types'; +import type { Money } from '#src/common/money.types'; import { add, decimalFromString, formatDecimal, -} from '../../../../common/decimal'; +} from '#src/common/decimal'; export function sumMoneyByCurrency(amounts: Money[]): Money[] { const totals = new Map>(); diff --git a/src/modules/investments/portfolio/infrastructure/forecast.repository.ts b/src/modules/investments/portfolio/infrastructure/forecast.repository.ts index 73edc97..c8066c3 100644 --- a/src/modules/investments/portfolio/infrastructure/forecast.repository.ts +++ b/src/modules/investments/portfolio/infrastructure/forecast.repository.ts @@ -1,10 +1,10 @@ import { Injectable } from '@nestjs/common'; import { isDeepStrictEqual } from 'node:util'; -import type { Prisma } from '../../../../../generated/prisma/client'; +import type { Prisma } from '#generated/prisma/client'; -import { PrismaService } from '../../../../prisma/prisma.service'; -import { toJson } from '../../../../prisma/to-json'; +import { PrismaService } from '#src/prisma/prisma.service'; +import { toJson } from '#src/prisma/to-json'; const FIRST_BATCH_OFFSET = 0; diff --git a/src/modules/investments/portfolio/infrastructure/portfolio.repository.ts b/src/modules/investments/portfolio/infrastructure/portfolio.repository.ts index eb702ce..14f9448 100644 --- a/src/modules/investments/portfolio/infrastructure/portfolio.repository.ts +++ b/src/modules/investments/portfolio/infrastructure/portfolio.repository.ts @@ -1,14 +1,15 @@ import { Injectable } from '@nestjs/common'; import { randomUUID } from 'node:crypto'; -import type { Prisma } from '../../../../../generated/prisma/client'; -import type { PortfolioDto } from '../presentation/portfolio.dto'; +import type { Prisma } from '#generated/prisma/client'; -import { TbankErrorCode } from '../../../../integrations/tbank/tbank-error-code'; -import { lockConnectionGeneration } from '../../../../integrations/tbank/tbank-sync-claim'; -import { isJoinableRunningAttempt, tbankSourceNeedsRefresh, tbankSourceTtlMs } from '../../../../integrations/tbank/tbank.api'; -import { PrismaService } from '../../../../prisma/prisma.service'; -import { toJson } from '../../../../prisma/to-json'; +import { TbankErrorCode } from '#src/integrations/tbank/tbank-error-code'; +import { lockConnectionGeneration } from '#src/integrations/tbank/tbank-sync-claim'; +import { isJoinableRunningAttempt, tbankSourceNeedsRefresh, tbankSourceTtlMs } from '#src/integrations/tbank/tbank.api'; +import { PrismaService } from '#src/prisma/prisma.service'; +import { toJson } from '#src/prisma/to-json'; + +import type { PortfolioDto } from '../presentation/portfolio.dto'; const EXPECTED_UPDATED_ACCOUNTS = 1; diff --git a/src/modules/investments/portfolio/infrastructure/position-classification.repository.ts b/src/modules/investments/portfolio/infrastructure/position-classification.repository.ts index 937cc18..4595455 100644 --- a/src/modules/investments/portfolio/infrastructure/position-classification.repository.ts +++ b/src/modules/investments/portfolio/infrastructure/position-classification.repository.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import { PrismaService } from '../../../../prisma/prisma.service'; +import { PrismaService } from '#src/prisma/prisma.service'; @Injectable() export class PositionClassificationRepository { diff --git a/src/modules/investments/portfolio/infrastructure/tbank-portfolio.mapper.ts b/src/modules/investments/portfolio/infrastructure/tbank-portfolio.mapper.ts index 47d3ae6..79e171f 100644 --- a/src/modules/investments/portfolio/infrastructure/tbank-portfolio.mapper.ts +++ b/src/modules/investments/portfolio/infrastructure/tbank-portfolio.mapper.ts @@ -1,6 +1,4 @@ -import type { Money } from '../../../../common/money.types'; -import type { Classification } from '../application/position-classification.service'; -import type { PortfolioDto, PortfolioPositionDto } from '../presentation/portfolio.dto'; +import type { Money } from '#src/common/money.types'; import { add, @@ -9,15 +7,19 @@ import { isZero, multiply, subtract, -} from '../../../../common/decimal'; -import { decimal } from '../../../../integrations/tbank/decimal'; +} from '#src/common/decimal'; +import { decimal } from '#src/integrations/tbank/decimal'; import { metadataKey, type TbankInstrument, type TbankMoney, TbankPortfolio, TbankPositions, -} from '../../../../integrations/tbank/tbank.api'; +} from '#src/integrations/tbank/tbank.api'; + +import type { Classification } from '../application/position-classification.service'; +import type { PortfolioDto, PortfolioPositionDto } from '../presentation/portfolio.dto'; + import { portfolioStructure } from '../domain/portfolio-structure'; const types: Record = { diff --git a/src/modules/investments/portfolio/portfolio.module.ts b/src/modules/investments/portfolio/portfolio.module.ts index 05c3a6e..9bb6b29 100644 --- a/src/modules/investments/portfolio/portfolio.module.ts +++ b/src/modules/investments/portfolio/portfolio.module.ts @@ -1,6 +1,7 @@ import { Module } from '@nestjs/common'; -import { TbankModule } from '../../../integrations/tbank/tbank.module'; +import { TbankModule } from '#src/integrations/tbank/tbank.module'; + import { AuthModule } from '../../auth/auth.module'; import { TbankSyncRepositoryModule } from '../tbank-sync/tbank-sync-repository.module'; import { ForecastService } from './application/forecast.service'; diff --git a/src/modules/investments/portfolio/presentation/portfolio.controller.ts b/src/modules/investments/portfolio/presentation/portfolio.controller.ts index 3b4919a..323e166 100644 --- a/src/modules/investments/portfolio/presentation/portfolio.controller.ts +++ b/src/modules/investments/portfolio/presentation/portfolio.controller.ts @@ -3,8 +3,9 @@ import type { Request } from 'express'; import { Controller, Get, Param, Req, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiOkResponse, ApiTags } from '@nestjs/swagger'; -import { ApiProblemResponses } from '../../../../common/decorators/api-safe-error-response.decorator'; -import { AccessPayload, JwtAuthGuard } from '../../../auth/auth.api'; +import { ApiProblemResponses } from '#src/common/decorators/api-safe-error-response.decorator'; +import { AccessPayload, JwtAuthGuard } from '#src/modules/auth/auth.api'; + import { PortfolioService } from '../application/portfolio.service'; import { PortfolioResourceDto } from './portfolio.dto'; diff --git a/src/modules/investments/portfolio/presentation/portfolio.dto.ts b/src/modules/investments/portfolio/presentation/portfolio.dto.ts index fdd6bd9..7527c7f 100644 --- a/src/modules/investments/portfolio/presentation/portfolio.dto.ts +++ b/src/modules/investments/portfolio/presentation/portfolio.dto.ts @@ -1,6 +1,7 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; -import { MoneyDto } from '../../../../common/money.dto'; +import { MoneyDto } from '#src/common/money.dto'; + import { AccountReferenceDto } from '../../account-reference.dto'; import { InvestmentResourceMetaDto } from '../../investment-resource.dto'; diff --git a/src/modules/investments/tbank-connection/tbank-connection.controller.ts b/src/modules/investments/tbank-connection/tbank-connection.controller.ts index 6d94617..90add97 100644 --- a/src/modules/investments/tbank-connection/tbank-connection.controller.ts +++ b/src/modules/investments/tbank-connection/tbank-connection.controller.ts @@ -18,7 +18,8 @@ import { ApiTags, } from '@nestjs/swagger'; -import { ApiProblemResponses } from '../../../common/decorators/api-safe-error-response.decorator'; +import { ApiProblemResponses } from '#src/common/decorators/api-safe-error-response.decorator'; + import { AccessPayload, JwtAuthGuard } from '../../auth/auth.api'; import { PutTbankConnectionDto, diff --git a/src/modules/investments/tbank-connection/tbank-connection.module.ts b/src/modules/investments/tbank-connection/tbank-connection.module.ts index 54fcc35..12357b9 100644 --- a/src/modules/investments/tbank-connection/tbank-connection.module.ts +++ b/src/modules/investments/tbank-connection/tbank-connection.module.ts @@ -1,6 +1,7 @@ import { Module } from '@nestjs/common'; -import { TbankModule } from '../../../integrations/tbank/tbank.module'; +import { TbankModule } from '#src/integrations/tbank/tbank.module'; + import { AuthModule } from '../../auth/auth.module'; import { TbankSyncModule } from '../tbank-sync/tbank-sync.module'; import { TbankConnectionController } from './tbank-connection.controller'; diff --git a/src/modules/investments/tbank-connection/tbank-connection.service.ts b/src/modules/investments/tbank-connection/tbank-connection.service.ts index ff2b2de..766d5c8 100644 --- a/src/modules/investments/tbank-connection/tbank-connection.service.ts +++ b/src/modules/investments/tbank-connection/tbank-connection.service.ts @@ -1,12 +1,12 @@ import { BadRequestException, Inject, Injectable } from '@nestjs/common'; -import { HttpErrorCode } from '../../../common/error-code'; +import { HttpErrorCode } from '#src/common/error-code'; import { supportedTbankAccounts, TbankClient, TbankTokenService, -} from '../../../integrations/tbank/tbank.api'; -import { PrismaService } from '../../../prisma/prisma.service'; +} from '#src/integrations/tbank/tbank.api'; +import { PrismaService } from '#src/prisma/prisma.service'; type TbankTokenValidator = Pick; diff --git a/src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts b/src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts index 058700d..cde3b2c 100644 --- a/src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts +++ b/src/modules/investments/tbank-sync/tbank-hourly.scheduler.ts @@ -1,14 +1,15 @@ import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; import { randomUUID } from 'node:crypto'; -import { StructuredLogger } from '../../../common/logging/structured-logger.service'; -import { TbankErrorCode } from '../../../integrations/tbank/tbank-error-code'; +import { StructuredLogger } from '#src/common/logging/structured-logger.service'; +import { TbankErrorCode } from '#src/integrations/tbank/tbank-error-code'; import { TbankAccessService, TbankMembershipService, type TbankSyncAttempt, -} from '../../../integrations/tbank/tbank.api'; -import { PrismaService } from '../../../prisma/prisma.service'; +} from '#src/integrations/tbank/tbank.api'; +import { PrismaService } from '#src/prisma/prisma.service'; + import { BrokerageOperationsSyncService } from '../operations/operations.api'; import { PortfolioService } from '../portfolio/portfolio.api'; import { UpcomingEventsService } from '../upcoming-events/upcoming-events.service'; diff --git a/src/modules/investments/tbank-sync/tbank-screen.ts b/src/modules/investments/tbank-sync/tbank-screen.ts index ca228f0..0bb14b1 100644 --- a/src/modules/investments/tbank-sync/tbank-screen.ts +++ b/src/modules/investments/tbank-sync/tbank-screen.ts @@ -1,8 +1,9 @@ import { BadRequestException } from '@nestjs/common'; +import { ISO_DATE_LENGTH, ISO_DATE_START } from '#src/common/time'; + import type { InvestmentScreenDto } from './tbank-sync.dto'; -import { ISO_DATE_LENGTH, ISO_DATE_START } from '../../../common/time'; import { MIN_INSTRUMENT_QUERY_LENGTH } from '../instrument-query'; // Reject fields from other screens before reserving any source work. diff --git a/src/modules/investments/tbank-sync/tbank-sync.controller.ts b/src/modules/investments/tbank-sync/tbank-sync.controller.ts index c6a62ba..26fc867 100644 --- a/src/modules/investments/tbank-sync/tbank-sync.controller.ts +++ b/src/modules/investments/tbank-sync/tbank-sync.controller.ts @@ -8,7 +8,8 @@ import { ApiTags, } from '@nestjs/swagger'; -import { ApiProblemResponses } from '../../../common/decorators/api-safe-error-response.decorator'; +import { ApiProblemResponses } from '#src/common/decorators/api-safe-error-response.decorator'; + import { AccessPayload, JwtAuthGuard } from '../../auth/auth.api'; import { EventsInvestmentScreenDto, diff --git a/src/modules/investments/tbank-sync/tbank-sync.module.ts b/src/modules/investments/tbank-sync/tbank-sync.module.ts index 44756fb..5662f35 100644 --- a/src/modules/investments/tbank-sync/tbank-sync.module.ts +++ b/src/modules/investments/tbank-sync/tbank-sync.module.ts @@ -1,6 +1,7 @@ import { Module } from '@nestjs/common'; -import { TbankModule } from '../../../integrations/tbank/tbank.module'; +import { TbankModule } from '#src/integrations/tbank/tbank.module'; + import { AuthModule } from '../../auth/auth.module'; import { InstrumentSourcesModule } from '../instruments/instrument-sources.module'; import { OperationsModule } from '../operations/operations.module'; diff --git a/src/modules/investments/tbank-sync/tbank-sync.repository.spec.ts b/src/modules/investments/tbank-sync/tbank-sync.repository.spec.ts index bff1581..75a38ef 100644 --- a/src/modules/investments/tbank-sync/tbank-sync.repository.spec.ts +++ b/src/modules/investments/tbank-sync/tbank-sync.repository.spec.ts @@ -1,4 +1,4 @@ -jest.mock('../../../prisma/prisma.service', () => ({ +jest.mock('#src/prisma/prisma.service', () => ({ PrismaService: class {}, })); diff --git a/src/modules/investments/tbank-sync/tbank-sync.repository.ts b/src/modules/investments/tbank-sync/tbank-sync.repository.ts index db534f2..5ea9ca7 100644 --- a/src/modules/investments/tbank-sync/tbank-sync.repository.ts +++ b/src/modules/investments/tbank-sync/tbank-sync.repository.ts @@ -1,14 +1,15 @@ import { Injectable } from '@nestjs/common'; import { randomUUID } from 'node:crypto'; -import type { Prisma } from '../../../../generated/prisma/client'; -import type { TbankSyncAttempt } from '../../../integrations/tbank/tbank.api'; +import type { Prisma } from '#generated/prisma/client'; +import type { TbankSyncAttempt } from '#src/integrations/tbank/tbank.api'; + +import { claimSyncWork, lockConnectionGeneration } from '#src/integrations/tbank/tbank-sync-claim'; +import { PrismaService } from '#src/prisma/prisma.service'; +import { toJson } from '#src/prisma/to-json'; + import type { InvestmentAttemptDto } from '../investment-resource.dto'; import type { InvestmentScreenDto } from './tbank-sync.dto'; - -import { claimSyncWork, lockConnectionGeneration } from '../../../integrations/tbank/tbank-sync-claim'; -import { PrismaService } from '../../../prisma/prisma.service'; -import { toJson } from '../../../prisma/to-json'; export type ScreenIntent = { now: string; scope: InvestmentScreenDto }; // Json columns are written only by this repository; a shape check turns corruption into an explicit 500. diff --git a/src/modules/investments/tbank-sync/tbank-sync.service.ts b/src/modules/investments/tbank-sync/tbank-sync.service.ts index 42c12a1..0746095 100644 --- a/src/modules/investments/tbank-sync/tbank-sync.service.ts +++ b/src/modules/investments/tbank-sync/tbank-sync.service.ts @@ -5,7 +5,8 @@ import { } from '@nestjs/common'; import { randomUUID } from 'node:crypto'; -import { TbankAccessService } from '../../../integrations/tbank/tbank.api'; +import { TbankAccessService } from '#src/integrations/tbank/tbank.api'; + import { BrokerageOperationsSyncService } from '../operations/operations.api'; import { TbankSyncStatusDto } from './tbank-sync.dto'; import { screenIntent, TbankSyncRepository } from './tbank-sync.repository'; diff --git a/src/modules/investments/upcoming-events/upcoming-event.mapper.ts b/src/modules/investments/upcoming-events/upcoming-event.mapper.ts index c250038..bf2af15 100644 --- a/src/modules/investments/upcoming-events/upcoming-event.mapper.ts +++ b/src/modules/investments/upcoming-events/upcoming-event.mapper.ts @@ -1,13 +1,14 @@ -import type { MoexBondEvent } from '../../../integrations/moex/moex.api'; -import type { TbankDividend } from '../../../integrations/tbank/tbank.api'; +import type { MoexBondEvent } from '#src/integrations/moex/moex.api'; +import type { TbankDividend } from '#src/integrations/tbank/tbank.api'; import { decimalFromString, formatDecimal, multiply, -} from '../../../common/decimal'; -import { ISO_DATE_LENGTH, ISO_DATE_START, MILLISECONDS_PER_SECOND } from '../../../common/time'; -import { decimal } from '../../../integrations/tbank/decimal'; +} from '#src/common/decimal'; +import { ISO_DATE_LENGTH, ISO_DATE_START, MILLISECONDS_PER_SECOND } from '#src/common/time'; +import { decimal } from '#src/integrations/tbank/decimal'; + import { UpcomingEventDto } from './upcoming-events.dto'; export function dividendEvent( diff --git a/src/modules/investments/upcoming-events/upcoming-events.controller.spec.ts b/src/modules/investments/upcoming-events/upcoming-events.controller.spec.ts index d7eb524..aae1a08 100644 --- a/src/modules/investments/upcoming-events/upcoming-events.controller.spec.ts +++ b/src/modules/investments/upcoming-events/upcoming-events.controller.spec.ts @@ -1,4 +1,4 @@ -jest.mock('../../../prisma/prisma.service', () => ({ +jest.mock('#src/prisma/prisma.service', () => ({ PrismaService: class PrismaService {}, })); diff --git a/src/modules/investments/upcoming-events/upcoming-events.controller.ts b/src/modules/investments/upcoming-events/upcoming-events.controller.ts index 17bc59a..6529716 100644 --- a/src/modules/investments/upcoming-events/upcoming-events.controller.ts +++ b/src/modules/investments/upcoming-events/upcoming-events.controller.ts @@ -3,7 +3,8 @@ import type { Request } from 'express'; import { Controller, Get, Param, Query, Req, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiOkResponse, ApiTags } from '@nestjs/swagger'; -import { ApiProblemResponses } from '../../../common/decorators/api-safe-error-response.decorator'; +import { ApiProblemResponses } from '#src/common/decorators/api-safe-error-response.decorator'; + import { AccessPayload, JwtAuthGuard } from '../../auth/auth.api'; import { UpcomingEventsQueryDto, diff --git a/src/modules/investments/upcoming-events/upcoming-events.dto.ts b/src/modules/investments/upcoming-events/upcoming-events.dto.ts index b838adf..809d7f1 100644 --- a/src/modules/investments/upcoming-events/upcoming-events.dto.ts +++ b/src/modules/investments/upcoming-events/upcoming-events.dto.ts @@ -1,7 +1,8 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsDateString, IsOptional, Matches } from 'class-validator'; -import { MoneyDto } from '../../../common/money.dto'; +import { MoneyDto } from '#src/common/money.dto'; + import { AccountReferenceDto } from '../account-reference.dto'; import { InvestmentReadQueryDto, diff --git a/src/modules/investments/upcoming-events/upcoming-events.module.ts b/src/modules/investments/upcoming-events/upcoming-events.module.ts index ab7ae36..523fe4e 100644 --- a/src/modules/investments/upcoming-events/upcoming-events.module.ts +++ b/src/modules/investments/upcoming-events/upcoming-events.module.ts @@ -1,6 +1,7 @@ import { Module } from '@nestjs/common'; -import { TbankModule } from '../../../integrations/tbank/tbank.module'; +import { TbankModule } from '#src/integrations/tbank/tbank.module'; + import { AuthModule } from '../../auth/auth.module'; import { InstrumentSourcesModule } from '../instruments/instrument-sources.module'; import { PortfolioModule } from '../portfolio/portfolio.module'; diff --git a/src/modules/investments/upcoming-events/upcoming-events.service.spec.ts b/src/modules/investments/upcoming-events/upcoming-events.service.spec.ts index f26c890..98ca93a 100644 --- a/src/modules/investments/upcoming-events/upcoming-events.service.spec.ts +++ b/src/modules/investments/upcoming-events/upcoming-events.service.spec.ts @@ -1,6 +1,7 @@ -import { decimalFromString } from '../../../common/decimal'; +import { decimalFromString } from '#src/common/decimal'; + import { bondEvent, dividendEvent } from './upcoming-event.mapper'; -jest.mock('../../../prisma/prisma.service', () => ({ +jest.mock('#src/prisma/prisma.service', () => ({ PrismaService: class {}, })); const metadata = { diff --git a/src/modules/investments/upcoming-events/upcoming-events.service.ts b/src/modules/investments/upcoming-events/upcoming-events.service.ts index 67690a3..3327e97 100644 --- a/src/modules/investments/upcoming-events/upcoming-events.service.ts +++ b/src/modules/investments/upcoming-events/upcoming-events.service.ts @@ -6,14 +6,15 @@ import { decimalFromString, formatDecimal, isZero, -} from '../../../common/decimal'; -import { MoneyDto } from '../../../common/money.dto'; -import { ISO_DATE_LENGTH, ISO_DATE_START } from '../../../common/time'; +} from '#src/common/decimal'; +import { MoneyDto } from '#src/common/money.dto'; +import { ISO_DATE_LENGTH, ISO_DATE_START } from '#src/common/time'; import { InstrumentMetadataService, metadataKey, TbankAccessService, -} from '../../../integrations/tbank/tbank.api'; +} from '#src/integrations/tbank/tbank.api'; + import { CatalogEnrichmentService } from '../instruments/instruments.api'; import { investmentResourceMeta } from '../investment-resource.mapper'; import { diff --git a/test/jest-e2e.json b/test/jest-e2e.json index 7645b6e..9161cb8 100644 --- a/test/jest-e2e.json +++ b/test/jest-e2e.json @@ -8,6 +8,8 @@ "^.+\\.(t|j)s$": "ts-jest" }, "moduleNameMapper": { + "^#generated/(.*)$": "/../generated/$1", + "^#src/(.*)$": "/../src/$1", "^(\\.{1,2}/.*)\\.js$": "$1" } } diff --git a/tsconfig.json b/tsconfig.json index a65e90f..2db15ec 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,10 @@ "compilerOptions": { "module": "nodenext", "moduleResolution": "nodenext", + "paths": { + "#src/*": ["./src/*"], + "#generated/*": ["./generated/*"] + }, "resolvePackageJsonExports": true, "esModuleInterop": true, "isolatedModules": true,