Skip to content

Commit c2b4fba

Browse files
committed
feat: delete inactive users and index
1 parent 8f8f825 commit c2b4fba

File tree

9 files changed

+154
-268
lines changed

9 files changed

+154
-268
lines changed

src/actions/activate.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ const jwt = require('../utils/jwt.js');
55
const { getInternalData } = require('../utils/userData');
66
const getMetadata = require('../utils/getMetadata');
77
const handlePipeline = require('../utils/pipelineError.js');
8-
const InactiveUser = require('../utils/inactive-user');
8+
const InactiveUser = require('../utils/inactive-user/inactive-user');
9+
const User = require('../utils/user/user');
910

1011
const {
1112
USERS_INDEX,
@@ -25,7 +26,7 @@ const {
2526
const Forbidden = new Errors.HttpStatusError(403, 'invalid token');
2627
const Inactive = new Errors.HttpStatusError(412, 'expired token, please request a new email');
2728
const Active = new Errors.HttpStatusError(409, 'account is already active, please use sign in form');
28-
29+
const NotFound = new Errors.HttpStatusError(404, 'account not found');
2930
/**
3031
* Helper to determine if something is true
3132
*/
@@ -158,6 +159,13 @@ function hook(userId) {
158159
return this.service.hook('users:activate', userId, { audience: this.audience });
159160
}
160161

162+
async function checkUserDeleting(internalData) {
163+
const user = new User(this);
164+
if (await user.isUserDeleting(internalData.id)) {
165+
throw NotFound;
166+
}
167+
}
168+
161169
/**
162170
* @api {amqp} <prefix>.activate Activate User
163171
* @apiVersion 1.0.0
@@ -183,7 +191,7 @@ async function activateAction({ params }) {
183191
// TODO: add security logs
184192
// var remoteip = request.params.remoteip;
185193
const { token, username } = params;
186-
const { log, config, redis, dlock, tokenManager } = this;
194+
const { log, config } = this;
187195
const audience = params.audience || config.defaultAudience;
188196

189197
log.debug('incoming request params %j', params);
@@ -197,14 +205,15 @@ async function activateAction({ params }) {
197205
erase: config.token.erase,
198206
};
199207

200-
const inactiveUsers = new InactiveUser(redis);
201-
await inactiveUsers.cleanInactive(config.deleteInactiveAccounts, { dlock, tokenManager });
208+
const inactiveUsers = new InactiveUser(this);
209+
await inactiveUsers.deleteInactive(config.deleteInactiveAccounts);
202210

203211
return Promise
204212
.bind(context)
205213
.then(verifyRequest)
206214
.bind(this)
207215
.then((resolvedUsername) => getInternalData.call(this, resolvedUsername))
216+
.tap(checkUserDeleting)
208217
.then((internalData) => Promise.join(
209218
internalData,
210219
getMetadata.call(this, internalData[USERS_ID_FIELD], audience).get(audience)

src/actions/register.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const checkLimits = require('../utils/checkIpLimits');
2222
const challenge = require('../utils/challenges/challenge');
2323
const handlePipeline = require('../utils/pipelineError');
2424
const hashPassword = require('../utils/register/password/hash');
25-
const InactiveUser = require('../utils/inactive-user');
25+
const InactiveUser = require('../utils/inactive-user/inactive-user');
2626

2727
const {
2828
USERS_REF,
@@ -150,8 +150,6 @@ async function performRegistration({ service, params }) {
150150
const {
151151
config,
152152
redis,
153-
dlock,
154-
tokenManager,
155153
} = service;
156154

157155
// do verifications of DB state
@@ -176,8 +174,8 @@ async function performRegistration({ service, params }) {
176174
await verifySSO(service, params);
177175
}
178176

179-
const inactiveUsers = new InactiveUser(redis);
180-
await inactiveUsers.cleanInactive(config.deleteInactiveAccounts, { dlock, tokenManager });
177+
const inactiveUsers = new InactiveUser(service);
178+
await inactiveUsers.deleteInactive(config.deleteInactiveAccounts);
181179

182180
const [creatorAudience] = audience;
183181
const defaultAudience = last(audience);
@@ -215,7 +213,7 @@ async function performRegistration({ service, params }) {
215213
pipeline.hset(USERS_USERNAME_TO_ID, username, userId);
216214

217215
if (activate === false && config.deleteInactiveAccounts >= 0) {
218-
InactiveUser.add(pipeline, userId, created);
216+
inactiveUsers.add(userId, created, pipeline);
219217
}
220218

221219
await pipeline.exec().then(handlePipeline);

src/utils/inactive-user.js

Lines changed: 0 additions & 79 deletions
This file was deleted.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
const Promise = require('bluebird');
2+
const RedisInactiveUser = require('./redis/inactive-user');
3+
const User = require('../user/user');
4+
5+
class InactiveUser {
6+
constructor(service) {
7+
this.service = service;
8+
this.backend = new RedisInactiveUser(service.redis);
9+
}
10+
11+
acquireLock(lockName) {
12+
const { dlock } = this.service;
13+
return dlock
14+
.once(lockName)
15+
.disposer((l) => {
16+
l.release().reflect();
17+
});
18+
}
19+
20+
add(userId, created, pipeline = undefined) {
21+
return this.backend.add(userId, created, pipeline);
22+
}
23+
24+
deleteInactive(userTTL) {
25+
return Promise
26+
.using(this.acquireLock('delete-inactive-users'), () => this._deleteInactive(userTTL))
27+
.catch({ name: 'LockAcquisitionError' }, () => {});
28+
}
29+
30+
async _deleteInactive(userTTL) {
31+
const user = new User(this.service);
32+
const inactiveUsers = await this.backend.get(userTTL);
33+
const work = [];
34+
35+
for (const userId of inactiveUsers) {
36+
work.push(
37+
user
38+
.delete(userId)
39+
.then(() => this.backend.remove(userId))
40+
);
41+
}
42+
await Promise.all(work);
43+
44+
return inactiveUsers.length;
45+
}
46+
}
47+
48+
module.exports = InactiveUser;

src/utils/organization/redis/command/delete-member-from-organizations.js

Lines changed: 0 additions & 84 deletions
This file was deleted.

src/utils/user/actions.js

Lines changed: 0 additions & 51 deletions
This file was deleted.
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const key = require('../../../key');
1+
const key = require('../../key');
22

33
const {
44
SSO_PROVIDERS,
@@ -12,7 +12,7 @@ const {
1212
USERS_DATA,
1313
USERS_METADATA,
1414
USERS_AUDIENCE,
15-
} = require('../../../../constants');
15+
} = require('../../../constants');
1616

1717

1818
const luaScript = `
@@ -86,7 +86,9 @@ const luaScript = `
8686
if userData ~= nil then
8787
local alias = userData[aliasField]
8888
local username = userData[usernameField]
89-
89+
if isempty(username) == true then
90+
return;
91+
end
9092
-- delete alias
9193
if isempty(alias) == false then
9294
redis.call("HDEL", aliasToIDKey, alias, string.lower(alias))

0 commit comments

Comments
 (0)