shuttlepro-shared 1.1.57 → 1.1.59

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.
@@ -0,0 +1,53 @@
1
+ const mongoose = require("mongoose");
2
+ const { Schema } = mongoose;
3
+
4
+ const IntegrationSchema = new mongoose.Schema(
5
+ {
6
+ workspaceId: {
7
+ type: Schema.Types.ObjectId,
8
+ ref: "Workspace",
9
+ default: null,
10
+ },
11
+ type: {
12
+ type: String,
13
+ enum: [
14
+ "socialPlatforms",
15
+ "whatsapp",
16
+ "gmail",
17
+ "sms",
18
+ "map",
19
+ "facebook",
20
+ "instagram",
21
+ "webChat",
22
+ "smtp_gmail",
23
+ ],
24
+ },
25
+ chatbot: { type: Boolean, default: false },
26
+ isNlp: { type: Boolean, default: false },
27
+ autoTicket: {
28
+ enabled: { type: Boolean, default: false },
29
+ },
30
+ signature: {
31
+ type: Map,
32
+ of: mongoose.Schema.Types.Mixed,
33
+ default: {},
34
+ },
35
+ chatbotId: { type: Schema.Types.ObjectId, ref: "Chatbot", default: null },
36
+ members: [
37
+ {
38
+ type: Schema.Types.ObjectId,
39
+ ref: "User",
40
+ },
41
+ ],
42
+ body: {},
43
+ },
44
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
45
+ );
46
+
47
+ IntegrationSchema.virtual("conversations", {
48
+ ref: "Conversation",
49
+ localField: "_id",
50
+ foreignField: "platformId",
51
+ });
52
+
53
+ module.exports = mongoose.model("Integration", IntegrationSchema);
@@ -0,0 +1,42 @@
1
+ const mongoose = require("mongoose");
2
+ const { Schema } = mongoose;
3
+
4
+ const LabelSchema = new Schema(
5
+ {
6
+ color: { type: String },
7
+ title: {
8
+ type: String,
9
+ required: true,
10
+ },
11
+ type: {
12
+ type: String,
13
+ required: true,
14
+ default: "system",
15
+ enum: ["system", "custom", "escalation"],
16
+ },
17
+ workspaceId: {
18
+ type: Schema.Types.ObjectId,
19
+ ref: "Workspace",
20
+ },
21
+ },
22
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
23
+ );
24
+ LabelSchema.virtual("conversationCount", {
25
+ ref: "Conversation",
26
+ localField: "_id",
27
+ foreignField: "labels",
28
+ count: true,
29
+ });
30
+
31
+ LabelSchema.virtual("conversations", {
32
+ ref: "Conversation",
33
+ localField: "_id",
34
+ foreignField: "labels",
35
+ });
36
+
37
+ LabelSchema.set("toObject", { virtuals: true });
38
+ LabelSchema.set("toJSON", { virtuals: true });
39
+
40
+ const Label = mongoose.model("Label", LabelSchema);
41
+
42
+ module.exports = Label;
@@ -0,0 +1,46 @@
1
+ const mongoose = require("mongoose");
2
+ const { Schema } = mongoose;
3
+
4
+ const readBySchema = new Schema({
5
+ receiptTrigger: { type: Boolean, default: false },
6
+ readerId: { type: Schema.Types.ObjectId, ref: "User", default: null },
7
+ readTime: { type: String, default: "" },
8
+ responseTime: { type: String, default: "" },
9
+ });
10
+
11
+ const newMessageSchema = new mongoose.Schema(
12
+ {
13
+ workspaceId: {
14
+ type: Schema.Types.ObjectId,
15
+ ref: "Workspace",
16
+ default: null,
17
+ },
18
+ readBy: [readBySchema],
19
+ messageType: {
20
+ type: String,
21
+ enum: [
22
+ "system",
23
+ "user",
24
+ "internal",
25
+ "chatbot",
26
+ "auto-generated",
27
+ "facebook",
28
+ "instagram",
29
+ "webChat",
30
+ ],
31
+ required: true,
32
+ },
33
+ conversationId: {
34
+ type: Schema.Types.ObjectId,
35
+ ref: "Conversation",
36
+ default: null,
37
+ },
38
+ conversationType: { type: String },
39
+ activityId: { type: String, default: "" },
40
+
41
+ body: {},
42
+ },
43
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
44
+ );
45
+
46
+ module.exports = mongoose.model("Message", newMessageSchema);
@@ -0,0 +1,131 @@
1
+ const mongoose = require("mongoose");
2
+ const { Schema } = mongoose;
3
+
4
+ const ShipperInformation = new Schema({
5
+ _id: false,
6
+ shipperType: { type: String, default: "" },
7
+ weight: { type: Number, default: 0 }, //M&P, TRAX, INSTA, RIDER, TCS, CC
8
+ fragile: { type: Boolean, default: false }, //M&P, TRAX, INSTA, RIDER, TCS, CC
9
+ serviceType: { type: String, default: "" }, //M&P, TRAX, INSTA, RIDER, TCS, CC
10
+ serviceTypeId: { type: String, default: 1 }, //M&P, TRAX, INSTA, RIDER, TCS, CC
11
+ pieces: { type: Number, default: 0 }, //M&P, TRAX, INSTA, RIDER, TCS, CC
12
+ originCityName: { type: String, default: "" }, //M&P, TRAX, INSTA, RIDER, TCS, CC
13
+ remarks: { type: String, default: "" },
14
+ customer_note: { type: String, default: "" },
15
+ return_branch: { type: String, default: "" },
16
+ cityData: { type: String, default: "" }, //M&P, TRAX, INSTA, RIDER, TCS, CC
17
+ //TRAX
18
+ paymentMode: { type: Number, default: 0 },
19
+ addressId: { type: Number, default: 0 },
20
+ itemProductType: { type: Number, default: 0 },
21
+ shippingMode: { type: Number, default: 0 },
22
+ itemInsurance: { type: Boolean, default: false },
23
+ informationDisplay: { type: String, default: "" },
24
+ //Call Courier (CC)
25
+ shipperName: { type: String, default: "" },
26
+ shipperEmail: { type: String, default: "" },
27
+ shipperCellNo: { type: String, default: "" },
28
+ shipperLandlineNo: { type: String, default: "" },
29
+ shipperAddress: { type: String, default: "" },
30
+ shipperCityId: { type: Number, default: 0 },
31
+ shipperAreaId: { type: Number, default: 0 },
32
+ });
33
+
34
+ const OrderSchema = new Schema(
35
+ {
36
+ customerId: { type: Schema.Types.ObjectId, ref: "Customer", default: null },
37
+ swap: { type: String, default: "" },
38
+ shipperInformation: ShipperInformation,
39
+ trackingId: { type: String, default: "" },
40
+ cityName: { type: String, default: "" },
41
+ status: { type: String, default: "" },
42
+ lastStatusTime: { type: String, default: "" },
43
+ statusType: { type: String, default: "" },
44
+ returnOrder: {
45
+ received: { type: Boolean, default: false },
46
+ restocked: { type: Boolean, default: false },
47
+ remarks: { type: String, default: "" },
48
+ },
49
+ statusTypeId: {
50
+ type: Schema.Types.ObjectId,
51
+ ref: "StatusType",
52
+ default: null,
53
+ },
54
+ statusId: {
55
+ type: Schema.Types.ObjectId,
56
+ ref: "Status",
57
+ default: null,
58
+ },
59
+ totalAmount: { type: Number, default: 0 },
60
+ payableAmount: { type: Number, default: 0 },
61
+ parcelValue: { type: Number, default: 0 },
62
+ payableAmount: { type: Number, default: 0 },
63
+ customerName: { type: String, default: "" },
64
+ customerPhone: { type: String, default: "" },
65
+ customerAddress: { type: String, default: "" },
66
+ discountPercentage: { type: Number, default: 0 },
67
+ discountValue: { type: Number, default: 0 },
68
+ productDetails: { type: String, default: "" },
69
+ webOrderId: { type: String, default: "" },
70
+ webOrderNumber: { type: String, default: "" },
71
+ fulfillmentStatus: { type: String, default: "" },
72
+ webFulfillmentId: { type: String, default: "" },
73
+ pinLocation: { type: String, default: "" },
74
+ deliveryCharges: { type: Number, default: 0 },
75
+ tax: { type: Number, default: 0 },
76
+ workspaceId: {
77
+ type: Schema.Types.ObjectId,
78
+ ref: "Workspace",
79
+ default: null,
80
+ },
81
+ orderType: { type: String, default: "" },
82
+ barCode: { type: String, default: "" },
83
+ quantity: { type: Number, default: 0 },
84
+ assignTo: { type: Schema.Types.ObjectId, ref: "User", default: null },
85
+ isLoadSheetGenerated: { type: Boolean, default: false },
86
+ orderNumber: { type: String, default: "" },
87
+ orderDate: { type: String, default: "" },
88
+ returnDate: { type: String, default: "" },
89
+ receivedDate: { type: String, default: "" },
90
+ published: { type: Boolean, default: false },
91
+ isFlagged: { type: Boolean, default: false },
92
+ publishedTime: { type: String, default: "" },
93
+ paymentType: { type: String, default: "COD" },
94
+ isDeleted: { type: Boolean, default: false },
95
+ isFake: { type: Boolean, default: false },
96
+ statusUpdatedAt: { type: String, default: "" },
97
+ invalidCity: { type: Boolean, default: false },
98
+ invalidCredentials: { type: Boolean, default: false },
99
+ isConfirmed: { type: Boolean, default: false },
100
+ confirmedBy: { type: Schema.Types.ObjectId, ref: "User", default: null },
101
+ isBulk: { type: String, default: "" },
102
+ priority: { type: String, default: "" },
103
+ conversationId: { type: String, default: "" },
104
+ createdBy: { type: Schema.Types.ObjectId, ref: "User", default: null },
105
+ updatedBy: { type: Schema.Types.ObjectId, ref: "User", default: null },
106
+ publishedStatus: { type: String, default: "pending" },
107
+ isDuplicate: { type: Boolean, default: false },
108
+ ivrGenerated: { type: Boolean, default: false },
109
+ isActivityGenerated: { type: Boolean, default: false },
110
+ platformFinancialStatus: { type: String, default: "pending" },
111
+ payment: {},
112
+ credentials: {},
113
+ },
114
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
115
+ );
116
+
117
+ OrderSchema.virtual("checkPoints", {
118
+ ref: "Checkpoint",
119
+ localField: "_id",
120
+ foreignField: "orderId",
121
+ });
122
+
123
+ OrderSchema.virtual("orderProducts", {
124
+ ref: "OrderProduct",
125
+ localField: "_id",
126
+ foreignField: "orderId",
127
+ });
128
+
129
+ const Order = mongoose.model("Order", OrderSchema);
130
+
131
+ module.exports = Order;
@@ -0,0 +1,37 @@
1
+ const { Schema, model } = require("mongoose");
2
+ const OrderProductSchema = new Schema(
3
+ {
4
+ orderId: { type: Schema.Types.ObjectId, ref: "Order", default: null },
5
+ productId: { type: Schema.Types.ObjectId, ref: "Product", default: null },
6
+ variantId: {
7
+ type: Schema.Types.ObjectId,
8
+ ref: "ProductVariant",
9
+ default: null,
10
+ },
11
+ locationId: {
12
+ type: Schema.Types.ObjectId,
13
+ ref: "Location",
14
+ default: null,
15
+ },
16
+ quantity: { type: Number, default: 0 },
17
+ price: { type: Number, default: 0 },
18
+ totalAmount: { type: Number, default: 0 },
19
+ discountPercentage: { type: Number, default: 0 },
20
+ webFulfillmentOrderId: { type: String, default: "" },
21
+ webFulfillmentId: { type: String, default: "" },
22
+ isFullfilled: { type: Boolean, default: false },
23
+ isDeleted: { type: Boolean, default: false },
24
+ discountValue: { type: Number, default: 0 },
25
+ webLineItemId: { type: String, default: "" },
26
+ status: { type: String, default: "open" },
27
+ hyperLink: { type: String, default: "" },
28
+ parentOrderProductId: { type: Schema.Types.ObjectId, default: null },
29
+ workspaceId: {
30
+ type: Schema.Types.ObjectId,
31
+ ref: "Workspace",
32
+ default: null,
33
+ },
34
+ },
35
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
36
+ );
37
+ module.exports = model("OrderProduct", OrderProductSchema);
@@ -0,0 +1,27 @@
1
+ const mongoose = require("mongoose");
2
+
3
+ const reportSchema = new mongoose.Schema(
4
+ {
5
+ workspaceId: { type: String, default: "" },
6
+ type: {
7
+ type: String,
8
+ default: "",
9
+ },
10
+ title: { type: String, default: "" },
11
+ mode: { type: String, default: "combined" },
12
+ displayType: { type: String, default: "table" },
13
+ filter: {},
14
+ dateRange: {
15
+ startDate: { type: String, default: "" },
16
+ endDate: { type: String, default: "" },
17
+ },
18
+ actions: [],
19
+ processedData: [],
20
+ },
21
+ { timestamps: true }
22
+ );
23
+
24
+ reportSchema.index({ type: 1, workspaceId: 1 });
25
+ reportSchema.index({ type: 1, workspaceId: 1, title: 1 });
26
+
27
+ module.exports = mongoose.model("Report", reportSchema);
@@ -0,0 +1,52 @@
1
+ const mongoose = require("mongoose");
2
+ const { Schema } = mongoose;
3
+
4
+ const shipperInformationSchema = new Schema({
5
+ weight: { type: Number, default: 0 }, //M&P, TRAX, INSTA, RIDER, TCS, CC
6
+ fragile: { type: Boolean, default: false }, //M&P, TRAX, INSTA, RIDER, TCS, CC
7
+ serviceType: { type: String, default: "" }, //M&P, TRAX, INSTA, RIDER, TCS, CC
8
+ serviceTypeId: { type: String, default: "" }, //M&P, TRAX, INSTA, RIDER, TCS, CC
9
+ pieces: { type: Number, default: 0 }, //M&P, TRAX, INSTA, RIDER, TCS, CC
10
+ originCityName: { type: String, default: "" }, //M&P, TRAX, INSTA, RIDER, TCS, CC
11
+ remarks: { type: String, default: "" },
12
+ customer_note: { type: String, default: "" },
13
+ cityData: { type: String, default: "" },
14
+ return_branch: { type: String, default: "" },
15
+ //M&P, TRAX, INSTA, RIDER, TCS, CC
16
+ //TRAX
17
+ paymentMode: { type: Number, default: 0 },
18
+ addressId: { type: Number, default: 0 }, //this will not be shown
19
+ itemProductType: { type: Number, default: 0 },
20
+ shippingMode: { type: Number, default: 0 },
21
+ itemInsurance: { type: Boolean, default: false }, //this will not be shown
22
+ informationDisplay: { type: String, default: "" },
23
+ //Call Courier (CC)
24
+ shipperName: { type: String, default: "" }, //this will not be shown
25
+ shipperEmail: { type: String, default: "" }, //this will not be shown
26
+ shipperCellNo: { type: String, default: "" }, //this will not be shown
27
+ shipperLandlineNo: { type: String, default: "" }, //this will not be shown
28
+ shipperAddress: { type: String, default: "" }, //this will not be shown
29
+ shipperCityId: { type: Number, default: 0 }, //this will not be shown
30
+ shipperAreaId: { type: Number, default: 0 }, //this will not be shown
31
+ });
32
+
33
+ const shipperSchema = new mongoose.Schema(
34
+ {
35
+ type: { type: String, default: "" },
36
+ userName: { type: String, default: "" },
37
+ password: { type: String, default: "" },
38
+ clientId: { type: String, default: "" },
39
+ workspaceId: {
40
+ type: Schema.Types.ObjectId,
41
+ ref: "Workspace",
42
+ default: null,
43
+ },
44
+ shipperInformation: shipperInformationSchema,
45
+ isDeleted: { type: Boolean, default: false },
46
+ createdBy: { type: Schema.Types.ObjectId, ref: "User", default: null },
47
+ updatedBy: { type: Schema.Types.ObjectId, ref: "User", default: null },
48
+ },
49
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
50
+ );
51
+
52
+ module.exports = mongoose.model("shipper", shipperSchema);
@@ -0,0 +1,58 @@
1
+ const { Schema, model } = require("mongoose");
2
+ const { setRedisData, getRedisData } = require("../config/redis");
3
+
4
+ const StatusSchema = new Schema(
5
+ {
6
+ value: { type: String, default: "" },
7
+ description: { type: String, default: "" },
8
+ severity: { type: String, default: "1" },
9
+ shipperType: { type: String, default: "" },
10
+ internalValue: { type: String, default: "" },
11
+ statusTypeId: { type: Schema.Types.ObjectId, ref: "StatusType" },
12
+ type: { type: String, default: "" },
13
+ },
14
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
15
+ );
16
+
17
+ StatusSchema.post("save", async function (doc) {
18
+ try {
19
+ addOrUpdateStatusInCache(doc);
20
+ } catch (err) {
21
+ console.log("err", err);
22
+ }
23
+ });
24
+
25
+ StatusSchema.post("findOneAndUpdate", async function (doc) {
26
+ try {
27
+ addOrUpdateStatusInCache(doc);
28
+ } catch (err) {
29
+ console.log("err", err);
30
+ }
31
+ });
32
+
33
+ const addOrUpdateStatusInCache = async (doc) => {
34
+ try {
35
+ const docId = doc?._id.toString();
36
+ let statuses = (await getRedisData("statuses")) || [];
37
+ if (!statuses || statuses.length === 0) {
38
+ // Fetch all statuses from the database if not found in Redis
39
+ const allStatuses = await model("Status").find().lean().exec();
40
+ statuses = allStatuses;
41
+ await setRedisData("statuses", statuses);
42
+ } else {
43
+ const statusesMap = statuses.reduce((map, status) => {
44
+ map[status._id.toString()] = status;
45
+ return map;
46
+ }, {});
47
+ statusesMap[docId] = doc.toObject();
48
+ statuses = Object.values(statusesMap);
49
+ await setRedisData("statuses", statuses);
50
+ }
51
+ return { code: 200 };
52
+ } catch (err) {
53
+ console.log("Error in addOrUpdateOrderInCache:", err);
54
+ return { code: 400 };
55
+ }
56
+ };
57
+
58
+ module.exports = model("Status", StatusSchema);
@@ -0,0 +1,10 @@
1
+ const { Schema, model } = require("mongoose");
2
+
3
+ const StatusTypeSchema = new Schema(
4
+ {
5
+ name: { type: String, default: "" },
6
+ },
7
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
8
+ );
9
+
10
+ module.exports = model("StatusType", StatusTypeSchema);
package/models/Type.js ADDED
@@ -0,0 +1,25 @@
1
+ const mongoose = require("mongoose");
2
+
3
+ const typeSchema = new mongoose.Schema(
4
+ {
5
+ title: {
6
+ type: String,
7
+ required: true,
8
+ },
9
+ deleted: {
10
+ type: Boolean,
11
+ default: false,
12
+ },
13
+ workspaceId: { type: String, default: "" },
14
+ color: { type: String, default: "#4a90e2", required: true },
15
+ },
16
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
17
+ );
18
+
19
+ typeSchema.virtual("cardList", {
20
+ ref: "Card",
21
+ localField: "_id",
22
+ foreignField: "typeId",
23
+ });
24
+
25
+ module.exports = mongoose.model("Type", typeSchema);
@@ -0,0 +1,190 @@
1
+ const mongoose = require("mongoose");
2
+
3
+ const shiftSchema = new mongoose.Schema({
4
+ _id: {
5
+ type: mongoose.Schema.Types.ObjectId,
6
+ default: mongoose.Types.ObjectId,
7
+ },
8
+ shiftName: {
9
+ type: String,
10
+ required: true,
11
+ },
12
+ days: [
13
+ {
14
+ day: { type: String, required: true },
15
+ startTime: { type: String, required: true },
16
+ endTime: { type: String, required: true },
17
+ breakStartTime: { type: String, required: false },
18
+ breakEndTime: { type: String, required: false },
19
+ lateThreshold: { type: String, required: false },
20
+ },
21
+ ],
22
+ });
23
+
24
+ const scoreThresholdSchema = new mongoose.Schema({
25
+ operator: {
26
+ type: mongoose.Schema.Types.Mixed,
27
+ required: false,
28
+ },
29
+ value: {
30
+ type: mongoose.Schema.Types.Mixed,
31
+ required: true,
32
+ },
33
+ score: {
34
+ type: Number,
35
+ required: false,
36
+ },
37
+ additionalFields: {
38
+ type: mongoose.Schema.Types.Mixed,
39
+ default: {},
40
+ },
41
+ });
42
+
43
+ const kpiSchema = new mongoose.Schema({
44
+ weight: {
45
+ type: Number,
46
+ required: true,
47
+ },
48
+ scoreThresholds: {
49
+ type: [scoreThresholdSchema],
50
+ default: [],
51
+ },
52
+ relativeGrading: {
53
+ type: Boolean,
54
+ default: false,
55
+ },
56
+ });
57
+
58
+ const workspaceSchema = new mongoose.Schema(
59
+ {
60
+ name: {
61
+ type: String,
62
+ required: true,
63
+ trim: true,
64
+ },
65
+ iconUrl: { type: String, default: "" },
66
+ thumbUrl: { type: String, default: "" },
67
+ createdBy: {
68
+ type: mongoose.Schema.Types.ObjectId,
69
+ ref: "User",
70
+ default: null,
71
+ },
72
+ updatedBy: {
73
+ type: mongoose.Schema.Types.ObjectId,
74
+ ref: "User",
75
+ default: null,
76
+ },
77
+ productsCount: { type: Number, default: 0 },
78
+ ordersCount: { type: Number, default: 0 },
79
+ shippers: [{ type: String, trim: true }],
80
+ socialProfiles: [],
81
+ shiftConfigurations: [shiftSchema],
82
+ kpiConfiguration: {
83
+ type: Map,
84
+ of: kpiSchema,
85
+ default: {},
86
+ },
87
+ members: [],
88
+ contact: String,
89
+ email: String,
90
+ address: String,
91
+ websiteUrl: String,
92
+ facebookUrl: String,
93
+ twitterUrl: String,
94
+ instagramUrl: String,
95
+ isDeleted: { type: Boolean, default: false },
96
+ businessHours: {
97
+ startTime: { type: String, default: "" },
98
+ endTime: { type: String, default: "" },
99
+ },
100
+ remarks: [
101
+ {
102
+ reason: { type: String, default: "" },
103
+ type: { type: String, default: "" },
104
+ },
105
+ ],
106
+ chatGptApiKey: String,
107
+ skuSeparator: { type: String, default: "-" },
108
+ uniqueNo: { type: Number, default: 0 },
109
+ webhookStatus: { type: String, default: "" },
110
+ businessCategory: { type: String, default: "" },
111
+ numberOfProducts: { type: Number, default: 0 },
112
+ monthlyOrders: { type: Number, default: 0 },
113
+ queueTracking: { type: Boolean, default: false },
114
+ orderConfiguration: { type: String, default: "" },
115
+ defaultModule: { type: String, default: "dashboard" },
116
+ dynamicFieldsTemplate: [
117
+ {
118
+ groupName: { type: String, required: true, trim: true },
119
+ fields: [
120
+ {
121
+ fieldName: {
122
+ type: String,
123
+ required: true,
124
+ trim: true,
125
+ },
126
+ required: {
127
+ type: Boolean,
128
+ default: false,
129
+ },
130
+ enabled: {
131
+ type: Boolean,
132
+ default: true,
133
+ },
134
+ createdBy: {
135
+ type: mongoose.Schema.Types.ObjectId,
136
+ ref: "User",
137
+ default: null,
138
+ },
139
+ updatedBy: {
140
+ type: mongoose.Schema.Types.ObjectId,
141
+ ref: "User",
142
+ default: null,
143
+ },
144
+ fieldType: {
145
+ type: String,
146
+ enum: [
147
+ "text",
148
+ "autocomplete",
149
+ "radio",
150
+ "text area",
151
+ "number",
152
+ "date",
153
+ "time",
154
+ "email",
155
+ "range",
156
+ "url",
157
+ "colour",
158
+ "file",
159
+ ],
160
+ },
161
+ option: {
162
+ type: mongoose.Schema.Types.Mixed,
163
+ },
164
+ },
165
+ ],
166
+ },
167
+ ],
168
+ },
169
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
170
+ );
171
+
172
+ const commonOptions = {
173
+ type: String,
174
+ trim: true,
175
+ default: "",
176
+ };
177
+
178
+ workspaceSchema.add({
179
+ contact: commonOptions,
180
+ email: commonOptions,
181
+ address: commonOptions,
182
+ websiteUrl: commonOptions,
183
+ facebookUrl: commonOptions,
184
+ twitterUrl: commonOptions,
185
+ instagramUrl: commonOptions,
186
+ chatGptApiKey: commonOptions,
187
+ });
188
+
189
+ const Workspace = mongoose.model("Workspace", workspaceSchema);
190
+ module.exports = Workspace;