documenso/packages/lib/server-only/folder/move-document-to-folder.ts

93 lines
2.2 KiB
TypeScript
Raw Normal View History

2025-05-01 16:46:59 +00:00
import { TeamMemberRole } from '@prisma/client';
import { match } from 'ts-pattern';
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
import { DocumentVisibility } from '@documenso/lib/types/document-visibility';
import { FolderType } from '@documenso/lib/types/folder-type';
import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
import { prisma } from '@documenso/prisma';
2025-06-10 01:49:52 +00:00
import { getTeamById } from '../team/get-team';
2025-05-01 16:46:59 +00:00
export interface MoveDocumentToFolderOptions {
userId: number;
2025-06-10 01:49:52 +00:00
teamId: number;
2025-05-01 16:46:59 +00:00
documentId: number;
folderId?: string | null;
requestMetadata?: ApiRequestMetadata;
}
export const moveDocumentToFolder = async ({
userId,
teamId,
documentId,
folderId,
}: MoveDocumentToFolderOptions) => {
2025-06-10 01:49:52 +00:00
const team = await getTeamById({ userId, teamId });
2025-05-01 16:46:59 +00:00
2025-06-10 01:49:52 +00:00
const visibilityFilters = match(team.currentTeamRole)
2025-05-01 16:46:59 +00:00
.with(TeamMemberRole.ADMIN, () => ({
visibility: {
in: [
DocumentVisibility.EVERYONE,
DocumentVisibility.MANAGER_AND_ABOVE,
DocumentVisibility.ADMIN,
],
},
}))
.with(TeamMemberRole.MANAGER, () => ({
visibility: {
in: [DocumentVisibility.EVERYONE, DocumentVisibility.MANAGER_AND_ABOVE],
},
}))
.otherwise(() => ({ visibility: DocumentVisibility.EVERYONE }));
const documentWhereClause = {
id: documentId,
2025-06-10 01:49:52 +00:00
OR: [
{ teamId, ...visibilityFilters },
{ userId, teamId },
],
2025-05-01 16:46:59 +00:00
};
const document = await prisma.document.findFirst({
where: documentWhereClause,
});
if (!document) {
throw new AppError(AppErrorCode.NOT_FOUND, {
message: 'Document not found',
});
}
if (folderId) {
const folderWhereClause = {
id: folderId,
type: FolderType.DOCUMENT,
2025-06-10 01:49:52 +00:00
OR: [
{ teamId, ...visibilityFilters },
{ userId, teamId },
],
2025-05-01 16:46:59 +00:00
};
const folder = await prisma.folder.findFirst({
where: folderWhereClause,
});
if (!folder) {
throw new AppError(AppErrorCode.NOT_FOUND, {
message: 'Folder not found',
});
}
}
return await prisma.document.update({
where: {
id: documentId,
},
data: {
folderId,
},
});
};