import { Controller, Get, Query, UseGuards, Request, ParseIntPipe, DefaultValuePipe, } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth, ApiQuery, } from '@nestjs/swagger'; import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; import { CreditsService } from './credits.service'; import { AuthenticatedRequest } from '../../common/interfaces/authenticated-request.interface'; @ApiTags('credits') @ApiBearerAuth() @UseGuards(JwtAuthGuard) @Controller('credits') export class CreditsController { constructor(private readonly creditsService: CreditsService) {} @Get('balance') @ApiOperation({ summary: 'Obtener balance de creditos' }) @ApiResponse({ status: 200, description: 'Balance actual' }) async getBalance(@Request() req: AuthenticatedRequest) { const balance = await this.creditsService.getBalance(req.user.id); return { balance: balance.balance, totalPurchased: balance.totalPurchased, totalConsumed: balance.totalConsumed, totalFromReferrals: balance.totalFromReferrals, }; } @Get('transactions') @ApiOperation({ summary: 'Obtener historial de transacciones' }) @ApiResponse({ status: 200, description: 'Lista de transacciones' }) @ApiQuery({ name: 'page', required: false, type: Number }) @ApiQuery({ name: 'limit', required: false, type: Number }) async getTransactions( @Request() req: AuthenticatedRequest, @Query('page', new DefaultValuePipe(1), ParseIntPipe) page: number, @Query('limit', new DefaultValuePipe(20), ParseIntPipe) limit: number, ) { const { transactions, total } = await this.creditsService.getTransactions( req.user.id, page, Math.min(limit, 100), ); return { transactions, total, page, limit, hasMore: page * limit < total, }; } @Get('packages') @ApiOperation({ summary: 'Obtener paquetes de creditos disponibles' }) @ApiResponse({ status: 200, description: 'Lista de paquetes' }) async getPackages() { return this.creditsService.getPackages(); } }