documenso/packages/lib/server-only/folder/delete-folder.ts

58 lines
1.5 KiB
TypeScript
Raw Normal View History

2025-05-01 16:46:59 +00:00
import { DocumentVisibility, TeamMemberRole } from '@prisma/client';
import { match } from 'ts-pattern';
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
import { prisma } from '@documenso/prisma';
import { buildTeamWhereQuery } from '../../utils/teams';
2025-06-10 01:49:52 +00:00
import { getTeamById } from '../team/get-team';
2025-05-01 16:46:59 +00:00
export interface DeleteFolderOptions {
userId: number;
2025-06-10 01:49:52 +00:00
teamId: number;
2025-05-01 16:46:59 +00:00
folderId: string;
}
export const deleteFolder = async ({ userId, teamId, folderId }: DeleteFolderOptions) => {
2025-06-10 01:49:52 +00:00
const team = await getTeamById({ userId, teamId });
2025-05-01 16:46:59 +00:00
const folder = await prisma.folder.findFirst({
where: {
id: folderId,
team: buildTeamWhereQuery({
teamId,
userId,
}),
2025-05-01 16:46:59 +00:00
},
include: {
documents: true,
subfolders: true,
templates: true,
},
});
if (!folder) {
throw new AppError(AppErrorCode.NOT_FOUND, {
message: 'Folder not found',
});
}
2025-06-10 01:49:52 +00:00
const hasPermission = match(team.currentTeamRole)
.with(TeamMemberRole.ADMIN, () => true)
.with(TeamMemberRole.MANAGER, () => folder.visibility !== DocumentVisibility.ADMIN)
.with(TeamMemberRole.MEMBER, () => folder.visibility === DocumentVisibility.EVERYONE)
.otherwise(() => false);
2025-05-01 16:46:59 +00:00
2025-06-10 01:49:52 +00:00
if (!hasPermission) {
throw new AppError(AppErrorCode.UNAUTHORIZED, {
message: 'You do not have permission to delete this folder',
});
2025-05-01 16:46:59 +00:00
}
return await prisma.folder.delete({
where: {
id: folderId,
},
});
};