Files
documenso/packages/trpc/server/admin-router/create-organisation-with-user.ts
2025-10-19 20:23:10 +00:00

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,
};
});