* feat: Split and simplify import/export pages in prep for more options * minor fixes * File operations for imports * test * icons
77 lines
2.1 KiB
TypeScript
77 lines
2.1 KiB
TypeScript
import fs from "fs";
|
|
import os from "os";
|
|
import File from "formidable/lib/file";
|
|
import invariant from "invariant";
|
|
import collectionImporter from "@server/commands/collectionImporter";
|
|
import { Event, FileOperation, Attachment, User } from "@server/models";
|
|
import { Event as TEvent } from "../../types";
|
|
|
|
export default class ImportsProcessor {
|
|
async on(event: TEvent) {
|
|
switch (event.name) {
|
|
case "collections.import": {
|
|
let state, error;
|
|
const { type } = event.data;
|
|
const attachment = await Attachment.findByPk(event.modelId);
|
|
invariant(attachment, "attachment not found");
|
|
|
|
const user = await User.findByPk(event.actorId);
|
|
invariant(user, "user not found");
|
|
|
|
const fileOperation = await FileOperation.create({
|
|
type: "import",
|
|
state: "creating",
|
|
size: attachment.size,
|
|
key: attachment.key,
|
|
userId: user.id,
|
|
teamId: user.teamId,
|
|
});
|
|
|
|
await Event.add({
|
|
name: "fileOperations.create",
|
|
modelId: fileOperation.id,
|
|
teamId: user.teamId,
|
|
actorId: user.id,
|
|
});
|
|
|
|
try {
|
|
const buffer = await attachment.buffer;
|
|
const tmpDir = os.tmpdir();
|
|
const tmpFilePath = `${tmpDir}/upload-${event.modelId}`;
|
|
await fs.promises.writeFile(tmpFilePath, buffer as Uint8Array);
|
|
const file = new File({
|
|
name: attachment.name,
|
|
type: attachment.contentType,
|
|
path: tmpFilePath,
|
|
});
|
|
|
|
await collectionImporter({
|
|
file,
|
|
user,
|
|
type,
|
|
ip: event.ip,
|
|
});
|
|
await attachment.destroy();
|
|
|
|
state = "complete";
|
|
} catch (err) {
|
|
state = "error";
|
|
error = err.message;
|
|
} finally {
|
|
await fileOperation.update({ state, error });
|
|
await Event.add({
|
|
name: "fileOperations.update",
|
|
modelId: fileOperation.id,
|
|
teamId: user.teamId,
|
|
actorId: user.id,
|
|
});
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
default:
|
|
}
|
|
}
|
|
}
|