@programisto/edrm-exams 0.3.7 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +1 -1
  2. package/dist/bin/www.js +1 -1
  3. package/dist/modules/edrm-exams/listeners/correct.listener.d.ts +1 -1
  4. package/dist/modules/edrm-exams/listeners/correct.listener.js +1 -1
  5. package/dist/modules/edrm-exams/models/candidate.model.d.ts +1 -1
  6. package/dist/modules/edrm-exams/models/candidate.model.js +1 -1
  7. package/dist/modules/edrm-exams/models/company.model.d.ts +1 -1
  8. package/dist/modules/edrm-exams/models/company.model.js +1 -1
  9. package/dist/modules/edrm-exams/models/contact.model.d.ts +1 -1
  10. package/dist/modules/edrm-exams/models/contact.model.js +1 -1
  11. package/dist/modules/edrm-exams/models/test-category.models.d.ts +1 -1
  12. package/dist/modules/edrm-exams/models/test-category.models.js +1 -1
  13. package/dist/modules/edrm-exams/models/test-job.model.d.ts +1 -1
  14. package/dist/modules/edrm-exams/models/test-job.model.js +1 -1
  15. package/dist/modules/edrm-exams/models/test-question.model.d.ts +1 -1
  16. package/dist/modules/edrm-exams/models/test-question.model.js +1 -1
  17. package/dist/modules/edrm-exams/models/test-result.model.d.ts +1 -1
  18. package/dist/modules/edrm-exams/models/test-result.model.js +1 -1
  19. package/dist/modules/edrm-exams/models/test.model.d.ts +1 -1
  20. package/dist/modules/edrm-exams/models/test.model.js +1 -1
  21. package/dist/modules/edrm-exams/models/user.model.d.ts +1 -1
  22. package/dist/modules/edrm-exams/models/user.model.js +1 -1
  23. package/dist/modules/edrm-exams/routes/company.router.d.ts +1 -1
  24. package/dist/modules/edrm-exams/routes/company.router.js +136 -7
  25. package/dist/modules/edrm-exams/routes/exams-candidate.router.d.ts +1 -1
  26. package/dist/modules/edrm-exams/routes/exams-candidate.router.js +227 -8
  27. package/dist/modules/edrm-exams/routes/exams.router.d.ts +1 -1
  28. package/dist/modules/edrm-exams/routes/exams.router.js +1022 -40
  29. package/dist/modules/edrm-exams/routes/result.router.d.ts +1 -1
  30. package/dist/modules/edrm-exams/routes/result.router.js +153 -6
  31. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
- import { EnduranceRouter, EnduranceAuthMiddleware, enduranceEmitter, enduranceEventTypes } from '@programisto/endurance-core';
1
+ import { EnduranceRouter, EnduranceAuthMiddleware, enduranceEmitter, enduranceEventTypes } from '@programisto/endurance';
2
2
  import CandidateModel from '../models/candidate.model.js';
3
3
  import ContactModel from '../models/contact.model.js';
4
4
  import TestResult from '../models/test-result.model.js';
@@ -32,7 +32,51 @@ class CandidateRouter extends EnduranceRouter {
32
32
  requireAuth: false,
33
33
  permissions: []
34
34
  };
35
- // Créer un nouveau candidat
35
+ /**
36
+ * @swagger
37
+ * /candidates:
38
+ * post:
39
+ * summary: Créer un candidat
40
+ * description: Crée un contact et un candidat ou réutilise un contact existant selon l'email.
41
+ * tags: [Candidats]
42
+ * requestBody:
43
+ * required: true
44
+ * content:
45
+ * application/json:
46
+ * schema:
47
+ * type: object
48
+ * required: [firstname, lastname, email, city, skills]
49
+ * properties:
50
+ * firstname:
51
+ * type: string
52
+ * lastname:
53
+ * type: string
54
+ * email:
55
+ * type: string
56
+ * phone:
57
+ * type: string
58
+ * linkedin:
59
+ * type: string
60
+ * city:
61
+ * type: string
62
+ * experienceLevel:
63
+ * type: string
64
+ * yearsOfExperience:
65
+ * type: number
66
+ * skills:
67
+ * type: array
68
+ * items:
69
+ * type: string
70
+ * responses:
71
+ * 201:
72
+ * description: Candidat créé
73
+ * 200:
74
+ * description: Candidat existant retourné
75
+ * 400:
76
+ * description: Paramètres manquants
77
+ * 500:
78
+ * description: Erreur interne
79
+ */
36
80
  this.post('/', authenticatedOptions, async (req, res) => {
37
81
  const { firstname, lastname, email, phone, linkedin, city, experienceLevel, yearsOfExperience, skills } = req.body;
38
82
  console.log(req.body);
@@ -113,7 +157,45 @@ class CandidateRouter extends EnduranceRouter {
113
157
  res.status(500).json({ message: 'Internal server error' });
114
158
  }
115
159
  });
