mirror of
https://github.com/hanzoai/sign.git
synced 2026-10-21 01:21:51 +00:00
The product is branded Hanzo eSign (esign.hanzo.ai, repo hanzoai/esign). Rename all workspace packages @hanzo/sign-* → @hanzo/esign-* (1052 files) and align docker/Dockerfile turbo --scope/--filter to the actual remix package name @hanzo/esign (was a pre-existing mismatch with -remix that broke the build). Protected deps (@hanzo/insights, @hanzo/logo) untouched.
84 lines
2.0 KiB
TypeScript
84 lines
2.0 KiB
TypeScript
import { prisma } from '@hanzo/esign-prisma';
|
|
|
|
import { AppError, AppErrorCode } from '../../errors/app-error';
|
|
import { orphanEnvelopes } from '../envelope/orphan-envelopes';
|
|
|
|
export type DeleteUserOptions = {
|
|
id: number;
|
|
};
|
|
|
|
export const deleteUser = async ({ id }: DeleteUserOptions) => {
|
|
const user = await prisma.user.findFirst({
|
|
where: {
|
|
id,
|
|
},
|
|
include: {
|
|
ownedOrganisations: {
|
|
include: {
|
|
teams: {
|
|
select: {
|
|
id: true,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
organisationMember: {
|
|
include: {
|
|
organisation: {
|
|
include: {
|
|
teams: {
|
|
select: {
|
|
id: true,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
if (!user) {
|
|
throw new AppError(AppErrorCode.NOT_FOUND, {
|
|
message: `User with ID ${id} not found`,
|
|
});
|
|
}
|
|
|
|
// Get team IDs from organisations the user owns.
|
|
const ownedTeamIds = user.ownedOrganisations.flatMap((org) => org.teams.map((team) => team.id));
|
|
|
|
// Get team IDs from organisations the user is a member of (but not owner).
|
|
const memberTeams = user.organisationMember
|
|
.filter((member) => member.organisation.ownerUserId !== user.id)
|
|
.flatMap((member) =>
|
|
member.organisation.teams.map((team) => ({
|
|
teamId: team.id,
|
|
orgOwnerId: member.organisation.ownerUserId,
|
|
})),
|
|
);
|
|
|
|
// For teams where user is the org owner - orphan their envelopes.
|
|
await Promise.all(ownedTeamIds.map(async (teamId) => orphanEnvelopes({ teamId })));
|
|
|
|
// For teams where user is a member (not owner) - transfer envelopes to team owner.
|
|
await Promise.all(
|
|
memberTeams.map(async ({ teamId, orgOwnerId }) => {
|
|
return prisma.envelope.updateMany({
|
|
where: {
|
|
userId: user.id,
|
|
teamId,
|
|
},
|
|
data: {
|
|
userId: orgOwnerId,
|
|
},
|
|
});
|
|
}),
|
|
);
|
|
|
|
return await prisma.user.delete({
|
|
where: {
|
|
id: user.id,
|
|
},
|
|
});
|
|
};
|