import { InternalStorage } from "./internal-storage.js"; import { DriveFiles, Users } from "../../models/index.js"; import { driveChart, perUserDriveChart, instanceChart } from "../chart/index.js"; import { createDeleteObjectStorageFileJob } from "../../queue/index.js"; import { fetchMeta } from "../../misc/fetch-meta.js"; import { getS3 } from "./s3.js"; import { v4 as uuid } from "uuid"; import { DeleteObjectCommand } from "@aws-sdk/client-s3"; export async function deleteFile(file, isExpired = false) { if (file.storedInternal) { InternalStorage.del(file.accessKey); if (file.thumbnailUrl) { InternalStorage.del(file.thumbnailAccessKey); } if (file.webpublicUrl) { InternalStorage.del(file.webpublicAccessKey); } } else if (!file.isLink) { createDeleteObjectStorageFileJob(file.accessKey); if (file.thumbnailUrl) { createDeleteObjectStorageFileJob(file.thumbnailAccessKey); } if (file.webpublicUrl) { createDeleteObjectStorageFileJob(file.webpublicAccessKey); } } postProcess(file, isExpired); } export async function deleteFileSync(file, isExpired = false) { if (file.storedInternal) { InternalStorage.del(file.accessKey); if (file.thumbnailUrl) { InternalStorage.del(file.thumbnailAccessKey); } if (file.webpublicUrl) { InternalStorage.del(file.webpublicAccessKey); } } else if (!file.isLink) { const promises = []; promises.push(deleteObjectStorageFile(file.accessKey)); if (file.thumbnailUrl) { promises.push(deleteObjectStorageFile(file.thumbnailAccessKey)); } if (file.webpublicUrl) { promises.push(deleteObjectStorageFile(file.webpublicAccessKey)); } await Promise.all(promises); } postProcess(file, isExpired); } async function postProcess(file, isExpired = false) { // リモートファイル期限切れ削除後は直リンクにする if (isExpired && file.userHost !== null && file.uri != null) { DriveFiles.update(file.id, { isLink: true, url: file.uri, thumbnailUrl: null, webpublicUrl: null, storedInternal: false, // ローカルプロキシ用 accessKey: uuid(), thumbnailAccessKey: `thumbnail-${uuid()}`, webpublicAccessKey: `webpublic-${uuid()}` }); Users.update({ avatarId: file.id }, { avatarUrl: file.uri }); Users.update({ bannerId: file.id }, { bannerUrl: file.uri }); } else { DriveFiles.delete(file.id); } // 統計を更新 driveChart.update(file, false); perUserDriveChart.update(file, false); if (file.userHost !== null) { instanceChart.updateDrive(file, false); } } export async function deleteObjectStorageFile(key) { const meta = await fetchMeta(); const s3 = getS3(meta); await s3.send(new DeleteObjectCommand({ Bucket: meta.objectStorageBucket, Key: key })); }