Files
outline/server/queues/tasks/DocumentImportTask.ts
2024-06-23 06:31:18 -07:00

84 lines
2.0 KiB
TypeScript

import { SourceMetadata } from "@shared/types";
import documentCreator from "@server/commands/documentCreator";
import documentImporter from "@server/commands/documentImporter";
import { User } from "@server/models";
import { sequelize } from "@server/storage/database";
import FileStorage from "@server/storage/files";
import BaseTask, { TaskPriority } from "./BaseTask";
type Props = {
userId: string;
sourceMetadata: Pick<Required<SourceMetadata>, "fileName" | "mimeType">;
publish?: boolean;
collectionId?: string;
parentDocumentId?: string;
ip: string;
key: string;
};
export type DocumentImportTaskResponse =
| {
documentId: string;
}
| {
error: string;
};
export default class DocumentImportTask extends BaseTask<Props> {
public async perform({
key,
sourceMetadata,
ip,
publish,
collectionId,
parentDocumentId,
userId,
}: Props): Promise<DocumentImportTaskResponse> {
try {
const content = await FileStorage.getFileBuffer(key);
const document = await sequelize.transaction(async (transaction) => {
const user = await User.findByPk(userId, {
rejectOnEmpty: true,
transaction,
});
const { text, state, title, icon } = await documentImporter({
user,
fileName: sourceMetadata.fileName,
mimeType: sourceMetadata.mimeType,
content,
ip,
transaction,
});
return documentCreator({
sourceMetadata,
title,
icon,
text,
state,
publish,
collectionId,
parentDocumentId,
user,
ip,
transaction,
});
});
return { documentId: document.id };
} catch (err) {
return { error: err.message };
} finally {
await FileStorage.deleteFile(key);
}
}
public get options() {
return {
attempts: 1,
priority: TaskPriority.Normal,
};
}
}