From cee1fa7d9627581264d167e9733daae1dfc7f5bd Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 18 Aug 2021 17:25:41 +0800 Subject: [PATCH] core: fix deleted file handle --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/model/storage.ts | 37 ++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 6234fdcd0..d42693796 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.32.22", + "version": "2.32.23", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/model/storage.ts b/packages/hydrooj/src/model/storage.ts index 13deeb6e5..dee740540 100644 --- a/packages/hydrooj/src/model/storage.ts +++ b/packages/hydrooj/src/model/storage.ts @@ -28,32 +28,52 @@ export class StorageModel { } static async get(path: string, savePath?: string) { - const { value } = await StorageModel.coll.findOneAndUpdate({ path }, { $set: { lastUsage: new Date() } }, { returnDocument: 'after' }); + const { value } = await StorageModel.coll.findOneAndUpdate( + { path, autoDelete: { $exists: false } }, + { $set: { lastUsage: new Date() } }, + { returnDocument: 'after' }, + ); return await storage.get(value?._id || path, savePath); } static async rename(path: string, newPath: string) { - return await StorageModel.coll.updateOne({ path }, { $set: { path: newPath } }); + return await StorageModel.coll.updateOne( + { path, autoDelete: { $exists: false } }, + { $set: { path: newPath } }, + ); } static async del(path: string[]) { const autoDelete = moment().add(7, 'day').toDate(); - await StorageModel.coll.updateMany({ path: { $in: path } }, { $set: { autoDelete } }); + await StorageModel.coll.updateMany( + { path: { $in: path }, autoDelete: { $exists: false } }, + { $set: { autoDelete } }, + ); } static async list(target: string, recursive = true) { if (target.includes('..') || target.includes('//')) throw new Error('Invalid path'); if (target.length && !target.endsWith('/')) target += '/'; const results = recursive - ? await StorageModel.coll.find({ path: { $regex: new RegExp(`^${escapeRegExp(target)}`, 'i') } }).toArray() - : await StorageModel.coll.find({ path: { $regex: new RegExp(`^${escapeRegExp(target)}[^/]+$`) } }).toArray(); + ? await StorageModel.coll.find({ + path: { $regex: new RegExp(`^${escapeRegExp(target)}`, 'i') }, + autoDelete: { $exists: false }, + }).toArray() + : await StorageModel.coll.find({ + path: { $regex: new RegExp(`^${escapeRegExp(target)}[^/]+$`) }, + autoDelete: { $exists: false }, + }).toArray(); return results.map((i) => ({ ...i, name: i.path.split(target)[1], prefix: target, })); } static async getMeta(path: string) { - const { value } = await StorageModel.coll.findOneAndUpdate({ path }, { $set: { lastUsage: new Date() } }, { returnDocument: 'after' }); + const { value } = await StorageModel.coll.findOneAndUpdate( + { path, autoDelete: { $exists: false } }, + { $set: { lastUsage: new Date() } }, + { returnDocument: 'after' }, + ); if (!value) return null; return { ...value.meta, @@ -64,7 +84,10 @@ export class StorageModel { } static async signDownloadLink(target: string, filename?: string, noExpire = false, useAlternativeEndpointFor?: 'user' | 'judge') { - const res = await StorageModel.coll.findOneAndUpdate({ path: target }, { $set: { lastUsage: new Date() } }); + const res = await StorageModel.coll.findOneAndUpdate( + { path: target, autoDelete: { $exists: false } }, + { $set: { lastUsage: new Date() } }, + ); if (!res.value) return ''; return await storage.signDownloadLink(res.value._id, filename, noExpire, useAlternativeEndpointFor); }