Skip to content

Commit 8be3064

Browse files
committed
save
1 parent e767e98 commit 8be3064

10 files changed

+175
-95
lines changed

src/core/backends/backends.service.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export class BackendsService extends AbstractQueueProcessor {
6565
await this.identitiesService.model.findByIdAndUpdate(isSyncedJob?.concernedTo?.id, {
6666
$set: {
6767
state: IdentityState.SYNCED,
68+
lastBackendSync: new Date(),
6869
},
6970
});
7071
this.logger.warn(`Job already completed, syncing... [${job.id}::COMPLETED]`);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { ApiProperty } from '@nestjs/swagger';
2+
import { IsString } from 'class-validator';
3+
4+
export class NeedChangePasswordDto {
5+
@IsString()
6+
@ApiProperty({ example: '66d80ab41821baca9bf965b2', description: 'User object id', type: String })
7+
public id: string;
8+
9+
}

src/management/identities/_enums/data-status.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
//DELETED : soft delete
55
export enum DataStatusEnum {
66
ACTIVE = 1,
7-
INACTIVE = 0,
7+
NOTINITIALIZED = 0,
88
DELETED = -1,
9+
PASSWORDNEEDTOBECHANGED=-2,
10+
INACTIVE = -3,
911
}

src/management/identities/_schemas/identities.schema.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export class Identities extends AbstractSchema {
2222
@Prop({ type: Number, enum: IdentityLifecycle, default: IdentityLifecycle.INACTIVE })
2323
public lifecycle: IdentityLifecycle;
2424

25-
@Prop({ type: Number, enum: DataStatusEnum, default: DataStatusEnum.INACTIVE })
25+
@Prop({ type: Number, enum: DataStatusEnum, default: DataStatusEnum.NOTINITIALIZED })
2626
public dataStatus: DataStatusEnum;
2727

2828
@Prop({ type: Boolean, default: false })

src/management/identities/abstract-identities.service.ts

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
1-
import { BadRequestException, forwardRef, HttpException, Inject, Injectable } from '@nestjs/common';
2-
import { InjectModel } from '@nestjs/mongoose';
3-
import { Document, Model, ModifyResult, Query, Types } from 'mongoose';
4-
import { AbstractServiceSchema } from '~/_common/abstracts/abstract.service.schema';
5-
import { AbstractSchema } from '~/_common/abstracts/schemas/abstract.schema';
6-
import { ValidationConfigException, ValidationSchemaException } from '~/_common/errors/ValidationException';
7-
import { IdentitiesUpsertDto } from './_dto/identities.dto';
8-
import { IdentityState } from './_enums/states.enum';
9-
import { Identities } from './_schemas/identities.schema';
10-
import { IdentitiesValidationService } from './validations/identities.validation.service';
11-
import { FactorydriveService } from '@the-software-compagny/nestjs_module_factorydrive';
12-
import { BackendsService } from '~/core/backends/backends.service';
13-
import { construct, omit } from 'radash';
14-
import { toPlainAndCrush } from '~/_common/functions/to-plain-and-crush';
15-
import { createHash } from 'node:crypto';
1+
import {BadRequestException, forwardRef, HttpException, Inject, Injectable} from '@nestjs/common';
2+
import {InjectModel} from '@nestjs/mongoose';
3+
import {Document, Model, ModifyResult, Query, Types} from 'mongoose';
4+
import {AbstractServiceSchema} from '~/_common/abstracts/abstract.service.schema';
5+
import {AbstractSchema} from '~/_common/abstracts/schemas/abstract.schema';
6+
import {ValidationConfigException, ValidationSchemaException} from '~/_common/errors/ValidationException';
7+
import {IdentitiesUpsertDto} from './_dto/identities.dto';
8+
import {IdentityState} from './_enums/states.enum';
9+
import {Identities} from './_schemas/identities.schema';
10+
import {IdentitiesValidationService} from './validations/identities.validation.service';
11+
import {FactorydriveService} from '@the-software-compagny/nestjs_module_factorydrive';
12+
import {BackendsService} from '~/core/backends/backends.service';
13+
import {construct, omit} from 'radash';
14+
import {toPlainAndCrush} from '~/_common/functions/to-plain-and-crush';
15+
import {createHash} from 'node:crypto';
1616
import {PasswdadmService} from "~/settings/passwdadm.service";
17+
import {DataStatusEnum} from "~/management/identities/_enums/data-status";
18+
import {JobState} from "~/core/jobs/_enums/state.enum";
1719

1820
@Injectable()
1921
export abstract class AbstractIdentitiesService extends AbstractServiceSchema {
@@ -140,4 +142,51 @@ export abstract class AbstractIdentitiesService extends AbstractServiceSchema {
140142
hash.update(data);
141143
return hash.digest('hex').toString();
142144
}
145+
public async activation(id: string, status: DataStatusEnum) {
146+
//recherche de l'identité
147+
let identity: Identities = null;
148+
let statusChanged = false;
149+
try {
150+
identity = await this.findById<Identities>(id);
151+
} catch (error) {
152+
throw new HttpException('Id not found', 400);
153+
}
154+
if (identity.lastBackendSync === null) {
155+
throw new HttpException('Identity has never been synced', 400);
156+
}
157+
if (identity.dataStatus !== DataStatusEnum.DELETED) {
158+
identity.dataStatus = status;
159+
statusChanged = true;
160+
} else {
161+
throw new BadRequestException('Identity is in status deleted');
162+
}
163+
//sauvegarde de l'identité
164+
if (statusChanged) {
165+
// le dataStaus à changé on envoye l info aux backend et on enregistre l identité
166+
// Envoi du status au backend
167+
let statusBackend=true
168+
if (status == DataStatusEnum.INACTIVE || status == DataStatusEnum.PASSWORDNEEDTOBECHANGED){
169+
statusBackend= false
170+
}
171+
const result = await this.backends.activationIdentity(identity._id.toString(),statusBackend);
172+
if (result.state === JobState.COMPLETED) {
173+
await super.update(identity._id, identity);
174+
} else {
175+
throw new HttpException('Backend failed', 400);
176+
}
177+
}
178+
}
179+
public async askToChangePassword(id: string){
180+
try {
181+
const identity = await this.findById<Identities>(id);
182+
if (identity.dataStatus === DataStatusEnum.ACTIVE) {
183+
identity.dataStatus = DataStatusEnum.PASSWORDNEEDTOBECHANGED
184+
await super.update(identity._id, identity);
185+
} else {
186+
throw new BadRequestException('Identity not in active');
187+
}
188+
} catch (error) {
189+
throw new HttpException('Id not found', 400);
190+
}
191+
}
143192
}

src/management/identities/identities-activation.controller.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import { AbstractController } from '~/_common/abstracts/abstract.controller';
2-
import { IdentitiesActivationService } from '~/management/identities/identities-activation.service';
3-
import { ApiOperation, ApiResponse, ApiTags} from '@nestjs/swagger';
4-
import { Body, Controller, HttpStatus, Post, Res} from '@nestjs/common';
5-
import { Response } from 'express';
6-
import { ActivationDto } from '~/management/identities/_dto/_parts/activation-dto';
1+
import {AbstractController} from '~/_common/abstracts/abstract.controller';
2+
import {IdentitiesActivationService} from '~/management/identities/identities-activation.service';
3+
import {ApiOperation, ApiResponse, ApiTags} from '@nestjs/swagger';
4+
import {Body, Controller, HttpStatus, Post, Res} from '@nestjs/common';
5+
import {Response} from 'express';
6+
import {ActivationDto} from '~/management/identities/_dto/_parts/activation-dto';
7+
import {DataStatusEnum} from "~/management/identities/_enums/data-status";
78

89
@ApiTags('management/identities')
910
@Controller('identities')
@@ -17,7 +18,11 @@ export class IdentitiesActivationController extends AbstractController {
1718
@ApiResponse({ status: HttpStatus.OK })
1819
public async activation(@Res() res: Response, @Body() body: ActivationDto): Promise<Response> {
1920
try {
20-
const data = await this._service.activation(body.id, body.status);
21+
let param = DataStatusEnum.INACTIVE
22+
if ( body.status === true){
23+
param=DataStatusEnum.ACTIVE
24+
}
25+
const data = await this._service.activation(body.id, param);
2126
return res.status(HttpStatus.OK).json({
2227
statusCode: HttpStatus.OK,
2328
data,
Lines changed: 2 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,6 @@
11
import { AbstractIdentitiesService } from '~/management/identities/abstract-identities.service';
2-
import { Identities } from '~/management/identities/_schemas/identities.schema';
3-
import { BadRequestException, HttpException } from '@nestjs/common';
4-
import { DataStatusEnum } from '~/management/identities/_enums/data-status';
5-
import { JobState } from '~/core/jobs/_enums/state.enum';
2+
63

74
export class IdentitiesActivationService extends AbstractIdentitiesService {
8-
public async activation(id: string, status: boolean) {
9-
//recherche de l'identité
10-
let identity: Identities = null;
11-
let statusChanged = false;
12-
try {
13-
identity = await this.findById<Identities>(id);
14-
} catch (error) {
15-
throw new HttpException('Id not found', 400);
16-
}
17-
if (identity.lastBackendSync === null) {
18-
throw new HttpException('Identity has never been synced', 400);
19-
}
20-
if (identity.dataStatus !== DataStatusEnum.DELETED) {
21-
if (status) {
22-
if (identity.dataStatus !== DataStatusEnum.ACTIVE) {
23-
identity.dataStatus = DataStatusEnum.ACTIVE;
24-
statusChanged = true;
25-
}
26-
} else {
27-
if (identity.dataStatus !== DataStatusEnum.INACTIVE) {
28-
identity.dataStatus = DataStatusEnum.INACTIVE;
29-
statusChanged = true;
30-
}
31-
}
32-
} else {
33-
throw new BadRequestException('Identity is in status deleted');
34-
}
35-
//sauvegarde de l'identité
36-
if (statusChanged) {
37-
// le dataStaus à changé on envoye l info aux backend et on enregistre l identité
38-
const result = await this.backends.activationIdentity(identity._id.toString(), status);
39-
if (result.state === JobState.COMPLETED) {
40-
await super.update(identity._id, identity);
41-
} else {
42-
throw new HttpException('Backend failed', 400);
43-
}
44-
}
45-
}
5+
466
}

src/management/identities/identities-forcepassword.controller.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Response } from 'express';
66
import { ActivationDto } from '~/management/identities/_dto/_parts/activation-dto';
77
import {ForcePasswordDto} from "~/management/identities/_dto/force-password-dto";
88
import {IdentitiesForcepasswordService} from "~/management/identities/identities-forcepassword.service";
9+
import {NeedChangePasswordDto} from "~/management/identities/_dto/need-change-password.dto";
910

1011
@ApiTags('management/identities')
1112
@Controller('identities')
@@ -30,4 +31,21 @@ export class IdentitiesForcePasswordController extends AbstractController {
3031
});
3132
}
3233
}
34+
@Post('needtochangepassword')
35+
@ApiOperation({ summary: "force l'utilisateur a changer son mot de passe" })
36+
@ApiResponse({ status: HttpStatus.OK })
37+
public async needToChangePassword(@Res() res: Response, @Body() body: NeedChangePasswordDto): Promise<Response> {
38+
try {
39+
const data = await this._service.needToChangePassword(body.id)
40+
return res.status(HttpStatus.OK).json({
41+
statusCode: HttpStatus.OK,
42+
data,
43+
});
44+
} catch (error) {
45+
return res.status(HttpStatus.BAD_REQUEST).json({
46+
statusCode: HttpStatus.BAD_REQUEST,
47+
message: error.message,
48+
});
49+
}
50+
}
3351
}

src/management/identities/identities-forcepassword.service.ts

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
import { AbstractIdentitiesService } from '~/management/identities/abstract-identities.service';
2-
import { Identities } from '~/management/identities/_schemas/identities.schema';
1+
import {AbstractIdentitiesService} from '~/management/identities/abstract-identities.service';
2+
import {Identities} from '~/management/identities/_schemas/identities.schema';
33
import {BadRequestException, HttpException, Injectable} from '@nestjs/common';
4-
import { DataStatusEnum } from '~/management/identities/_enums/data-status';
4+
import {DataStatusEnum} from '~/management/identities/_enums/data-status';
55
import {ActionType} from "~/core/backends/_enum/action-type.enum";
66

77

8-
98
@Injectable()
109
export class IdentitiesForcepasswordService extends AbstractIdentitiesService {
1110

@@ -30,6 +29,7 @@ export class IdentitiesForcepasswordService extends AbstractIdentitiesService {
3029
error: 'Bad Request',
3130
statusCode: 400,
3231
});
32+
}
3333
//ok on envoie le changement de mdp
3434
try{
3535
const [_, response] = await this.backends.executeJob(
@@ -45,6 +45,8 @@ export class IdentitiesForcepasswordService extends AbstractIdentitiesService {
4545
},
4646
);
4747
if (response?.status === 0) {
48+
//activation de l'identité
49+
await this.activation(id,DataStatusEnum.ACTIVE)
4850
return [_, response];
4951
}
5052
}catch (e) {
@@ -53,8 +55,30 @@ export class IdentitiesForcepasswordService extends AbstractIdentitiesService {
5355
'Une erreur est survenue : Tentative de réinitialisation de mot de passe impossible',
5456
);
5557
}
56-
57-
58+
}
59+
public async needToChangePassword(id: string){
60+
let identity: Identities = null;
61+
try {
62+
identity = await this.findById<Identities>(id);
63+
} catch (error) {
64+
throw new HttpException('Id not found', 400);
5865
}
66+
if (identity.lastBackendSync === null) {
67+
throw new HttpException('Identity has never been synced', 400);
68+
}
69+
if (identity.dataStatus === DataStatusEnum.DELETED) {
70+
throw new BadRequestException('Identity is in status deleted');
71+
}
72+
if (identity.dataStatus === DataStatusEnum.INACTIVE) {
73+
throw new BadRequestException('Identity is in status disabled');
74+
}
75+
//desactivation du compte
76+
try{
77+
await this.activation(id,DataStatusEnum.PASSWORDNEEDTOBECHANGED)
78+
}catch{
79+
throw new BadRequestException('Error changing status');
80+
}
81+
5982
}
83+
6084
}

