mirror of
https://github.com/Unleash/unleash.git
synced 2025-05-12 01:17:04 +02:00
fix: filter out service and system users from inactive users list (#6134)
This commit is contained in:
parent
1da59abb2d
commit
3bea6bbd20
@ -1,5 +1,10 @@
|
|||||||
import Controller from '../../routes/controller';
|
import Controller from '../../routes/controller';
|
||||||
import { ADMIN, IUnleashConfig, IUnleashServices } from '../../types';
|
import {
|
||||||
|
ADMIN,
|
||||||
|
IFlagResolver,
|
||||||
|
IUnleashConfig,
|
||||||
|
IUnleashServices,
|
||||||
|
} from '../../types';
|
||||||
import { Logger } from '../../logger';
|
import { Logger } from '../../logger';
|
||||||
import { InactiveUsersService } from './inactive-users-service';
|
import { InactiveUsersService } from './inactive-users-service';
|
||||||
import {
|
import {
|
||||||
@ -8,6 +13,7 @@ import {
|
|||||||
emptyResponse,
|
emptyResponse,
|
||||||
getStandardResponses,
|
getStandardResponses,
|
||||||
IdsSchema,
|
IdsSchema,
|
||||||
|
InactiveUserSchema,
|
||||||
inactiveUsersSchema,
|
inactiveUsersSchema,
|
||||||
InactiveUsersSchema,
|
InactiveUsersSchema,
|
||||||
} from '../../openapi';
|
} from '../../openapi';
|
||||||
@ -15,12 +21,15 @@ import { IAuthRequest } from '../../routes/unleash-types';
|
|||||||
import { Response } from 'express';
|
import { Response } from 'express';
|
||||||
import { OpenApiService } from '../../services';
|
import { OpenApiService } from '../../services';
|
||||||
import { DAYS_TO_BE_COUNTED_AS_INACTIVE } from './createInactiveUsersService';
|
import { DAYS_TO_BE_COUNTED_AS_INACTIVE } from './createInactiveUsersService';
|
||||||
|
import { anonymise } from '../../util';
|
||||||
export class InactiveUsersController extends Controller {
|
export class InactiveUsersController extends Controller {
|
||||||
private readonly logger: Logger;
|
private readonly logger: Logger;
|
||||||
|
|
||||||
private inactiveUsersService: InactiveUsersService;
|
private inactiveUsersService: InactiveUsersService;
|
||||||
|
|
||||||
private openApiService: OpenApiService;
|
private openApiService: OpenApiService;
|
||||||
|
|
||||||
|
private flagResolver: IFlagResolver;
|
||||||
constructor(
|
constructor(
|
||||||
config: IUnleashConfig,
|
config: IUnleashConfig,
|
||||||
{
|
{
|
||||||
@ -34,6 +43,7 @@ export class InactiveUsersController extends Controller {
|
|||||||
);
|
);
|
||||||
this.inactiveUsersService = inactiveUsersService;
|
this.inactiveUsersService = inactiveUsersService;
|
||||||
this.openApiService = openApiService;
|
this.openApiService = openApiService;
|
||||||
|
this.flagResolver = config.flagResolver;
|
||||||
|
|
||||||
this.route({
|
this.route({
|
||||||
method: 'get',
|
method: 'get',
|
||||||
@ -78,8 +88,10 @@ export class InactiveUsersController extends Controller {
|
|||||||
res: Response<InactiveUsersSchema>,
|
res: Response<InactiveUsersSchema>,
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
this.logger.info('Hitting inactive users');
|
this.logger.info('Hitting inactive users');
|
||||||
const inactiveUsers =
|
let inactiveUsers = await this.inactiveUsersService.getInactiveUsers();
|
||||||
await this.inactiveUsersService.getInactiveUsers();
|
if (this.flagResolver.isEnabled('anonymiseEventLog')) {
|
||||||
|
inactiveUsers = this.anonymiseUsers(inactiveUsers);
|
||||||
|
}
|
||||||
this.openApiService.respondWithValidation(
|
this.openApiService.respondWithValidation(
|
||||||
200,
|
200,
|
||||||
res,
|
res,
|
||||||
@ -87,7 +99,16 @@ export class InactiveUsersController extends Controller {
|
|||||||
{ version: 1, inactiveUsers },
|
{ version: 1, inactiveUsers },
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
anonymiseUsers(users: InactiveUserSchema[]): InactiveUserSchema[] {
|
||||||
|
return users.map((u) => ({
|
||||||
|
...u,
|
||||||
|
name: anonymise(u.name || ''),
|
||||||
|
username: anonymise(u.username || ''),
|
||||||
|
email: anonymise(u.email || 'random'),
|
||||||
|
imageUrl:
|
||||||
|
'https://gravatar.com/avatar/21232f297a57a5a743894a0e4a801fc3?size=42&default=retro',
|
||||||
|
}));
|
||||||
|
}
|
||||||
async deleteInactiveUsers(
|
async deleteInactiveUsers(
|
||||||
req: IAuthRequest<undefined, undefined, IdsSchema>,
|
req: IAuthRequest<undefined, undefined, IdsSchema>,
|
||||||
res: Response<void>,
|
res: Response<void>,
|
||||||
|
@ -46,6 +46,8 @@ export class InactiveUsersStore implements IInactiveUsersStore {
|
|||||||
'users.id',
|
'users.id',
|
||||||
)
|
)
|
||||||
.where('deleted_at', null)
|
.where('deleted_at', null)
|
||||||
|
.andWhere('is_service', false)
|
||||||
|
.andWhere('is_system', false)
|
||||||
.andWhereRaw(
|
.andWhereRaw(
|
||||||
`(users.seen_at IS NULL OR users.seen_at < now() - INTERVAL '?? days')
|
`(users.seen_at IS NULL OR users.seen_at < now() - INTERVAL '?? days')
|
||||||
AND (users.created_at IS NULL OR users.created_at < now() - INTERVAL '?? days')
|
AND (users.created_at IS NULL OR users.created_at < now() - INTERVAL '?? days')
|
||||||
|
@ -139,6 +139,17 @@ describe('Inactive users service', () => {
|
|||||||
expect(users).toBeTruthy();
|
expect(users).toBeTruthy();
|
||||||
expect(users).toHaveLength(0);
|
expect(users).toHaveLength(0);
|
||||||
});
|
});
|
||||||
|
test('System users and service users are not returned, even if not seen', async () => {
|
||||||
|
await db.rawDatabase.raw(
|
||||||
|
`INSERT INTO users(id, name, created_at, is_service) VALUES (4949, 'service_account', now() - INTERVAL '1 YEAR', true)`,
|
||||||
|
);
|
||||||
|
await db.rawDatabase.raw(
|
||||||
|
`INSERT INTO users(id, name, created_at, is_system) VALUES (13337, 'service_account', now() - INTERVAL '1 YEAR', true)`,
|
||||||
|
);
|
||||||
|
const users = await inactiveUserService.getInactiveUsers();
|
||||||
|
expect(users).toBeTruthy();
|
||||||
|
expect(users).toHaveLength(0);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
describe('Deleting inactive users', () => {
|
describe('Deleting inactive users', () => {
|
||||||
test('Deletes users that have never logged in but was created before our deadline', async () => {
|
test('Deletes users that have never logged in but was created before our deadline', async () => {
|
||||||
|
Loading…
Reference in New Issue
Block a user