mirror of
https://github.com/documenso/documenso.git
synced 2025-11-09 20:12:31 +10:00
94 lines
2.4 KiB
TypeScript
94 lines
2.4 KiB
TypeScript
import { OrganisationType } from '@prisma/client';
|
|
|
|
import { sendAdminUserWelcomeEmail } from '@documenso/lib/server-only/admin/send-admin-user-welcome-email';
|
|
import { createOrganisation } from '@documenso/lib/server-only/organisation/create-organisation';
|
|
import { createAdminUser } from '@documenso/lib/server-only/user/create-admin-user';
|
|
import { internalClaims } from '@documenso/lib/types/subscription';
|
|
import { prisma } from '@documenso/prisma';
|
|
|
|
import { adminProcedure } from '../trpc';
|
|
import {
|
|
ZCreateOrganisationWithUserRequestSchema,
|
|
ZCreateOrganisationWithUserResponseSchema,
|
|
} from './create-organisation-with-user.types';
|
|
|
|
export const createOrganisationWithUserRoute = adminProcedure
|
|
.input(ZCreateOrganisationWithUserRequestSchema)
|
|
.output(ZCreateOrganisationWithUserResponseSchema)
|
|
.mutation(async ({ input, ctx }) => {
|
|
const { data } = input;
|
|
|
|
ctx.logger.info({
|
|
input: {
|
|
userEmail: data.userEmail,
|
|
organisationName: data.organisationName,
|
|
subscriptionClaimId: data.subscriptionClaimId,
|
|
},
|
|
});
|
|
|
|
const existingUser = await prisma.user.findFirst({
|
|
where: {
|
|
email: data.userEmail.toLowerCase(),
|
|
},
|
|
});
|
|
|
|
let userId: number;
|
|
let isNewUser: boolean;
|
|
|
|
if (existingUser) {
|
|
userId = existingUser.id;
|
|
isNewUser = false;
|
|
|
|
ctx.logger.info({
|
|
message: 'Linking existing user to new organisation',
|
|
userId,
|
|
});
|
|
} else {
|
|
const newUser = await createAdminUser({
|
|
name: data.userName,
|
|
email: data.userEmail,
|
|
});
|
|
|
|
userId = newUser.id;
|
|
isNewUser = true;
|
|
|
|
ctx.logger.info({
|
|
message: 'Created new user for organisation',
|
|
userId,
|
|
});
|
|
}
|
|
|
|
const organisation = await createOrganisation({
|
|
userId,
|
|
name: data.organisationName,
|
|
type: OrganisationType.ORGANISATION,
|
|
claim: internalClaims[data.subscriptionClaimId],
|
|
});
|
|
|
|
ctx.logger.info({
|
|
message: 'Organisation created successfully',
|
|
organisationId: organisation.id,
|
|
userId,
|
|
isNewUser,
|
|
});
|
|
|
|
if (isNewUser) {
|
|
await sendAdminUserWelcomeEmail({
|
|
userId,
|
|
organisationName: data.organisationName,
|
|
}).catch((err) => {
|
|
ctx.logger.error({
|
|
message: 'Failed to send welcome email',
|
|
error: err,
|
|
userId,
|
|
});
|
|
});
|
|
}
|
|
|
|
return {
|
|
organisationId: organisation.id,
|
|
userId,
|
|
isNewUser,
|
|
};
|
|
});
|