From 8b202ef7d3c7ac1b3554649d4b64a6c4373ea322 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Wed, 17 Jun 2026 14:39:30 +0300 Subject: [PATCH] feat(tbank): add GET /positions endpoint with cursor pagination --- .../tbank/dto/broker-position-query.dto.ts | 18 ++++++++++++++++++ .../src/modules/tbank/tbank.controller.ts | 17 +++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 apps/backend/src/modules/tbank/dto/broker-position-query.dto.ts diff --git a/apps/backend/src/modules/tbank/dto/broker-position-query.dto.ts b/apps/backend/src/modules/tbank/dto/broker-position-query.dto.ts new file mode 100644 index 0000000..57e4d59 --- /dev/null +++ b/apps/backend/src/modules/tbank/dto/broker-position-query.dto.ts @@ -0,0 +1,18 @@ +import { ApiPropertyOptional } from '@nestjs/swagger'; +import { Type } from 'class-transformer'; +import { IsNumber, IsOptional, IsString, Max, Min } from 'class-validator'; + +export class BrokerPositionQueryDto { + @ApiPropertyOptional({ description: 'Cursor for pagination (positionUid)' }) + @IsOptional() + @IsString() + cursor?: string; + + @ApiPropertyOptional({ default: 10 }) + @IsOptional() + @Type(() => Number) + @IsNumber() + @Min(1) + @Max(100) + limit?: number = 10; +} diff --git a/apps/backend/src/modules/tbank/tbank.controller.ts b/apps/backend/src/modules/tbank/tbank.controller.ts index 5b3f316..dbe09e2 100644 --- a/apps/backend/src/modules/tbank/tbank.controller.ts +++ b/apps/backend/src/modules/tbank/tbank.controller.ts @@ -7,7 +7,9 @@ import { BrokerOperationSyncEnvelopeDto, BrokerOperationsEnvelopeDto, BrokerPortfolioEnvelopeDto, + BrokerPositionsEnvelopeDto, } from './dto/broker-envelope.dto'; +import { BrokerPositionQueryDto } from './dto/broker-position-query.dto'; import { BrokerOperationQueryDto } from './dto/broker-operation-query.dto'; import { BrokerOperationSyncQueryDto } from './dto/broker-operation-sync-query.dto'; import { BrokerAccountsService } from './services/broker-accounts.service'; @@ -43,6 +45,21 @@ export class TBankController { return new ApiResponse(result.data, result.meta.fromCache, result.meta.cachedAt); } + @Get('accounts/:accountId/positions') + @ApiOperation({ summary: 'Get paginated T-Bank broker account positions' }) + @ApiOkResponse({ type: BrokerPositionsEnvelopeDto }) + async getPositions( + @Param('accountId') accountId: string, + @Query() query: BrokerPositionQueryDto, + ) { + const result = await this.brokerPortfolioService.getPositions( + accountId, + query.cursor, + query.limit, + ); + return new ApiResponse(result.data, result.meta.fromCache, result.meta.cachedAt); + } + @Get('accounts/:accountId/operations') @ApiOperation({ summary: 'Get paginated T-Bank broker account operations' }) @ApiOkResponse({ type: BrokerOperationsEnvelopeDto })