miinventario-v2/apps/backend/src/modules/credits/credits.controller.ts
rckrdmrd 1a53b5c4d3 [MIINVENTARIO] feat: Initial commit - Sistema de inventario con análisis de video IA
- 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>
2026-01-13 02:25:48 -06:00

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();
}
}