From 3ceb9adda2a98b0626e2e750868a656fd233e475 Mon Sep 17 00:00:00 2001 From: "a.bouhuolia" Date: Fri, 5 May 2023 00:28:57 +0200 Subject: [PATCH] fix(server): sending invite email --- packages/server/src/before.ts | 1 + packages/server/src/interfaces/User.ts | 45 ++++++++++++++++--- packages/server/src/jobs/UserInviteMail.ts | 14 ++---- packages/server/src/lib/Mail/index.ts | 2 +- packages/server/src/loaders/eventEmitter.ts | 2 +- .../services/InviteUsers/AcceptInviteUser.ts | 5 ++- ...=> InviteSendMailNotificationSubscribe.ts} | 5 +-- .../InviteUsers/InviteUsersSMSMessages.ts | 0 ...sages.ts => SendInviteUsersMailMessage.ts} | 10 ++--- .../InviteUsers/SyncTenantAcceptInvite.ts | 2 +- .../services/InviteUsers/TenantInviteUser.ts | 8 ++-- 11 files changed, 60 insertions(+), 34 deletions(-) rename packages/server/src/services/InviteUsers/{InviteSendMailNotification.ts => InviteSendMailNotificationSubscribe.ts} (88%) delete mode 100644 packages/server/src/services/InviteUsers/InviteUsersSMSMessages.ts rename packages/server/src/services/InviteUsers/{InviteUsersMailMessages.ts => SendInviteUsersMailMessage.ts} (83%) diff --git a/packages/server/src/before.ts b/packages/server/src/before.ts index d638c64ea..dbc90cd05 100644 --- a/packages/server/src/before.ts +++ b/packages/server/src/before.ts @@ -4,6 +4,7 @@ import moment from 'moment'; global.__root_dir = path.join(__dirname, '..'); global.__resources_dir = path.join(global.__root_dir, 'resources'); global.__locales_dir = path.join(global.__resources_dir, 'locales'); +global.__views_dir = path.join(global.__root_dir, 'views'); moment.prototype.toMySqlDateTime = function () { return this.format('YYYY-MM-DD HH:mm:ss'); diff --git a/packages/server/src/interfaces/User.ts b/packages/server/src/interfaces/User.ts index 25543e394..fb1e1c186 100644 --- a/packages/server/src/interfaces/User.ts +++ b/packages/server/src/interfaces/User.ts @@ -1,6 +1,7 @@ import { AnyObject } from '@casl/ability/dist/types/types'; import { ITenant } from '@/interfaces'; import { Model } from 'objection'; +import { Tenant } from '@/system/models'; export interface ISystemUser extends Model { id: number; @@ -54,20 +55,52 @@ export interface IUserInvite { export interface IInviteUserService { acceptInvite(token: string, inviteUserInput: IInviteUserInput): Promise; + + /** + * Re-send user invite. + * @param {number} tenantId - + * @param {string} email - + * @return {Promise<{ invite: IUserInvite }>} + */ resendInvite( tenantId: number, userId: number, authorizedUser: ISystemUser ): Promise<{ - invite: IUserInvite; + user: ITenantUser; }>; + + /** + * Sends invite mail to the given email from the given tenant and user. + * @param {number} tenantId - + * @param {string} email - + * @param {IUser} authorizedUser - + * @return {Promise} + */ sendInvite( tenantId: number, - email: string, + sendInviteDTO: IUserSendInviteDTO, authorizedUser: ISystemUser ): Promise<{ - invite: IUserInvite; + invitedUser: ITenantUser; }>; +} + +export interface IAcceptInviteUserService { + /** + * Accept the received invite. + * @param {string} token + * @param {IInviteUserInput} inviteUserInput + * @throws {ServiceErrors} + * @returns {Promise} + */ + acceptInvite(token: string, inviteUserDTO: IInviteUserInput): Promise; + + /** + * Validate the given invite token. + * @param {string} token - the given token string. + * @throws {ServiceError} + */ checkInvite( token: string ): Promise<{ inviteToken: IUserInvite; orgName: object }>; @@ -121,7 +154,7 @@ export interface IUserInvitedEventPayload { tenantId: number; user: ITenantUser; } -export interface IUserInviteTenantSyncedEventPayload{ +export interface IUserInviteTenantSyncedEventPayload { invite: IUserInvite; authorizedUser: ISystemUser; tenantId: number; @@ -143,10 +176,10 @@ export interface IAcceptInviteEventPayload { export interface ICheckInviteEventPayload { inviteToken: IUserInvite; - tenant: ITenant + tenant: Tenant; } export interface IUserSendInviteDTO { email: string; roleId: number; -} \ No newline at end of file +} diff --git a/packages/server/src/jobs/UserInviteMail.ts b/packages/server/src/jobs/UserInviteMail.ts index 1b07ebc5d..5585c79e1 100644 --- a/packages/server/src/jobs/UserInviteMail.ts +++ b/packages/server/src/jobs/UserInviteMail.ts @@ -1,5 +1,6 @@ import { Container, Inject } from 'typedi'; import InviteUserService from '@/services/InviteUsers/AcceptInviteUser'; +import SendInviteUsersMailMessage from '@/services/InviteUsers/SendInviteUsersMailMessage'; export default class UserInviteMailJob { /** @@ -21,24 +22,17 @@ export default class UserInviteMailJob { */ public async handler(job, done: Function): Promise { const { invite, authorizedUser, tenantId } = job.attrs.data; - - const Logger = Container.get('logger'); - const inviteUsersService = Container.get(InviteUserService); - - Logger.info(`Send invite user mail - started: ${job.attrs.data}`); + const sendInviteMailMessage = Container.get(SendInviteUsersMailMessage); try { - await inviteUsersService.mailMessages.sendInviteMail( + await sendInviteMailMessage.sendInviteMail( tenantId, authorizedUser, invite ); - Logger.info(`Send invite user mail - finished: ${job.attrs.data}`); done(); } catch (error) { - Logger.info( - `Send invite user mail - error: ${job.attrs.data}, error: ${error}` - ); + console.log(error); done(error); } } diff --git a/packages/server/src/lib/Mail/index.ts b/packages/server/src/lib/Mail/index.ts index 553b5eb37..dd79c934b 100644 --- a/packages/server/src/lib/Mail/index.ts +++ b/packages/server/src/lib/Mail/index.ts @@ -109,7 +109,7 @@ export default class Mail { * Retrieve view content from the view directory. */ private getViewContent(): string { - const filePath = path.join(global.__root_dir, `../views/${this.view}`); + const filePath = path.join(global.__views_dir, `/${this.view}`); return fs.readFileSync(filePath, 'utf8'); } } diff --git a/packages/server/src/loaders/eventEmitter.ts b/packages/server/src/loaders/eventEmitter.ts index 5551f6925..7915734bd 100644 --- a/packages/server/src/loaders/eventEmitter.ts +++ b/packages/server/src/loaders/eventEmitter.ts @@ -22,7 +22,7 @@ import SaleInvoiceAutoIncrementSubscriber from '@/subscribers/SaleInvoices/AutoI import SaleInvoiceConvertFromEstimateSubscriber from '@/subscribers/SaleInvoices/ConvertFromEstimate'; import PaymentReceiveAutoSerialSubscriber from '@/subscribers/PaymentReceive/AutoSerialIncrement'; import SyncSystemSendInvite from '@/services/InviteUsers/SyncSystemSendInvite'; -import InviteSendMainNotification from '@/services/InviteUsers/InviteSendMailNotification'; +import InviteSendMainNotification from '@/services/InviteUsers/InviteSendMailNotificationSubscribe'; import SyncTenantAcceptInvite from '@/services/InviteUsers/SyncTenantAcceptInvite'; import SyncTenantUserMutate from '@/services/Users/SyncTenantUserSaved'; import { SyncTenantUserDelete } from '@/services/Users/SyncTenantUserDeleted'; diff --git a/packages/server/src/services/InviteUsers/AcceptInviteUser.ts b/packages/server/src/services/InviteUsers/AcceptInviteUser.ts index 04b99e944..40b83e521 100644 --- a/packages/server/src/services/InviteUsers/AcceptInviteUser.ts +++ b/packages/server/src/services/InviteUsers/AcceptInviteUser.ts @@ -12,9 +12,12 @@ import { } from '@/interfaces'; import { ERRORS } from './constants'; import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; +import { IAcceptInviteUserService } from '@/interfaces'; @Service() -export default class AcceptInviteUserService { +export default class AcceptInviteUserService + implements IAcceptInviteUserService +{ @Inject() private eventPublisher: EventPublisher; diff --git a/packages/server/src/services/InviteUsers/InviteSendMailNotification.ts b/packages/server/src/services/InviteUsers/InviteSendMailNotificationSubscribe.ts similarity index 88% rename from packages/server/src/services/InviteUsers/InviteSendMailNotification.ts rename to packages/server/src/services/InviteUsers/InviteSendMailNotificationSubscribe.ts index 6ab04cccd..24966f3bb 100644 --- a/packages/server/src/services/InviteUsers/InviteSendMailNotification.ts +++ b/packages/server/src/services/InviteUsers/InviteSendMailNotificationSubscribe.ts @@ -1,7 +1,4 @@ -import { - IUserInvitedEventPayload, - IUserInviteTenantSyncedEventPayload, -} from '@/interfaces'; +import { IUserInviteTenantSyncedEventPayload } from '@/interfaces'; import events from '@/subscribers/events'; import { Inject, Service } from 'typedi'; diff --git a/packages/server/src/services/InviteUsers/InviteUsersSMSMessages.ts b/packages/server/src/services/InviteUsers/InviteUsersSMSMessages.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/server/src/services/InviteUsers/InviteUsersMailMessages.ts b/packages/server/src/services/InviteUsers/SendInviteUsersMailMessage.ts similarity index 83% rename from packages/server/src/services/InviteUsers/InviteUsersMailMessages.ts rename to packages/server/src/services/InviteUsers/SendInviteUsersMailMessage.ts index 957c6e362..9e6e89dd6 100644 --- a/packages/server/src/services/InviteUsers/InviteUsersMailMessages.ts +++ b/packages/server/src/services/InviteUsers/SendInviteUsersMailMessage.ts @@ -1,12 +1,12 @@ +import path from 'path'; import { ISystemUser } from '@/interfaces'; -import TenancyService from '@/services/Tenancy/TenancyService'; import Mail from '@/lib/Mail'; -import { Service, Container } from 'typedi'; -import config from '@/config'; +import { Service } from 'typedi'; import { Tenant } from '@/system/models'; +import config from '@/config'; @Service() -export default class InviteUsersMailMessages { +export default class SendInviteUsersMailMessage { /** * Sends invite mail to the given email. * @param user @@ -18,7 +18,7 @@ export default class InviteUsersMailMessages { .findById(tenantId) .withGraphFetched('metadata'); - const root = __dirname + '/../../../views/images/bigcapital.png'; + const root = path.join(global.__views_dir, '/images/bigcapital.png'); const mail = new Mail() .setSubject(`${fromUser.firstName} has invited you to join a Bigcapital`) diff --git a/packages/server/src/services/InviteUsers/SyncTenantAcceptInvite.ts b/packages/server/src/services/InviteUsers/SyncTenantAcceptInvite.ts index c5eb2d648..a1b1e7239 100644 --- a/packages/server/src/services/InviteUsers/SyncTenantAcceptInvite.ts +++ b/packages/server/src/services/InviteUsers/SyncTenantAcceptInvite.ts @@ -8,7 +8,7 @@ import { IAcceptInviteEventPayload } from '@/interfaces'; @Service() export default class SyncTenantAcceptInvite { @Inject() - tenancy: HasTenancyService; + private tenancy: HasTenancyService; /** * Attaches events with handlers. diff --git a/packages/server/src/services/InviteUsers/TenantInviteUser.ts b/packages/server/src/services/InviteUsers/TenantInviteUser.ts index d219dfbb9..fffa0d632 100644 --- a/packages/server/src/services/InviteUsers/TenantInviteUser.ts +++ b/packages/server/src/services/InviteUsers/TenantInviteUser.ts @@ -74,17 +74,15 @@ export default class InviteTenantUserService implements IInviteUserService { /** * Re-send user invite. - * @param {number} tenantId - - * @param {string} email - + * @param {number} tenantId - + * @param {string} email - * @return {Promise<{ invite: IUserInvite }>} */ public async resendInvite( tenantId: number, userId: number, authorizedUser: ISystemUser - ): Promise<{ - user: ITenantUser; - }> { + ): Promise<{ user: ITenantUser }> { // Retrieve the user by id or throw not found service error. const user = await this.getUserByIdOrThrowError(tenantId, userId);