flykup_model_production 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 (38) hide show
  1. package/auth.js +14 -0
  2. package/config.js +1 -0
  3. package/db_connection.js +23 -0
  4. package/index.js +127 -0
  5. package/info.txt +1 -0
  6. package/models/AdminEmail.model.js +36 -0
  7. package/models/LiveStreamInteraction.model.js +93 -0
  8. package/models/ProductInteraction.model.js +42 -0
  9. package/models/Review.model.js +121 -0
  10. package/models/SearchAnalytics.js +22 -0
  11. package/models/ShoppableInteraction.model.js +89 -0
  12. package/models/Wishlist.model.js +30 -0
  13. package/models/admin.model.js +27 -0
  14. package/models/appUpdate.model.js +18 -0
  15. package/models/assets.model.js +32 -0
  16. package/models/blockedRegion.models.js +27 -0
  17. package/models/category.model.js +29 -0
  18. package/models/chat.model.js +496 -0
  19. package/models/coHostInvitation.model.js +56 -0
  20. package/models/follow.model.js +37 -0
  21. package/models/loginlogs.model.js +25 -0
  22. package/models/notification.model.js +116 -0
  23. package/models/order.modal.js +285 -0
  24. package/models/productListing.model.js +132 -0
  25. package/models/profileInteractions.model.js +45 -0
  26. package/models/registerShow.model.js +28 -0
  27. package/models/seller.model.js +299 -0
  28. package/models/settings.model.js +18 -0
  29. package/models/shipper.model.js +128 -0
  30. package/models/shoppableVideo.model.js +177 -0
  31. package/models/shoppableVideoComment.model.js +58 -0
  32. package/models/shoppableVideoLike.model.js +30 -0
  33. package/models/shoppableVideoSave.model.js +28 -0
  34. package/models/shows.model.js +315 -0
  35. package/models/stock.model.js +128 -0
  36. package/models/ticket.model.js +115 -0
  37. package/models/user.model.js +229 -0
  38. package/package.json +18 -0
