add bot wsp
This commit is contained in:
@@ -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');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user