- Backend NestJS con módulos de autenticación, inventario, créditos - Frontend React con dashboard y componentes UI - Base de datos PostgreSQL con migraciones - Tests E2E configurados - Configuración de Docker y deployment Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
73 lines
2.1 KiB
TypeScript
73 lines
2.1 KiB
TypeScript
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();
|
|
}
|
|
}
|