116
- // Lister tous les candidats
160
+ /**
161
+ * @swagger
162
+ * /candidates:
163
+ * get:
164
+ * summary: Lister les candidats
165
+ * description: Retourne les candidats avec contact, pagination, recherche et tri.
166
+ * tags: [Candidats]
167
+ * parameters:
168
+ * - in: query
169
+ * name: page
170
+ * schema:
171
+ * type: integer
172
+ * default: 1
173
+ * - in: query
174
+ * name: limit
175
+ * schema:
176
+ * type: integer
177
+ * default: 10
178
+ * - in: query
179
+ * name: search
180
+ * schema:
181
+ * type: string
182
+ * description: Recherche sur prénom, nom, email
183
+ * - in: query
184
+ * name: sortBy
185
+ * schema:
186
+ * type: string
187
+ * default: lastname
188
+ * - in: query
189
+ * name: sortOrder
190
+ * schema:
191
+ * type: string
192
+ * default: asc
193
+ * responses:
194
+ * 200:
195
+ * description: Liste paginée des candidats
196
+ * 500:
197
+ * description: Erreur interne
198
+ */
117
199
  this.get('/', authenticatedOptions, async (req, res) => {
118
200
  try {
119
201
  const page = parseInt(req.query.page) || 1;
@@ -207,7 +289,27 @@ class CandidateRouter extends EnduranceRouter {
207
289
  res.status(500).json({ message: 'Internal server error' });
208
290
  }
209
291
  });
210
- // Obtenir un candidat par son ID
292
+ /**
293
+ * @swagger
294
+ * /candidates/{id}:
295
+ * get:
296
+ * summary: Détail d'un candidat
297
+ * description: Récupère un candidat et son contact par ID.
298
+ * tags: [Candidats]
299
+ * parameters:
300
+ * - in: path
301
+ * name: id
302
+ * required: true
303
+ * schema:
304
+ * type: string
305
+ * responses:
306
+ * 200:
307
+ * description: Candidat trouvé
308
+ * 404:
309
+ * description: Candidat non trouvé
310
+ * 500:
311
+ * description: Erreur interne
312
+ */
211
313
  this.get('/:id', authenticatedOptions, async (req, res) => {
212
314
  const { id } = req.params;
213
315
  try {
@@ -233,7 +335,27 @@ class CandidateRouter extends EnduranceRouter {
233
335
  res.status(500).json({ message: 'Internal server error' });
234
336
  }
235
337
  });
236
- // Obtenir un candidat par son email
338
+ /**
339
+ * @swagger
340
+ * /candidates/email/{email}:
341
+ * get:
342
+ * summary: Détail d'un candidat par email
343
+ * description: Cherche le contact par email puis retourne le candidat associé.
344
+ * tags: [Candidats]
345
+ * parameters:
346
+ * - in: path
347
+ * name: email
348
+ * required: true
349
+ * schema:
350
+ * type: string
351
+ * responses:
352
+ * 200:
353
+ * description: Candidat trouvé
354
+ * 404:
355
+ * description: Contact ou candidat non trouvé
356
+ * 500:
357
+ * description: Erreur interne
358
+ */
237
359
  this.get('/email/:email', authenticatedOptions, async (req, res) => {
238
360
  try {
239
361
  const email = req.params.email;
@@ -257,7 +379,33 @@ class CandidateRouter extends EnduranceRouter {
257
379
  res.status(500).send('Erreur interne du serveur');
258
380
  }
259
381
  });
260
- // Générer un lien magique pour le candidat
382
+ /**
383
+ * @swagger
384
+ * /candidates/magic-link:
385
+ * post:
386
+ * summary: Générer un lien magique
387
+ * description: Génère un token d'accès court pour un candidat et envoie l'email.
388
+ * tags: [Candidats]
389
+ * requestBody:
390
+ * required: true
391
+ * content:
392
+ * application/json:
393
+ * schema:
394
+ * type: object
395
+ * required: [email]
396
+ * properties:
397
+ * email:
398
+ * type: string
399
+ * responses:
400
+ * 200:
401
+ * description: Lien envoyé
402
+ * 404:
403
+ * description: Contact ou candidat non trouvé
404
+ * 400:
405
+ * description: Email manquant
406
+ * 500:
407
+ * description: Erreur interne
408
+ */
261
409
  this.post('/magic-link', { requireAuth: false }, async (req, res) => {
262
410
  try {
263
411
  const { email } = req.body;
@@ -303,7 +451,33 @@ class CandidateRouter extends EnduranceRouter {
303
451
  res.status(500).send('Erreur interne du serveur');
304
452
  }
305
453
  });
306
- // Vérifier et consommer le token magique
454
+ /**
455
+ * @swagger
456
+ * /candidates/verify-magic-link:
457
+ * post:
458
+ * summary: Vérifier un lien magique
459
+ * description: Valide le token magique, génère un authToken 24h et retourne le candidat.
460
+ * tags: [Candidats]
461
+ * requestBody:
462
+ * required: true
463
+ * content:
464
+ * application/json:
465
+ * schema:
466
+ * type: object
467
+ * required: [token]
468
+ * properties:
469
+ * token:
470
+ * type: string
471
+ * responses:
472
+ * 200:
473
+ * description: Authentification réussie
474
+ * 400:
475
+ * description: Token manquant
476
+ * 401:
477
+ * description: Token invalide ou expiré
478
+ * 500:
479
+ * description: Erreur interne
480
+ */
307
481
  this.post('/verify-magic-link', { requireAuth: false }, async (req, res) => {
308
482
  try {
309
483
  const { token } = req.body;
@@ -357,7 +531,52 @@ class CandidateRouter extends EnduranceRouter {
357
531
  res.status(500).send('Erreur interne du serveur');
358
532
  }
359
533
  });
360
- // Lister tous les résultats de tests d'un candidat
534
+ /**
535
+ * @swagger
536
+ * /candidates/results/{candidateId}:
537
+ * get:
538
+ * summary: Lister les résultats d'un candidat
539
+ * description: Liste paginée des résultats d'un candidat avec filtrage état et tri.
540
+ * tags: [Candidats]
541
+ * parameters:
542
+ * - in: path
543
+ * name: candidateId
544
+ * required: true
545
+ * schema:
546
+ * type: string
547
+ * - in: query
548
+ * name: page
549
+ * schema:
550
+ * type: integer
551
+ * default: 1
552
+ * - in: query
553
+ * name: limit
554
+ * schema:
555
+ * type: integer
556
+ * default: 10
557
+ * - in: query
558
+ * name: state
559
+ * schema:
560
+ * type: string
561
+ * default: all
562
+ * - in: query
563
+ * name: sortBy
564
+ * schema:
565
+ * type: string
566
+ * default: invitationDate
567
+ * - in: query
568
+ * name: sortOrder
569
+ * schema:
570
+ * type: string
571
+ * default: desc
572
+ * responses:
573
+ * 200:
574
+ * description: Résultats paginés
575
+ * 404:
576
+ * description: Candidat non trouvé
577
+ * 500:
578
+ * description: Erreur interne
579
+ */
361
580
  this.get('/results/:candidateId', authenticatedOptions, async (req, res) => {
362
581
  try {
363
582
  const { candidateId } = req.params;
@@ -1,4 +1,4 @@
1
- import { EnduranceRouter } from '@programisto/endurance-core';
1
+ import { EnduranceRouter } from '@programisto/endurance';
2
2
  declare class ExamsRouter extends EnduranceRouter {
3
3
  constructor();
4
4
  private generateAndSaveQuestion;