flykup_model_production 1.0.16 → 1.0.18
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/.gitattributes +2 -0
- package/.github/workflows/publish.yml +31 -0
- package/auth.js +14 -14
- package/config.js +1 -1
- package/db_connection.js +23 -23
- package/index.js +140 -140
- package/models/AadhaarVerification.js +131 -131
- package/models/AdminEmail.model.js +38 -38
- package/models/BankVerification.js +92 -92
- package/models/GSTVerification.js +89 -89
- package/models/LiveStreamInteraction.model.js +101 -101
- package/models/ProductInteraction.model.js +108 -108
- package/models/Review.model.js +121 -121
- package/models/SearchAnalytics.js +23 -23
- package/models/ShoppableInteraction.model.js +106 -106
- package/models/Wishlist.model.js +29 -29
- package/models/admin.model.js +42 -42
- package/models/appUpdate.model.js +19 -19
- package/models/assets.model.js +32 -32
- package/models/blockedRegion.models.js +27 -27
- package/models/chat.model.js +511 -511
- package/models/coHostInvitation.model.js +60 -60
- package/models/follow.model.js +38 -38
- package/models/loginlogs.model.js +26 -26
- package/models/notification.model.js +130 -129
- package/models/order.modal.js +385 -385
- package/models/orderPayment.model.js +218 -218
- package/models/productListing.model.js +322 -322
- package/models/profileInteractions.model.js +44 -44
- package/models/registerShow.model.js +29 -29
- package/models/sellerDraft.model.js +27 -27
- package/models/shipper.model.js +126 -126
- package/models/shoppableVideo.model.js +237 -237
- package/models/shoppableVideoComment.model.js +57 -57
- package/models/shoppableVideoLike.model.js +29 -29
- package/models/shoppableVideoSave.model.js +27 -27
- package/models/shows.model.js +603 -603
- package/models/stock.model.js +105 -105
- package/models/ticket.model.js +115 -115
- package/package.json +18 -18
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
import mongoose, { Schema, model } from 'mongoose';
|
|
2
|
-
|
|
3
|
-
const profileInteractionSchema = new mongoose.Schema({
|
|
4
|
-
profile: {
|
|
5
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
6
|
-
ref: 'users',
|
|
7
|
-
required: true,
|
|
8
|
-
index: true
|
|
9
|
-
},
|
|
10
|
-
viewer: {
|
|
11
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
12
|
-
ref: 'users',
|
|
13
|
-
index: true
|
|
14
|
-
},
|
|
15
|
-
location: {
|
|
16
|
-
city: String,
|
|
17
|
-
region: String,
|
|
18
|
-
country: String
|
|
19
|
-
},
|
|
20
|
-
platform: {
|
|
21
|
-
type: String,
|
|
22
|
-
enum: ['web', 'mobile', 'unknown'],
|
|
23
|
-
default: 'mobile'
|
|
24
|
-
},
|
|
25
|
-
device: {
|
|
26
|
-
type: String,
|
|
27
|
-
enum: ['mobile', 'desktop', 'tablet', 'other']
|
|
28
|
-
},
|
|
29
|
-
browser: String,
|
|
30
|
-
os: String,
|
|
31
|
-
ip: { type: String, required: true },
|
|
32
|
-
viewedAt: { type: Date, default: Date.now }
|
|
33
|
-
}, { timestamps: true });
|
|
34
|
-
|
|
35
|
-
// Ensures a user's view is counted only once per profile
|
|
36
|
-
profileInteractionSchema.index({ profile: 1, viewer: 1 }, {
|
|
37
|
-
unique: true,
|
|
38
|
-
partialFilterExpression: { viewer: { $exists: true } }
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
profileInteractionSchema.index({ viewedAt: -1 });
|
|
42
|
-
// Safe export to prevent OverwriteModelError
|
|
43
|
-
const ProfileInteraction = mongoose.models.ProfileInteraction || mongoose.model('ProfileInteraction', profileInteractionSchema);
|
|
44
|
-
export default ProfileInteraction;
|
|
1
|
+
import mongoose, { Schema, model } from 'mongoose';
|
|
2
|
+
|
|
3
|
+
const profileInteractionSchema = new mongoose.Schema({
|
|
4
|
+
profile: {
|
|
5
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
6
|
+
ref: 'users',
|
|
7
|
+
required: true,
|
|
8
|
+
index: true
|
|
9
|
+
},
|
|
10
|
+
viewer: {
|
|
11
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
12
|
+
ref: 'users',
|
|
13
|
+
index: true
|
|
14
|
+
},
|
|
15
|
+
location: {
|
|
16
|
+
city: String,
|
|
17
|
+
region: String,
|
|
18
|
+
country: String
|
|
19
|
+
},
|
|
20
|
+
platform: {
|
|
21
|
+
type: String,
|
|
22
|
+
enum: ['web', 'mobile', 'unknown'],
|
|
23
|
+
default: 'mobile'
|
|
24
|
+
},
|
|
25
|
+
device: {
|
|
26
|
+
type: String,
|
|
27
|
+
enum: ['mobile', 'desktop', 'tablet', 'other']
|
|
28
|
+
},
|
|
29
|
+
browser: String,
|
|
30
|
+
os: String,
|
|
31
|
+
ip: { type: String, required: true },
|
|
32
|
+
viewedAt: { type: Date, default: Date.now }
|
|
33
|
+
}, { timestamps: true });
|
|
34
|
+
|
|
35
|
+
// Ensures a user's view is counted only once per profile
|
|
36
|
+
profileInteractionSchema.index({ profile: 1, viewer: 1 }, {
|
|
37
|
+
unique: true,
|
|
38
|
+
partialFilterExpression: { viewer: { $exists: true } }
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
profileInteractionSchema.index({ viewedAt: -1 });
|
|
42
|
+
// Safe export to prevent OverwriteModelError
|
|
43
|
+
const ProfileInteraction = mongoose.models.ProfileInteraction || mongoose.model('ProfileInteraction', profileInteractionSchema);
|
|
44
|
+
export default ProfileInteraction;
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import mongoose, { Schema, model } from 'mongoose';
|
|
2
|
-
|
|
3
|
-
const registerShowSchema = new mongoose.Schema(
|
|
4
|
-
{
|
|
5
|
-
showId: {
|
|
6
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
7
|
-
ref: "shows", // Changed back to "Shows" to match your actual model name
|
|
8
|
-
required: true,
|
|
9
|
-
},
|
|
10
|
-
userId: {
|
|
11
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
12
|
-
ref: "users", // Make sure this matches your User model name
|
|
13
|
-
required: true,
|
|
14
|
-
},
|
|
15
|
-
registeredAt: {
|
|
16
|
-
type: Date,
|
|
17
|
-
default: Date.now,
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
{ timestamps: true }
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
// Add compound index to prevent duplicate registrations
|
|
24
|
-
registerShowSchema.index({ showId: 1, userId: 1 }, { unique: true });
|
|
25
|
-
|
|
26
|
-
// Safe export to prevent OverwriteModelError
|
|
27
|
-
const RegisterShow = mongoose.models.RegisterShow || mongoose.model("RegisterShow", registerShowSchema);
|
|
28
|
-
export default RegisterShow;
|
|
29
|
-
|
|
1
|
+
import mongoose, { Schema, model } from 'mongoose';
|
|
2
|
+
|
|
3
|
+
const registerShowSchema = new mongoose.Schema(
|
|
4
|
+
{
|
|
5
|
+
showId: {
|
|
6
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
7
|
+
ref: "shows", // Changed back to "Shows" to match your actual model name
|
|
8
|
+
required: true,
|
|
9
|
+
},
|
|
10
|
+
userId: {
|
|
11
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
12
|
+
ref: "users", // Make sure this matches your User model name
|
|
13
|
+
required: true,
|
|
14
|
+
},
|
|
15
|
+
registeredAt: {
|
|
16
|
+
type: Date,
|
|
17
|
+
default: Date.now,
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
{ timestamps: true }
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
// Add compound index to prevent duplicate registrations
|
|
24
|
+
registerShowSchema.index({ showId: 1, userId: 1 }, { unique: true });
|
|
25
|
+
|
|
26
|
+
// Safe export to prevent OverwriteModelError
|
|
27
|
+
const RegisterShow = mongoose.models.RegisterShow || mongoose.model("RegisterShow", registerShowSchema);
|
|
28
|
+
export default RegisterShow;
|
|
29
|
+
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import mongoose from "mongoose";
|
|
2
|
-
const { Schema } = mongoose;
|
|
3
|
-
|
|
4
|
-
const SellerDraftSchema = new Schema(
|
|
5
|
-
{
|
|
6
|
-
userInfo: {
|
|
7
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
8
|
-
ref: "users",
|
|
9
|
-
required: true,
|
|
10
|
-
unique: true, // A user can only have one draft
|
|
11
|
-
index: true,
|
|
12
|
-
},
|
|
13
|
-
formData: {
|
|
14
|
-
type: mongoose.Schema.Types.Mixed, // Allows storing a flexible, partially-filled form object
|
|
15
|
-
required: true,
|
|
16
|
-
},
|
|
17
|
-
// The 'createdAt' and 'updatedAt' fields are automatically managed by timestamps: true
|
|
18
|
-
},
|
|
19
|
-
{ timestamps: true }
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
// TTL Index: Automatically delete documents 30 days after they were last updated.
|
|
23
|
-
// This keeps your collection clean from abandoned drafts.
|
|
24
|
-
SellerDraftSchema.index({ updatedAt: 1 }, { expireAfterSeconds: 2592000 }); // 30 days in seconds
|
|
25
|
-
|
|
26
|
-
const SellerDraft = mongoose.models.sellerDrafts || mongoose.model("sellerDrafts", SellerDraftSchema);
|
|
27
|
-
|
|
1
|
+
import mongoose from "mongoose";
|
|
2
|
+
const { Schema } = mongoose;
|
|
3
|
+
|
|
4
|
+
const SellerDraftSchema = new Schema(
|
|
5
|
+
{
|
|
6
|
+
userInfo: {
|
|
7
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
8
|
+
ref: "users",
|
|
9
|
+
required: true,
|
|
10
|
+
unique: true, // A user can only have one draft
|
|
11
|
+
index: true,
|
|
12
|
+
},
|
|
13
|
+
formData: {
|
|
14
|
+
type: mongoose.Schema.Types.Mixed, // Allows storing a flexible, partially-filled form object
|
|
15
|
+
required: true,
|
|
16
|
+
},
|
|
17
|
+
// The 'createdAt' and 'updatedAt' fields are automatically managed by timestamps: true
|
|
18
|
+
},
|
|
19
|
+
{ timestamps: true }
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
// TTL Index: Automatically delete documents 30 days after they were last updated.
|
|
23
|
+
// This keeps your collection clean from abandoned drafts.
|
|
24
|
+
SellerDraftSchema.index({ updatedAt: 1 }, { expireAfterSeconds: 2592000 }); // 30 days in seconds
|
|
25
|
+
|
|
26
|
+
const SellerDraft = mongoose.models.sellerDrafts || mongoose.model("sellerDrafts", SellerDraftSchema);
|
|
27
|
+
|
|
28
28
|
export default SellerDraft;
|
package/models/shipper.model.js
CHANGED
|
@@ -1,126 +1,126 @@
|
|
|
1
|
-
import mongoose from "mongoose";
|
|
2
|
-
const { Schema } = mongoose;
|
|
3
|
-
|
|
4
|
-
const dropshipperConnectionSchema = new Schema({
|
|
5
|
-
_id: false,
|
|
6
|
-
sellerId: {
|
|
7
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
8
|
-
ref: "sellers",
|
|
9
|
-
required: true,
|
|
10
|
-
},
|
|
11
|
-
status: {
|
|
12
|
-
type: String,
|
|
13
|
-
enum: [
|
|
14
|
-
"pending",
|
|
15
|
-
"approved",
|
|
16
|
-
"rejected",
|
|
17
|
-
"revoked_by_seller",
|
|
18
|
-
"revoked_by_dropshipper",
|
|
19
|
-
],
|
|
20
|
-
required: true,
|
|
21
|
-
default: "pending",
|
|
22
|
-
},
|
|
23
|
-
commissionRate: {
|
|
24
|
-
type: Number, // Store as percentage, e.g., 15 for 15%
|
|
25
|
-
min: 0,
|
|
26
|
-
max: 100,
|
|
27
|
-
default: null, // Or a platform default? Needs discussion
|
|
28
|
-
},
|
|
29
|
-
agreementDetails: {
|
|
30
|
-
type: String,
|
|
31
|
-
maxLength: 500,
|
|
32
|
-
default: null,
|
|
33
|
-
},
|
|
34
|
-
requestedAt: {
|
|
35
|
-
type: Date,
|
|
36
|
-
default: Date.now,
|
|
37
|
-
},
|
|
38
|
-
respondedAt: {
|
|
39
|
-
type: Date,
|
|
40
|
-
default: null,
|
|
41
|
-
},
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
const DropshipperSchema = new Schema(
|
|
45
|
-
{
|
|
46
|
-
userInfo: {
|
|
47
|
-
type: mongoose.Schema.Types.ObjectId,
|
|
48
|
-
ref: "users",
|
|
49
|
-
required: true,
|
|
50
|
-
unique: true, // Ensure one user is only one dropshipper
|
|
51
|
-
index: true,
|
|
52
|
-
},
|
|
53
|
-
// Dropshipper specific info (can mirror Seller or be simpler)
|
|
54
|
-
businessName: {
|
|
55
|
-
// Optional: If they operate under a different name
|
|
56
|
-
type: String,
|
|
57
|
-
maxLength: 60,
|
|
58
|
-
trim: true,
|
|
59
|
-
},
|
|
60
|
-
mobileNumber: {
|
|
61
|
-
// May differ from user's primary mobile
|
|
62
|
-
type: String,
|
|
63
|
-
maxLength: 15,
|
|
64
|
-
trim: true,
|
|
65
|
-
},
|
|
66
|
-
email: {
|
|
67
|
-
// May differ from user's primary email
|
|
68
|
-
type: String,
|
|
69
|
-
trim: true,
|
|
70
|
-
maxLength: 60,
|
|
71
|
-
},
|
|
72
|
-
// Connections managed by the Dropshipper
|
|
73
|
-
connectedSellers: [dropshipperConnectionSchema],
|
|
74
|
-
|
|
75
|
-
// Address might be needed for correspondence or legal reasons
|
|
76
|
-
address: {
|
|
77
|
-
addressLine1: { type: String, trim: true, maxLength: 150 },
|
|
78
|
-
addressLine2: { type: String, trim: true, maxLength: 150 },
|
|
79
|
-
city: { type: String, trim: true, maxLength: 50 },
|
|
80
|
-
state: { type: String, trim: true, maxLength: 50 },
|
|
81
|
-
pincode: { type: String, trim: true, maxLength: 6 },
|
|
82
|
-
},
|
|
83
|
-
|
|
84
|
-
// Payout information (CRUCIAL for dropshippers)
|
|
85
|
-
bankDetails: {
|
|
86
|
-
accountHolderName: { type: String, trim: true },
|
|
87
|
-
accountNumber: { type: String, trim: true },
|
|
88
|
-
ifscCode: { type: String, trim: true },
|
|
89
|
-
bankName: { type: String, trim: true },
|
|
90
|
-
// Add UPI details if needed
|
|
91
|
-
},
|
|
92
|
-
|
|
93
|
-
// Admin approval status for the dropshipper account itself
|
|
94
|
-
approvalStatus: {
|
|
95
|
-
type: String,
|
|
96
|
-
enum: ["pending", "approved", "rejected", "suspended"],
|
|
97
|
-
default: "pending",
|
|
98
|
-
},
|
|
99
|
-
rejectedReason: {
|
|
100
|
-
type: String,
|
|
101
|
-
maxLength: 200,
|
|
102
|
-
default: null,
|
|
103
|
-
},
|
|
104
|
-
// Add other relevant fields like readiness for live selling etc.
|
|
105
|
-
// e.g., experience, social media links if relevant
|
|
106
|
-
},
|
|
107
|
-
{ timestamps: true, strict: true } // Use strict: true to prevent undefined fields
|
|
108
|
-
);
|
|
109
|
-
|
|
110
|
-
// Pre-hook (Example): Ensure user role is updated when dropshipper is created/approved
|
|
111
|
-
// This logic might be better placed in the controller after successful creation/approval
|
|
112
|
-
// DropshipperSchema.pre('save', async function (next) {
|
|
113
|
-
// if (this.isNew || this.isModified('approvalStatus')) {
|
|
114
|
-
// try {
|
|
115
|
-
// const User = mongoose.model('users'); // Avoid circular dependency if possible
|
|
116
|
-
// await User.findByIdAndUpdate(this.userInfo, {
|
|
117
|
-
// $set: { role: this.approvalStatus === 'approved' ? 'dropshipper' : 'user' } // Adjust logic as needed
|
|
118
|
-
// });
|
|
119
|
-
// } catch (error) {
|
|
120
|
-
// return next(error);
|
|
121
|
-
// }
|
|
122
|
-
// }
|
|
123
|
-
// next();
|
|
124
|
-
// });
|
|
125
|
-
const Dropshipper = mongoose.models.dropshippers || mongoose.model("dropshippers", DropshipperSchema);
|
|
126
|
-
export default Dropshipper;
|
|
1
|
+
import mongoose from "mongoose";
|
|
2
|
+
const { Schema } = mongoose;
|
|
3
|
+
|
|
4
|
+
const dropshipperConnectionSchema = new Schema({
|
|
5
|
+
_id: false,
|
|
6
|
+
sellerId: {
|
|
7
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
8
|
+
ref: "sellers",
|
|
9
|
+
required: true,
|
|
10
|
+
},
|
|
11
|
+
status: {
|
|
12
|
+
type: String,
|
|
13
|
+
enum: [
|
|
14
|
+
"pending",
|
|
15
|
+
"approved",
|
|
16
|
+
"rejected",
|
|
17
|
+
"revoked_by_seller",
|
|
18
|
+
"revoked_by_dropshipper",
|
|
19
|
+
],
|
|
20
|
+
required: true,
|
|
21
|
+
default: "pending",
|
|
22
|
+
},
|
|
23
|
+
commissionRate: {
|
|
24
|
+
type: Number, // Store as percentage, e.g., 15 for 15%
|
|
25
|
+
min: 0,
|
|
26
|
+
max: 100,
|
|
27
|
+
default: null, // Or a platform default? Needs discussion
|
|
28
|
+
},
|
|
29
|
+
agreementDetails: {
|
|
30
|
+
type: String,
|
|
31
|
+
maxLength: 500,
|
|
32
|
+
default: null,
|
|
33
|
+
},
|
|
34
|
+
requestedAt: {
|
|
35
|
+
type: Date,
|
|
36
|
+
default: Date.now,
|
|
37
|
+
},
|
|
38
|
+
respondedAt: {
|
|
39
|
+
type: Date,
|
|
40
|
+
default: null,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const DropshipperSchema = new Schema(
|
|
45
|
+
{
|
|
46
|
+
userInfo: {
|
|
47
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
48
|
+
ref: "users",
|
|
49
|
+
required: true,
|
|
50
|
+
unique: true, // Ensure one user is only one dropshipper
|
|
51
|
+
index: true,
|
|
52
|
+
},
|
|
53
|
+
// Dropshipper specific info (can mirror Seller or be simpler)
|
|
54
|
+
businessName: {
|
|
55
|
+
// Optional: If they operate under a different name
|
|
56
|
+
type: String,
|
|
57
|
+
maxLength: 60,
|
|
58
|
+
trim: true,
|
|
59
|
+
},
|
|
60
|
+
mobileNumber: {
|
|
61
|
+
// May differ from user's primary mobile
|
|
62
|
+
type: String,
|
|
63
|
+
maxLength: 15,
|
|
64
|
+
trim: true,
|
|
65
|
+
},
|
|
66
|
+
email: {
|
|
67
|
+
// May differ from user's primary email
|
|
68
|
+
type: String,
|
|
69
|
+
trim: true,
|
|
70
|
+
maxLength: 60,
|
|
71
|
+
},
|
|
72
|
+
// Connections managed by the Dropshipper
|
|
73
|
+
connectedSellers: [dropshipperConnectionSchema],
|
|
74
|
+
|
|
75
|
+
// Address might be needed for correspondence or legal reasons
|
|
76
|
+
address: {
|
|
77
|
+
addressLine1: { type: String, trim: true, maxLength: 150 },
|
|
78
|
+
addressLine2: { type: String, trim: true, maxLength: 150 },
|
|
79
|
+
city: { type: String, trim: true, maxLength: 50 },
|
|
80
|
+
state: { type: String, trim: true, maxLength: 50 },
|
|
81
|
+
pincode: { type: String, trim: true, maxLength: 6 },
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
// Payout information (CRUCIAL for dropshippers)
|
|
85
|
+
bankDetails: {
|
|
86
|
+
accountHolderName: { type: String, trim: true },
|
|
87
|
+
accountNumber: { type: String, trim: true },
|
|
88
|
+
ifscCode: { type: String, trim: true },
|
|
89
|
+
bankName: { type: String, trim: true },
|
|
90
|
+
// Add UPI details if needed
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
// Admin approval status for the dropshipper account itself
|
|
94
|
+
approvalStatus: {
|
|
95
|
+
type: String,
|
|
96
|
+
enum: ["pending", "approved", "rejected", "suspended"],
|
|
97
|
+
default: "pending",
|
|
98
|
+
},
|
|
99
|
+
rejectedReason: {
|
|
100
|
+
type: String,
|
|
101
|
+
maxLength: 200,
|
|
102
|
+
default: null,
|
|
103
|
+
},
|
|
104
|
+
// Add other relevant fields like readiness for live selling etc.
|
|
105
|
+
// e.g., experience, social media links if relevant
|
|
106
|
+
},
|
|
107
|
+
{ timestamps: true, strict: true } // Use strict: true to prevent undefined fields
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
// Pre-hook (Example): Ensure user role is updated when dropshipper is created/approved
|
|
111
|
+
// This logic might be better placed in the controller after successful creation/approval
|
|
112
|
+
// DropshipperSchema.pre('save', async function (next) {
|
|
113
|
+
// if (this.isNew || this.isModified('approvalStatus')) {
|
|
114
|
+
// try {
|
|
115
|
+
// const User = mongoose.model('users'); // Avoid circular dependency if possible
|
|
116
|
+
// await User.findByIdAndUpdate(this.userInfo, {
|
|
117
|
+
// $set: { role: this.approvalStatus === 'approved' ? 'dropshipper' : 'user' } // Adjust logic as needed
|
|
118
|
+
// });
|
|
119
|
+
// } catch (error) {
|
|
120
|
+
// return next(error);
|
|
121
|
+
// }
|
|
122
|
+
// }
|
|
123
|
+
// next();
|
|
124
|
+
// });
|
|
125
|
+
const Dropshipper = mongoose.models.dropshippers || mongoose.model("dropshippers", DropshipperSchema);
|
|
126
|
+
export default Dropshipper;
|