jp-shared 1.0.0

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 (82) hide show
  1. package/configs/firebase-admin.js +24 -0
  2. package/configs/index.js +3 -0
  3. package/constants/configuration.js +6 -0
  4. package/constants/database.js +6 -0
  5. package/constants/index.js +6 -0
  6. package/constants/org.js +30 -0
  7. package/constants/time-constant.js +4 -0
  8. package/helpers/index.js +4 -0
  9. package/helpers/otp-helper.js +48 -0
  10. package/helpers/validateMongoId.js +13 -0
  11. package/index.js +15 -0
  12. package/models/admin-models/admin-model.js +62 -0
  13. package/models/admin-models/index.js +4 -0
  14. package/models/admin-models/token-model.js +20 -0
  15. package/models/candidate-models/candidateModel.js +375 -0
  16. package/models/candidate-models/index.js +8 -0
  17. package/models/candidate-models/mobileOTPModel.js +75 -0
  18. package/models/candidate-models/otpModel.js +75 -0
  19. package/models/candidate-models/requestModel.js +26 -0
  20. package/models/candidate-models/savedJobModel.js +20 -0
  21. package/models/candidate-models/searchAppearanceModel.js +50 -0
  22. package/models/candidate-models/tokenModel.js +20 -0
  23. package/models/common-models/course-model.js +20 -0
  24. package/models/common-models/downloadedResumeHistory-model.js +54 -0
  25. package/models/common-models/education-model.js +17 -0
  26. package/models/common-models/index.js +19 -0
  27. package/models/common-models/jobApplication-model.js +57 -0
  28. package/models/common-models/jobApproach-model.js +14 -0
  29. package/models/common-models/jobOffer-model.js +20 -0
  30. package/models/common-models/jobType-model.js +22 -0
  31. package/models/common-models/noticePeriod.js +14 -0
  32. package/models/common-models/paymentHistory-model.js +128 -0
  33. package/models/common-models/plan-model.js +144 -0
  34. package/models/common-models/role-model.js +22 -0
  35. package/models/common-models/searchAppearanceHistory-model.js +36 -0
  36. package/models/common-models/skill-model.js +21 -0
  37. package/models/common-models/sms-student-model.js +44 -0
  38. package/models/common-models/speakingLanguage.js +14 -0
  39. package/models/common-models/specialization-model.js +20 -0
  40. package/models/common-models/viewedProfileHistory-model.js +44 -0
  41. package/models/index.js +8 -0
  42. package/models/jobPost-models/active-model.js +71 -0
  43. package/models/jobPost-models/draft-model.js +42 -0
  44. package/models/jobPost-models/expired-model.js +46 -0
  45. package/models/jobPost-models/index.js +10 -0
  46. package/models/jobPost-models/invitation-model.js +72 -0
  47. package/models/jobPost-models/onHold-model.js +58 -0
  48. package/models/jobPost-models/pending-model.js +45 -0
  49. package/models/jobPost-models/rejected-model.js +51 -0
  50. package/models/jobPost-models/verification-model.js +50 -0
  51. package/models/organization-models/active-model.js +111 -0
  52. package/models/organization-models/index.js +4 -0
  53. package/models/organization-models/verification-model.js +52 -0
  54. package/models/recruiter-models/active-model.js +45 -0
  55. package/models/recruiter-models/basicDetail-model.js +113 -0
  56. package/models/recruiter-models/counter-model.js +13 -0
  57. package/models/recruiter-models/emailOTP-model.js +68 -0
  58. package/models/recruiter-models/index.js +10 -0
  59. package/models/recruiter-models/mobileOTP-model.js +88 -0
  60. package/models/recruiter-models/pending-model.js +44 -0
  61. package/models/recruiter-models/request-model.js +75 -0
  62. package/models/recruiter-models/token-model.js +15 -0
  63. package/models/recruiter-models/verification-model.js +63 -0
  64. package/package.json +28 -0
  65. package/schemes/address-schema.js +43 -0
  66. package/schemes/index.js +7 -0
  67. package/schemes/pendingJobPostStep1-schema.js +192 -0
  68. package/schemes/pendingJobPostStep2-scheme.js +117 -0
  69. package/schemes/pendingJobPostStep3-scheme.js +21 -0
  70. package/schemes/pendingJobPostStep4-scheme.js +22 -0
  71. package/utils/env-utils.js +12 -0
  72. package/utils/firebase-utils.js +220 -0
  73. package/utils/index.js +12 -0
  74. package/utils/invoiceTemplate.js +123 -0
  75. package/utils/otp-utils.js +23 -0
  76. package/utils/password-utils.js +49 -0
  77. package/utils/percentageWeights.js +106 -0
  78. package/utils/populate-utils.js +57 -0
  79. package/utils/sendEmail-utils.js +40 -0
  80. package/utils/sendInvoice-utils.js +139 -0
  81. package/utils/token-utils.js +18 -0
  82. package/utils/validate-utils.js +118 -0
