Skip to content

Commit c1c4b6c

Browse files
Merge pull request #10 from Libertech-FR/8-rework-yup-validation
8 rework yup validation
2 parents bef00f4 + cd506b9 commit c1c4b6c

32 files changed

+953
-387
lines changed

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ on:
77
branches: [main]
88

99
jobs:
10-
build:
10+
test:
1111
runs-on: ubuntu-latest
1212

1313
strategy:

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ stop-dbs: ## Stop dependencies for development
4444
@docker compose --project-directory docker rm -f $(APPNAME)-redis $(APPNAME)-mongo
4545

4646
run-test: ## Run tests
47-
act --container-architecture="linux/arm64"
47+
act --container-architecture="linux/arm64" -j test
4848

4949
gen-doc:
5050
npx @compodoc/compodoc -p tsconfig.json -s -d docs --includes ./markdowns -n "Sesame Orchestrator"
Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
11

2-
# Documentation Technique - Service de Validation des Identités
2+
# Documentation Technique - Service de Validation des Identités (Mise à Jour)
33

44
## Description
5-
Ce document décrit le fonctionnement du service de validation des identités dans une application NestJS, en utilisant `yup` pour la validation des données.
5+
Cette documentation mise à jour décrit les améliorations apportées au service de validation des identités dans une application NestJS. Ce service utilise `yup` pour la validation des données et `ajv` pour gérer la validation des schémas JSON et YML. Les fichiers de configuration YML sont chargés dynamiquement et convertis en schémas `yup` pour valider les données utilisateur.
66

77
## Services
88

99
### IdentitiesValidationService
1010

11+
#### Modifications Clés
12+
- Extraction de la logique de validation d'attributs dans une méthode privée `validateAttribute`, améliorant la lisibilité et la maintenabilité.
13+
- Utilisation améliorée de la gestion des erreurs pour fournir des messages d'erreur spécifiques.
14+
- Commentaires et annotations de type TypeScript ajoutés pour une meilleure compréhension et utilisation du type checking de TypeScript.
15+
1116
#### Méthodes
1217
- `validate(data: AdditionalFieldsPart): Promise<object>`
1318
- Valide les données fournies en utilisant des schémas de validation `yup`.
14-
- Les schémas de validation sont chargés à partir de fichiers de configuration YAML spécifiques à chaque classe d'objet.
15-
- En cas d'erreur de validation, une promesse rejetée est renvoyée avec les détails des erreurs.
19+
- Les schémas sont chargés à partir de fichiers YAML spécifiques à chaque classe d'objet.
20+
- Renvoie une promesse rejetée avec les détails des erreurs en cas d'échec de la validation.
21+
- `private validateAttribute(key: string, attribute: any): Promise<string | null>`
22+
- Valide un attribut individuel.
23+
- Renvoie un message d'erreur spécifique ou `null` si la validation réussit.
1624

