import { Body, Controller, Get, HttpException, Param, Post, UseGuards } from '@nestjs/common' import { NotFoundError, UnprocessableEntityError } from '../../../errors' import { Person } from '../domain' import { PersonResult, SubscriptionResult } from '../domain/types' import { ThirdPartyAuthorizationGuard } from '../../../guards' import { TokenKindDisallowedError } from '../../../services/subscription/errors' import { PersonSubscribeParam } from './params' @UseGuards(ThirdPartyAuthorizationGuard) @Controller('api-payment/person') export class PersonController { constructor(private readonly person: Person) {} @Get('/:login') async get(@Param('login') login: string): Promise { return this.person.get(login) } @Get('/:login/subscriptions') async getSubscriptions(@Param('login') login: string): Promise> { return this.person.getSubscriptions(login) } @Post('/:login/subscribe') async subscribe( @Param('login') login: string, @Body() { token, kind, source, planId, unitId, discount, salesChannel }: PersonSubscribeParam, ): Promise { try { return await this.person.subscribe( login, token, kind === 'credit_card' ? 'credit' : 'debit', source, planId, unitId, discount, salesChannel, ) } catch (error) { if (error instanceof TokenKindDisallowedError) throw new UnprocessableEntityError( 'Métodos de pagamentos aceitos: cartão de crédito, cartão de débito. Por favor, substitua o método de pagamento.', ) const status = error instanceof NotFoundError ? 404 : 422 throw new HttpException({ code: status.toString(), description: error.message }, status) } } @Post('/:login/unsubscribe') async unsubscribe(@Param('login') login: string): Promise { return this.person.unsubscribe(login) } }