diff --git a/src/models/Site.js b/src/models/Site.js index f9cfb8e0..dfd84efb 100755 --- a/src/models/Site.js +++ b/src/models/Site.js @@ -912,12 +912,10 @@ Wil je dit liever niet? Dan hoef je alleen een keer in te loggen op de website o } Site.prototype.willAnonymizeAllUsers = async function () { - let self = this; let result = {}; try { - if (!self.id) throw Error('Site not found'); if (!self.config.project.projectHasEnded) throw Error('Cannot anonymize users on an active site - first set the project-has-ended parameter'); @@ -929,43 +927,46 @@ Wil je dit liever niet? Dan hoef je alleen een keer in te loggen op de website o // extract externalUserIds result.externalUserIds = result.users.filter( user => user.externalUserId ).map( user => user.externalUserId ); - } catch (err) { console.log(err); throw err; } return result; - } - Site.prototype.doAnonymizeAllUsers = async function () { - + Site.prototype.doAnonymizeAllUsers = async function (usersToAnonymize, externalUserIds, useOauth='default') { // anonymize all users for this site let self = this; - let result; - + const amountOfUsersPerSecond = 50; try { - - result = await self.willAnonymizeAllUsers(); - - let users = [ ...result.users ] - - // anonymize users - for (const user of users) { - user.site = self; - let res = await user.doAnonymize(); - user.site = null; + // Anonymize users + for (const user of usersToAnonymize) { + await new Promise((resolve, reject) => { + setTimeout(async function() { + user.site = self; + let res = await user.doAnonymize(); + user.site = null; + }, 1000 / amountOfUsersPerSecond) + }) + .then(result => resolve() ) + .catch(function (err) { + throw err; + }); } + for (let externalUserId of externalUserIds) { + let users = await db.User.findAll({ where: { externalUserId } }); + if (users.length == 0) { + // no api users left for this oauth user, so remove the oauth user + let siteConfig = self && merge({}, self.config, { id: self.id }); + await OAuthApi.deleteUser({ siteConfig, useOauth, userData: { id: externalUserId }}) + } + } } catch (err) { console.log(err); throw err; } - - result.message = 'Ok'; - return result; - } Site.prototype.isVoteActive = function () { diff --git a/src/routes/api/site.js b/src/routes/api/site.js index 77f1d19e..9761ed1b 100755 --- a/src/routes/api/site.js +++ b/src/routes/api/site.js @@ -282,40 +282,25 @@ router.route('/:siteId(\\d+)/:willOrDo(will|do)-anonymize-all-users') if ( !found ) throw new Error('Site not found'); req.results = found; req.site = req.results; // middleware expects this to exist - next(); - return null; + next(); }) .catch(next); }) .put(async function (req, res, next) { try { + const result = await req.site.willAnonymizeAllUsers(); + req.results = result; if (req.params.willOrDo == 'do') { - req.results = await req.site.doAnonymizeAllUsers(); - } else { - req.results = await req.site.willAnonymizeAllUsers(); - } - next(); - return null; - } catch (err) { - return next(err); - } - }) - .put(async function (req, res, next) { - try { - if (req.results.externalUserIds.length == 0) return next(); - for (let externalUserId of req.results.externalUserIds) { - let users = await db.User.findAll({ where: { externalUserId } }); - if (users.length == 0) { - // no api users left for this oauth user, so remove the oauth user - let which = req.query.useOauth || 'default'; - let siteConfig = req.site && merge({}, req.site.config, { id: req.site.id }); - if (req.params.willOrDo == 'do') { - let result = await OAuthApi.deleteUser({ siteConfig, which, userData: { id: externalUserId }}) - } - } - } + result.message = 'Ok'; + + req.site.doAnonymizeAllUsers( + [...result.users], + [...result.externalUserIds], + req.query.useOauth + + ); + } next(); - return null; } catch (err) { return next(err); }