diff options
Diffstat (limited to 'src/services/drive/delete-file.ts')
| -rw-r--r-- | src/services/drive/delete-file.ts | 108 |
1 files changed, 31 insertions, 77 deletions
diff --git a/src/services/drive/delete-file.ts b/src/services/drive/delete-file.ts index c5c15ca20b..adf57416fe 100644 --- a/src/services/drive/delete-file.ts +++ b/src/services/drive/delete-file.ts @@ -1,99 +1,53 @@ import * as Minio from 'minio'; -import DriveFile, { DriveFileChunk, IDriveFile } from '../../models/drive-file'; -import DriveFileThumbnail, { DriveFileThumbnailChunk } from '../../models/drive-file-thumbnail'; import config from '../../config'; -import driveChart from '../../services/chart/drive'; -import perUserDriveChart from '../../services/chart/per-user-drive'; -import instanceChart from '../../services/chart/instance'; -import DriveFileWebpublic, { DriveFileWebpublicChunk } from '../../models/drive-file-webpublic'; -import Instance from '../../models/instance'; -import { isRemoteUser } from '../../models/user'; +import { DriveFile } from '../../models/entities/drive-file'; +import { InternalStorage } from './internal-storage'; +import { DriveFiles, Instances } from '../../models'; +import { driveChart, perUserDriveChart, instanceChart } from '../chart'; -export default async function(file: IDriveFile, isExpired = false) { - if (file.metadata.storage == 'minio') { - const minio = new Minio.Client(config.drive.config); - - // 後方互換性のため、file.metadata.storageProps.key があるかどうかチェックしています。 - // 将来的には const obj = file.metadata.storageProps.key; とします。 - const obj = file.metadata.storageProps.key ? file.metadata.storageProps.key : `${config.drive.prefix}/${file.metadata.storageProps.id}`; - await minio.removeObject(config.drive.bucket, obj); +export default async function(file: DriveFile, isExpired = false) { + if (file.storedInternal) { + InternalStorage.del(file.accessKey); - if (file.metadata.thumbnailUrl) { - // 後方互換性のため、file.metadata.storageProps.thumbnailKey があるかどうかチェックしています。 - // 将来的には const thumbnailObj = file.metadata.storageProps.thumbnailKey; とします。 - const thumbnailObj = file.metadata.storageProps.thumbnailKey ? file.metadata.storageProps.thumbnailKey : `${config.drive.prefix}/${file.metadata.storageProps.id}-thumbnail`; - await minio.removeObject(config.drive.bucket, thumbnailObj); + if (file.thumbnailUrl) { + InternalStorage.del(file.thumbnailAccessKey); } - if (file.metadata.webpublicUrl) { - const webpublicObj = file.metadata.storageProps.webpublicKey ? file.metadata.storageProps.webpublicKey : `${config.drive.prefix}/${file.metadata.storageProps.id}-original`; - await minio.removeObject(config.drive.bucket, webpublicObj); + if (file.webpublicUrl) { + InternalStorage.del(file.webpublicAccessKey); } - } + } else { + const minio = new Minio.Client(config.drive.config); - // チャンクをすべて削除 - await DriveFileChunk.remove({ - files_id: file._id - }); + await minio.removeObject(config.drive.bucket, file.accessKey); - const set = { - metadata: { - deletedAt: new Date(), - isExpired: isExpired + if (file.thumbnailUrl) { + await minio.removeObject(config.drive.bucket, file.thumbnailAccessKey); } - } as any; - - // リモートファイル期限切れ削除後は直リンクにする - if (isExpired && file.metadata && file.metadata._user && file.metadata._user.host != null) { - set.metadata.withoutChunks = true; - set.metadata.isRemote = true; - set.metadata.url = file.metadata.uri; - set.metadata.thumbnailUrl = undefined; - set.metadata.webpublicUrl = undefined; - } - - await DriveFile.update({ _id: file._id }, { - $set: set - }); - //#region サムネイルもあれば削除 - const thumbnail = await DriveFileThumbnail.findOne({ - 'metadata.originalId': file._id - }); - - if (thumbnail) { - await DriveFileThumbnailChunk.remove({ - files_id: thumbnail._id - }); - - await DriveFileThumbnail.remove({ _id: thumbnail._id }); + if (file.webpublicUrl) { + await minio.removeObject(config.drive.bucket, file.webpublicAccessKey); + } } - //#endregion - //#region Web公開用もあれば削除 - const webpublic = await DriveFileWebpublic.findOne({ - 'metadata.originalId': file._id - }); - - if (webpublic) { - await DriveFileWebpublicChunk.remove({ - files_id: webpublic._id + // リモートファイル期限切れ削除後は直リンクにする + if (isExpired && file.userHost !== null) { + DriveFiles.update(file.id, { + isRemote: true, + url: file.uri, + thumbnailUrl: null, + webpublicUrl: null }); - - await DriveFileWebpublic.remove({ _id: webpublic._id }); + } else { + DriveFiles.delete(file.id); } - //#endregion // 統計を更新 driveChart.update(file, false); perUserDriveChart.update(file, false); - if (isRemoteUser(file.metadata._user)) { + if (file.userHost !== null) { instanceChart.updateDrive(file, false); - Instance.update({ host: file.metadata._user.host }, { - $inc: { - driveUsage: -file.length, - driveFiles: -1 - } - }); + Instances.decrement({ host: file.userHost }, 'driveUsage', file.size); + Instances.decrement({ host: file.userHost }, 'driveFiles', 1); } } |