add bot wsp

This commit is contained in:
Valentin Romero
2026-06-30 22:04:56 -03:00
parent 6859b89262
commit 25d4ba6cc0
166 changed files with 29830 additions and 0 deletions
@@ -0,0 +1 @@
export class CreateSubscriptionDto {}
@@ -0,0 +1,4 @@
import { PartialType } from '@nestjs/mapped-types';
import { CreateSubscriptionDto } from './create-subscription.dto';
export class UpdateSubscriptionDto extends PartialType(CreateSubscriptionDto) {}
@@ -0,0 +1 @@
export class Subscription {}
@@ -0,0 +1,20 @@
import { Test, TestingModule } from '@nestjs/testing';
import { SubscriptionsController } from './subscriptions.controller';
import { SubscriptionsService } from './subscriptions.service';
describe('SubscriptionsController', () => {
let controller: SubscriptionsController;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [SubscriptionsController],
providers: [SubscriptionsService],
}).compile();
controller = module.get<SubscriptionsController>(SubscriptionsController);
});
it('should be defined', () => {
expect(controller).toBeDefined();
});
});
@@ -0,0 +1,34 @@
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { SubscriptionsService } from './subscriptions.service';
import { CreateSubscriptionDto } from './dto/create-subscription.dto';
import { UpdateSubscriptionDto } from './dto/update-subscription.dto';
@Controller('subscriptions')
export class SubscriptionsController {
constructor(private readonly subscriptionsService: SubscriptionsService) {}
// @Post()
// create(@Body() createSubscriptionDto: CreateSubscriptionDto) {
// return this.subscriptionsService.create(createSubscriptionDto);
// }
// @Get()
// findAll() {
// return this.subscriptionsService.findAll();
// }
// @Get(':id')
// findOne(@Param('id') id: string) {
// return this.subscriptionsService.findOne(+id);
// }
// @Patch(':id')
// update(@Param('id') id: string, @Body() updateSubscriptionDto: UpdateSubscriptionDto) {
// return this.subscriptionsService.update(+id, updateSubscriptionDto);
// }
// @Delete(':id')
// remove(@Param('id') id: string) {
// return this.subscriptionsService.remove(+id);
// }
}
@@ -0,0 +1,18 @@
import { Module } from '@nestjs/common';
import { SubscriptionsService } from './subscriptions.service';
import { SubscriptionsController } from './subscriptions.controller';
import { SessionsModule } from '../sessions/sessions.module';
import { UserModule } from '../user/user.module';
import { PrismaModule } from '../prisma/prisma.module';
@Module({
controllers: [SubscriptionsController],
providers: [SubscriptionsService],
imports: [
SessionsModule,
UserModule,
PrismaModule
],
exports: [SubscriptionsService],
})
export class SubscriptionsModule { }
@@ -0,0 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { SubscriptionsService } from './subscriptions.service';
describe('SubscriptionsService', () => {
let service: SubscriptionsService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [SubscriptionsService],
}).compile();
service = module.get<SubscriptionsService>(SubscriptionsService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});
@@ -0,0 +1,155 @@
import { BadRequestException, Injectable, InternalServerErrorException, Logger } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import { SessionsService } from '../sessions/sessions.service';
import { UserService } from '~/user/user.service';
@Injectable()
export class SubscriptionsService {
private logger = new Logger(SubscriptionsService.name);
constructor(
private prismaService: PrismaService,
private sessionsService: SessionsService,
private userService: UserService,
) { }
/**
* Suscribe un usuario a una sesión como asistente
* @param userId ID del usuario
* @param sessionId ID de la sesión
* @returns información de la inscripción
*/
async subscribeUserToSession(userId: string, sessionId: string) {
try {
this.logger.log(`Subscribing user ${userId} to session ${sessionId}`);
const session = await this.sessionsService.findById(sessionId);
const user = await this.userService.findById(userId);
if (!session || !user) {
this.logger.warn(`Session or user not found (userId: ${userId}, sessionId: ${sessionId})`);
throw new BadRequestException('Usuario o sesión no encontrados');
}
// Verificar si el usuario ya es asistente de esta sesión
const isAlreadyAssistant = session?.assistants.some(assistant => assistant.id === userId);
if (isAlreadyAssistant) {
this.logger.warn(`User ${userId} is already an assistant in session ${sessionId}`);
throw new BadRequestException('El usuario ya es asistente en esta sesión');
}
// Agregar el usuario como asistente a la sesión
const updatedSession = await this.prismaService.session.update({
where: { id: sessionId },
data: {
assistants: {
connect: { id: userId }
}
},
include: {
assistants: true
}
});
return {
message: 'Usuario suscrito exitosamente',
sessionId: sessionId,
userId: userId,
sessionDescription: session?.description
};
} catch (error: any) {
// Si es una excepción HTTP específica, no la transformamos
if (error instanceof BadRequestException || error instanceof InternalServerErrorException) {
this.logger.error(`Error subscribing user ${userId} to session ${sessionId}: ${error.message}`);
throw error;
}
// Solo para errores no controlados
this.logger.error(`Unexpected error subscribing user ${userId} to session ${sessionId}: ${error.message}`, error.stack);
throw new InternalServerErrorException('Error al suscribir al usuario');
}
}
/**
* Desuscribe un usuario de una sesión
* @param userId ID del usuario
* @param sessionId ID de la sesión
*/
async unsubscribeUserFromSession(userId: string, sessionId: string) {
try {
this.logger.log(`Unsubscribing user ${userId} from session ${sessionId}`);
const session = await this.sessionsService.findById(sessionId);
if (!session) {
this.logger.warn(`Session not found: ${sessionId}`);
throw new BadRequestException('Sesión no encontrada');
}
// Verificar si el usuario es asistente de esta sesión
const isAssistant = session.assistants.some(assistant => assistant.id === userId);
if (!isAssistant) {
this.logger.warn(`User ${userId} is not an assistant in session ${sessionId}`);
throw new BadRequestException('El usuario no es asistente en esta sesión');
}
// Remover el usuario como asistente de la sesión
await this.prismaService.session.update({
where: { id: sessionId },
data: {
assistants: {
disconnect: { id: userId }
}
}
});
return {
message: 'Usuario desuscrito exitosamente',
sessionId: sessionId,
userId: userId
};
} catch (error: any) {
if (error instanceof BadRequestException || error instanceof InternalServerErrorException) {
this.logger.error(`Error unsubscribing user ${userId} from session ${sessionId}: ${error.message}`);
throw error;
}
this.logger.error(`Unexpected error unsubscribing user ${userId} from session ${sessionId}: ${error.message}`, error.stack);
throw new InternalServerErrorException('Error al desuscribir al usuario');
}
}
/**
* Obtiene todas las sesiones en las que un usuario es asistente
* @param userId ID del usuario
*/
async getUserSessions(userId: string) {
try {
this.logger.log(`Getting sessions for user ${userId}`);
const user = await this.prismaService.user.findUnique({
where: { id: userId },
include: {
assistantSessions: {
include: {
instructors: true,
dates: true
}
}
}
});
if (!user) {
throw new BadRequestException('Usuario no encontrado');
}
return user.assistantSessions;
} catch (error: any) {
this.logger.error(`Error getting sessions for user ${userId}: ${error.message}`);
throw new InternalServerErrorException('Error al obtener las sesiones del usuario');
}
}
}