import { Body, BadRequestException, Controller, Get, HttpCode, HttpStatus, Param, Post, Req, UseGuards, ValidationPipe, } from '@nestjs/common'; import { ApiAcceptedResponse, ApiBearerAuth, ApiBody, ApiExtraModels, ApiOkResponse, ApiTags, } from '@nestjs/swagger'; import type { Request } from 'express'; import { ApiProblemResponses } from '../../../common/decorators/api-safe-error-response.decorator'; import { AccessPayload, JwtAuthGuard } from '../../auth/auth.api'; import { InvestmentScreenDto, IncomeInvestmentScreenDto, EventsInvestmentScreenDto, TimestampInvestmentScreenDto, investmentScreenSchema, TbankSyncAcceptedDto, TbankSyncStatusDto, } from './tbank-sync.dto'; import { TbankSyncService } from './tbank-sync.service'; @ApiTags('tbank-sync') @ApiExtraModels( IncomeInvestmentScreenDto, EventsInvestmentScreenDto, TimestampInvestmentScreenDto, ) @ApiProblemResponses() @ApiBearerAuth() @UseGuards(JwtAuthGuard) @Controller('tbank-sync') export class TbankSyncController { constructor(private readonly sync: TbankSyncService) {} @Post() @HttpCode(HttpStatus.ACCEPTED) @ApiBody({ schema: investmentScreenSchema }) @ApiAcceptedResponse({ type: TbankSyncAcceptedDto }) request( @Req() request: Request & { user: AccessPayload }, @Body( new ValidationPipe({ expectedType: InvestmentScreenDto, transform: true, whitelist: true, forbidNonWhitelisted: true, validationError: { target: false, value: false }, exceptionFactory: (message) => new BadRequestException({ message }), }), ) input: unknown, ) { return this.sync.request(request.user.sub, input as InvestmentScreenDto); } @Get(':id') @ApiOkResponse({ type: TbankSyncStatusDto }) status( @Req() request: Request & { user: AccessPayload }, @Param('id') id: string, ) { return this.sync.status(request.user.sub, id); } }