@@ -0,0 +1,144 @@
1
+ const mongoose = require("mongoose");
2
+ const { isIntegerValidator } = require("../../utils");
3
+ const { getDatabaseName } = require("../../constants");
4
+
5
+ const planSchema = new mongoose.Schema({
6
+ planName: {
7
+ type: String,
8
+ required: [true, "Plan name is required"],
9
+ minlength: [3, "Plan name must be at least 3 characters long"],
10
+ maxlength: [100, "Plan name cannot exceed 100 characters"],
11
+ trim: true,
12
+ },
13
+ maxApplicant: {
14
+ type: Number,
15
+ required: [true, "Number of applicants is required"],
16
+ min: [0, "Applicants count must be a positive number"],
17
+ validate: isIntegerValidator,
18
+ },
19
+ amount: {
20
+ type: Number,
21
+ required: [true, "Amount is required"],
22
+ min: [0, "Amount must be a positive number"],
23
+ validate: isIntegerValidator,
24
+ },
25
+ isFree: {
26
+ type: Boolean,
27
+ required: [true, "isFree field is required"],
28
+ default: false, // Assuming plans are paid by default
29
+ },
30
+ userAccessCount: {
31
+ type: Number,
32
+ required: [true, "User access count is required"],
33
+ min: [1, "User access count must be at least 1"],
34
+ validate: isIntegerValidator,
35
+ },
36
+ candidateLastActiveMonth: {
37
+ type: Number,
38
+ required: [true, "Candidate last active month is required"],
39
+ min: [1, "Candidate last active month must be between 1 and 12"],
40
+ max: [12, "Candidate last active month must be between 1 and 12"],
41
+ },
42
+ maxResult: {
43
+ type: Number,
44
+ required: [true, "Search result count is required"],
45
+ min: [0, "Search result count must be a positive number"],
46
+ validate: isIntegerValidator,
47
+ },
48
+ maxProfileView: {
49
+ type: Number,
50
+ required: [true, "Maximum profile view count is required"],
51
+ min: [0, "Maximum profile view count must be a positive number"],
52
+ validate: isIntegerValidator,
53
+ },
54
+ isBooleanKeywordSearch: {
55
+ type: Boolean,
56
+ required: [true, "Boolean keyword search availability is required"],
57
+ },
58
+ isDownloadResume: {
59
+ type: Boolean,
60
+ required: [true, "Resume download availability is required"],
61
+ },
62
+ isFilter: {
63
+ type: Boolean,
64
+ required: [true, "Filter feature availability is required"],
65
+ },
66
+ isTag: {
67
+ type: Boolean,
68
+ required: [true, "Tag feature availability is required"],
69
+ },
70
+ minValidityDay: {
71
+ type: Number,
72
+ required: [true, "Minimum validity day is required"],
73
+ min: [1, "Minimum validity day must be a positive number"],
74
+ validate: [
75
+ isIntegerValidator,
76
+ {
77
+ validator: function (value) {
78
+ return !this.maxValidityDay || value < this.maxValidityDay;
79
+ },
80
+ message: "Minimum validity day must be less than maximum validity day",
81
+ },
82
+ ],
83
+ },
84
+ maxValidityDay: {
85
+ type: Number,
86
+ required: [true, "Maximum validity day is required"],
87
+ min: [1, "Maximum validity day must be a positive number"],
88
+ validate: [
89
+ isIntegerValidator,
90
+ {
91
+ validator: function (value) {
92
+ return !this.minValidityDay || value > this.minValidityDay;
93
+ },
94
+ message:
95
+ "Maximum validity day must be greater than minimum validity day",
96
+ },
97
+ ],
98
+ },
99
+ isJobOffer: {
100
+ type: Boolean,
101
+ required: [true, "Job offer status is required"],
102
+ validate: {
103
+ validator: function () {
104
+ return this.isFree === false || this.isJobOffer === false;
105
+ },
106
+ message: "isJobOffer can only be true if isFree is false",
107
+ },
108
+ },
109
+ jobOfferDetails: {
110
+ jobOfferValidity: {
111
+ type: Date,
112
+ required: function () {
113
+ return this.isJobOffer;
114
+ },
115
+ validate: {
116
+ validator: function (value) {
117
+ return !this.isJobOffer || value > new Date();
118
+ },
119
+ message: "Job offer validity date must be in the future",
120
+ },
121
+ },
122
+ jobOfferDiscountPercentage: {
123
+ type: Number,
124
+ required: function () {
125
+ return this.isJobOffer;
126
+ },
127
+ min: [1, "Discount percentage must be greater than 1%"],
128
+ max: [99, "Discount percentage must be less than or equal to 99%"],
129
+ validate: isIntegerValidator,
130
+ },
131
+ },
132
+ submitLabel: {
133
+ type: String,
134
+ required: [true, "Submit label is required"],
135
+ minlength: [3, "Submit label must be at least 3 characters long"],
136
+ maxlength: [100, "Submit label cannot exceed 100 characters"],
137
+ trim: true,
138
+ },
139
+ });
140
+
141
+ const myDB = mongoose.connection.useDb(getDatabaseName());
142
+ const PlanModel = myDB.model("Plan", planSchema);
143
+
144
+ module.exports = PlanModel;
@@ -0,0 +1,22 @@
1
+ const mongoose = require("mongoose");
2
+ const { getDatabaseName } = require("../../constants");
3
+
4
+ // Define the schema
5
+ const schema = new mongoose.Schema(
6
+ {
7
+ roleName: {
8
+ type: String,
9
+ required: true,
10
+ },
11
+ },
12
+ {
13
+ timestamps: { createdAt: true, updatedAt: true },
14
+ }
15
+ );
16
+
17
+ const myDB = mongoose.connection.useDb(getDatabaseName());
18
+
19
+ // Create the model
20
+ const RoleModel = myDB.model("role", schema);
21
+
22
+ module.exports = RoleModel;
@@ -0,0 +1,36 @@
1
+ const mongoose = require("mongoose");
2
+ const { getDatabaseName } = require("../../constants");
3
+ const { ObjectId } = mongoose.Types;
4
+
5
+ // Define the schema for Search Appearance History
6
+ const searchAppearanceHistorySchema = new mongoose.Schema(
7
+ {
8
+ recruiterId: { type: ObjectId, ref: "recruiter", required: true },
9
+ searchQuery: {
10
+ roleIds: { type: [ObjectId], default: [] },
11
+ skillIds: { type: [ObjectId], default: [] },
12
+ workStatus: {
13
+ type: String,
14
+ enum: ["fresher", "experienced", null],
15
+ default: null,
16
+ },
17
+ yearExperienceStart: { type: Number, default: null },
18
+ yearExperienceEnd: { type: Number, default: null },
19
+ },
20
+ searchDate: { type: Date, default: Date.now },
21
+ },
22
+ { timestamps: true }
23
+ );
24
+
25
+ // Create indexes for efficient querying
26
+ searchAppearanceHistorySchema.index({ recruiterId: 1 });
27
+ searchAppearanceHistorySchema.index({ searchDate: -1 });
28
+
29
+ // Create the model
30
+ const myDB = mongoose.connection.useDb(getDatabaseName());
31
+ const SearchAppearanceHistoryModel = myDB.model(
32
+ "search-appearance-history",
33
+ searchAppearanceHistorySchema
34
+ );
35
+
36
+ module.exports = SearchAppearanceHistoryModel;
@@ -0,0 +1,21 @@
1
+ const mongoose = require("mongoose");
2
+ const { getDatabaseName } = require("../../constants");
3
+
4
+ // Define the schema
5
+ const schema = new mongoose.Schema(
6
+ {
7
+ skillName: {
8
+ type: String,
9
+ required: true,
10
+ },
11
+ },
12
+
13
+ { timestamps: { createdAt: true, updatedAt: true } }
14
+ );
15
+
16
+ const myDB = mongoose.connection.useDb(getDatabaseName());
17
+
18
+ // Create the model
19
+ const SkillModel = myDB.model("skill", schema);
20
+
21
+ module.exports = SkillModel;
@@ -0,0 +1,44 @@
1
+ const mongoose = require("mongoose");
2
+ const moment = require("moment");
3
+
4
+ const admissionSchema = mongoose.Schema({
5
+ _id: { type: String },
6
+ name: { type: String },
7
+ dob: { type: String },
8
+ mobileNumber: { type: String },
9
+ address: { type: String },
10
+ qualification: { type: String },
11
+ nationality: { type: String },
12
+ workingDesignation: { type: String },
13
+ studentCollegeName: { type: String },
14
+ courseName: { type: String },
15
+ courseCode: { type: String },
16
+ email: { type: String },
17
+ whatsappnumber: { type: String },
18
+ gender: { type: String },
19
+ batchname: { type: String },
20
+ trainerName: { type: String },
21
+ doj: { type: String },
22
+ photo: { type: String },
23
+ date: {
24
+ type: String,
25
+ default: moment().utcOffset(330).format("DD-MM-yyy"),
26
+ },
27
+ active: { type: Boolean, default: true },
28
+ archive: { type: Boolean, default: false },
29
+ coursestatus: { type: String, default: "Learning" },
30
+ certificateCollectedStatus: { type: String, default: "No" },
31
+ totalFees: { type: Number },
32
+ studentId: {
33
+ type: String,
34
+ pattern: { type: String },
35
+ parentNumber: { type: String },
36
+ regNo: { type: String },
37
+ },
38
+ });
39
+
40
+ const myDB = mongoose.connection.useDb("OA_SMS");
41
+
42
+ const AdmissionModel = myDB.model("admission", admissionSchema);
43
+
44
+ module.exports = AdmissionModel;
@@ -0,0 +1,14 @@
1
+ const mongoose = require("mongoose");
2
+ const { getDatabaseName } = require("../../constants");
3
+
4
+ // Define the schema
5
+ const schema = new mongoose.Schema({
6
+ speakingLanguage: { type: String, required: true },
7
+ });
8
+
9
+ const myDB = mongoose.connection.useDb(getDatabaseName());
10
+
11
+ // Create the model
12
+ const SpeakingLanguageModel = myDB.model("speaking-language", schema);
13
+
14
+ module.exports = SpeakingLanguageModel;
@@ -0,0 +1,20 @@
1
+ const mongoose = require("mongoose");
2
+ const { getDatabaseName } = require("../../constants");
3
+
4
+ const { ObjectId } = mongoose.Types;
5
+
6
+ // Define the schema
7
+ const schema = new mongoose.Schema(
8
+ {
9
+ courseId: { type: ObjectId, required: true },
10
+ label: { type: String, required: true },
11
+ },
12
+ { timestamps: { createdAt: true, updatedAt: true } }
13
+ );
14
+
15
+ const myDB = mongoose.connection.useDb(getDatabaseName());
16
+
17
+ // Create the model
18
+ const SpecializationModel = myDB.model("specialization", schema);
19
+
20
+ module.exports = SpecializationModel;
@@ -0,0 +1,44 @@
1
+ const mongoose = require("mongoose");
2
+ const { getDatabaseName } = require("../../constants");
3
+
4
+ const { ObjectId } = mongoose.Types;
5
+
6
+ // Define the schema with validation
7
+ const schema = new mongoose.Schema(
8
+ {
9
+ candidateId: {
10
+ type: ObjectId,
11
+ required: [true, "Candidate ID is required"],
12
+ validate: {
13
+ validator: mongoose.Types.ObjectId.isValid,
14
+ message: "Invalid Candidate ID",
15
+ },
16
+ },
17
+ recruiterId: {
18
+ type: ObjectId,
19
+ required: [true, "Recruiter ID is required"],
20
+ validate: {
21
+ validator: mongoose.Types.ObjectId.isValid,
22
+ message: "Invalid Recruiter ID",
23
+ },
24
+ },
25
+ organizationId: {
26
+ type: ObjectId,
27
+ required: [true, "Organization ID is required"],
28
+ validate: {
29
+ validator: mongoose.Types.ObjectId.isValid,
30
+ message: "Invalid Organization ID",
31
+ },
32
+ },
33
+ },
34
+ {
35
+ timestamps: { createdAt: true, updatedAt: true },
36
+ }
37
+ );
38
+
39
+ const myDB = mongoose.connection.useDb(getDatabaseName());
40
+
41
+ // Create the model
42
+ const ViewedProfileHistory = myDB.model("viewed-profile-history", schema);
43
+
44
+ module.exports = ViewedProfileHistory;
@@ -0,0 +1,8 @@
1
+ module.exports = {
2
+ ...require("./candidate-models"),
3
+ ...require("./recruiter-models"),
4
+ ...require("./common-models"),
5
+ ...require("./admin-models"),
6
+ ...require("./organization-models"),
7
+ ...require("./jobPost-models"),
8
+ };
@@ -0,0 +1,71 @@
1
+ const mongoose = require("mongoose");
2
+ const { ObjectId } = mongoose.Schema.Types;
3
+ const {
4
+ pendingJobPostStep1Schema,
5
+ } = require("../../schemes/pendingJobPostStep1-schema");
6
+ const {
7
+ pendingJobPostStep2Schema,
8
+ } = require("../../schemes/pendingJobPostStep2-scheme");
9
+ const { getDatabaseName } = require("../../constants");
10
+
11
+ // Define the schema
12
+ const schema = new mongoose.Schema(
13
+ {
14
+ organizationId: {
15
+ type: ObjectId,
16
+ required: [true, "Organization ID is required"],
17
+ validate: {
18
+ validator: function (v) {
19
+ return mongoose.Types.ObjectId.isValid(v);
20
+ },
21
+ message: "Invalid Organization ID format",
22
+ },
23
+ },
24
+ recruiterId: {
25
+ type: ObjectId,
26
+ required: [true, "Recruiter ID is required"],
27
+ validate: {
28
+ validator: function (v) {
29
+ return mongoose.Types.ObjectId.isValid(v);
30
+ },
31
+ message: "Invalid Recruiter ID format",
32
+ },
33
+ },
34
+ // planId: {
35
+ // type: ObjectId,
36
+ // required: [true, "Plan ID is required"],
37
+ // ref: "plan",
38
+ // validate: {
39
+ // validator: function (v) {
40
+ // return mongoose.Types.ObjectId.isValid(v);
41
+ // },
42
+ // message: "Invalid Plan ID format",
43
+ // },
44
+ // },
45
+ jobId: {
46
+ type: String,
47
+ required: [true, "Job ID is required"],
48
+ },
49
+ paymentHistoryId: {
50
+ type: ObjectId,
51
+ required: [true, "Payment History ID is required"],
52
+ ref: "paymentHistory",
53
+ validate: {
54
+ validator: function (v) {
55
+ return mongoose.Types.ObjectId.isValid(v);
56
+ },
57
+ message: "Invalid Payment History ID format",
58
+ },
59
+ },
60
+ ...pendingJobPostStep1Schema.obj,
61
+ ...pendingJobPostStep2Schema.obj,
62
+ },
63
+ { timestamps: { createdAt: true, updatedAt: true } }
64
+ );
65
+
66
+ // Create the model
67
+ const myDB = mongoose.connection.useDb(getDatabaseName());
68
+
69
+ const ActiveJobPostModel = myDB.model("active-jobPost", schema);
70
+
71
+ module.exports = ActiveJobPostModel;
@@ -0,0 +1,42 @@
1
+ const mongoose = require("mongoose");
2
+ const { ObjectId } = mongoose.Types;
3
+ const {
4
+ pendingJobPostStep1Schema,
5
+ pendingJobPostStep2Schema,
6
+ } = require("../../schemes");
7
+ const { getDatabaseName } = require("../../constants");
8
+
9
+ // Define the schema
10
+ const schema = new mongoose.Schema(
11
+ {
12
+ recruiterId: {
13
+ type: ObjectId,
14
+ required: [true, "Recruiter ID is required"],
15
+ validate: {
16
+ validator: function (v) {
17
+ return mongoose.Types.ObjectId.isValid(v);
18
+ },
19
+ message: "Invalid Recruiter ID format",
20
+ },
21
+ },
22
+ step1: {
23
+ type: pendingJobPostStep1Schema,
24
+ default: null,
25
+ },
26
+ step2: {
27
+ type: pendingJobPostStep2Schema,
28
+ default: null,
29
+ },
30
+ },
31
+ {
32
+ timestamps: { createdAt: true, updatedAt: true },
33
+ validateBeforeSave: true,
34
+ }
35
+ );
36
+
37
+ // Create the model
38
+ const myDB = mongoose.connection.useDb(getDatabaseName());
39
+
40
+ const DraftJobPostModel = myDB.model("draft-jobPost", schema);
41
+
42
+ module.exports = DraftJobPostModel;
@@ -0,0 +1,46 @@
1
+ const mongoose = require("mongoose");
2
+ const { ObjectId } = mongoose.Schema.Types;
3
+ const {
4
+ pendingJobPostStep1Schema,
5
+ } = require("../../schemes/pendingJobPostStep1-schema");
6
+ const {
7
+ pendingJobPostStep2Schema,
8
+ } = require("../../schemes/pendingJobPostStep2-scheme");
9
+ const { getDatabaseName } = require("../../constants");
10
+
11
+ // Define the schema
12
+ const schema = new mongoose.Schema(
13
+ {
14
+ organizationId: {
15
+ type: ObjectId,
16
+ required: [true, "Organization ID is required"],
17
+ validate: {
18
+ validator: function (v) {
19
+ return mongoose.Types.ObjectId.isValid(v);
20
+ },
21
+ message: "Invalid Organization ID format",
22
+ },
23
+ },
24
+ recruiterId: {
25
+ type: ObjectId,
26
+ required: [true, "Recruiter ID is required"],
27
+ validate: {
28
+ validator: function (v) {
29
+ return mongoose.Types.ObjectId.isValid(v);
30
+ },
31
+ message: "Invalid Recruiter ID format",
32
+ },
33
+ },
34
+ expiredAt: { type: Date, default: Date.now }, // Add expiredAt field
35
+ ...pendingJobPostStep1Schema.obj,
36
+ ...pendingJobPostStep2Schema.obj,
37
+ },
38
+ { timestamps: { createdAt: true, updatedAt: true } }
39
+ );
40
+
41
+ // Create the model
42
+ const myDB = mongoose.connection.useDb(getDatabaseName());
43
+
44
+ const ExpiredJobPostModel = myDB.model("expired-jobPost", schema);
45
+
46
+ module.exports = ExpiredJobPostModel;
@@ -0,0 +1,10 @@
1
+ module.exports = {
2
+ ActiveJobPostModel: require("./active-model"),
3
+ DraftJobPostModel: require("./draft-model"),
4
+ ExpiredJobPostModel: require("./expired-model"),
5
+ JobInvitationModel: require("./invitation-model"),
6
+ OnHoldJobPostModel: require("./onHold-model"),
7
+ PendingJobPostModel: require("./pending-model"),
8
+ RejectedJobPostModel: require("./rejected-model"),
9
+ VerificationJobPostModel: require("./verification-model"),
10
+ };
@@ -0,0 +1,72 @@
1
+ const mongoose = require("mongoose");
2
+ const { getDatabaseName } = require("../../constants");
3
+
4
+ const { ObjectId } = mongoose.Types;
5
+
6
+ // Define the schema
7
+ const schema = new mongoose.Schema(
8
+ {
9
+ candidateId: {
10
+ type: ObjectId,
11
+ required: [true, "Candidate ID is required."],
12
+ validate: {
13
+ validator: ObjectId.isValid,
14
+ message: "Invalid Candidate ID format.",
15
+ },
16
+ },
17
+ recruiterId: {
18
+ type: ObjectId,
19
+ required: [true, "Recruiter ID is required."],
20
+ validate: {
21
+ validator: ObjectId.isValid,
22
+ message: "Invalid Recruiter ID format.",
23
+ },
24
+ },
25
+ organizationId: {
26
+ type: ObjectId,
27
+ required: [true, "Organization ID is required."],
28
+ validate: {
29
+ validator: ObjectId.isValid,
30
+ message: "Invalid Organization ID format.",
31
+ },
32
+ },
33
+ jobPostId: {
34
+ type: ObjectId,
35
+ required: [true, "Job Post ID is required."],
36
+ validate: {
37
+ validator: ObjectId.isValid,
38
+ message: "Invalid Job Post ID format.",
39
+ },
40
+ },
41
+ isApplied: {
42
+ type: Boolean,
43
+ default: false, // Default to false if not specified
44
+ },
45
+ appliedAt: {
46
+ type: Date,
47
+ default: null, // Default to null if not specified
48
+ validate: {
49
+ // Validate that appliedAt is not set in the future
50
+ validator: function (value) {
51
+ return !value || value <= new Date();
52
+ },
53
+ message: "Applied date cannot be in the future.",
54
+ },
55
+ // Ensure appliedAt is required when isApplied is true
56
+ required: function () {
57
+ return this.isApplied;
58
+ },
59
+ },
60
+ },
61
+ {
62
+ timestamps: { createdAt: true, updatedAt: true },
63
+ versionKey: false, // Disable the version key (__v) for this schema
64
+ }
65
+ );
66
+
67
+ const myDB = mongoose.connection.useDb(getDatabaseName());
68
+
69
+ // Create the model
70
+ const JobInvitationModel = myDB.model("job-invitation", schema);
71
+
72
+ module.exports = JobInvitationModel;
@@ -0,0 +1,58 @@
1
+ const mongoose = require("mongoose");
2
+ const {
3
+ pendingJobPostStep1Schema,
4
+ } = require("../../schemes/pendingJobPostStep1-schema");
5
+ const {
6
+ pendingJobPostStep2Schema,
7
+ } = require("../../schemes/pendingJobPostStep2-scheme");
8
+ const {
9
+ pendingJobPostStep3Schema,
10
+ } = require("../../schemes/pendingJobPostStep3-scheme");
11
+ const {
12
+ pendingJobPostStep4Schema,
13
+ } = require("../../schemes/pendingJobPostStep4-scheme");
14
+ const { validateReason } = require("../../utils");
15
+ const { getDatabaseName } = require("../../constants");
16
+
17
+ // Define the schema
18
+ const schema = new mongoose.Schema(
19
+ {
20
+ recruiterId: {
21
+ type: mongoose.Schema.Types.ObjectId,
22
+ required: [true, "Recruiter ID is required"],
23
+ validate: {
24
+ validator: mongoose.Types.ObjectId.isValid,
25
+ message: "Invalid recruiter ID",
26
+ },
27
+ },
28
+ step1: {
29
+ type: pendingJobPostStep1Schema,
30
+ required: [true, "Step 1 data is required"],
31
+ },
32
+ step2: {
33
+ type: pendingJobPostStep2Schema,
34
+ required: [true, "Step 2 data is required"],
35
+ },
36
+ step3: {
37
+ type: pendingJobPostStep3Schema,
38
+ required: [true, "Step 3 data is required"],
39
+ },
40
+ step4: {
41
+ type: pendingJobPostStep4Schema,
42
+ required: [true, "Step 4 data is required"],
43
+ },
44
+ reason: {
45
+ type: String,
46
+ required: [true, "Reason is required"],
47
+ validate: [validateReason, "Reason must be at least 5 characters long"],
48
+ },
49
+ },
50
+ { timestamps: { createdAt: true, updatedAt: true } }
51
+ );
52
+
53
+ // Create the model
54
+ const myDB = mongoose.connection.useDb(getDatabaseName());
55
+
56
+ const OnHoldJobPostModel = myDB.model("onHold-jobPost", schema);
57
+
58
+ module.exports = OnHoldJobPostModel;