64 lines
1.8 KiB
TypeScript
64 lines
1.8 KiB
TypeScript
import { Tenant, Role } from "@toolctrl/db/prisma-browser";
|
|
import { getMyTenants, getTenantWithUsers } from "../db/tenants.db.server";
|
|
import { UserWithoutPassword, deleteUser } from "../db/users.db.server";
|
|
import { deleteAndCancelTenant } from "./tenantService";
|
|
import { db } from "../db.server";
|
|
import { createUserRoles, deleteAllUserRoles } from "../db/permissions/userRoles.db.server";
|
|
import { clearCacheKey } from "../cache.server";
|
|
|
|
export async function deleteUserWithItsTenants(id: string) {
|
|
const userTenants = await getMyTenants(id);
|
|
const deletedAccounts = await Promise.all(
|
|
userTenants.map(async (tenant) => {
|
|
const tenantUsers = await getTenantWithUsers(tenant.id);
|
|
if (tenantUsers?.users.length === 1 && tenantUsers.users[0].userId === id) {
|
|
return await deleteAndCancelTenant({
|
|
tenantId: tenant.id,
|
|
userId: id,
|
|
});
|
|
}
|
|
})
|
|
);
|
|
const deletedTenants: Tenant[] = [];
|
|
deletedAccounts.forEach((deletedAccount) => {
|
|
if (deletedAccount) {
|
|
deletedTenants.push(deletedAccount);
|
|
}
|
|
});
|
|
return {
|
|
deletedUser: await deleteUser(id),
|
|
deletedTenants,
|
|
};
|
|
}
|
|
|
|
export async function setUserRoles({
|
|
user,
|
|
roles,
|
|
isAdmin,
|
|
type,
|
|
}: {
|
|
user: UserWithoutPassword;
|
|
roles: { role: Role; tenantId: string | null }[];
|
|
isAdmin: boolean;
|
|
type: "admin" | "app";
|
|
}) {
|
|
if (user.admin && !isAdmin) {
|
|
await db.adminUser.delete({ where: { userId: user.id } });
|
|
} else if (!user.admin && isAdmin) {
|
|
await db.adminUser.create({ data: { userId: user.id } });
|
|
}
|
|
|
|
await deleteAllUserRoles(user.id, type);
|
|
return await createUserRoles(
|
|
user.id,
|
|
roles.map(({ role, tenantId }) => ({
|
|
id: role.id,
|
|
tenantId,
|
|
}))
|
|
).then((item) => {
|
|
clearCacheKey(`user:${user.id}`);
|
|
clearCacheKey(`userRoles:${user.id}:${null}`);
|
|
return item;
|
|
});
|
|
}
|