bugfix: org invitation flow updated so that the invited org follows the exact steps of free trial registration.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { IsString, MinLength } from 'class-validator';
|
||||
import { IsEmail, IsEnum, IsString, MinLength } from 'class-validator';
|
||||
|
||||
export class AcceptOrganizationInviteDto {
|
||||
@IsString()
|
||||
@@ -9,6 +9,12 @@ export class AcceptOrganizationInviteDto {
|
||||
@MinLength(1)
|
||||
organizationName: string;
|
||||
|
||||
@IsEmail()
|
||||
organizationEmail: string;
|
||||
|
||||
@IsEnum(['CLINIC', 'LAB'])
|
||||
organizationType: 'CLINIC' | 'LAB';
|
||||
|
||||
@IsString()
|
||||
@MinLength(1)
|
||||
ownerName: string;
|
||||
|
||||
@@ -424,12 +424,23 @@ export class OrganizationService {
|
||||
|
||||
async previewInvite(token: string) {
|
||||
const invitation = await this.findValidInvitation(token);
|
||||
let organizationEmail = '';
|
||||
if (invitation.invitedOrganizationId) {
|
||||
const invitedOrg = await this.prisma.organization.findUnique({
|
||||
where: { id: invitation.invitedOrganizationId },
|
||||
select: { email: true },
|
||||
});
|
||||
if (invitedOrg?.email && !invitedOrg.email.includes('@dyolink.local')) {
|
||||
organizationEmail = invitedOrg.email;
|
||||
}
|
||||
}
|
||||
return {
|
||||
success: true,
|
||||
data: {
|
||||
ownerEmail: invitation.invitedOwnerEmail,
|
||||
organizationName: invitation.invitedOrganizationName,
|
||||
organizationType: invitation.invitedOrganizationType,
|
||||
organizationEmail,
|
||||
inviterOrganizationName: invitation.inviterOrganization.name,
|
||||
expiresAt: invitation.expiresAt.toISOString(),
|
||||
status: invitation.acceptedAt ? 'ACCEPTED' : 'PENDING',
|
||||
@@ -443,6 +454,14 @@ export class OrganizationService {
|
||||
throw new BadRequestException('This invitation has already been accepted');
|
||||
}
|
||||
|
||||
if (dto.organizationType !== invitation.invitedOrganizationType) {
|
||||
throw new BadRequestException(
|
||||
`Organization type must be ${invitation.invitedOrganizationType} for this invitation`,
|
||||
);
|
||||
}
|
||||
|
||||
const organizationEmail = dto.organizationEmail.trim().toLowerCase();
|
||||
|
||||
const organization = await this.prisma.$transaction(async (tx) => {
|
||||
const passwordHash = await bcrypt.hash(dto.password, 10);
|
||||
const ownerEmail = invitation.invitedOwnerEmail;
|
||||
@@ -470,8 +489,9 @@ export class OrganizationService {
|
||||
where: { id: targetOrganizationId },
|
||||
data: {
|
||||
name: dto.organizationName.trim(),
|
||||
email: ownerEmail,
|
||||
email: organizationEmail,
|
||||
owner: { connect: { id: owner.id } },
|
||||
type: { connect: { name: dto.organizationType } },
|
||||
plan: { connect: { name: 'trial' } },
|
||||
},
|
||||
});
|
||||
@@ -479,9 +499,9 @@ export class OrganizationService {
|
||||
const createdOrg = await tx.organization.create({
|
||||
data: {
|
||||
name: dto.organizationName.trim(),
|
||||
email: ownerEmail,
|
||||
email: organizationEmail,
|
||||
owner: { connect: { id: owner.id } },
|
||||
type: { connect: { name: invitation.invitedOrganizationType } },
|
||||
type: { connect: { name: dto.organizationType } },
|
||||
plan: { connect: { name: 'trial' } },
|
||||
},
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user