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,44 @@
1
+ const mongoose = require("mongoose");
2
+ const { getDatabaseName } = require("../../constants");
3
+ const {
4
+ Schema,
5
+ Types: { ObjectId },
6
+ } = mongoose;
7
+
8
+ // Define the schema
9
+ const schema = new mongoose.Schema(
10
+ {
11
+ recruiterId: {
12
+ type: ObjectId,
13
+ required: [true, "Recruiter ID is required"],
14
+ },
15
+ mobileNumber: {
16
+ type: String,
17
+ required: [true, "Mobile number is required"],
18
+ unique: true,
19
+ minlength: [10, "Mobile number must be exactly 10 digits long"],
20
+ maxlength: [10, "Mobile number must be exactly 10 digits long"],
21
+ match: [/^\d{10}$/, "Mobile number must be exactly 10 digits"],
22
+ },
23
+ countryCode: {
24
+ type: String,
25
+ required: [true, "Country code is required"],
26
+ enum: ["+91"],
27
+ },
28
+ deleteAt: {
29
+ type: Date,
30
+ default: null,
31
+ },
32
+ },
33
+ { timestamps: { createdAt: true, updatedAt: true } }
34
+ );
35
+
36
+ const myDB = mongoose.connection.useDb(getDatabaseName());
37
+
38
+ // Create the model
39
+ const PendingRecruiterModel = myDB.model("pending-recruiter", schema);
40
+
41
+ // Ensure TTL index is created
42
+ schema.index({ deleteAt: 1 }, { expireAfterSeconds: 0 });
43
+
44
+ module.exports = PendingRecruiterModel;
@@ -0,0 +1,75 @@
1
+ const mongoose = require("mongoose");
2
+ const { getDatabaseName } = require("../../constants");
3
+
4
+ // Define the schema
5
+ const schema = new mongoose.Schema(
6
+ {
7
+ mobileNumber: {
8
+ type: String,
9
+ required: [true, "Mobile number is required"],
10
+ unique: true,
11
+ match: [/^\d{10}$/, "Mobile number must be exactly 10 digits"],
12
+ },
13
+ countryCode: {
14
+ type: String,
15
+ required: [true, "Country code is required"],
16
+ enum: ["+91"], // Consider expanding this if needed
17
+ },
18
+ OTP: {
19
+ type: String,
20
+ required: [true, "OTP is required"],
21
+ // minlength: [24, "Encrypted OTP must be at least 24 characters long"],
22
+ maxlength: [6, "OTP must be at most 6 characters long"],
23
+ },
24
+ requests: [
25
+ {
26
+ date: {
27
+ type: Date,
28
+ required: [true, "Request date is required"],
29
+ default: Date.now,
30
+ },
31
+ attempts: {
32
+ type: Number,
33
+ default: 0, // Initialize attempts with 0
34
+ min: [0, "Attempts cannot be negative"],
35
+ },
36
+ successful: {
37
+ type: Boolean,
38
+ default: false,
39
+ },
40
+ },
41
+ ],
42
+ expiryDate: {
43
+ type: Date,
44
+ required: [true, "Expiry date is required"],
45
+ validate: {
46
+ validator: function (v) {
47
+ return v > Date.now();
48
+ },
49
+ message: "Expiry date must be in the future.",
50
+ },
51
+ },
52
+ deleteAt: {
53
+ type: Date,
54
+ required: [true, "Deletion time is required"],
55
+ validate: {
56
+ validator: function (v) {
57
+ return v > Date.now();
58
+ },
59
+ message: "Deletion time must be in the future.",
60
+ },
61
+ },
62
+ },
63
+ { timestamps: { createdAt: true, updatedAt: true } }
64
+ );
65
+
66
+ // Add indexes
67
+ schema.index({ mobileNumber: 1, countryCode: 1 }); // Compound index on mobileNumber and countryCode
68
+ schema.index({ deleteAt: 1 }, { expireAfterSeconds: 0 }); // TTL index for automatic deletion
69
+
70
+ const myDB = mongoose.connection.useDb(getDatabaseName());
71
+
72
+ // Create the model
73
+ const RequestRecruiterModel = myDB.model("request-recruiter", schema);
74
+
75
+ module.exports = RequestRecruiterModel;
@@ -0,0 +1,15 @@
1
+ const mongoose = require("mongoose");
2
+ const { getDatabaseName } = require("../../constants");
3
+
4
+ const { ObjectId } = mongoose.Types;
5
+
6
+ const schema = new mongoose.Schema({
7
+ token: { type: String, required: true },
8
+ recruiterId: { type: ObjectId, required: true },
9
+ });
10
+
11
+ const myDB = mongoose.connection.useDb(getDatabaseName());
12
+
13
+ const RecruiterTokenModel = myDB.model("recruiter-token", schema);
14
+
15
+ module.exports = { RecruiterTokenModel };
@@ -0,0 +1,63 @@
1
+ const mongoose = require("mongoose");
2
+ const { getDatabaseName } = require("../../constants");
3
+
4
+ const { Schema } = mongoose;
5
+
6
+ // Define the schema
7
+ const schema = new Schema(
8
+ {
9
+ fullName: {
10
+ type: String,
11
+ required: [true, "Full name is optional"], // Optional field
12
+ minlength: [2, "Full name must be at least 2 characters long"],
13
+ maxlength: [50, "Full name cannot exceed 50 characters"],
14
+ },
15
+ mobileNumber: {
16
+ type: String,
17
+ required: [true, "Mobile number is required"],
18
+ minlength: [10, "Mobile number must be exactly 10 digits long"],
19
+ maxlength: [10, "Mobile number must be exactly 10 digits long"],
20
+ match: [/^\d{10}$/, "Mobile number must be exactly 10 digits"],
21
+ unique: true, // Ensure mobileNumber is unique
22
+ },
23
+ countryCode: {
24
+ type: String,
25
+ required: [true, "Country code is required"],
26
+ minlength: [1, "Country code must be at least 1 character long"],
27
+ maxlength: [4, "Country code cannot exceed 4 characters"],
28
+ enum: ["+91"], // Only allow +91
29
+ },
30
+ email: {
31
+ type: String,
32
+ required: [true, "Email is optional"],
33
+ match: [/^\S+@\S+\.\S+$/, "Invalid email format"],
34
+ },
35
+ password: {
36
+ type: String,
37
+ required: [true, "Password is optional"],
38
+ minlength: [6, "Password must be at least 6 characters long"],
39
+ select: false, // Do not include password in queries by default
40
+ },
41
+ organizationId: {
42
+ type: Schema.Types.ObjectId,
43
+ required: [false, "Organization ID is optional"],
44
+ ref: "organization-verification",
45
+ default: null,
46
+ },
47
+ avatar: { type: String, required: true },
48
+ designation: {
49
+ type: String,
50
+ required: [true, "Designation is optional"], // Optional field
51
+ minlength: [2, "Designation must be at least 2 characters long"],
52
+ maxlength: [50, "Designation cannot exceed 50 characters"],
53
+ },
54
+ },
55
+ { timestamps: { createdAt: true, updatedAt: true } }
56
+ );
57
+
58
+
59
+ // Create the model
60
+ const myDB = mongoose.connection.useDb(getDatabaseName());
61
+ const VerificationRecruiterModel = myDB.model("verification-recruiter", schema);
62
+
63
+ module.exports = VerificationRecruiterModel;
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "jp-shared",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "scripts": {
6
+ "test": "echo \"Error: no test specified\" && exit 1"
7
+ },
8
+ "keywords": [],
9
+ "author": "",
10
+ "license": "ISC",
11
+ "description": "",
12
+ "peerDependencies": {
13
+ "axios": "^1.8.1",
14
+ "bcrypt": "^5.1.1",
15
+ "dotenv": "^16.4.7",
16
+ "express-validator": "^7.2.1",
17
+ "firebase-admin": "^13.2.0",
18
+ "jsonwebtoken": "^9.0.2",
19
+ "moment": "^2.30.1",
20
+ "mongoose": "^8.12.1",
21
+ "nodemailer": "^6.10.0",
22
+ "puppeteer": "^23.11.0",
23
+ "puppeteer-core": "^10.4.0",
24
+ "chrome-aws-lambda": "^10.1.0",
25
+ "validator": "^13.12.0",
26
+ "to-words": "^4.2.0"
27
+ }
28
+ }
@@ -0,0 +1,43 @@
1
+ const mongoose = require("mongoose");
2
+ const { Schema } = mongoose;
3
+
4
+ const addressSchema = new Schema({
5
+ city: {
6
+ type: String,
7
+ required: [true, "City is required"],
8
+ minlength: [2, "City must be at least 2 characters long"],
9
+ maxlength: [50, "City cannot exceed 50 characters"],
10
+ },
11
+ state: {
12
+ type: String,
13
+ required: [true, "State is required"],
14
+ minlength: [2, "State must be at least 2 characters long"],
15
+ maxlength: [50, "State cannot exceed 50 characters"],
16
+ },
17
+ country: {
18
+ type: String,
19
+ required: [true, "Country is required"],
20
+ minlength: [2, "Country must be at least 2 characters long"],
21
+ maxlength: [50, "Country cannot exceed 50 characters"],
22
+ },
23
+ street: {
24
+ type: String,
25
+ required: [true, "Street is required"],
26
+ minlength: [2, "Street must be at least 2 characters long"],
27
+ maxlength: [100, "Street cannot exceed 100 characters"],
28
+ },
29
+ area: {
30
+ type: String,
31
+ minlength: [2, "Area must be at least 2 characters long"],
32
+ maxlength: [100, "Area cannot exceed 100 characters"],
33
+ },
34
+ pincode: {
35
+ type: Number,
36
+ required: [true, "Pincode is required"],
37
+ minlength: [6, "Pincode must be exactly 6 characters long"],
38
+ maxlength: [6, "Pincode must be exactly 6 characters long"],
39
+ match: [/^\d{6}$/, "Pincode must be exactly 6 digits"],
40
+ },
41
+ });
42
+
43
+ module.exports = { addressSchema };
@@ -0,0 +1,7 @@
1
+ module.exports = {
2
+ ...require("./pendingJobPostStep1-schema"),
3
+ ...require("./pendingJobPostStep2-scheme"),
4
+ ...require("./pendingJobPostStep3-scheme"),
5
+ ...require("./pendingJobPostStep4-scheme"),
6
+ ...require("./address-schema"),
7
+ };
@@ -0,0 +1,192 @@
1
+ const mongoose = require("mongoose");
2
+ const { ObjectId } = mongoose.Types;
3
+
4
+ // Define the schema
5
+ const pendingJobPostStep1Schema = new mongoose.Schema(
6
+ {
7
+ jobTitle: {
8
+ type: String,
9
+ required: [true, "Job title is required"],
10
+ minlength: [3, "Job title must be at least 3 characters long"],
11
+ maxlength: [100, "Job title cannot exceed 100 characters"],
12
+ },
13
+ jobRoleIds: {
14
+ type: [{ type: ObjectId, ref: "role", required: true }],
15
+ validate: {
16
+ validator: function (v) {
17
+ return Array.isArray(v) && v.length > 0;
18
+ },
19
+ message: "At least one job role ID is required",
20
+ },
21
+ },
22
+ jobSkillIds: {
23
+ type: [{ type: ObjectId, ref: "skill", required: true }],
24
+ validate: {
25
+ validator: function (v) {
26
+ return Array.isArray(v) && v.length > 0;
27
+ },
28
+ message: "At least one job skill ID is required",
29
+ },
30
+ },
31
+ jobPreferredSkillIds: {
32
+ type: [{ type: ObjectId, ref: "skill", required: true }],
33
+ validate: {
34
+ validator: function (v) {
35
+ return Array.isArray(v) && v.length > 0;
36
+ },
37
+ message: "At least one job preferred skill ID is required",
38
+ },
39
+ },
40
+ jobLocation: {
41
+ type: String,
42
+ required: [true, "Job location is required"],
43
+ minlength: [2, "Job location must be at least 2 characters long"],
44
+ maxlength: [100, "Job location cannot exceed 100 characters"],
45
+ },
46
+ jobMode: {
47
+ type: [{ type: String, required: true }],
48
+ validate: {
49
+ validator: function (v) {
50
+ const validModes = ["Remote", "On-site", "Hybrid"];
51
+ return v.every((mode) => validModes.includes(mode));
52
+ },
53
+ message: "Invalid job mode",
54
+ },
55
+ },
56
+ jobType: {
57
+ type: [{ type: String, required: true }],
58
+ validate: {
59
+ validator: function (v) {
60
+ const validTypes = [
61
+ "Full-time",
62
+ "Part-time",
63
+ "Contract",
64
+ "Internship",
65
+ ];
66
+ return v.every((type) => validTypes.includes(type));
67
+ },
68
+ message: "Invalid job type",
69
+ },
70
+ },
71
+ jobShift: {
72
+ type: String,
73
+ required: [true, "Job shift is required"],
74
+ enum: {
75
+ values: ["Day", "Night", "Flexible"],
76
+ message: "Invalid job shift",
77
+ },
78
+ },
79
+ isJobSalaryToShow: {
80
+ type: Boolean,
81
+ required: [true, "Salary display preference is required"],
82
+ },
83
+ jobSalaryDetails: {
84
+ type: {
85
+ jobSalaryCurrency: {
86
+ type: String,
87
+ required: function () {
88
+ return this.isJobSalaryToShow;
89
+ },
90
+ enum: {
91
+ values: ["USD", "INR"],
92
+ message: "Job salary currency must be either 'USD' or 'INR'",
93
+ },
94
+ },
95
+ jobMaximumSalary: {
96
+ type: Number,
97
+ required: function () {
98
+ return this.isJobSalaryToShow;
99
+ },
100
+ min: [0, "Job maximum salary must be a positive number"],
101
+ },
102
+ jobMinimumSalary: {
103
+ type: Number,
104
+ required: function () {
105
+ return this.isJobSalaryToShow;
106
+ },
107
+ min: [0, "Job minimum salary must be a positive number"],
108
+ validate: {
109
+ validator: function (v) {
110
+ return this.isJobSalaryToShow
111
+ ? v <= this.jobSalaryDetails.jobMaximumSalary
112
+ : true;
113
+ },
114
+ message:
115
+ "Job minimum salary must be less than or equal to maximum salary",
116
+ },
117
+ },
118
+ },
119
+ validate: {
120
+ validator: function (v) {
121
+ if (this.isJobSalaryToShow) {
122
+ return (
123
+ v.jobSalaryCurrency && v.jobMaximumSalary && v.jobMinimumSalary
124
+ );
125
+ }
126
+ return true;
127
+ },
128
+ message:
129
+ "All job salary details are required when salary display preference is enabled",
130
+ },
131
+ },
132
+ jobDescription: {
133
+ type: String,
134
+ required: [true, "Job description is required"],
135
+ minlength: [10, "Job description must be at least 10 characters long"],
136
+ maxlength: [2000, "Job description cannot exceed 2000 characters"],
137
+ },
138
+ jobResponsibility: {
139
+ type: [{ type: String, required: true }],
140
+ validate: {
141
+ validator: function (v) {
142
+ return Array.isArray(v) && v.length > 0;
143
+ },
144
+ message: "At least one job responsibility is required",
145
+ },
146
+ },
147
+ jobRequirement: {
148
+ type: [{ type: String, required: true }],
149
+ validate: {
150
+ validator: function (v) {
151
+ return Array.isArray(v) && v.length > 0;
152
+ },
153
+ message: "At least one job requirement is required",
154
+ },
155
+ },
156
+ isFeeCollecting: {
157
+ type: Boolean,
158
+ required: [true, "Fee collecting status is required"],
159
+ },
160
+ feeDetails: {
161
+ amount: {
162
+ type: Number,
163
+ required: function () {
164
+ return this.isFeeCollecting;
165
+ },
166
+ min: [0, "Fee amount must be a positive number"],
167
+ },
168
+ reasons: {
169
+ type: [{ type: String, required: true }],
170
+ required: function () {
171
+ return this.isFeeCollecting;
172
+ },
173
+ validate: {
174
+ validator: function (v) {
175
+ return this.isFeeCollecting
176
+ ? Array.isArray(v) && v.length > 0
177
+ : true;
178
+ },
179
+ message: "At least one reason for the fee is required",
180
+ },
181
+ },
182
+ feePaymentSchedule: {
183
+ type: String,
184
+ enum: ["Before giving job", "After giving job"],
185
+ required: false,
186
+ },
187
+ },
188
+ },
189
+ { timestamps: { createdAt: true, updatedAt: true } }
190
+ );
191
+
192
+ module.exports = { pendingJobPostStep1Schema };
@@ -0,0 +1,117 @@
1
+ const mongoose = require("mongoose");
2
+
3
+ const { ObjectId } = mongoose.Types;
4
+
5
+ // Define the schema
6
+ const pendingJobPostStep2Schema = new mongoose.Schema(
7
+ {
8
+ qualificationIds: {
9
+ type: [ObjectId],
10
+ required: [true, "Qualification ID is required"],
11
+ validate: {
12
+ validator: function (v) {
13
+ return v.every((id) => ObjectId.isValid(id));
14
+ },
15
+ message: "Invalid Qualification ID format",
16
+ },
17
+ },
18
+ courseIds: {
19
+ type: [ObjectId],
20
+ required: [true, "Course ID is required"],
21
+ validate: {
22
+ validator: function (v) {
23
+ return v.every((id) => ObjectId.isValid(id));
24
+ },
25
+ message: "Invalid Course ID format",
26
+ },
27
+ },
28
+ specializationIds: {
29
+ type: [ObjectId],
30
+ required: [true, "Specialization ID is required"],
31
+ validate: {
32
+ validator: function (v) {
33
+ return v.every((id) => ObjectId.isValid(id));
34
+ },
35
+ message: "Invalid Specialization ID format",
36
+ },
37
+ },
38
+ preferredGender: {
39
+ type: String,
40
+ required: [true, "Preferred gender is required"],
41
+ enum: {
42
+ values: ["Male", "Female", "Other", "Any"],
43
+ message: "Preferred gender must be 'Male', 'Female', 'Other', or 'Any'",
44
+ },
45
+ minlength: [3, "Preferred gender must be at least 3 characters"],
46
+ maxlength: [6, "Preferred gender must be at most 6 characters"],
47
+ },
48
+ jobOpeningCount: {
49
+ type: Number,
50
+ required: [true, "Job opening count is required"],
51
+ min: [1, "Job opening count must be at least 1"],
52
+ validate: {
53
+ validator: Number.isInteger,
54
+ message: "Job opening count must be an integer",
55
+ },
56
+ },
57
+ experienceLevel: {
58
+ type: String,
59
+ enum: {
60
+ values: ["Fresher", "Experienced", "Any"],
61
+ message: "Experience level must be 'Fresher', 'Experienced', or 'Any'",
62
+ },
63
+ required: [true, "Experience level is required"],
64
+ minlength: [3, "Experience level must be at least 3 characters"],
65
+ maxlength: [11, "Experience level must be at most 11 characters"],
66
+ },
67
+ experience: {
68
+ type: {
69
+ min: {
70
+ type: Number,
71
+ required: function () {
72
+ return this.experienceLevel === "Experienced";
73
+ },
74
+ min: [0, "Minimum experience must be a non-negative number"],
75
+ validate: {
76
+ validator: Number.isInteger,
77
+ message: "Minimum experience must be an integer",
78
+ },
79
+ },
80
+ max: {
81
+ type: Number,
82
+ required: function () {
83
+ return this.experienceLevel === "Experienced";
84
+ },
85
+ min: [0, "Maximum experience must be a non-negative number"],
86
+ validate: {
87
+ validator: Number.isInteger,
88
+ message: "Maximum experience must be an integer",
89
+ },
90
+ },
91
+ },
92
+ validate: {
93
+ validator: function (v) {
94
+ if (
95
+ this.experienceLevel === "Fresher" ||
96
+ this.experienceLevel === "Any"
97
+ ) {
98
+ return !v || (v.min === undefined && v.max === undefined);
99
+ }
100
+ return v.min <= v.max;
101
+ },
102
+ message: function (props) {
103
+ if (
104
+ this.experienceLevel === "Fresher" ||
105
+ this.experienceLevel === "Any"
106
+ ) {
107
+ return "Experience field should not be provided for 'Fresher' or 'Any' experience levels";
108
+ }
109
+ return "Minimum experience must be less than or equal to maximum experience";
110
+ },
111
+ },
112
+ },
113
+ },
114
+ { timestamps: { createdAt: true, updatedAt: true } }
115
+ );
116
+
117
+ module.exports = { pendingJobPostStep2Schema };
@@ -0,0 +1,21 @@
1
+ const mongoose = require("mongoose");
2
+
3
+ const { ObjectId } = mongoose.Types;
4
+
5
+ // Define the schema
6
+ const pendingJobPostStep3Schema = new mongoose.Schema(
7
+ {
8
+ organizationId: {
9
+ type: ObjectId,
10
+ // ref : "verification-organization",
11
+ required: [true, "Organization ID is required"],
12
+ validate: {
13
+ validator: mongoose.Types.ObjectId.isValid,
14
+ message: "Invalid organization ID",
15
+ },
16
+ },
17
+ },
18
+ { timestamps: { createdAt: true, updatedAt: true } }
19
+ );
20
+
21
+ module.exports = { pendingJobPostStep3Schema };
@@ -0,0 +1,22 @@
1
+ const mongoose = require("mongoose");
2
+
3
+ const { ObjectId } = mongoose.Types;
4
+
5
+ // Define the schema
6
+ const pendingJobPostStep4Schema = new mongoose.Schema(
7
+ {
8
+ planId: {
9
+ type: ObjectId,
10
+ required: [true, "Plan ID is required"],
11
+ validate: {
12
+ validator: function (v) {
13
+ return mongoose.Types.ObjectId.isValid(v);
14
+ },
15
+ message: "Invalid Plan ID format",
16
+ },
17
+ },
18
+ },
19
+ { timestamps: { createdAt: true, updatedAt: true } }
20
+ );
21
+
22
+ module.exports = { pendingJobPostStep4Schema };
@@ -0,0 +1,12 @@
1
+ const isProduction = () => process.env.NODE_ENV === "prod";
2
+
3
+ const isDev = () => process.env.NODE_ENV === "dev";
4
+
5
+ const isTest = () => process.env.NODE_ENV === "test";
6
+
7
+
8
+ module.exports = {
9
+ isProduction,
10
+ isDev,
11
+ isTest,
12
+ };