From 59d99c1cfb0564270142e04951ae728ada085181 Mon Sep 17 00:00:00 2001 From: Mariela Date: Tue, 26 Jul 2022 16:59:29 -0600 Subject: [PATCH] registro de administrador de comunidad con bug en el envio del correo --- api-gateway/src/app.controller.ts | 29 +- api-gateway/src/app.service.ts | 78 +++- .../src/email.controller.ts | 43 +- .../src/mails/emailCreateUserAdmin.hbs | 442 ++++++++++++++++++ .../mails/emailCreateUserAdminCommunity.hbs | 442 ++++++++++++++++++ .../src/mails/images/Logo Katoikia.png | Bin 0 -> 37826 bytes .../src/mails/images/Logo Katoikia.svg | 9 + .../src/users/users.controller.ts | 6 + servicio-usuarios/src/users/users.module.ts | 10 + servicio-usuarios/src/users/users.service.ts | 40 +- .../components/AdministradoresComunidad.js | 67 ++- .../src/components/AdministradoresSistema.js | 3 +- 12 files changed, 1121 insertions(+), 48 deletions(-) create mode 100644 servicio-notificaciones/src/mails/emailCreateUserAdmin.hbs create mode 100644 servicio-notificaciones/src/mails/emailCreateUserAdminCommunity.hbs create mode 100644 servicio-notificaciones/src/mails/images/Logo Katoikia.png create mode 100644 servicio-notificaciones/src/mails/images/Logo Katoikia.svg diff --git a/api-gateway/src/app.controller.ts b/api-gateway/src/app.controller.ts index 2d02bfe4..e0a5eb1d 100644 --- a/api-gateway/src/app.controller.ts +++ b/api-gateway/src/app.controller.ts @@ -11,13 +11,12 @@ export class AppController { @Body('last_name') last_name: string, @Body('email') email: string, @Body('phone') phone: number, - @Body('password') password: string, @Body('user_type') user_type: string, @Body('status') status: string, @Body('date_entry') date_entry: Date, ) { - return this.appService.createAdminSystem(dni, name, last_name, email, phone, password, - user_type, status, date_entry); + return this.appService.createAdminSystem(dni, name, last_name, email, phone, + user_type, status, date_entry); } @Post('user/createGuard') @@ -28,13 +27,29 @@ export class AppController { @Body('last_name') last_name: string, @Body('email') email: string, @Body('phone') phone: number, - @Body('password') password: string, @Body('user_type') user_type: string, @Body('status') status: string, @Body('date_entry') date_entry: Date, @Body('community_id') community_id:string ) { - return this.appService.createGuard(dni, name, last_name, email, phone, password, + return this.appService.createGuard(dni, name, last_name, email, phone, + user_type, status, date_entry,community_id); + } + + @Post('user/createAdminCommunity') + createAdminCommunity( + //Nombre, Apellidos, Correo electrónico, Cédula, Teléfono, Contraseña + @Body('dni') dni: string, + @Body('name') name: string, + @Body('last_name') last_name: string, + @Body('email') email: string, + @Body('phone') phone: number, + @Body('user_type') user_type: string, + @Body('status') status: string, + @Body('date_entry') date_entry: Date, + @Body('community_id') community_id:string + ) { + return this.appService.createAdminCommunity(dni, name, last_name, email, phone, user_type, status, date_entry,community_id); } @@ -349,4 +364,8 @@ export class AppController { return this.appService.html(email, name); } + + + + } \ No newline at end of file diff --git a/api-gateway/src/app.service.ts b/api-gateway/src/app.service.ts index 65ebd4f8..c55021d1 100644 --- a/api-gateway/src/app.service.ts +++ b/api-gateway/src/app.service.ts @@ -37,11 +37,11 @@ export class AppService { //POST parameter from API createAdminSystem(dni: string, name: string, last_name: string, email: string, phone: number - , password: string, user_type: string, status: string, date_entry: Date) { + , user_type: string, status: string, date_entry: Date) { const pattern = { cmd: 'createAdminSystem' }; const payload = { dni: dni, name: name, last_name: last_name, email: email, phone: phone, - password: password, user_type: user_type, status: status, date_entry: date_entry + password: this.generatePassword(), user_type: user_type, status: status, date_entry: date_entry }; return this.clientUserApp .send(pattern, payload) @@ -51,11 +51,27 @@ export class AppService { } createGuard(dni: string, name: string, last_name: string, email: string, phone: number - , password: string, user_type: string, status: string, date_entry: Date, community_id: string) { + , user_type: string, status: string, date_entry: Date, community_id: string) { const pattern = { cmd: 'createGuard' }; const payload = { dni: dni, name: name, last_name: last_name, email: email, phone: phone, - password: password, user_type: user_type, status: status, date_entry: date_entry, community_id + password: this.generatePassword(), user_type: user_type, status: status, date_entry: date_entry, community_id + + }; + return this.clientUserApp + .send(pattern, payload) + .pipe( + map((message: string) => ({ message })), + ); + } + + + createAdminCommunity(dni: string, name: string, last_name: string, email: string, phone: number + , user_type: string, status: string, date_entry: Date, community_id: string) { + const pattern = { cmd: 'createAdminCommunity' }; + const payload = { + dni: dni, name: name, last_name: last_name, email: email, phone: phone, + password: this.generatePassword(), user_type: user_type, status: status, date_entry: date_entry, community_id }; return this.clientUserApp @@ -116,7 +132,7 @@ export class AppService { ); } - + deleteAdminSystem(id: string) { const pattern = { cmd: 'deleteAdminSystem' }; const payload = { id: id }; @@ -129,7 +145,7 @@ export class AppService { inicioSesion(pEmail: string, pPassword: string) { const pattern = { cmd: 'loginUser' }; - const payload = { email: pEmail, password: pPassword}; + const payload = { email: pEmail, password: pPassword }; return this.clientUserApp .send(pattern, payload) .pipe( @@ -153,7 +169,7 @@ export class AppService { //POST parameter from API createCommunity(name: string, province: string, canton: string, district: string - , num_houses: number, phone: string, status: string, date_entry: Date, houses: []) { + , num_houses: number, phone: string, status: string, date_entry: Date, houses: []) { const pattern = { cmd: 'createCommunity' }; const payload = { name: name, province: province, canton: canton, district: district, num_houses: num_houses, @@ -245,7 +261,7 @@ export class AppService { , status: string, date_entry: Date) { const pattern = { cmd: 'createGuest' }; const payload = { - name: name, last_name: last_name, dni: dni, number_plate: number_plate, phone: phone, + name: name, last_name: last_name, dni: dni, number_plate: number_plate, phone: phone, status: status, date_entry: date_entry }; return this.clientGuestApp @@ -276,15 +292,15 @@ export class AppService { ); } - // ====================== PAYMENTS =============================== + // ====================== PAYMENTS =============================== //POST parameter from API createPayment(date_payment: Date, mount: number, description: string, period: string , status: string, user_id: string, communty_id: string) { const pattern = { cmd: 'createPayment' }; const payload = { - date_payment: date_payment, mount: mount, description: description, - period: period, status: status, user_id: user_id, communty_id: communty_id + date_payment: date_payment, mount: mount, description: description, + period: period, status: status, user_id: user_id, communty_id: communty_id }; return this.clientPaymentApp .send(pattern, payload) @@ -318,12 +334,12 @@ export class AppService { // ====================== RESERVATIONS =============================== //POST parameter from API - createReservation(start_time: string, finish_time: string, status: string, + createReservation(start_time: string, finish_time: string, status: string, date_entry: Date, user_id: string, common_area_id: string) { const pattern = { cmd: 'createReservation' }; const payload = { - start_time: start_time, finish_time: finish_time, status: status, - date_entry: date_entry, user_id: user_id, common_area_id: common_area_id + start_time: start_time, finish_time: finish_time, status: status, + date_entry: date_entry, user_id: user_id, common_area_id: common_area_id }; return this.clientReservationApp .send(pattern, payload) @@ -357,11 +373,11 @@ export class AppService { // ====================== POSTS =============================== //POST parameter from API - createPost(post: string, date_entry: Date, user_id: string, + createPost(post: string, date_entry: Date, user_id: string, community_id: string) { const pattern = { cmd: 'createPost' }; const payload = { - post: post, date_entry: date_entry, user_id: user_id, + post: post, date_entry: date_entry, user_id: user_id, community_id: community_id }; return this.clientPostApp @@ -395,11 +411,11 @@ export class AppService { // ====================== COMMNENT POSTS =============================== //Comment parameter from API - createComment(comment: string, date_entry: Date, user_id: string, + createComment(comment: string, date_entry: Date, user_id: string, post_id: string) { const pattern = { cmd: 'createComment' }; const payload = { - comment: comment, date_entry: date_entry, user_id: user_id, + comment: comment, date_entry: date_entry, user_id: user_id, post_id: post_id }; return this.clientPostApp @@ -433,11 +449,11 @@ export class AppService { // ====================== REPORTS =============================== //Report parameter from API - createReport(action: string, description: string, date_entry: Date, + createReport(action: string, description: string, date_entry: Date, user_id: string) { const pattern = { cmd: 'createReport' }; const payload = { - action: action, description: description, date_entry: date_entry, + action: action, description: description, date_entry: date_entry, user_id: user_id }; return this.clientReportApp @@ -471,7 +487,7 @@ export class AppService { sendMail(email: string) { const pattern = { cmd: 'sendMail' }; - const payload = { email: email}; + const payload = { email: email }; return this.clientNotificationtApp .send(pattern, payload) .pipe( @@ -481,11 +497,29 @@ export class AppService { html(email: string, name: string) { const pattern = { cmd: 'html' }; - const payload = { email: email, name: name}; + const payload = { email: email, name: name }; return this.clientNotificationtApp .send(pattern, payload) .pipe( map((message: string) => ({ message })), ); } + + + + /* Function to generate combination of password */ + generatePassword() { + var pass = ''; + var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + + 'abcdefghijklmnopqrstuvwxyz0123456789@#$'; + + for (let i = 1; i <= 8; i++) { + var char = Math.floor(Math.random() + * str.length + 1); + + pass += str.charAt(char) + } + + return pass; + } } \ No newline at end of file diff --git a/servicio-notificaciones/src/email.controller.ts b/servicio-notificaciones/src/email.controller.ts index c18340a0..882ebccf 100644 --- a/servicio-notificaciones/src/email.controller.ts +++ b/servicio-notificaciones/src/email.controller.ts @@ -22,8 +22,8 @@ export class EmailController { @MessagePattern({ cmd: 'html' }) async postHTMLEmail(@Payload() user: any) { - const url = "http://localhost:3000/"; - const image = "images/email.ong"; + const url = "http://localhost:3000/"; + const image = "images/email.ong"; var response = await this.mailService.sendMail({ to: user["email"], from: "mbonilla.guti@gmail.com", @@ -36,9 +36,44 @@ export class EmailController { attachments: [ { filename: 'email.png', - path: __dirname +'/mails/images/email.png', + path: __dirname + '/mails/images/email.png', cid: 'logo' //my mistake was putting "cid:logo@cid" here! - } + } + ] + }); + return response; + } + + + @MessagePattern({ cmd: 'emailCreateUserAdminCommunity' }) + async emailCreateUserAdmin(@Payload() user: any) { + const url = "http://localhost:3000/"; + const image = "images/email.png"; + const logo = "images/Logo Katoikia.svg"; + var response = await this.mailService.sendMail({ + to: user["email"], + from: "mbonilla.guti@gmail.com", + subject: 'Usuario registrado', + template: 'emailCreateUserAdmin', + context: { + name: user["name"], + password: user["password"], + date_entry: user["date_entry"], + email: user["email"], + community_name: user['community_name'], + url + }, + attachments: [ + { + filename: 'email.png', + path: __dirname + '/mails/images/email.png', + cid: 'image_email' //my mistake was putting "cid:logo@cid" here! + }, + { + filename: 'Logo Katoikia.svg', + path: __dirname + '/mails/images/Logo Katoikia.svg', + cid: 'logo' //my mistake was putting "cid:logo@cid" here! + } ] }); return response; diff --git a/servicio-notificaciones/src/mails/emailCreateUserAdmin.hbs b/servicio-notificaciones/src/mails/emailCreateUserAdmin.hbs new file mode 100644 index 00000000..e14f72e0 --- /dev/null +++ b/servicio-notificaciones/src/mails/emailCreateUserAdmin.hbs @@ -0,0 +1,442 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌  +
+ +
+ + + \ No newline at end of file diff --git a/servicio-notificaciones/src/mails/emailCreateUserAdminCommunity.hbs b/servicio-notificaciones/src/mails/emailCreateUserAdminCommunity.hbs new file mode 100644 index 00000000..04cd0f59 --- /dev/null +++ b/servicio-notificaciones/src/mails/emailCreateUserAdminCommunity.hbs @@ -0,0 +1,442 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌  +
+ +
+ + + \ No newline at end of file diff --git a/servicio-notificaciones/src/mails/images/Logo Katoikia.png b/servicio-notificaciones/src/mails/images/Logo Katoikia.png new file mode 100644 index 0000000000000000000000000000000000000000..d59e2c9a5a020b13246fd55f6daf2d01f236f7d9 GIT binary patch literal 37826 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
  • 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 + + + + + + + + diff --git a/servicio-usuarios/src/users/users.controller.ts b/servicio-usuarios/src/users/users.controller.ts index ea3c70a9..a059227e 100644 --- a/servicio-usuarios/src/users/users.controller.ts +++ b/servicio-usuarios/src/users/users.controller.ts @@ -22,6 +22,10 @@ export class UsersController { return this.userService.create(user); } + @MessagePattern({ cmd: 'createAdminCommunity' }) + createAdminCommunity(@Payload() user: UserDocument) { + return this.userService.createAdminCommunity(user); + } @MessagePattern({ cmd: 'findAllUsers' }) findAll() { @@ -91,5 +95,7 @@ export class UsersController { return this.userService.deleteAdminSystem(user["id"]); } + + } diff --git a/servicio-usuarios/src/users/users.module.ts b/servicio-usuarios/src/users/users.module.ts index 75fc3bd5..79cad874 100644 --- a/servicio-usuarios/src/users/users.module.ts +++ b/servicio-usuarios/src/users/users.module.ts @@ -18,6 +18,16 @@ import { ClientsModule, Transport } from "@nestjs/microservices"; } } ]), + ClientsModule.register([ + { + name: "SERVICIO_COMUNIDADES", + transport: Transport.TCP, + options: { + host: "127.0.0.1", + port: 3002 + } + } + ]), MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]), ], controllers: [UsersController], diff --git a/servicio-usuarios/src/users/users.service.ts b/servicio-usuarios/src/users/users.service.ts index edaf2ed0..7119c469 100644 --- a/servicio-usuarios/src/users/users.service.ts +++ b/servicio-usuarios/src/users/users.service.ts @@ -4,6 +4,7 @@ import { User, UserDocument } from '../schemas/user.schema'; import { InjectModel } from '@nestjs/mongoose'; import { Md5 } from "md5-typescript"; import { map } from 'rxjs/operators'; +import { lastValueFrom } from 'rxjs'; import { RpcException, ClientProxy } from '@nestjs/microservices'; @@ -14,6 +15,7 @@ export class UsersService { constructor( @InjectModel(User.name) private readonly userModel: Model, @Inject('SERVICIO_NOTIFICACIONES') private readonly clientNotificationtApp: ClientProxy, + @Inject('SERVICIO_COMUNIDADES') private readonly clientCommunityApp: ClientProxy, ) { } private publicKey: string; @@ -23,6 +25,38 @@ export class UsersService { return this.userModel.create(user); } + + async createAdminCommunity(user: UserDocument) { + let password = user.password; + let passwordEncriptada = Md5.init(user.password); + user.password = passwordEncriptada; + this.userModel.create(user); + let community = await this.findCommunity(user.community_id); + user.community_id = community['name']; + + const pattern = { cmd: 'emailCreateUserAdminCommunity' }; + const payload = { email: user['email'], password: password, name: user['name'], date_entry: user['date_entry'] }; + return this.clientNotificationtApp + .send(pattern, payload) + .pipe( + map((message: string) => ({ message })), + ); + } + + async findCommunity(community_id: string) { + const pattern = { cmd: 'findOneCommunity' } + const payload = { _id: community_id } + + let callback = await this.clientCommunityApp + .send(pattern, payload) + .pipe( + map((response: string) => ({ response })) + ) + const finalValue = await lastValueFrom(callback); + return finalValue['response']; + + } + async findAll(): Promise { return this.userModel .find() @@ -110,7 +144,11 @@ export class UsersService { } async deleteAdminSystem(id: string) { - return this.userModel.deleteOne({_id: id}).exec(); + return this.userModel.deleteOne({ _id: id }).exec(); } + + + } + diff --git a/web-ui/web-react/src/components/AdministradoresComunidad.js b/web-ui/web-react/src/components/AdministradoresComunidad.js index 7a203a1e..a5ab7f0a 100644 --- a/web-ui/web-react/src/components/AdministradoresComunidad.js +++ b/web-ui/web-react/src/components/AdministradoresComunidad.js @@ -31,6 +31,7 @@ const AdministradoresComunidad = () => { community_id: '', community_name: '', user_type: '2', + date_entry: new Date(), status: '1' }; @@ -48,8 +49,6 @@ const AdministradoresComunidad = () => { const dt = useRef(null); - - async function listaAdmin() { let nombres = await fetch('http://localhost:4000/user/findAdminComunidad/', { method: 'GET' }) .then((response) => response.json()) @@ -58,14 +57,14 @@ const AdministradoresComunidad = () => { //item.full_name returns the repositorie name return fetch(`http://localhost:4000/community/findCommunityName/${item.community_id}`, { method: 'GET' }) .then((response2) => response2.json()) - .then(data => { - console.log(data.message.name); - item.community_name = data.message.name + .then(data => data.message) + .then( data => { + item.community_name = data['name'] return item }) })); - }).then(data => setListaAdmins(data) - ); + }) + .then(data => setListaAdmins(data)); } @@ -90,7 +89,7 @@ const AdministradoresComunidad = () => { const cList = communitiesList.map((item) => ({ label: item.name, - value: item.id, + value: item._id, })) @@ -153,9 +152,46 @@ const AdministradoresComunidad = () => { const saveAdminCommunity = () => { - if (adminCommunity.password !== adminCommunity.confirmPassword) { - setSubmitted(true); - } else if (adminCommunity.name && adminCommunity.dni && adminCommunity.last_name && adminCommunity.email && adminCommunity.password && adminCommunity.phone) { + if (adminCommunity.name && adminCommunity.dni && adminCommunity.last_name && adminCommunity.email && adminCommunity.phone) { + + let _administrators= [...listaAdmins]; + let _adminCommunity = { ...adminCommunity }; + _adminCommunity.community_id = communityId; + console.log(_adminCommunity) + console.log(communityId) + + fetch('http://localhost:4000/user/createAdminCommunity', { + cache: 'no-cache', + method: 'POST', + body: JSON.stringify(_adminCommunity), + headers: { + 'Content-Type': 'application/json' + } + }) + .then( + function (response) { + if (response.status != 201) + console.log('Ocurrió un error con el servicio: ' + response.status); + else + return response.json(); + } + ) + .then(() => { + + // _adminCommunity.community_id = communitiesList.find(c => c._id === _adminCommunity.community_id).name + + _administrators.push(_adminCommunity); + toast.current.show({ severity: 'success', summary: 'Registro exitoso', detail: 'Comunidad de vivienda Creada', life: 3000 }); + + setListaAdmins(_administrators); + + setAdminCommunity(emptyAdminCommunity); + + }) + .catch( + err => console.log('Ocurrió un error con el fetch', err) + ); + toast.current.show({ severity: 'success', summary: 'Registro exitoso', detail: 'Administrador de Comunidad de vivienda Creada', life: 3000 }); } else { @@ -286,8 +322,9 @@ const AdministradoresComunidad = () => { } const handleCommunities = (event) => { - const getCommunity = event.target.value; - setCommunityId(getCommunity); + const getCommunityValue = event.target.value; + setCommunityId(getCommunityValue); + console.log(getCommunityValue) } return (

    @@ -397,8 +434,8 @@ const AdministradoresComunidad = () => { - +
    {submitted && !communityId && Comunidad es requirida.} diff --git a/web-ui/web-react/src/components/AdministradoresSistema.js b/web-ui/web-react/src/components/AdministradoresSistema.js index 68c29f1f..0991b828 100644 --- a/web-ui/web-react/src/components/AdministradoresSistema.js +++ b/web-ui/web-react/src/components/AdministradoresSistema.js @@ -59,6 +59,7 @@ const AdministradoresSistema = () => { user_type: "1", //1 es admin status: "1" }; + setSysAdmin(data) // console.log(data); fetch('http://localhost:4000/user/createAdminSystem/', { @@ -80,7 +81,7 @@ const AdministradoresSistema = () => { .then( function (response) { let _administrators = [...administrators]; - let _admin = { ...response.message };; + let _admin = { ...sysadmin }; _administrators.push(_admin); setAdministrators(_administrators) }