Skip to content

Commit f8e14f5

Browse files
authored
fix(userHandler-asyncGetDeleted): ZMSA-52: user-handler create new asyncGetDeleted function to get deleted user by username, id, main address (#947)
* ZMSA-52: user-handler create new asyncGetDeleted function to get deleted user by username, id, main address * add indexes for deletedusers collection * user-handler asyncGetDeleted tests * users-async-get-deleted-test.js remove .only from describe * indexes, deletedusers indexes don't need to be unique indexes
1 parent b9d8957 commit f8e14f5

File tree

3 files changed

+161
-0
lines changed

3 files changed

+161
-0
lines changed

indexes.yaml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,21 @@ indexes:
762762
key:
763763
domain: 1
764764

765+
# Indexes for the deletedusers collection
766+
- collection: deletedusers
767+
type: users # index applies to users database
768+
index:
769+
name: deletedusers_dotless
770+
key:
771+
unameview: 1
772+
773+
- collection: deletedusers
774+
type: users # index applies to users database
775+
index:
776+
name: deletedusers_address
777+
key:
778+
address: 1
779+
765780
deleteindexes:
766781
- collection: settings
767782
index: key_enumerable

lib/user-handler.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,55 @@ class UserHandler {
296296
}
297297
}
298298

299+
// Get user from deletedusers
300+
async asyncGetDeleted(username, extraFields) {
301+
let fields = {
302+
_id: true,
303+
quota: true,
304+
storageUsed: true,
305+
disabled: true,
306+
suspended: true
307+
};
308+
309+
Object.keys(extraFields || {}).forEach(field => {
310+
fields[field] = true;
311+
});
312+
313+
let addressData;
314+
let query;
315+
if (tools.isId(username)) {
316+
query = { _id: new ObjectId(username) };
317+
} else if (username.indexOf('@') < 0) {
318+
// assume regular username
319+
query = { unameview: tools.uview(username) };
320+
} else {
321+
// assume main address
322+
query = { address: tools.uview(username) };
323+
}
324+
325+
if (!query) {
326+
return false;
327+
}
328+
329+
try {
330+
let userData = await this.users.collection('deletedusers').findOne(query, {
331+
projection: fields,
332+
maxTimeMS: consts.DB_MAX_TIME_USERS
333+
});
334+
335+
if (userData && fields.name && addressData && addressData.name) {
336+
// override name
337+
userData.name = addressData.name;
338+
}
339+
340+
return userData;
341+
} catch (err) {
342+
err.responseCode = 500;
343+
err.code = 'InternalDatabaseError';
344+
throw err;
345+
}
346+
}
347+
299348
/**
300349
* rateLimitIP
301350
* if ip is not available will always return success object
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/*eslint no-unused-expressions: 0, prefer-arrow-callback: 0, no-console:0 */
2+
/* globals before: false, after: false */
3+
4+
'use strict';
5+
6+
const supertest = require('supertest');
7+
const chai = require('chai');
8+
const ObjectId = require('mongodb').ObjectId;
9+
10+
const expect = chai.expect;
11+
chai.config.includeStack = true;
12+
13+
const config = require('@zone-eu/wild-config');
14+
const UserHandler = require('../../lib/user-handler');
15+
const db = require('../../lib/db');
16+
17+
const server = supertest.agent(`http://127.0.0.1:${config.api.port}`);
18+
19+
describe('Async Get Deleted User', function () {
20+
this.timeout(10000); // eslint-disable-line no-invalid-this
21+
22+
const username = 'deleted-user-handler';
23+
const address = 'deleted-user-handler@example.com';
24+
25+
let userHandler;
26+
let deletedUserId;
27+
28+
before(async () => {
29+
await new Promise((resolve, reject) => db.connect(err => (err ? reject(err) : resolve())));
30+
userHandler = new UserHandler({
31+
database: db.database,
32+
users: db.users,
33+
redis: db.redis
34+
});
35+
36+
const createResponse = await server
37+
.post('/users')
38+
.send({
39+
username,
40+
address,
41+
password: 'secretvalue'
42+
})
43+
.expect(200);
44+
45+
expect(createResponse.body.success).to.be.true;
46+
deletedUserId = createResponse.body.id;
47+
48+
const deleteAfter = new Date(Date.now() + 3600 * 1000).toISOString();
49+
const deleteResponse = await server.delete(`/users/${deletedUserId}?deleteAfter=${encodeURIComponent(deleteAfter)}`).expect(200);
50+
51+
expect(deleteResponse.body.success).to.be.true;
52+
});
53+
54+
after(async () => {
55+
if (!deletedUserId) {
56+
return;
57+
}
58+
59+
const userObjectId = new ObjectId(deletedUserId);
60+
await db.users.collection('deletedusers').deleteOne({ _id: userObjectId });
61+
await db.database.collection('tasks').deleteMany({
62+
task: 'user-delete',
63+
$or: [{ user: userObjectId }, { 'data.user': userObjectId }]
64+
});
65+
});
66+
67+
it('should get deleted user by id expect success', async () => {
68+
const deletedUser = await userHandler.asyncGetDeleted(deletedUserId, { username: true, address: true });
69+
70+
expect(deletedUser).to.exist;
71+
expect(deletedUser._id.toString()).to.equal(deletedUserId);
72+
expect(deletedUser.username).to.equal(username);
73+
expect(deletedUser.address).to.equal(address);
74+
});
75+
76+
it('should get deleted user by username expect success', async () => {
77+
const deletedUser = await userHandler.asyncGetDeleted(username.toUpperCase(), { username: true });
78+
79+
expect(deletedUser).to.exist;
80+
expect(deletedUser._id.toString()).to.equal(deletedUserId);
81+
expect(deletedUser.username).to.equal(username);
82+
});
83+
84+
it('should get deleted user by address expect success', async () => {
85+
const deletedUser = await userHandler.asyncGetDeleted(address.toUpperCase(), { address: true });
86+
87+
expect(deletedUser).to.exist;
88+
expect(deletedUser._id.toString()).to.equal(deletedUserId);
89+
expect(deletedUser.address).to.equal(address);
90+
});
91+
92+
it('should get deleted user expect failure for missing account', async () => {
93+
const deletedUser = await userHandler.asyncGetDeleted('missing-user@example.com');
94+
95+
expect(deletedUser).to.be.null;
96+
});
97+
});

0 commit comments

Comments
 (0)