From 2940c2379bc84f870c13f29792f23b5c09d73a3f Mon Sep 17 00:00:00 2001 From: Jesse Chan Date: Sat, 10 Oct 2020 01:42:02 +0800 Subject: [PATCH] server: auth: correctly destory user's service when delete user --- server/models/Users.ts | 8 ++++++-- server/routes/auth.ts | 17 ++++++++++++----- server/services/index.ts | 3 +-- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/server/models/Users.ts b/server/models/Users.ts index c8242144..4c8d51b8 100644 --- a/server/models/Users.ts +++ b/server/models/Users.ts @@ -126,7 +126,10 @@ class Users { return undefined; } - removeUser(username: Credentials['username'], callback: (data: Credentials | null, error?: Error) => void): void { + removeUser( + username: Credentials['username'], + callback: (userId: UserInDatabase['_id'] | null, error?: Error) => void, + ): void { this.db.findOne({username}, (findError: Error | null, user: UserInDatabase): void => { if (findError) { return callback(null, findError); @@ -137,6 +140,7 @@ class Users { return callback(null, new Error('User not found.')); } + const userId = user._id; this.db.remove({username}, {}, (removeError) => { if (removeError) { return callback(null, removeError); @@ -144,7 +148,7 @@ class Users { fs.rmdirSync(path.join(config.dbPath, user._id), {recursive: true}); - return callback({username}); + return callback(userId); }); return undefined; diff --git a/server/routes/auth.ts b/server/routes/auth.ts index 5acb4bc9..fed9053d 100644 --- a/server/routes/auth.ts +++ b/server/routes/auth.ts @@ -187,10 +187,17 @@ router.get('/users', (req, res) => { }); router.delete('/users/:username', (req, res) => { - Users.removeUser(req.params.username, ajaxUtil.getResponseFn(res)); - if (req.user != null) { - services.destroyUserServices(req.user); - } + const callback = ajaxUtil.getResponseFn(res); + Users.removeUser(req.params.username, (id, err) => { + if (err || id == null) { + callback(null, err || new Error()); + return; + } + + services.destroyUserServices(id); + + callback({usernmae: req.params.username}); + }); }); router.patch('/users/:username', (req, res) => { @@ -212,7 +219,7 @@ router.patch('/users/:username', (req, res) => { } if (user != null) { - services.destroyUserServices(user); + services.destroyUserServices(user._id); services.bootstrapServicesForUser(user); } diff --git a/server/services/index.ts b/server/services/index.ts index 44b30669..d2d05e05 100644 --- a/server/services/index.ts +++ b/server/services/index.ts @@ -118,8 +118,7 @@ const createUserServices = (user: UserInDatabase): boolean => { }); }; -const destroyUserServices = (user: UserInDatabase) => { - const userId = user._id; +const destroyUserServices = (userId: UserInDatabase['_id']) => { Object.keys(serviceInstances).forEach((key) => { const serviceMap = key as keyof typeof serviceInstances; const userService = serviceInstances[serviceMap][userId];