From 79b7a02f85a446260ba03c45d082dfac396b8a82 Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Sat, 5 Sep 2020 15:12:38 +0200 Subject: [PATCH] fix: issues in organization build. --- server/src/jobs/WelcomeSMS.ts | 27 +++++++++++------- server/src/loaders/dependencyInjector.ts | 6 ++-- server/src/loaders/events.ts | 2 +- server/src/loaders/jobs.ts | 7 +---- .../AuthenticationMailMessages.ts | 1 - .../AuthenticationSMSMessages.ts | 16 +++++++---- server/src/services/Organization/index.ts | 28 +++++++++++++++---- .../src/services/SMSClient/EasySmsClient.ts | 5 ++-- server/src/subscribers/events.ts | 4 +++ server/src/subscribers/organization.ts | 7 ++--- 10 files changed, 65 insertions(+), 38 deletions(-) diff --git a/server/src/jobs/WelcomeSMS.ts b/server/src/jobs/WelcomeSMS.ts index 059af2fba..4dc135db7 100644 --- a/server/src/jobs/WelcomeSMS.ts +++ b/server/src/jobs/WelcomeSMS.ts @@ -2,8 +2,13 @@ import { Container, Inject } from 'typedi'; import AuthenticationService from '@/services/Authentication'; export default class WelcomeSMSJob { - @Inject() - authService: AuthenticationService; + /** + * Constructor method. + * @param {Agenda} agenda + */ + constructor(agenda) { + agenda.define('welcome-sms', { priority: 'high' }, this.handler); + } /** * Handle send welcome mail job. @@ -11,17 +16,19 @@ export default class WelcomeSMSJob { * @param {Function} done */ public async handler(job, done: Function): Promise { - const { email, organizationName, firstName } = job.attrs.data; - const Logger = Container.get('logger'); + const { tenant, user } = job.attrs.data; + + const Logger = Container.get('logger'); + const authService = Container.get(AuthenticationService); + + Logger.info(`[welcome_sms] started: ${job.attrs.data}`); - Logger.info(`Send welcome SMS message - started: ${job.attrs.data}`); - try { - await this.authService.smsMessages.sendWelcomeMessage(); - Logger.info(`Send welcome SMS message - finished: ${job.attrs.data}`); - done() + await authService.smsMessages.sendWelcomeMessage(tenant, user); + Logger.info(`[welcome_sms] finished`, { tenant, user }); + done(); } catch (error) { - Logger.info(`Send welcome SMS message - error: ${job.attrs.data}, error: ${error}`); + Logger.info(`[welcome_sms] error`, { error, tenant, user }); done(error); } } diff --git a/server/src/loaders/dependencyInjector.ts b/server/src/loaders/dependencyInjector.ts index 891f0aed4..f45a7c748 100644 --- a/server/src/loaders/dependencyInjector.ts +++ b/server/src/loaders/dependencyInjector.ts @@ -11,9 +11,6 @@ export default ({ mongoConnection, knex }) => { const smsClientInstance = SmsClientLoader(); const dbManager = dbManagerFactory(); - Container.set('agenda', agendaInstance); - LoggerInstance.info('Agenda has been injected into container'); - Container.set('logger', LoggerInstance) LoggerInstance.info('Logger instance has been injected into container'); @@ -29,6 +26,9 @@ export default ({ mongoConnection, knex }) => { Container.set('dbManager', dbManager); LoggerInstance.info('Database manager has been injected into container.'); + Container.set('agenda', agendaInstance); + LoggerInstance.info('Agenda has been injected into container'); + return { agenda: agendaInstance }; } catch (e) { LoggerInstance.error('Error on dependency injector loader: %o', e); diff --git a/server/src/loaders/events.ts b/server/src/loaders/events.ts index 5cbb85728..0e3726d07 100644 --- a/server/src/loaders/events.ts +++ b/server/src/loaders/events.ts @@ -1,3 +1,3 @@ // Here we import all events. import '@/subscribers/authentication'; - +import '@/subscribers/organization'; diff --git a/server/src/loaders/jobs.ts b/server/src/loaders/jobs.ts index c1095af2f..bae51a2d0 100644 --- a/server/src/loaders/jobs.ts +++ b/server/src/loaders/jobs.ts @@ -15,12 +15,7 @@ import UserInviteMailJob from '@/jobs/UserInviteMail'; export default ({ agenda }: { agenda: Agenda }) => { new WelcomeEmailJob(agenda); new ResetPasswordMailJob(agenda); - - agenda.define( - 'welcome-sms', - { priority: 'high' }, - new WelcomeSMSJob().handler - ); + new WelcomeSMSJob(agenda); // User invite mail. agenda.define( diff --git a/server/src/services/Authentication/AuthenticationMailMessages.ts b/server/src/services/Authentication/AuthenticationMailMessages.ts index e74585971..3116ca33c 100644 --- a/server/src/services/Authentication/AuthenticationMailMessages.ts +++ b/server/src/services/Authentication/AuthenticationMailMessages.ts @@ -4,7 +4,6 @@ import Mustache from 'mustache'; import path from 'path'; import { ISystemUser } from '@/interfaces'; import config from '@/../config/config'; -import { ISystemUser } from 'src/interfaces'; @Service() export default class AuthenticationMailMesssages { diff --git a/server/src/services/Authentication/AuthenticationSMSMessages.ts b/server/src/services/Authentication/AuthenticationSMSMessages.ts index 3635b7054..29bd69b72 100644 --- a/server/src/services/Authentication/AuthenticationSMSMessages.ts +++ b/server/src/services/Authentication/AuthenticationSMSMessages.ts @@ -1,13 +1,19 @@ -import { Service } from "typedi"; +import { Service, Inject } from "typedi"; +import { ISystemUser, ITenant } from "@/interfaces"; @Service() export default class AuthenticationSMSMessages { + @Inject('SMSClient') smsClient: any; - sendWelcomeMessage() { - const message: string = `Hi ${firstName}, Welcome to Bigcapital, You've joined the new workspace, - if you need any help please don't hesitate to contact us.` + /** + * Sends welcome sms message. + * @param {ITenant} tenant + * @param {ISystemUser} user + */ + sendWelcomeMessage(tenant: ITenant, user: ISystemUser) { + const message: string = `Hi ${user.firstName}, Welcome to Bigcapital, You've joined the new workspace, if you need any help please don't hesitate to contact us.` - + return this.smsClient.sendMessage(user.phoneNumber, message); } } \ No newline at end of file diff --git a/server/src/services/Organization/index.ts b/server/src/services/Organization/index.ts index 40e1f9d5c..095fbb5f4 100644 --- a/server/src/services/Organization/index.ts +++ b/server/src/services/Organization/index.ts @@ -1,11 +1,19 @@ import { Service, Inject, Container } from 'typedi'; -import { Tenant } from '@/system/models'; +import { Tenant, SystemUser } from '@/system/models'; import TenantsManager from '@/system/TenantsManager'; import { ServiceError } from '@/exceptions'; import { ITenant } from '@/interfaces'; +import { + EventDispatcher, + EventDispatcherInterface, +} from '@/decorators/eventDispatcher'; +import events from '@/subscribers/events'; @Service() export default class OrganizationService { + @EventDispatcher() + eventDispatcher: EventDispatcherInterface; + @Inject() tenantsManager: TenantsManager; @@ -35,8 +43,18 @@ export default class OrganizationService { this.logger.info('[tenant_db_build] mark tenant as initialized.', { tenant }); await tenant.$query().update({ initialized: true }); + + // Retrieve the tenant system user. + const user = await SystemUser.query().findOne('tenant_id', tenant.id); + + // Throws `onOrganizationBuild` event. + this.eventDispatcher.dispatch(events.organization.build, { tenant, user }); } + /** + * Throws error in case the given tenant is undefined. + * @param {ITenant} tenant + */ private throwIfTenantNotExists(tenant: ITenant) { if (!tenant) { this.logger.info('[tenant_db_build] organization id not found.'); @@ -44,13 +62,13 @@ export default class OrganizationService { } } + /** + * Throws error in case the given tenant is already initialized. + * @param {ITenant} tenant + */ private throwIfTenantInitizalized(tenant: ITenant) { if (tenant.initialized) { throw new ServiceError('tenant_initialized'); } } - - destroy() { - - } } \ No newline at end of file diff --git a/server/src/services/SMSClient/EasySmsClient.ts b/server/src/services/SMSClient/EasySmsClient.ts index ec77ed8c5..1391268c0 100644 --- a/server/src/services/SMSClient/EasySmsClient.ts +++ b/server/src/services/SMSClient/EasySmsClient.ts @@ -11,15 +11,14 @@ export default class EasySMSClient implements SMSClientInterface { * @param {string} message */ send(to: string, message: string) { - console.log(config); const API_KEY = config.easySMSGateway.api_key; const params = `action=send-sms&api_key=${API_KEY}=&to=${to}&sms=${message}&unicode=1`; return new Promise((resolve, reject) => { axios.get(`https://easysms.devs.ly/sms/api?${params}`) .then((response) => { - if (response.code === 'ok') { resolve(); } - else { reject(); } + if (response.data.code === 'ok') { resolve(); } + else { reject(response.data); } }) .catch((error) => { reject(error) }); }); diff --git a/server/src/subscribers/events.ts b/server/src/subscribers/events.ts index 73a8a6481..baf05327b 100644 --- a/server/src/subscribers/events.ts +++ b/server/src/subscribers/events.ts @@ -12,5 +12,9 @@ export default { acceptInvite: 'onUserAcceptInvite', sendInvite: 'onUserSendInvite', checkInvite: 'onUserCheckInvite' + }, + + organization: { + build: 'onOrganizationBuild', } } diff --git a/server/src/subscribers/organization.ts b/server/src/subscribers/organization.ts index 670505ede..40427bcb3 100644 --- a/server/src/subscribers/organization.ts +++ b/server/src/subscribers/organization.ts @@ -6,11 +6,10 @@ import events from '@/subscribers/events'; export class OrganizationSubscriber { @On(events.organization.build) - public onBuild(payload) { + public async onBuild(payload) { + const { tenant, user } = payload; const agenda = Container.get('agenda'); - agenda.now('welcome-sms', { - email, organizationName, firstName, - }); + await agenda.now('welcome-sms', { tenant, user }); } } \ No newline at end of file