From 38cc02e261c39a5e8a9f6c1e506371e23b16184d Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 9 Oct 2018 02:14:03 +0900 Subject: [PATCH] Add tool --- src/tools/move-drive-files.ts | 64 +++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/tools/move-drive-files.ts diff --git a/src/tools/move-drive-files.ts b/src/tools/move-drive-files.ts new file mode 100644 index 0000000000..e34652243f --- /dev/null +++ b/src/tools/move-drive-files.ts @@ -0,0 +1,64 @@ +import * as Minio from 'minio'; +import * as uuid from 'uuid'; +import DriveFile, { DriveFileChunk, getDriveFileBucket } from '../models/drive-file'; +import DriveFileThumbnail, { DriveFileThumbnailChunk } from '../models/drive-file-thumbnail'; +import config from '../config'; + +DriveFile.find({ + $or: [{ + withoutChunks: { $exists: false } + }, { + withoutChunks: false + }] +}).then(async files => { + files.forEach(async file => { + const minio = new Minio.Client(config.drive.config); + + const keyDir = `${config.drive.prefix}/${uuid.v4()}`; + const key = `${keyDir}/${name}`; + const thumbnailKeyDir = `${config.drive.prefix}/${uuid.v4()}`; + const thumbnailKey = `${thumbnailKeyDir}/${name}.thumbnail.jpg`; + + const baseUrl = config.drive.baseUrl + || `${ config.drive.config.useSSL ? 'https' : 'http' }://${ config.drive.config.endPoint }${ config.drive.config.port ? `:${config.drive.config.port}` : '' }/${ config.drive.bucket }`; + + const bucket = await getDriveFileBucket(); + const readable = bucket.openDownloadStream(file._id); + + await minio.putObject(config.drive.bucket, key, readable, file.length, { + 'Content-Type': file.contentType, + 'Cache-Control': 'max-age=31536000, immutable' + }); + + await DriveFile.findOneAndUpdate({ _id: file._id }, { + $set: { + 'metadata.withoutChunks': true, + 'metadata.storage': 'minio', + 'metadata.storageProps': { + key: key, + thumbnailKey: thumbnailKey + }, + 'metadata.url': `${ baseUrl }/${ keyDir }/${ encodeURIComponent(name) }`, + } + }); + + // チャンクをすべて削除 + await DriveFileChunk.remove({ + files_id: file._id + }); + + //#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 }); + } + //#endregion + }); +});