1725
#### Utilisation
1826
```typescript
@@ -22,12 +30,8 @@ class IdentitiesValidationService {
2230
// ... Implémentation de la validation
2331
}
2432

25-
private getValidator(type, required = false): yup.AnyObject {
26-
// ... Implémentation du sélecteur de validateur
27-
}
28-
29-
async createSchema(attributes: ConfigObjectAttributeDTO[]): Promise<yup.ObjectSchema<any>> {
30-
// ... Création du schéma yup
33+
private async validateAttribute(key: string, attribute: any): Promise<string | null> {
34+
// ... Implémentation de la validation d'un attribut individuel
3135
}
3236
}
3337
```
@@ -38,21 +42,26 @@ class IdentitiesValidationService {
3842
- Représente les champs supplémentaires d'une identité.
3943
- Utilisé par `IdentitiesValidationService` pour la validation.
4044

41-
### inetOrgPerson
42-
- Représente une personne dans l'organisation.
43-
- Défini avec des champs spécifiques comme `cn`, `sn`, `uid`, etc.
45+
### ConfigObjectSchemaDTO
46+
- Nouveau modèle ajouté pour représenter les schémas de configuration des objets.
4447

4548
## Configuration
4649

4750
### Fichiers YAML
4851
- Chaque classe d'objet a son fichier de configuration YAML correspondant.
49-
- Exemple : `supann.yml` contient la configuration pour la classe d'objet `supannPerson`.
52+
- Ces fichiers sont utilisés pour générer des schémas de validation `yup`.
53+
54+
## Intégrations
55+
56+
### Intégration avec AJV
57+
- AJV est utilisé pour compiler et valider les schémas JSON.
58+
- Amélioration de la gestion des erreurs et des validations de schémas.
5059

51-
## Intégration avec Mongoose
52-
- Les schémas Mongoose sont utilisés pour définir le modèle de données.
53-
- Des hooks (`pre validate`, `pre save`) sont utilisés pour intégrer la validation `yup` dans le cycle de vie des documents Mongoose.
60+
### Intégration avec Mongoose
61+
- Les schémas Mongoose sont définis comme auparavant.
62+
- La validation `yup` est intégrée dans le cycle de vie des documents Mongoose via des hooks (`pre validate`, `pre save`).
5463

5564
## Module
5665

5766
### IdentitiesModule
58-
- Configure le schéma Mongoose et intègre le service de validation.
67+
- Configure le schéma Mongoose et intègre le service de validation avec les améliorations apportées.

docs/user/IdentitiesValidation.md

Lines changed: 197 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Le système de validation d'identité utilise des fichiers de configuration YAML
1010
Les champs de base de l'objet `inetOrgPerson` sont validés par défaut.
1111

1212
### Champs obligatoires :
13-
- `cn`
13+
- `cn`
1414
- `sn`
1515
- `uid`
1616

@@ -34,53 +34,212 @@ Les champs de base de l'objet `inetOrgPerson` sont validés par défaut.
3434

3535
Le fichier de configuration YAML doit être nommé selon le nom de l'`objectClass` qu'il définit, par exemple `supann.yml` pour l'`objectClass` `supann`. Il doit être placé dans le dossier `TBD`.
3636

37+
Vous pouvez vous baser sur le template si dessous pour créer votre fichier YAML. Les champs $schema, type, properties et required sont obligatoires. Vpis ajouterez le champs désirés dans properties. Pour les champs requis, vous les listerez dans required.
38+
39+
#### Exemple Générique de Fichier YAML
40+
41+
```yaml
42+
$schema: "http://json-schema.org/draft-07/schema#"
43+
type: "object"
44+
properties:
45+
[Nom de l'attribut 1] :
46+
description: "[Description de l'attribut]"
47+
type: [Type de l'attribut]
48+
[Autres options]
49+
# plus de détails d'attributs...
50+
required:
51+
- [Nom de l'attribut 1]
52+
- [Nom de l'attribut 2]
53+
# plus d'attributs requis...
54+
55+
```
56+
57+
3758
#### Exemple de Fichier YAML (`supann.yml`)
3859

3960
Ce fichier définit la structure et les attributs requis pour l'`objectClass` `supann`.
4061

4162
```yaml
42-
objectClasses:
43-
- name: supann
44-
desc: 'SUPANN person object class'
45-
attributes:
46-
- supannEmpId
47-
- supannCivilite
48-
- supannBirthName
49-
# more attributes...
50-
51-
attributes:
52-
- name: supannEmpId
53-
desc: 'Employee ID'
54-
type: string
63+
$schema: "http://json-schema.org/draft-07/schema#"
64+
type: "object"
65+
properties:
66+
supannEmpId:
67+
type: "string"
68+
description: "Employee ID"
69+
supannCivilite:
70+
type: "string"
71+
description: "Title (Mr, Ms, etc.)"
72+
supannBirthName:
73+
type: "string"
74+
description: "Birth name"
75+
supannBirthDate:
76+
type: "string"
77+
format: "date"
78+
description: "Date of birth"
79+
# plus d'attributs...
80+
required:
81+
- "supannEmpId"
82+
- "supannCivilite"
83+
- "supannBirthName"
84+
```
5585
56-
- name: supannCivilite
57-
desc: 'Title (Mr, Ms, etc.)'
58-
type: string
86+
### Options
5987
60-
- name: supannBirthName
61-
desc: 'Birth name'
88+
Chaque attribut peut avoir des options supplémentaires pour définir des règles de validation spécifiques. Les options sont définies en tant que clés dans le fichier YAML.
89+
90+
#### Array (Tableau)
91+
- **ensure**: Assure que la valeur est toujours un tableau.
92+
```yaml
93+
type: array
94+
ensure: true
95+
```
96+
- **compact**: Supprime les valeurs vides du tableau.
97+
```yaml
98+
type: array
99+
compact: true
100+
```
101+
- **items (of)** : Définit le type des éléments du tableau.
102+
103+
```yaml
104+
type: array
105+
items:
62106
type: string
63-
# more attributes...
64-
```
107+
```
108+
- **maxItems (max)** : Définit le nombre maximum d'éléments du tableau.
109+
```yaml
110+
type: array
111+
maxItems: 5
112+
```
113+
- **minItems (min)** : Définit le nombre minimum d'éléments du tableau.
114+
```yaml
115+
type: array
116+
minItems: 2
117+
```
65118
66-
#### Exemple Générique de Fichier YAML
119+
#### Boolean (Booléen)
120+
- *Pas de clés spécifiques*
121+
```yaml
122+
type: boolean
123+
```
124+
125+
#### Date
126+
- **maxDate (max)**: Définit la date maximum.
127+
```yaml
128+
type: date
129+
maxDate: '2024-01-01'
130+
```
131+
- **minDate (min)**: Définit la date minimum.
132+
```yaml
133+
type: date
134+
minDate: '2020-01-01'
135+
```
136+
137+
#### Number (Nombre)
138+
- **integer**: Définit que la valeur doit être un entier.
139+
```yaml
140+
type: number
141+
integer: true
142+
```
143+
- **moreThan (exclusiveMinimum)**: Définit la valeur minimum.
144+
```yaml
145+
type: number
146+
moreThan: 10
147+
```
148+
- **lessThan (exclusiveMaximum)**: Définit la valeur maximum.
149+
```yaml
150+
type: number
151+
lessThan: 20
152+
```
153+
- **positive**: Définit que la valeur doit être positive.
154+
```yaml
155+
type: number
156+
positive: true
157+
```
158+
- **negative**: Définit que la valeur doit être négative.
159+
```yaml
160+
type: number
161+
negative: true
162+
```
163+
- **min (minimum)**: Définit la valeur minimum.
164+
```yaml
165+
type: number
166+
min: 5
167+
```
168+
- **max (maximum)**: Définit la valeur maximum.
169+
```yaml
170+
type: number
171+
max: 100
172+
```
173+
- **truncate**: Tronque la valeur.
174+
```yaml
175+
type: number
176+
truncate: true
177+
```
178+
- **round**: Arrondi la valeur.
179+
```yaml
180+
type: number
181+
round: true
182+
```
183+
184+
#### Object (Objet)
185+
- **camelCase**: Convertit les clés de l'objet en camelCase.
186+
```yaml
187+
type: object
188+
camelCase: true
189+
```
190+
- **constantCase**: Convertit les clés de l'objet en CONSTANT_CASE.
191+
```yaml
192+
type: object
193+
constantCase: true
194+
```
195+
- **noUnknown (propertyNames)**: Définit que l'objet ne peut pas contenir de clés non définies.
196+
```yaml
197+
type: object
198+
noUnknown: true
199+
```
200+
201+
#### String (Chaîne de caractères)
202+
- **minLength (min)**: Définit la longueur minimum de la chaîne de caractères.
203+
```yaml
204+
type: string
205+
minLength: 5
206+
```
207+
- **maxLength (max)**: Définit la longueur maximum de la chaîne de caractères.
208+
```yaml
209+
type: string
210+
maxLength: 20
211+
```
212+
- **pattern (matches or regex)**: Définit une expression régulière à respecter.
213+
```yaml
214+
type: string
215+
pattern: '^[a-zA-Z]+$'
216+
```
217+
- **email (format: 'email')**: Définit que la chaîne de caractères doit être un email.
218+
```yaml
219+
type: string
220+
email: true
221+
```
222+
- **url (format: 'url')**: Définit que la chaîne de caractères doit être une URL.
223+
```yaml
224+
type: string
225+
url: true
226+
```
227+
- **lowercase**: Convertit la chaîne de caractères en minuscule.
228+
```yaml
229+
type: string
230+
lowercase: true
231+
```
232+
- **uppercase**: Convertit la chaîne de caractères en majuscule.
233+
```yaml
234+
type: string
235+
uppercase: true
236+
```
237+
- **trim**: Supprime les espaces en début et fin de chaîne de caractères.
238+
```yaml
239+
type: string
240+
trim: true
241+
```
67242
68-
```yaml
69-
objectClasses:
70-
- name: [Nom de l'ObjectClass]
71-
desc: '[Description de l'ObjectClass]'
72-
attributes:
73-
- [Nom de l'attribut 1]
74-
- [Nom de l'attribut 2]
75-
# plus d'attributs...
76-
77-
attributes:
78-
- name: [Nom de l'attribut 1]
79-
desc: '[Description de l'attribut]'
80-
type: [Type de l'attribut]
81-
required: [true/false]
82-
# plus de détails d'attributs...
83-
```
84243
85244
### JSON de Validation
86245

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
"@nestjs/passport": "^10.0.2",
5656
"@nestjs/platform-express": "^10.0.0",
5757
"@streamkits/nestjs_module_scrud": "^0.0.16",
58+
"ajv": "^8.12.0",
59+
"ajv-errors": "^3.0.0",
5860
"bullmq": "^4.14.0",
5961
"class-transformer": "^0.5.1",
6062
"class-validator": "^0.14.0",
@@ -69,6 +71,7 @@
6971
"reflect-metadata": "^0.1.13",
7072
"request-ip": "^3.3.0",
7173
"rxjs": "^7.8.1",
74+
"schema-to-yup": "^1.12.18",
7275
"winston": "^3.11.0",
7376
"winston-mongodb": "^5.1.1",
7477
"winston-transport": "^4.6.0",
@@ -133,4 +136,4 @@
133136
"downloadUrl": "https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-debian10-5.0.22.tgz"
134137
}
135138
}
136-
}
139+
}

0 commit comments

Comments
 (0)