@programisto/edrm-exams 0.2.1 → 0.2.3
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.
- package/dist/modules/edrm-exams/models/user.model.d.ts +4 -4
- package/dist/modules/edrm-exams/models/user.model.js +21 -12
- package/dist/modules/edrm-exams/routes/company.router.js +2 -2
- package/dist/modules/edrm-exams/routes/exams-candidate.router.js +4 -4
- package/dist/modules/edrm-exams/routes/exams.router.js +29 -9
- package/dist/modules/edrm-exams/routes/user.router.js +8 -8
- package/package.json +1 -1
|
@@ -5,14 +5,14 @@ declare enum UserRole {
|
|
|
5
5
|
Recruiter = "recruiter",
|
|
6
6
|
Candidate = "candidate"
|
|
7
7
|
}
|
|
8
|
-
declare class
|
|
8
|
+
declare class UserExam extends EnduranceSchema {
|
|
9
9
|
firstName: string;
|
|
10
10
|
lastName: string;
|
|
11
11
|
email: string;
|
|
12
12
|
password: string;
|
|
13
13
|
role: UserRole;
|
|
14
14
|
companyId?: typeof Company;
|
|
15
|
-
static getModel(): import("@typegoose/typegoose").ReturnModelType<typeof
|
|
15
|
+
static getModel(): import("@typegoose/typegoose").ReturnModelType<typeof UserExam, import("@typegoose/typegoose/lib/types.js").BeAnObject>;
|
|
16
16
|
}
|
|
17
|
-
declare const
|
|
18
|
-
export default
|
|
17
|
+
declare const UserExamModel: import("@typegoose/typegoose").ReturnModelType<typeof UserExam, import("@typegoose/typegoose/lib/types.js").BeAnObject>;
|
|
18
|
+
export default UserExamModel;
|
|
@@ -18,7 +18,7 @@ var UserRole;
|
|
|
18
18
|
// eslint-disable-next-line no-unused-vars
|
|
19
19
|
UserRole["Candidate"] = "candidate";
|
|
20
20
|
})(UserRole || (UserRole = {}));
|
|
21
|
-
let
|
|
21
|
+
let UserExam = class UserExam extends EnduranceSchema {
|
|
22
22
|
firstName;
|
|
23
23
|
lastName;
|
|
24
24
|
email;
|
|
@@ -26,39 +26,48 @@ let User = class User extends EnduranceSchema {
|
|
|
26
26
|
role;
|
|
27
27
|
companyId;
|
|
28
28
|
static getModel() {
|
|
29
|
-
return
|
|
29
|
+
return UserExamModel;
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
32
|
__decorate([
|
|
33
33
|
EnduranceModelType.prop({ required: true }),
|
|
34
34
|
__metadata("design:type", String)
|
|
35
|
-
],
|
|
35
|
+
], UserExam.prototype, "firstName", void 0);
|
|
36
36
|
__decorate([
|
|
37
37
|
EnduranceModelType.prop({ required: true }),
|
|
38
38
|
__metadata("design:type", String)
|
|
39
|
-
],
|
|
39
|
+
], UserExam.prototype, "lastName", void 0);
|
|
40
40
|
__decorate([
|
|
41
41
|
EnduranceModelType.prop({ required: true, unique: true }),
|
|
42
42
|
__metadata("design:type", String)
|
|
43
|
-
],
|
|
43
|
+
], UserExam.prototype, "email", void 0);
|
|
44
44
|
__decorate([
|
|
45
45
|
EnduranceModelType.prop({ required: true }),
|
|
46
46
|
__metadata("design:type", String)
|
|
47
|
-
],
|
|
47
|
+
], UserExam.prototype, "password", void 0);
|
|
48
48
|
__decorate([
|
|
49
49
|
EnduranceModelType.prop({ required: true, enum: UserRole }),
|
|
50
50
|
__metadata("design:type", String)
|
|
51
|
-
],
|
|
51
|
+
], UserExam.prototype, "role", void 0);
|
|
52
52
|
__decorate([
|
|
53
53
|
EnduranceModelType.prop({ ref: () => Company }),
|
|
54
54
|
__metadata("design:type", Object)
|
|
55
|
-
],
|
|
56
|
-
|
|
55
|
+
], UserExam.prototype, "companyId", void 0);
|
|
56
|
+
UserExam = __decorate([
|
|
57
57
|
EnduranceModelType.modelOptions({
|
|
58
|
+
schemaOptions: {
|
|
59
|
+
collection: 'users',
|
|
60
|
+
timestamps: true,
|
|
61
|
+
toObject: { virtuals: true },
|
|
62
|
+
toJSON: { virtuals: true },
|
|
63
|
+
_id: true,
|
|
64
|
+
validateBeforeSave: false,
|
|
65
|
+
strict: false
|
|
66
|
+
},
|
|
58
67
|
options: {
|
|
59
68
|
allowMixed: EnduranceModelType.Severity.ALLOW
|
|
60
69
|
}
|
|
61
70
|
})
|
|
62
|
-
],
|
|
63
|
-
const
|
|
64
|
-
export default
|
|
71
|
+
], UserExam);
|
|
72
|
+
const UserExamModel = EnduranceModelType.getModelForClass(UserExam);
|
|
73
|
+
export default UserExamModel;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EnduranceRouter, EnduranceAuthMiddleware } from '@programisto/endurance-core';
|
|
2
2
|
import Company from '../models/company.model.js';
|
|
3
|
-
import
|
|
3
|
+
import UserExam from '../models/user.model.js';
|
|
4
4
|
class CompanyRouter extends EnduranceRouter {
|
|
5
5
|
constructor() {
|
|
6
6
|
super(EnduranceAuthMiddleware.getInstance());
|
|
@@ -82,7 +82,7 @@ class CompanyRouter extends EnduranceRouter {
|
|
|
82
82
|
this.get('/numberOfUser/:id', authenticatedOptions, async (req, res) => {
|
|
83
83
|
const { id } = req.params;
|
|
84
84
|
try {
|
|
85
|
-
const users = await
|
|
85
|
+
const users = await UserExam.find({ companyId: id });
|
|
86
86
|
const numberOfUser = users.length;
|
|
87
87
|
res.status(200).json({ data: numberOfUser });
|
|
88
88
|
}
|
|
@@ -137,11 +137,11 @@ class CandidateRouter extends EnduranceRouter {
|
|
|
137
137
|
// Envoyer l'email avec le lien magique
|
|
138
138
|
const magicLink = `${process.env.CANDIDATE_MAGIC_LINK}${token}`;
|
|
139
139
|
await enduranceEmitter.emit(enduranceEventTypes.SEND_EMAIL, {
|
|
140
|
-
template: 'candidate-magic-link
|
|
140
|
+
template: 'candidate-magic-link',
|
|
141
141
|
to: email,
|
|
142
|
-
from: process.env.
|
|
143
|
-
emailUser: process.env.
|
|
144
|
-
emailPassword: process.env.
|
|
142
|
+
from: process.env.EMAIL_USER,
|
|
143
|
+
emailUser: process.env.EMAIL_USER,
|
|
144
|
+
emailPassword: process.env.EMAIL_PASSWORD,
|
|
145
145
|
data: {
|
|
146
146
|
magicLink
|
|
147
147
|
}
|
|
@@ -553,10 +553,9 @@ class ExamsRouter extends EnduranceRouter {
|
|
|
553
553
|
const emailPassword = process.env.EMAIL_PASSWORD_TURING;
|
|
554
554
|
// Envoyer l'email via l'event emitter
|
|
555
555
|
await emitter.emit(eventTypes.SEND_EMAIL, {
|
|
556
|
-
template: 'test-invitation
|
|
556
|
+
template: 'test-invitation',
|
|
557
557
|
to: email,
|
|
558
558
|
from: emailUser,
|
|
559
|
-
subject: 'Vous êtes invité à passer un test technique - École de Turing',
|
|
560
559
|
emailUser,
|
|
561
560
|
emailPassword,
|
|
562
561
|
data: {
|
|
@@ -822,14 +821,36 @@ class ExamsRouter extends EnduranceRouter {
|
|
|
822
821
|
expertiseLevel: categoryInfo.expertiseLevel,
|
|
823
822
|
otherQuestions: otherQuestions.map(question => question.instruction).join('\n')
|
|
824
823
|
}, true);
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
824
|
+
// Vérifier si la réponse est un JSON valide
|
|
825
|
+
if (generatedQuestion === 'Brain freezed, I cannot generate a live message right now.') {
|
|
826
|
+
console.error('Échec de génération de question pour la catégorie:', categoryDoc.name);
|
|
827
|
+
continue; // Passer à la question suivante
|
|
828
|
+
}
|
|
829
|
+
try {
|
|
830
|
+
const question = new TestQuestion(JSON.parse(generatedQuestion));
|
|
831
|
+
await question.save();
|
|
832
|
+
generatedQuestions.push(question);
|
|
833
|
+
test.questions.push({ questionId: question._id, order: test.questions.length });
|
|
834
|
+
}
|
|
835
|
+
catch (parseError) {
|
|
836
|
+
console.error('Erreur lors du parsing de la question générée:', parseError);
|
|
837
|
+
console.error('Réponse reçue:', generatedQuestion);
|
|
838
|
+
continue; // Passer à la question suivante
|
|
839
|
+
}
|
|
829
840
|
}
|
|
830
841
|
}
|
|
842
|
+
// Vérifier qu'au moins une question a été générée
|
|
843
|
+
if (generatedQuestions.length === 0) {
|
|
844
|
+
return res.status(500).json({
|
|
845
|
+
message: 'Aucune question n\'a pu être générée. Veuillez réessayer plus tard.'
|
|
846
|
+
});
|
|
847
|
+
}
|
|
831
848
|
await test.save();
|
|
832
|
-
res.status(200).json({
|
|
849
|
+
res.status(200).json({
|
|
850
|
+
message: `${generatedQuestions.length} question(s) générée(s) avec succès`,
|
|
851
|
+
questions: generatedQuestions,
|
|
852
|
+
test
|
|
853
|
+
});
|
|
833
854
|
}
|
|
834
855
|
catch (err) {
|
|
835
856
|
console.error('Erreur lors de la génération des questions : ', err);
|
|
@@ -943,10 +964,9 @@ class ExamsRouter extends EnduranceRouter {
|
|
|
943
964
|
const testLink = process.env.TEST_INVITATION_LINK || '';
|
|
944
965
|
// Envoyer l'email via l'event emitter
|
|
945
966
|
await emitter.emit(eventTypes.SEND_EMAIL, {
|
|
946
|
-
template: 'test-invitation
|
|
967
|
+
template: 'test-invitation',
|
|
947
968
|
to: email,
|
|
948
969
|
from: emailUser,
|
|
949
|
-
subject: 'Vous êtes invité à passer un test technique - École de Turing',
|
|
950
970
|
emailUser,
|
|
951
971
|
emailPassword,
|
|
952
972
|
data: {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EnduranceRouter, EnduranceAuthMiddleware } from '@programisto/endurance-core';
|
|
2
|
-
import
|
|
2
|
+
import UserExam from '../models/user.model.js';
|
|
3
3
|
class UserRouter extends EnduranceRouter {
|
|
4
4
|
constructor() {
|
|
5
5
|
super(EnduranceAuthMiddleware.getInstance());
|
|
@@ -12,7 +12,7 @@ class UserRouter extends EnduranceRouter {
|
|
|
12
12
|
// Lister tous les utilisateurs
|
|
13
13
|
this.get('/', authenticatedOptions, async (req, res) => {
|
|
14
14
|
try {
|
|
15
|
-
const users = await
|
|
15
|
+
const users = await UserExam.find();
|
|
16
16
|
res.status(200).json({ array: users });
|
|
17
17
|
}
|
|
18
18
|
catch (err) {
|
|
@@ -27,7 +27,7 @@ class UserRouter extends EnduranceRouter {
|
|
|
27
27
|
return res.status(400).json({ message: 'Error, firstName, lastName, email and companyId are required' });
|
|
28
28
|
}
|
|
29
29
|
try {
|
|
30
|
-
const newUser = new
|
|
30
|
+
const newUser = new UserExam({ firstName, lastName, email, companyId });
|
|
31
31
|
await newUser.save();
|
|
32
32
|
res.status(201).json({ message: 'user created with sucess', user: newUser });
|
|
33
33
|
}
|
|
@@ -40,7 +40,7 @@ class UserRouter extends EnduranceRouter {
|
|
|
40
40
|
this.get('/:id', authenticatedOptions, async (req, res) => {
|
|
41
41
|
const { id } = req.params;
|
|
42
42
|
try {
|
|
43
|
-
const user = await
|
|
43
|
+
const user = await UserExam.findById(id);
|
|
44
44
|
if (!user) {
|
|
45
45
|
return res.status(404).json({ message: 'no user founded with this id' });
|
|
46
46
|
}
|
|
@@ -56,7 +56,7 @@ class UserRouter extends EnduranceRouter {
|
|
|
56
56
|
const { id } = req.params;
|
|
57
57
|
const { firstName, lastName, email, companyId } = req.body;
|
|
58
58
|
try {
|
|
59
|
-
const user = await
|
|
59
|
+
const user = await UserExam.findById(id);
|
|
60
60
|
if (!user) {
|
|
61
61
|
return res.status(404).json({ message: 'no user founded with this id' });
|
|
62
62
|
}
|
|
@@ -66,8 +66,8 @@ class UserRouter extends EnduranceRouter {
|
|
|
66
66
|
email: email || user.email,
|
|
67
67
|
companyId: companyId || user.companyId
|
|
68
68
|
};
|
|
69
|
-
await
|
|
70
|
-
const updatedUser = await
|
|
69
|
+
await UserExam.findByIdAndUpdate(id, updateData, { new: true });
|
|
70
|
+
const updatedUser = await UserExam.findById(id);
|
|
71
71
|
res.status(200).json({ message: 'user updated', user: updatedUser });
|
|
72
72
|
}
|
|
73
73
|
catch (err) {
|
|
@@ -79,7 +79,7 @@ class UserRouter extends EnduranceRouter {
|
|
|
79
79
|
this.delete('/:id', authenticatedOptions, async (req, res) => {
|
|
80
80
|
const { id } = req.params;
|
|
81
81
|
try {
|
|
82
|
-
const user = await
|
|
82
|
+
const user = await UserExam.findByIdAndDelete(id);
|
|
83
83
|
if (!user) {
|
|
84
84
|
return res.status(404).json({ message: 'no user founded with this id' });
|
|
85
85
|
}
|