From 498e70e589ba7bc1b4fddf4241530f146e5fe3c5 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Tue, 14 Mar 2023 15:26:00 -0600 Subject: [PATCH 1/2] sending email is already in the project --- .env | 22 +++++++++---- package-lock.json | 14 ++++++++ package.json | 1 + sql/00-tipo_miembro.sql | 2 +- src/app.module.ts | 4 +++ src/email/dto/emailDto.dto.ts | 8 +++++ src/email/email.controller.spec.ts | 18 +++++++++++ src/email/email.controller.ts | 16 +++++++++ src/email/email.module.ts | 13 ++++++++ src/email/email.service.spec.ts | 18 +++++++++++ src/email/email.service.ts | 52 ++++++++++++++++++++++++++++++ src/eventos/eventos.controller.ts | 7 +++- src/eventos/eventos.module.ts | 3 +- src/eventos/eventos.service.ts | 31 ++++++++++++------ src/miembro/miembro.controller.ts | 7 +++- src/miembro/miembro.service.ts | 8 +++++ 16 files changed, 205 insertions(+), 19 deletions(-) create mode 100644 src/email/dto/emailDto.dto.ts create mode 100644 src/email/email.controller.spec.ts create mode 100644 src/email/email.controller.ts create mode 100644 src/email/email.module.ts create mode 100644 src/email/email.service.spec.ts create mode 100644 src/email/email.service.ts diff --git a/.env b/.env index 2a1e147..f90c7ad 100644 --- a/.env +++ b/.env @@ -1,12 +1,22 @@ PORT=5089 -DB_HOST=132.248.180.82 -DB_USER=user_cedetec -DB_PASSWORD=c3t3d3c -DB_NAME=Betelgeuse_Cedetec_Prueba -DB_PORT= +# DB_HOST=132.248.180.82 +# DB_USER=user_cedetec +# DB_PASSWORD=c3t3d3c +# DB_NAME=Betelgeuse_Cedetec_Prueba +# DB_PORT= + + DB_HOST=localhost + DB_USER=root + DB_PASSWORD=password + DB_NAME=cedetec_proyectos + DB_PORT= DB_HOST_DSC = 132.248.180.82 DB_USER_DSC = sites_user DB_PASS_DSC = F0rTest -DB_NAME_DSC = sat \ No newline at end of file +DB_NAME_DSC = sat + +NODEMAILER_SERVICE = gmail +NODEMAILER_USER = cidwa1@pcpuma.acatlan.unam.mx +NODEMAILER_PASWORD = cidwaxd1, \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 48642b8..87cae60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "class-validator": "^0.14.0", "moment": "^2.29.4", "mysql2": "^3.1.2", + "nodemailer": "^6.9.1", "passport": "^0.6.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", @@ -6980,6 +6981,14 @@ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, + "node_modules/nodemailer": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz", + "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", @@ -14913,6 +14922,11 @@ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, + "nodemailer": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz", + "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==" + }, "nopt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", diff --git a/package.json b/package.json index 4b5be02..3ac1600 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "class-validator": "^0.14.0", "moment": "^2.29.4", "mysql2": "^3.1.2", + "nodemailer": "^6.9.1", "passport": "^0.6.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", diff --git a/sql/00-tipo_miembro.sql b/sql/00-tipo_miembro.sql index 1e87c8f..b42aae8 100644 --- a/sql/00-tipo_miembro.sql +++ b/sql/00-tipo_miembro.sql @@ -1,2 +1,2 @@ INSERT INTO tipo_miembro(tipo_miembro) VALUES("Admin"); -INSERT INTO tipo_miembro(tipo_miembro) VALUES("Alumno"); +INSERT INTO tipo_miembro(tipo_miembro) VALUES("Miembro"); diff --git a/src/app.module.ts b/src/app.module.ts index fd39777..21f3362 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -44,6 +44,9 @@ import { Contacto } from './contacto/entity/contacto.entity'; import { Equipo } from './equipo/entity/equipo.entity'; import { EquipoEvento } from './equipo-evento/entity/equipo_evento.entity'; import { EquipoMiembro } from './equipo-miembro/entity/equipo_miembro.entity'; +import { EmailService } from './email/email.service'; +import { EmailController } from './email/email.controller'; +import { EmailModule } from './email/email.module'; @Module({ imports: [ @@ -106,6 +109,7 @@ import { EquipoMiembro } from './equipo-miembro/entity/equipo_miembro.entity'; ProyectoModule, ProyectoActividadModule, ActividadModule, + EmailModule, ], controllers: [ AppController, diff --git a/src/email/dto/emailDto.dto.ts b/src/email/dto/emailDto.dto.ts new file mode 100644 index 0000000..a6c6129 --- /dev/null +++ b/src/email/dto/emailDto.dto.ts @@ -0,0 +1,8 @@ +import { IsEmail } from "class-validator" + +export class EmailDto { + + subject:string + + text:string +} \ No newline at end of file diff --git a/src/email/email.controller.spec.ts b/src/email/email.controller.spec.ts new file mode 100644 index 0000000..9470aa8 --- /dev/null +++ b/src/email/email.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { EmailController } from './email.controller'; + +describe('EmailController', () => { + let controller: EmailController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [EmailController], + }).compile(); + + controller = module.get(EmailController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/email/email.controller.ts b/src/email/email.controller.ts new file mode 100644 index 0000000..1593154 --- /dev/null +++ b/src/email/email.controller.ts @@ -0,0 +1,16 @@ +import { Body, Controller, Param, ParseIntPipe, Post } from '@nestjs/common'; +import { EmailDto } from './dto/emailDto.dto'; +import { EmailService } from './email.service'; + +@Controller('email') +export class EmailController { + constructor(private readonly emailService: EmailService) {} + + @Post('/evento/:id') + async sendEmail( + @Param('id', ParseIntPipe) id: number, + @Body() emailDto: EmailDto, + ): Promise { + return this.emailService.sendEmail(id, emailDto); + } +} diff --git a/src/email/email.module.ts b/src/email/email.module.ts new file mode 100644 index 0000000..39df2ed --- /dev/null +++ b/src/email/email.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { EventosModule } from 'src/eventos/eventos.module'; +import { Participante } from 'src/participante/participante.entity'; +import { EmailController } from './email.controller'; +import { EmailService } from './email.service'; + +@Module({ + imports:[TypeOrmModule.forFeature([Participante])], + controllers:[EmailController], + providers:[EmailService] +}) +export class EmailModule {} diff --git a/src/email/email.service.spec.ts b/src/email/email.service.spec.ts new file mode 100644 index 0000000..27719da --- /dev/null +++ b/src/email/email.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { EmailService } from './email.service'; + +describe('EmailService', () => { + let service: EmailService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [EmailService], + }).compile(); + + service = module.get(EmailService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/email/email.service.ts b/src/email/email.service.ts new file mode 100644 index 0000000..f8a7852 --- /dev/null +++ b/src/email/email.service.ts @@ -0,0 +1,52 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { InjectRepository } from '@nestjs/typeorm'; +import * as nodemailer from 'nodemailer'; +import { EventosService } from 'src/eventos/eventos.service'; +import { Participante } from 'src/participante/participante.entity'; +import { Repository } from 'typeorm'; +import { EmailDto } from './dto/emailDto.dto'; + +@Injectable() +export class EmailService { + private transporter; + + constructor( + @InjectRepository(Participante) + private participanteRepository: Repository, + private configService: ConfigService, + ) { + this.transporter = nodemailer.createTransport({ + service: this.configService.get('NODEMAILER_SERVICE'), + auth: { + user: this.configService.get('NODEMAILER_USER'), + pass: this.configService.get('NODEMAILER_PASWORD'), + }, + }); + } + + async sendEmail(id: number, message: EmailDto) { + const participantes = await this.getEmailDeParticipantes(id); + participantes.map((res) => { + const emailDestinatario = res.email; + this.transporter.sendMail({ + to: emailDestinatario, + subject: message.subject, + text: message.text, + }); + /*console.log("Email enviado a: ", res)*/ + }); + } + + async getEmailDeParticipantes(idEvento: number) { + const participantes = await this.participanteRepository + .createQueryBuilder('participante') + .innerJoin('participante.eventosParticipante', 'eventoParticipante') + .innerJoin('eventoParticipante.evento', 'evento') + .where('evento.id_evento = :idEvento', { idEvento }) + .select(['participante.email']) + .getMany(); + + return participantes; + } +} diff --git a/src/eventos/eventos.controller.ts b/src/eventos/eventos.controller.ts index e3f9b99..5abbe20 100644 --- a/src/eventos/eventos.controller.ts +++ b/src/eventos/eventos.controller.ts @@ -37,8 +37,13 @@ export class EventosController { return this.eventoService.deleteEventoParticipante(id) } - @Get(':id/participantes') + @Get(':id/cupos') async getCupos(@Param('id', ParseIntPipe)id: number){ return this.eventoService.getCupos(id) } + + @Get(':id/participante') + async getParticipnates(@Param('id', ParseIntPipe)id:number){ + return this.eventoService.getParticipantes(id) + } } diff --git a/src/eventos/eventos.module.ts b/src/eventos/eventos.module.ts index 52755c1..a165de0 100644 --- a/src/eventos/eventos.module.ts +++ b/src/eventos/eventos.module.ts @@ -1,12 +1,13 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { EventoParticipante } from 'src/evento-participante/evento-participante/eventoParticipante.entity'; +import { Participante } from 'src/participante/participante.entity'; import { Evento } from './evento.entity'; import { EventosController } from './eventos.controller'; import { EventosService } from './eventos.service'; @Module({ - imports:[TypeOrmModule.forFeature([Evento, EventoParticipante])], + imports:[TypeOrmModule.forFeature([Evento, EventoParticipante, Participante])], controllers:[EventosController], providers:[EventosService] }) diff --git a/src/eventos/eventos.service.ts b/src/eventos/eventos.service.ts index c308f04..8777106 100644 --- a/src/eventos/eventos.service.ts +++ b/src/eventos/eventos.service.ts @@ -13,6 +13,7 @@ export class EventosService { @InjectRepository(Evento) private eventoRepository: Repository, @InjectRepository(EventoParticipante) private eventoParticipanteRepository: Repository, + @InjectRepository(Participante) private participanteRepository:Repository ) {} getEventos() { @@ -61,16 +62,28 @@ export class EventosService { } } - async getCupos(id: number){ - const evento = this.getEventosPorId(id) - if(!evento) throw new Error(`El evento con id:${id} no existe`) + async getCupos(id: number) { + const evento = this.getEventosPorId(id); + if (!evento) throw new Error(`El evento con id:${id} no existe`); const registrados = await this.eventoParticipanteRepository - .createQueryBuilder('ep') - .select('COUNT(ep.id_evento)', 'count') - .where('ep.id_evento = :eventoId', { eventoId: (await evento).id_evento }) - .getRawOne(); + .createQueryBuilder('ep') + .select('COUNT(ep.id_evento)', 'count') + .where('ep.id_evento = :eventoId', { eventoId: (await evento).id_evento }) + .getRawOne(); const cupoOriginal = (await evento).cupo; - const cupoDisponible = cupoOriginal - registrados.count; - return { registrados: registrados.count, cupoDisponible, cupoOriginal}; + const cupoDisponible = cupoOriginal - registrados.count; + return { registrados: registrados.count, cupoDisponible, cupoOriginal }; + } + + async getParticipantes(idEvento: number) { + const participantes = await this.participanteRepository + .createQueryBuilder('participante') + .innerJoin('participante.eventosParticipante', 'eventoParticipante') + .innerJoin('eventoParticipante.evento', 'evento') + .where('evento.id_evento = :idEvento', { idEvento }) + .select(['participante.nombre','participante.apellido_paterno','participante.carrera', 'participante.email']) + .getMany(); + + return participantes; } } diff --git a/src/miembro/miembro.controller.ts b/src/miembro/miembro.controller.ts index 35d28cb..50b9cda 100644 --- a/src/miembro/miembro.controller.ts +++ b/src/miembro/miembro.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, UseGuards } from '@nestjs/common'; +import { Controller, Get, Param, ParseIntPipe, UseGuards } from '@nestjs/common'; import { JwtAuthGuard } from 'src/auth/jwt-auth.guard'; import { Miembro } from './entity/miembro.entity'; import { MiembroService } from './miembro.service'; @@ -13,4 +13,9 @@ export class MiembroController { getUsuarios(): Promise{ return this.miembroService.getUsuarios() } + + @Get(':tipo') + getMiembros(@Param('tipo', ParseIntPipe)tipo: number): Promise{ + return this.miembroService.getMiembros(tipo) + } } diff --git a/src/miembro/miembro.service.ts b/src/miembro/miembro.service.ts index 1878615..dbd0c57 100644 --- a/src/miembro/miembro.service.ts +++ b/src/miembro/miembro.service.ts @@ -20,4 +20,12 @@ export class MiembroService { }, }); } + + getMiembros(tipo: number){ + return this.miembroRepository.find({ + where:{ + id_tipo_miembro: tipo + } + }) + } } -- 2.43.0 From 0158b6af9845ede9693b9484e2215668c3e03714 Mon Sep 17 00:00:00 2001 From: jalvarado <421010301@pcpuma.acatlan.unam.mx> Date: Tue, 14 Mar 2023 15:41:02 -0600 Subject: [PATCH 2/2] add new info in env --- .env.example | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index caca0c6..ce26c2b 100644 --- a/.env.example +++ b/.env.example @@ -8,4 +8,8 @@ DB_NAME= DB_HOST_DSC= DB_USER_DSC= DB_PASS_DSC= -DB_NAME_DSC= \ No newline at end of file +DB_NAME_DSC= + +NODEMAILER_SERVICE= +NODEMAILER_USER= +NODEMAILER_PASWORD= \ No newline at end of file -- 2.43.0