mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-13 19:30:30 +00:00
add server to monorepo.
This commit is contained in:
109
packages/server/src/services/InviteUsers/SyncSystemSendInvite.ts
Normal file
109
packages/server/src/services/InviteUsers/SyncSystemSendInvite.ts
Normal file
@@ -0,0 +1,109 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import {
|
||||
IUserInvitedEventPayload,
|
||||
IUserInviteResendEventPayload,
|
||||
IUserInviteTenantSyncedEventPayload,
|
||||
} from '@/interfaces';
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import events from '@/subscribers/events';
|
||||
import { Invite, SystemUser } from '@/system/models';
|
||||
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
|
||||
|
||||
@Service()
|
||||
export default class SyncSystemSendInvite {
|
||||
@Inject()
|
||||
tenancy: HasTenancyService;
|
||||
|
||||
@Inject()
|
||||
eventPublisher: EventPublisher;
|
||||
|
||||
/**
|
||||
* Attaches events with handlers.
|
||||
* @param bus
|
||||
*/
|
||||
public attach(bus) {
|
||||
bus.subscribe(events.inviteUser.sendInvite, this.syncSendInviteSystem);
|
||||
bus.subscribe(
|
||||
events.inviteUser.resendInvite,
|
||||
this.syncResendInviteSystemUser
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Syncs send invite to system user.
|
||||
* @param {IUserInvitedEventPayload} payload -
|
||||
*/
|
||||
private syncSendInviteSystem = async ({
|
||||
inviteToken,
|
||||
user,
|
||||
tenantId,
|
||||
authorizedUser,
|
||||
}: IUserInvitedEventPayload) => {
|
||||
const { User } = this.tenancy.models(tenantId);
|
||||
|
||||
// Creates a new system user.
|
||||
const systemUser = await SystemUser.query().insert({
|
||||
email: user.email,
|
||||
active: user.active,
|
||||
tenantId,
|
||||
});
|
||||
// Creates a invite user token.
|
||||
const invite = await Invite.query().insert({
|
||||
email: user.email,
|
||||
tenantId,
|
||||
userId: systemUser.id,
|
||||
token: inviteToken,
|
||||
});
|
||||
// Links the tenant user with created system user.
|
||||
await User.query().findById(user.id).patch({
|
||||
systemUserId: systemUser.id,
|
||||
});
|
||||
// Triggers `onUserSendInviteTenantSynced` event.
|
||||
await this.eventPublisher.emitAsync(
|
||||
events.inviteUser.sendInviteTenantSynced,
|
||||
{
|
||||
invite,
|
||||
tenantId,
|
||||
user,
|
||||
authorizedUser,
|
||||
} as IUserInviteTenantSyncedEventPayload
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* Syncs resend invite to system user.
|
||||
* @param {IUserInviteResendEventPayload} payload -
|
||||
*/
|
||||
private syncResendInviteSystemUser = async ({
|
||||
inviteToken,
|
||||
authorizedUser,
|
||||
tenantId,
|
||||
user,
|
||||
}: IUserInviteResendEventPayload) => {
|
||||
// Clear all invite tokens of the given user id.
|
||||
await this.clearInviteTokensByUserId(user.systemUserId, tenantId);
|
||||
|
||||
const invite = await Invite.query().insert({
|
||||
email: user.email,
|
||||
tenantId,
|
||||
userId: user.systemUserId,
|
||||
token: inviteToken,
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Clear invite tokens of the given user id.
|
||||
* @param {number} userId - User id.
|
||||
*/
|
||||
private clearInviteTokensByUserId = async (
|
||||
userId: number,
|
||||
tenantId: number
|
||||
) => {
|
||||
await Invite.query()
|
||||
.where({
|
||||
userId,
|
||||
tenantId,
|
||||
})
|
||||
.delete();
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user