diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index dba98b543..cecc04890 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.27.2", + "version": "2.27.3", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/model/document.ts b/packages/hydrooj/src/model/document.ts index c315dd14a..afb9028c4 100644 --- a/packages/hydrooj/src/model/document.ts +++ b/packages/hydrooj/src/model/document.ts @@ -428,6 +428,11 @@ async function ensureIndexes() { } bus.once('app/started', ensureIndexes); +bus.on('domain/delete', (domainId) => Promise.all([ + coll.deleteMany({ domainId }), + collStatus.deleteMany({ domainId }), +])); + global.Hydro.model.document = { coll, collStatus, diff --git a/packages/hydrooj/src/model/domain.ts b/packages/hydrooj/src/model/domain.ts index 4205ea7ee..be86e4361 100644 --- a/packages/hydrooj/src/model/domain.ts +++ b/packages/hydrooj/src/model/domain.ts @@ -249,6 +249,13 @@ class DomainModel { }).limit(limit).toArray(); return ddocs; } + + @ArgMethod + static async del(domainId: string) { + await coll.deleteOne({ _id: domainId }); + await collUser.deleteMany({ domainId }); + await bus.parallel('domain/delete', domainId); + } } export default DomainModel; diff --git a/packages/hydrooj/src/model/record.ts b/packages/hydrooj/src/model/record.ts index 8aa783537..57bfd83ac 100644 --- a/packages/hydrooj/src/model/record.ts +++ b/packages/hydrooj/src/model/record.ts @@ -208,5 +208,7 @@ class RecordModel { } bus.on('problem/delete', (domainId, docId) => RecordModel.coll.deleteMany({ domainId, pid: docId })); +bus.on('domain/delete', (domainId) => RecordModel.coll.deleteMany({ domainId })); + export default RecordModel; global.Hydro.model.record = RecordModel; diff --git a/packages/hydrooj/src/model/storage.ts b/packages/hydrooj/src/model/storage.ts index 78e393250..3fcc7b051 100644 --- a/packages/hydrooj/src/model/storage.ts +++ b/packages/hydrooj/src/model/storage.ts @@ -97,6 +97,10 @@ bus.once('app/started', async () => { }); } }); +bus.on('domain/delete', async (domainId) => { + const files = await StorageModel.list(`problem/${domainId}`); + await StorageModel.del(files.map((i) => i.path)); +}); global.Hydro.model.storage = StorageModel; export default StorageModel; diff --git a/packages/hydrooj/src/model/task.ts b/packages/hydrooj/src/model/task.ts index d473dcd92..3f9de7e4d 100644 --- a/packages/hydrooj/src/model/task.ts +++ b/packages/hydrooj/src/model/task.ts @@ -127,5 +127,7 @@ class TaskModel { static Worker = Worker; } +bus.on('domain/delete', (domainId) => coll.deleteMany({ domainId })); + export default TaskModel; global.Hydro.model.task = TaskModel; diff --git a/packages/hydrooj/src/service/bus.ts b/packages/hydrooj/src/service/bus.ts index 718cf44b2..175d640fc 100644 --- a/packages/hydrooj/src/service/bus.ts +++ b/packages/hydrooj/src/service/bus.ts @@ -55,6 +55,7 @@ export interface EventMap extends Record { 'domain/get': (ddoc: DomainDoc) => VoidReturn 'domain/before-update': (domainId: string, $set: Partial) => VoidReturn 'domain/update': (domainId: string, $set: Partial, ddoc: DomainDoc) => VoidReturn + 'domain/delete': (domainId: string) => VoidReturn 'document/add': (doc: any) => VoidReturn 'document/set': ( diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 67469558a..cd427354c 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.9.1", + "version": "4.9.2", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js",