src/management/passwd/passwd.service.ts

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { InjectRedis } from '@nestjs-modules/ioredis';
1+
import {InjectRedis} from '@nestjs-modules/ioredis';
22
import {
33
BadRequestException,
44
HttpException,
@@ -8,29 +8,30 @@ import {
88
NotFoundException,
99
} from '@nestjs/common';
1010
import * as crypto from 'crypto';
11-
import { randomInt } from 'crypto';
11+
import {randomInt} from 'crypto';
1212
import Redis from 'ioredis';
13-
import { AbstractService } from '~/_common/abstracts/abstract.service';
14-
import { ActionType } from '~/core/backends/_enum/action-type.enum';
15-
import { BackendsService } from '~/core/backends/backends.service';
16-
import { Jobs } from '~/core/jobs/_schemas/jobs.schema';
17-
import { AskTokenDto } from './_dto/ask-token.dto';
18-
import { ChangePasswordDto } from './_dto/change-password.dto';
19-
import { ResetPasswordDto } from './_dto/reset-password.dto';
20-
import { IdentitiesCrudService } from '../identities/identities-crud.service';
21-
import { get } from 'radash';
22-
import { Identities } from '../identities/_schemas/identities.schema';
23-
import { MailerService } from '@nestjs-modules/mailer';
24-
import { InitAccountDto } from '~/management/passwd/_dto/init-account.dto';
25-
import { ConfigService } from '@nestjs/config';
26-
import { ResetByCodeDto } from '~/management/passwd/_dto/reset-by-code.dto';
27-
import { PasswdadmService } from '~/settings/passwdadm.service';
28-
import { IdentityState } from '~/management/identities/_enums/states.enum';
29-
import { InitResetDto } from '~/management/passwd/_dto/init-reset.dto';
30-
import { SmsadmService } from '~/settings/smsadm.service';
31-
import { InitManyDto } from '~/management/passwd/_dto/init-many.dto';
32-
import { InitStatesEnum } from '~/management/identities/_enums/init-state.enum';
33-
import { MailadmService } from '~/settings/mailadm.service';
13+
import {AbstractService} from '~/_common/abstracts/abstract.service';
14+
import {ActionType} from '~/core/backends/_enum/action-type.enum';
15+
import {BackendsService} from '~/core/backends/backends.service';
16+
import {Jobs} from '~/core/jobs/_schemas/jobs.schema';
17+
import {AskTokenDto} from './_dto/ask-token.dto';
18+
import {ChangePasswordDto} from './_dto/change-password.dto';
19+
import {ResetPasswordDto} from './_dto/reset-password.dto';
20+
import {IdentitiesCrudService} from '../identities/identities-crud.service';
21+
import {get} from 'radash';
22+
import {Identities} from '../identities/_schemas/identities.schema';
23+
import {MailerService} from '@nestjs-modules/mailer';
24+
import {InitAccountDto} from '~/management/passwd/_dto/init-account.dto';
25+
import {ConfigService} from '@nestjs/config';
26+
import {ResetByCodeDto} from '~/management/passwd/_dto/reset-by-code.dto';
27+
import {PasswdadmService} from '~/settings/passwdadm.service';
28+
import {IdentityState} from '~/management/identities/_enums/states.enum';
29+
import {InitResetDto} from '~/management/passwd/_dto/init-reset.dto';
30+
import {SmsadmService} from '~/settings/smsadm.service';
31+
import {InitManyDto} from '~/management/passwd/_dto/init-many.dto';
32+
import {InitStatesEnum} from '~/management/identities/_enums/init-state.enum';
33+
import {MailadmService} from '~/settings/mailadm.service';
34+
import {DataStatusEnum} from "~/management/identities/_enums/data-status";
3435

3536
interface TokenData {
3637
k: string;
@@ -141,6 +142,12 @@ export class PasswdService extends AbstractService {
141142
//recherche de l'identity
142143
try {
143144
const identity = (await this.identities.findOne({ 'inetOrgPerson.uid': initDto.uid })) as Identities;
145+
//test si on peu reninitialiser le compte
146+
if ( identity.dataStatus == DataStatusEnum.INACTIVE){
147+
throw new BadRequestException(
148+
'Une erreur est survenue : Tentative de réinitialisation de mot de passe impossible',
149+
);
150+
}
144151
//envoi du mail
145152
const params = await this.passwdadmService.getPolicies();
146153
const mailAttribute = params.emailAttribute;
@@ -200,6 +207,11 @@ export class PasswdService extends AbstractService {
200207
'inetOrgPerson.uid': passwdDto.uid,
201208
state: IdentityState.SYNCED,
202209
})) as Identities;
210+
if ( identity.dataStatus == DataStatusEnum.INACTIVE){
211+
throw new BadRequestException(
212+
'Une erreur est survenue : Tentative de réinitialisation de mot de passe impossible',
213+
);
214+
}
203215
//verification de la police de mdp
204216
if ((await this.passwdadmService.checkPolicies(passwdDto.newPassword)) === false) {
205217
throw new BadRequestException({

0 commit comments

Comments
 (0)