diff --git a/src/admin/admin.controller.spec.ts b/src/admin/admin.controller.spec.ts index d5af5352ceb3950fce9459dbc131e41796bd9de5..d594e2dbefa656e9b30114339595d20b2b10a683 100644 --- a/src/admin/admin.controller.spec.ts +++ b/src/admin/admin.controller.spec.ts @@ -197,4 +197,16 @@ describe('AdminController', () => { expect((await controller.getAdminStructuresList()).claimed.length).toEqual(0); expect((await controller.getAdminStructuresList()).incomplete.length).toEqual(2); }); + + it('should find attached users', async () => { + expect((await controller.findAttachedUsers()).length).toBe(0); + }); + + it('should find unattached users', async () => { + expect((await controller.findUnattachedUsers()).length).toBe(0); + }); + + it('should find unverified users', async () => { + expect((await controller.findUnVerifiedUsers()).length).toBe(0); + }); }); diff --git a/src/admin/admin.controller.ts b/src/admin/admin.controller.ts index 3fae73b8f3970e7786f21eba848bef4ca20db68a..5521d40e837eb69c4162cb0988861a69ad836300 100644 --- a/src/admin/admin.controller.ts +++ b/src/admin/admin.controller.ts @@ -21,6 +21,7 @@ import { UsersService } from '../users/users.service'; import { PendingStructureDto } from './dto/pending-structure.dto'; import { validate } from 'class-validator'; import { Structure } from '../structures/schemas/structure.schema'; +import { IUser } from '../users/interfaces/user.interface'; @Controller('admin') export class AdminController { @@ -162,6 +163,31 @@ export class AdminController { else return this.usersService.findAll(); } + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') + @Get('getUnAttachedUsers') + public async findUnattachedUsers() { + return this.usersService.findAllUnattached(); + } + + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') + @Get('getAttachedUsers') + public async findAttachedUsers() { + return this.usersService.findAllAttached().then(async (users: IUser[]) => { + return this.structuresService.getAllUserCompletedStructures(users); + }); + } + + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') + @Get('getUnVerifiedUsers') + public async findUnVerifiedUsers() { + return this.usersService.findAllUnVerified().then(async (users: IUser[]) => { + return this.structuresService.getAllUserCompletedStructures(users); + }); + } + @UseGuards(JwtAuthGuard, RolesGuard) @Roles('admin') @Post('searchNewsletterSubscriptions') diff --git a/src/structures/services/structures.service.ts b/src/structures/services/structures.service.ts index d1bb442cade9565dd040ffc852a4da2a2652ae13..afa5d0542a4efccfd80833b953f1c19a9fd93cd2 100644 --- a/src/structures/services/structures.service.ts +++ b/src/structures/services/structures.service.ts @@ -616,4 +616,23 @@ export class StructuresService { private hasTempMail(structure: Structure): boolean { return structure.contactMail === 'unknown@unknown.com'; } + + public async getAllUserCompletedStructures(users: IUser[]): Promise<any[]> { + return Promise.all( + users.map(async (user) => { + return { + id: user._id, + surname: user.surname, + name: user.name, + email: user.email, + phone: user.phone, + structures: await Promise.all( + user.structuresLink.map(async (id) => { + return await this.findOne(id.toHexString()); + }) + ), + }; + }) + ); + } } diff --git a/src/users/users.service.spec.ts b/src/users/users.service.spec.ts index 3b830315abff451d576fcfbe961f40b24ae5dd60..be5f9c272b12567ebd3e469e83d2b07e8723b753 100644 --- a/src/users/users.service.spec.ts +++ b/src/users/users.service.spec.ts @@ -9,6 +9,7 @@ import { LoginDto } from '../auth/login-dto'; import { EmailChangeDto } from './dto/change-email.dto'; import * as bcrypt from 'bcrypt'; import { ConfigurationModule } from '../configuration/configuration.module'; +import { IUser } from './interfaces/user.interface'; function hashPassword() { return bcrypt.hashSync(process.env.USER_PWD, process.env.SALT); @@ -289,4 +290,41 @@ describe('UsersService', () => { expect(await service.updateStructureLinked('test@mii.com', '6001a37716b08100062e4160')).toBe(result); }); }); + + it('should find All Unattacheduser', async () => { + const result = [ + { + _id: '123', + validationToken: + 'cf1c74c22cedb6b575945098db42d2f493fb759c9142c6aff7980f252886f36ee086574ee99a06bc99119079257116c959c8ec870949cebdef2b293666dbca42', + emailVerified: false, + email: 'jacques.dupont@mii.com', + password: hashPassword(), + role: 0, + newEmail: '', + changeEmailToken: '', + resetPasswordToken: null, + structuresLink: [], + pendingStructuresLink: [], + structureOutdatedMailSent: [], + name: 'Jacques', + surname: 'Dupont', + phone: '06 06 06 06 06', + } as IUser, + ]; + jest.spyOn(service, 'findAllUnattached').mockImplementation(async (): Promise<IUser[]> => result); + expect(await service.findAllUnattached()).toBe(result); + }); + + it('should find attached users', async () => { + const result = []; + jest.spyOn(service, 'findAllAttached').mockImplementation(async (): Promise<IUser[]> => result); + expect((await service.findAllAttached()).length).toBe(0); + }); + + it('should find UnVerified Users', async () => { + const result = []; + jest.spyOn(service, 'findAllUnVerified').mockImplementation(async (): Promise<IUser[]> => result); + expect((await service.findAllUnVerified()).length).toBe(0); + }); }); diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 993ae82a4b9cd0e139190a81a1514da50763ca3d..ce0e954d6eb37a37a2f14f2da4befc9a13de3b18 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -82,8 +82,32 @@ export class UsersService { return this.userModel.findOne({ email: mail }).select('-password').exec(); } - public async findAll(): Promise<User[]> { - return await this.userModel.find().exec(); + public findAll(): Promise<User[]> { + return this.userModel.find().exec(); + } + + public findAllUnattached(): Promise<IUser[]> { + return this.userModel + .find() + .where('emailVerified') + .equals(true) + .where('structuresLink') + .size(0) + .sort({ surname: 1 }) + .exec(); + } + + public findAllAttached(): Promise<IUser[]> { + return this.userModel + .find({ $where: 'this.structuresLink.length>0' }) + .where('emailVerified') + .equals(true) + .sort({ surname: 1 }) + .exec(); + } + + public findAllUnVerified(): Promise<IUser[]> { + return this.userModel.find().where('emailVerified').equals(false).sort({ surname: 1 }).exec(); } public async findById(id: string, passwordQuery?: boolean): Promise<IUser | undefined> { diff --git a/test/mock/services/structures.mock.service.ts b/test/mock/services/structures.mock.service.ts index f088613ba024969b276d4998118a707852e7240d..5482c2ffee4658dce4c411021836f32d220cdeba 100644 --- a/test/mock/services/structures.mock.service.ts +++ b/test/mock/services/structures.mock.service.ts @@ -865,4 +865,8 @@ export class StructuresServiceMock { __v: 0, }; } + + async getAllUserCompletedStructures(users: any[]): Promise<any[]> { + return []; + } } diff --git a/test/mock/services/user.mock.service.ts b/test/mock/services/user.mock.service.ts index cd00bb6011952deba844c48bc3c9e5fe170805c8..5b3fc7d578e5f5e5184b0d287b6cf0adaff7d614 100644 --- a/test/mock/services/user.mock.service.ts +++ b/test/mock/services/user.mock.service.ts @@ -1,6 +1,7 @@ import { HttpException, HttpStatus } from '@nestjs/common'; import { PendingStructureDto } from '../../../src/admin/dto/pending-structure.dto'; import { LoginDto } from '../../../src/auth/login-dto'; +import { User } from '../../../src/users/schemas/user.schema'; export class UsersServiceMock { findOne(mail: string, passwordQuery?: boolean) { @@ -187,4 +188,16 @@ export class UsersServiceMock { }, ]; } + + async findAllAttached(): Promise<User[]> { + return await []; + } + + async findAllUnattached(): Promise<User[]> { + return await []; + } + + async findAllUnVerified(): Promise<User[]> { + return await []; + } }