Skip to content

Commit 7d81579

Browse files
committed
feat(api): add importUserLastLoggedAt usecase
1 parent d32de7f commit 7d81579

File tree

2 files changed

+185
-0
lines changed

2 files changed

+185
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { UserLogin } from '../models/UserLogin.js';
2+
3+
/**
4+
* @typedef {function} importUserLastLoggedAt
5+
* @param {Object} params
6+
* @param {boolean} params.dryRun
7+
* @param {string} params.userId
8+
* @param {Date} params.lastActivity
9+
* @param {UserRepository} params.userRepository
10+
* @param {UserLoginRepository} params.userLoginRepository
11+
* @return {Promise<boolean>}
12+
*/
13+
export const importUserLastLoggedAt = async function ({
14+
dryRun,
15+
userId,
16+
lastActivity,
17+
userRepository,
18+
userLoginRepository,
19+
}) {
20+
const user = await userRepository.get(userId);
21+
if (!user || user.hasBeenAnonymised) {
22+
return false;
23+
}
24+
25+
const userLogin = await userLoginRepository.findByUserId(userId);
26+
27+
if (!userLogin) {
28+
const newUserLogin = new UserLogin({ userId, lastLoggedAt: lastActivity });
29+
if (!dryRun) await userLoginRepository.create(newUserLogin);
30+
return true;
31+
}
32+
if (!userLogin.lastLoggedAt) {
33+
userLogin.lastLoggedAt = lastActivity;
34+
if (!dryRun) await userLoginRepository.update(userLogin, { preventUpdatedAt: true });
35+
return true;
36+
}
37+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
import { usecases } from '../../../../../src/identity-access-management/domain/usecases/index.js';
2+
import { databaseBuilder, expect, sinon } from '../../../../test-helper.js';
3+
4+
describe('Integration | Identity Access Management | Domain | UseCase | import user last logged at', function () {
5+
let clock;
6+
const now = new Date('2025-01-01');
7+
8+
beforeEach(function () {
9+
clock = sinon.useFakeTimers({ now, toFake: ['Date'] });
10+
});
11+
12+
afterEach(function () {
13+
clock.restore();
14+
});
15+
16+
context('when dryRun is false', function () {
17+
let dryRun;
18+
19+
beforeEach(function () {
20+
dryRun = false;
21+
});
22+
23+
context('when the user exists', function () {
24+
context('when the user has not been anonymized', function () {
25+
context('when the user login has no lastloggedAt', function () {
26+
it('updates the user login lastLoggedAt', async function () {
27+
// given
28+
const userId = databaseBuilder.factory.buildUser({
29+
hasBeenAnonymised: false,
30+
}).id;
31+
databaseBuilder.factory.buildUserLogin({
32+
userId,
33+
lastLoggedAt: null,
34+
});
35+
36+
await databaseBuilder.commit();
37+
38+
// when
39+
await usecases.importUserLastLoggedAt({
40+
dryRun,
41+
userId,
42+
lastActivity: new Date(),
43+
});
44+
45+
// then
46+
const userLoginUpdated = await databaseBuilder.knex('user-logins').where({ userId }).first();
47+
expect(userLoginUpdated.lastLoggedAt).to.deep.equal(now);
48+
});
49+
});
50+
});
51+
52+
context('when ther is no user login', function () {
53+
it('creates a new user login', async function () {
54+
// given
55+
const userId = databaseBuilder.factory.buildUser({
56+
hasBeenAnonymised: false,
57+
}).id;
58+
59+
await databaseBuilder.commit();
60+
61+
// when
62+
await usecases.importUserLastLoggedAt({
63+
dryRun,
64+
userId,
65+
lastActivity: new Date(),
66+
});
67+
68+
// then
69+
const userLoginCreated = await databaseBuilder.knex('user-logins').where({ userId }).first();
70+
expect(userLoginCreated.lastLoggedAt).to.deep.equal(now);
71+
});
72+
});
73+
74+
context('when the user login has a lastLoggedAt', function () {
75+
it('does nothing', async function () {
76+
// given
77+
const userId = databaseBuilder.factory.buildUser({
78+
hasBeenAnonymised: false,
79+
}).id;
80+
databaseBuilder.factory.buildUserLogin({
81+
userId,
82+
lastLoggedAt: new Date('2020-01-01'),
83+
});
84+
await databaseBuilder.commit();
85+
86+
// when
87+
await usecases.importUserLastLoggedAt({
88+
dryRun,
89+
userId,
90+
lastActivity: new Date(),
91+
});
92+
93+
// then
94+
const userLoginUpdated = await databaseBuilder.knex('user-logins').where({ userId }).first();
95+
expect(userLoginUpdated.lastLoggedAt).to.deep.equal(new Date('2020-01-01'));
96+
});
97+
});
98+
});
99+
100+
context('when the user has been anonymized', function () {
101+
it('does nothing', async function () {
102+
// given
103+
const userId = databaseBuilder.factory.buildUser({
104+
hasBeenAnonymised: true,
105+
}).id;
106+
databaseBuilder.factory.buildUserLogin({
107+
userId,
108+
lastLoggedAt: null,
109+
});
110+
await databaseBuilder.commit();
111+
112+
// when
113+
await usecases.importUserLastLoggedAt({
114+
dryRun,
115+
userId,
116+
lastActivity: new Date(),
117+
});
118+
119+
// then
120+
const userLoginUpdated = await databaseBuilder.knex('user-logins').where({ userId }).first();
121+
expect(userLoginUpdated.lastLoggedAt).to.be.null;
122+
});
123+
});
124+
});
125+
126+
context('when dryRun is true', function () {
127+
it('does nothing', async function () {
128+
// given
129+
const userId = databaseBuilder.factory.buildUser().id;
130+
databaseBuilder.factory.buildUserLogin({
131+
userId,
132+
lastLoggedAt: null,
133+
});
134+
await databaseBuilder.commit();
135+
136+
// when
137+
await usecases.importUserLastLoggedAt({
138+
dryRun: true,
139+
userId,
140+
lastActivity: new Date(),
141+
});
142+
143+
// then
144+
const userLoginUpdated = await databaseBuilder.knex('user-logins').where({ userId }).first();
145+
expect(userLoginUpdated.lastLoggedAt).to.be.null;
146+
});
147+
});
148+
});

0 commit comments

Comments
 (0)