diff --git a/src/models/drive-file.ts b/src/models/drive-file.ts index fc9c15072..0d0a6523d 100644 --- a/src/models/drive-file.ts +++ b/src/models/drive-file.ts @@ -8,11 +8,11 @@ import MessagingMessage, { deleteMessagingMessage } from './messaging-message'; import User from './user'; const DriveFile = monkDb.get('driveFiles.files'); - DriveFile.createIndex('metadata.uri', { sparse: true, unique: true }); - export default DriveFile; +export const DriveFileChunk = monkDb.get('driveFiles.chunks'); + const getGridFSBucket = async (): Promise => { const db = await nativeDbConn(); const bucket = new mongo.GridFSBucket(db, { @@ -93,7 +93,7 @@ export async function deleteDriveFile(driveFile: string | mongo.ObjectID | IDriv } // このDriveFileのチャンクをすべて削除 - await monkDb.get('driveFiles.chunks').remove({ + await DriveFileChunk.remove({ files_id: d._id }); diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index 30aae24ba..279cdf0bc 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -10,12 +10,12 @@ import * as debug from 'debug'; import fileType = require('file-type'); import prominence = require('prominence'); -import DriveFile, { IMetadata, getGridFSBucket, IDriveFile } from '../../models/drive-file'; +import DriveFile, { IMetadata, getGridFSBucket, IDriveFile, DriveFileChunk } from '../../models/drive-file'; import DriveFolder from '../../models/drive-folder'; import { pack } from '../../models/drive-file'; import event, { publishDriveStream } from '../../publishers/stream'; import getAcct from '../../acct/render'; -import { IUser } from '../../models/user'; +import { IUser, isLocalUser } from '../../models/user'; const gm = _gm.subClass({ imageMagick: true @@ -207,7 +207,34 @@ const addFile = async ( // If usage limit exceeded if (usage + size > user.driveCapacity) { - throw 'no-free-space'; + if (isLocalUser(user)) { + throw 'no-free-space'; + } else { + //#region (アバターまたはバナーを含まず)最も古いファイルを削除する + const oldFile = await DriveFile.findOne({ + _id: { + $nin: [user.avatarId, user.bannerId] + } + }, { + sort: { + _id: 1 + } + }); + + if (oldFile) { + // チャンクをすべて削除 + DriveFileChunk.remove({ + files_id: oldFile._id + }); + + DriveFile.update({ _id: oldFile._id }, { + $set: { + 'metadata.deletedAt': new Date() + } + }); + } + //#endregion + } } })() ]);