@@ -0,0 +1,229 @@
1
+ import mongoose from "mongoose";
2
+ import bcrypt from "bcrypt";
3
+ import jwt from "jsonwebtoken";
4
+ import Seller from "./seller.model.js";
5
+
6
+ // ------------------- User Schema -------------------
7
+ const UserSchema = new mongoose.Schema(
8
+ {
9
+ devices: [
10
+ {
11
+ deviceId: { type: String, required: true },
12
+ fcmToken: { type: String, required: true },
13
+ platform: {
14
+ type: String,
15
+ enum: ["web", "android", "ios", "mobile-web"],
16
+ required: true,
17
+ },
18
+ lastLogin: { type: Date, default: Date.now },
19
+ lastLogout: { type: Date },
20
+ isActive: { type: Boolean, default: true },
21
+ _id: false,
22
+ },
23
+ ],
24
+ sellerInfo: { type: mongoose.Schema.Types.ObjectId, ref: "sellers" },
25
+ dropshipperInfo: { type: mongoose.Schema.Types.ObjectId, ref: "dropshippers" },
26
+ categories: { type: [String], default: [], maxLength: 100 },
27
+ userName: {
28
+ type: String,
29
+ minLength: 1,
30
+ maxLength: 50,
31
+ trim: true,
32
+ required: true,
33
+ unique: true,
34
+ index: true,
35
+ },
36
+ name: { type: String, minLength: 1, maxLength: 50, required: true, trim: true },
37
+ emailId: {
38
+ type: String,
39
+ required: true,
40
+ unique: true,
41
+ trim: true,
42
+ maxLength: 60,
43
+ index: true,
44
+ },
45
+ password: {
46
+ type: String,
47
+ required: function () {
48
+ return !this.oAuth;
49
+ },
50
+ maxLength: 120,
51
+ },
52
+ mobile: { type: String, trim: true, maxLength: 15 },
53
+ isEmailVerified: { type: Boolean, default: false },
54
+ role: {
55
+ type: String,
56
+ enum: {
57
+ values: ["user", "seller", "dropshipper", null],
58
+ message: "{VALUE} is invalid",
59
+ },
60
+ default: null,
61
+ },
62
+ accessAllowed: { type: Boolean, default: true },
63
+ oAuth: {
64
+ type: String,
65
+ enum: {
66
+ values: ["google", "facebook", null],
67
+ message: "{VALUE} is invalid",
68
+ },
69
+ default: null,
70
+ },
71
+ profileURL: {
72
+ key: { type: String, maxLength: 255, default: null },
73
+ },
74
+ backgroundCoverURL: {
75
+ key: { type: String, maxLength: 255, default: null },
76
+ },
77
+ emailVerificationOtp: { type: String, maxLength: 6, default: null },
78
+ emailVerificationOtpExpiry: { type: Date, default: null },
79
+ isPasswordResetAllowed: { type: Boolean, default: false },
80
+ bio: { type: String, maxLength: 255, default: null },
81
+ address: [
82
+ {
83
+ name: { type: String, maxLength: 50, trim: true, required: true },
84
+ mobile: { type: String, trim: true, maxLength: 15, required: true },
85
+ alternateMobile: { type: String, trim: true, maxLength: 15, default: null },
86
+ line1: { type: String, trim: true, maxLength: 100, required: true },
87
+ line2: { type: String, trim: true, maxLength: 100, default: "" },
88
+ city: { type: String, trim: true, maxLength: 50, required: true },
89
+ state: { type: String, trim: true, maxLength: 50, required: true },
90
+ pincode: { type: String, maxLength: 6, trim: true, required: true },
91
+ addressType: { type: String, enum: ["home", "work", "other"], default: "home" },
92
+ isDefault: { type: Boolean, default: false },
93
+ },
94
+ ],
95
+ filledNewSellerForm: { type: Boolean, default: false },
96
+
97
+ // --- Verification Flow Fields ---
98
+ verificationFlowStatus: {
99
+ type: String,
100
+ enum: [
101
+ "pending_aadhaar",
102
+ "pending_address",
103
+ "pending_payment_setup",
104
+ "completed",
105
+ "failed",
106
+ ],
107
+ default: "pending_aadhaar",
108
+ },
109
+
110
+ // Aadhaar Verification
111
+ aadhaarNumberTransient: { type: String, select: false },
112
+ aadhaarNumberLast4: { type: String, trim: true, maxLength: 4 },
113
+ isAadhaarVerified: { type: Boolean, default: false },
114
+ aadhaarApiReference: { type: String },
115
+ aadhaarVerificationDate: { type: Date },
116
+ aadhaarOTPReference: { type: String, select: false },
117
+ aadhaarOTPExpiry: { type: Date, select: false },
118
+
119
+ // Address Selection
120
+ selectedAddressId: { type: mongoose.Schema.Types.ObjectId, default: null },
121
+ isAddressSelected: { type: Boolean, default: false },
122
+ addressSelectedDate: { type: Date },
123
+
124
+ // Payment Mandate Setup (Auto-Payment)
125
+ payuMandate: {
126
+ mandateToken: { type: String, default: null },
127
+ mandateId: { type: String, default: null },
128
+ bankReferenceNumber: { type: String, default: null },
129
+ initialTransactionId: { type: String, default: null },
130
+ status: {
131
+ type: String,
132
+ enum: [
133
+ "pending_confirmation",
134
+ "active",
135
+ "failed",
136
+ "cancelled",
137
+ "failed_hash_mismatch",
138
+ "failed_missing_token",
139
+ "failed_payu_status",
140
+ ],
141
+ default: "pending_confirmation",
142
+ },
143
+ failureReason: { type: String, default: null },
144
+ _id: false,
145
+ },
146
+ isAutoPaymentEnabled: { type: Boolean, default: false },
147
+ autoPaymentSetupDate: { type: Date },
148
+
149
+ deviceInfo: {
150
+ deviceId: { type: String, default: null },
151
+ appPlatform: { type: String, enum: ["android", "ios", "web"], default: "web" },
152
+ model: { type: String, default: null },
153
+ appVersion: { type: String, default: "1.0.0" },
154
+ systemVersion: { type: String, default: null },
155
+ brand: { type: String, default: null },
156
+ },
157
+ },
158
+ { timestamps: true }
159
+ );
160
+
161
+ UserSchema.index({ _id: 1, "devices.deviceId": 1 }, { unique: true });
162
+
163
+ // ------------------- Instance Methods -------------------
164
+ UserSchema.methods.createJwtToken = function () {
165
+ return jwt.sign(
166
+ { _id: this._id, role: this.role },
167
+ process.env.JWT_SECRET,
168
+ { expiresIn: "4d" }
169
+ );
170
+ };
171
+
172
+ UserSchema.methods.comparePassword = async function (loginPassword) {
173
+ if (!this.password) return false;
174
+ return bcrypt.compare(loginPassword, this.password);
175
+ };
176
+
177
+ UserSchema.methods.getPublicProfile = function () {
178
+ const userObject = this.toObject();
179
+ delete userObject.password;
180
+ delete userObject.aadhaarNumberTransient;
181
+ delete userObject.aadhaarOTPReference;
182
+ delete userObject.aadhaarOTPExpiry;
183
+ delete userObject.emailVerificationOtp;
184
+ delete userObject.emailVerificationOtpExpiry;
185
+ return userObject;
186
+ };
187
+
188
+ UserSchema.methods.getSelectedAddress = function () {
189
+ if (
190
+ this.isAddressSelected &&
191
+ this.selectedAddressId &&
192
+ this.address &&
193
+ this.address.length > 0
194
+ ) {
195
+ return this.address.find((addr) =>
196
+ addr._id.equals(this.selectedAddressId)
197
+ );
198
+ }
199
+ return null;
200
+ };
201
+
202
+ // ------------------- Hooks -------------------
203
+ UserSchema.pre("save", async function (next) {
204
+ if (this.isModified("password") && this.password) {
205
+ try {
206
+ this.password = await bcrypt.hash(this.password, 10);
207
+ } catch (error) {
208
+ return next(error);
209
+ }
210
+ }
211
+ if (this.isModified("payuMandate.status")) {
212
+ this.isAutoPaymentEnabled = this.payuMandate.status === "active";
213
+ }
214
+ next();
215
+ });
216
+
217
+ // Cleanup seller if user is deleted
218
+ UserSchema.pre("deleteOne", { document: true, query: false }, async function (next) {
219
+ try {
220
+ await Seller.deleteOne({ userInfo: this._id }).exec();
221
+ next();
222
+ } catch (error) {
223
+ next(error);
224
+ }
225
+ });
226
+
227
+ // ------------------- Model Export -------------------
228
+ const User = mongoose.models.users || mongoose.model("users", UserSchema);
229
+ export default User;
package/package.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "flykup_model_production",
3
+ "version": "1.0.0",
4
+ "main": "index.js",
5
+ "type": "module",
6
+ "private": false,
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
10
+ "dependencies": {
11
+ "bcrypt": "^5.1.0",
12
+ "crypto": "^1.0.1",
13
+ "dotenv": "^16.4.5",
14
+ "jsonwebtoken": "^9.0.0",
15
+ "mongoose": "^8.0.0",
16
+ "nanoid": "^5.1.5"
17
+ }
18
+ }