shuttlepro-shared 1.3.41 → 1.3.43

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 (73) hide show
  1. package/common/repositories/customerProfile.repository.js +83 -14
  2. package/common/repositories/userRole.repository.js +5 -2
  3. package/config/redis.js +72 -73
  4. package/middlewares/checkPermission/index.js +36 -23
  5. package/models/Activity.js +28 -0
  6. package/models/ActivityLogs.js +1 -0
  7. package/models/AgentActivity.js +5 -4
  8. package/models/Attribute.js +130 -0
  9. package/models/Automation.js +231 -0
  10. package/models/BusinessRule.js +16 -0
  11. package/models/BusinessRuleHelper.js +13 -0
  12. package/models/Card.js +50 -1
  13. package/models/Catalogue.js +22 -0
  14. package/models/Category.js +129 -0
  15. package/models/ChatMemberSession.js +21 -0
  16. package/models/ChatMessage.js +43 -0
  17. package/models/Chatbot.js +1 -1
  18. package/models/Color.js +10 -0
  19. package/models/Column.js +6 -0
  20. package/models/Conversation.js +40 -0
  21. package/models/Customer.js +2 -1
  22. package/models/CustomerCheckpoint.js +21 -0
  23. package/models/DeviceInfo.js +13 -0
  24. package/models/Email.js +21 -0
  25. package/models/EmailMessage.js +30 -0
  26. package/models/EmailNotification.js +17 -0
  27. package/models/EscalationConfiguration.js +123 -0
  28. package/models/EscalationManager.js +50 -0
  29. package/models/Faq.js +29 -0
  30. package/models/FeedbackResponse.js +72 -0
  31. package/models/FormTemplate.js +27 -0
  32. package/models/Integration.js +8 -0
  33. package/models/InternalComments.js +27 -0
  34. package/models/InternalThreads.js +20 -0
  35. package/models/JobDesign.js +32 -0
  36. package/models/JobQueue.js +17 -0
  37. package/models/LabelsPdf.js +12 -0
  38. package/models/Layout.js +12 -0
  39. package/models/LoadSheet.js +31 -0
  40. package/models/Location.js +148 -0
  41. package/models/Logo.js +11 -0
  42. package/models/MailGroup.js +21 -0
  43. package/models/Notification.js +32 -0
  44. package/models/Order.js +11 -0
  45. package/models/OrderPdf.js +29 -0
  46. package/models/PostsAutomation.js +66 -0
  47. package/models/Product.js +337 -0
  48. package/models/ProductAttachment.js +158 -0
  49. package/models/ProductAttribute.js +140 -0
  50. package/models/ProductCategory.js +128 -0
  51. package/models/ProductLabels.js +11 -0
  52. package/models/ProductShopify.js +13 -0
  53. package/models/ProductTag.js +124 -0
  54. package/models/ProductVariant.js +157 -0
  55. package/models/Profile.js +3 -1
  56. package/models/ServiceUsage.js +26 -0
  57. package/models/ShipperSetting.js +24 -0
  58. package/models/SocialGroup.js +127 -0
  59. package/models/SocialPost.js +40 -0
  60. package/models/SocialProfile.js +56 -0
  61. package/models/Story.js +86 -0
  62. package/models/Tag.js +77 -0
  63. package/models/Template.js +76 -0
  64. package/models/TemplateFrame.js +55 -0
  65. package/models/TemplateTag.js +10 -0
  66. package/models/UserGuide.js +21 -0
  67. package/models/UserSession.js +47 -0
  68. package/models/VariantLocation.js +145 -0
  69. package/models/WhatsappFlow.js +29 -0
  70. package/models/Workflow.js +34 -0
  71. package/models/Workspace.js +78 -4
  72. package/models.js +168 -49
  73. package/package.json +1 -1
@@ -0,0 +1,157 @@
1
+ const mongoose = require("mongoose");
2
+ const { Schema } = mongoose;
3
+
4
+ const ProductVariantSchema = new Schema(
5
+ {
6
+ price: { type: Number, default: 0 },
7
+ costPrice: { type: Number, default: 0 },
8
+ name: { type: String, default: "" },
9
+ sku: { type: String, default: "" },
10
+ subSku: { type: String, default: "" },
11
+ salePrice: { type: Number, default: 0 },
12
+ quantity: { type: Number, default: null },
13
+ productId: { type: Schema.Types.ObjectId, ref: "Product", default: null },
14
+ oldId: { type: String, default: "" },
15
+ workspaceId: {
16
+ type: Schema.Types.ObjectId,
17
+ ref: "Workspace",
18
+ default: null,
19
+ },
20
+ webVariantId: { type: Number, default: null },
21
+ inventoryPolicy: { type: String, default: "deny" }, //deny,continue
22
+ taxable: { type: Boolean, default: false },
23
+ tax: { type: Number, default: 0 },
24
+ weight: { type: Number, default: 0 },
25
+ weightUnit: { type: String, default: "" },
26
+ attachmentId: {
27
+ type: Schema.Types.ObjectId,
28
+ ref: "ProductAttachment",
29
+ default: null,
30
+ },
31
+ webAttachmentId: { type: Number, default: null },
32
+ inventoryManagement: { type: String, default: "shopify" }, //shopify, null, fulfillment_service
33
+ webInventoryItemId: { type: Number, default: null },
34
+ manufactureDate: { type: String, default: "" },
35
+ expiryDate: { type: String, default: "" },
36
+ attributes: [],
37
+ attributeIds: [
38
+ // {
39
+ // type: Schema.Types.ObjectId,
40
+ // ref: "Attribute",
41
+ // default: null,
42
+ // },
43
+ ],
44
+ isDeleted: { type: Boolean, default: false },
45
+ createdBy: { type: Schema.Types.ObjectId, ref: "User", default: null },
46
+ updatedBy: { type: Schema.Types.ObjectId, ref: "User", default: null },
47
+ isDeleted: { type: Boolean, default: false },
48
+ bcVariantId: { type: String, default: "" },
49
+ },
50
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
51
+ );
52
+
53
+ ProductVariantSchema.virtual("variantLocations", {
54
+ ref: "VariantLocation",
55
+ localField: "_id",
56
+ foreignField: "variantId",
57
+ });
58
+
59
+ ProductVariantSchema.virtual("productAttachments", {
60
+ ref: "ProductAttachment",
61
+ localField: "_id",
62
+ foreignField: "variantIds",
63
+ });
64
+
65
+ const ProductVariant = mongoose.model("ProductVariant", ProductVariantSchema);
66
+
67
+ const createNewProductVariant = async (variantData) => {
68
+ try {
69
+ return await ProductVariant.create(variantData);
70
+ } catch (error) {
71
+ console.log(error);
72
+ return null;
73
+ }
74
+ };
75
+
76
+ const insertProductVariants = async (data) => {
77
+ try {
78
+ return await ProductVariant.create(data);
79
+ } catch (error) {
80
+ console.log(error);
81
+ return [];
82
+ }
83
+ };
84
+
85
+ const findProductVariants = async (criteria) => {
86
+ try {
87
+ const variants = await ProductVariant.find(criteria);
88
+ return variants;
89
+ } catch (error) {
90
+ console.log(error);
91
+ return [];
92
+ }
93
+ };
94
+
95
+ const findSingleProductVariant = async (obj) => {
96
+ try {
97
+ let variant = await ProductVariant.findOne(obj);
98
+ return variant;
99
+ } catch (err) {
100
+ return null;
101
+ }
102
+ };
103
+
104
+ const updateManyProductVariants = async (
105
+ criteria,
106
+ updateData,
107
+ options = {}
108
+ ) => {
109
+ try {
110
+ return await ProductVariant.updateMany(criteria, updateData, options);
111
+ } catch (error) {
112
+ console.log(error);
113
+ return null;
114
+ }
115
+ };
116
+
117
+ const findOneAndUpdateProductVariant = async (query, data) => {
118
+ try {
119
+ return await ProductVariant.findOneAndUpdate(
120
+ query,
121
+ { $set: data },
122
+ { new: true }
123
+ );
124
+ } catch (error) {
125
+ console.log("eerr", error);
126
+ return null;
127
+ }
128
+ };
129
+
130
+ const aggregateProductVariants = async (pipeline) => {
131
+ try {
132
+ return await ProductVariant.aggregate(pipeline);
133
+ } catch (error) {
134
+ console.log(error);
135
+ return null;
136
+ }
137
+ };
138
+
139
+ const findSingleProductVariantWithPopulate = async (obj, populateObj) => {
140
+ try {
141
+ return await ProductVariant.findOne(obj).populate(populateObj);
142
+ } catch (err) {
143
+ return null;
144
+ }
145
+ };
146
+
147
+ module.exports = {
148
+ insertProductVariants,
149
+ createNewProductVariant,
150
+ updateManyProductVariants,
151
+ findOneAndUpdateProductVariant,
152
+ aggregateProductVariants,
153
+ findProductVariants,
154
+ findSingleProductVariant,
155
+ findSingleProductVariantWithPopulate,
156
+ ProductVariant,
157
+ };
package/models/Profile.js CHANGED
@@ -68,7 +68,9 @@ const fetchProfileByEmailAndWorkspaceId = async (
68
68
  try {
69
69
  let profiles = await fetchProfiles(workspaceId);
70
70
  let profile = profiles.find(
71
- (p) => p?.userName === userName && p?.workspaceId === workspaceId
71
+ (p) =>
72
+ p?.userName === userName &&
73
+ p?.workspaceId?.toString() === workspaceId?.toString()
72
74
  );
73
75
  return profile || null;
74
76
  } catch (err) {
@@ -0,0 +1,26 @@
1
+ const mongoose = require("mongoose");
2
+ const { Schema } = mongoose;
3
+
4
+ const ServiceUsageSchema = new Schema(
5
+ {
6
+ type: {
7
+ type: String,
8
+ enum: ["nlp", "google"],
9
+ required: true,
10
+ },
11
+ data: {},
12
+ labelId: {
13
+ type: Schema.Types.ObjectId,
14
+ ref: "Label",
15
+ required: false,
16
+ },
17
+ workspaceId: {
18
+ type: Schema.Types.ObjectId,
19
+ ref: "Workspace",
20
+ },
21
+ },
22
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
23
+ );
24
+
25
+ const ServiceUsage = mongoose.model("ServiceUsage", ServiceUsageSchema);
26
+ module.exports = ServiceUsage;
@@ -0,0 +1,24 @@
1
+ const mongoose = require("mongoose");
2
+
3
+ const shipperSettingSchema = new mongoose.Schema(
4
+ {
5
+ publish: { type: Boolean, default: false },
6
+ defaultShipper: { type: String, default: "" },
7
+ codAmount: { type: Number, default: 0 },
8
+ workspaceId: { type: String, default: "" },
9
+ publishTime: [],
10
+ days: [],
11
+ minAmount: { type: Number, default: 0 },
12
+ tabs: [],
13
+ location: {
14
+ shippers: [],
15
+ citiesShippers: [],
16
+ },
17
+ weight: [],
18
+ prepaidOrder: [],
19
+ amount: [],
20
+ },
21
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
22
+ );
23
+
24
+ module.exports = mongoose.model("ShipperSetting", shipperSettingSchema);
@@ -0,0 +1,127 @@
1
+ const mongoose = require("mongoose");
2
+ const { Schema } = mongoose;
3
+
4
+ const SocialGroupSchema = new mongoose.Schema(
5
+ {
6
+ name: { type: String, default: "" },
7
+ products: [
8
+ {
9
+ productId: {
10
+ type: Schema.Types.ObjectId,
11
+ ref: "Product",
12
+ },
13
+ orderNo: {
14
+ type: String,
15
+ default: "",
16
+ },
17
+ },
18
+ ],
19
+ deletedArr: [],
20
+ productCount: { type: String, default: "" },
21
+ workspaceId: {
22
+ type: Schema.Types.ObjectId,
23
+ ref: "Workspace",
24
+ default: null,
25
+ },
26
+ isDeleted: { type: Boolean, default: false },
27
+ createdBy: { type: Schema.Types.ObjectId, ref: "User", default: null },
28
+ updatedBy: { type: Schema.Types.ObjectId, ref: "User", default: null },
29
+ },
30
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
31
+ );
32
+
33
+ const SocialGroup = mongoose.model("SocialGroup", SocialGroupSchema);
34
+
35
+ const createNewSocialGroup = async (socialGroupData) => {
36
+ try {
37
+ return await SocialGroup.create(socialGroupData);
38
+ } catch (error) {
39
+ console.log(error);
40
+ return null;
41
+ }
42
+ };
43
+
44
+ const findSocialGroupById = async (socialGroupId) => {
45
+ try {
46
+ return await SocialGroup.findById(socialGroupId);
47
+ } catch (error) {
48
+ console.log(error);
49
+ return null;
50
+ }
51
+ };
52
+
53
+ const updateSocialGroupById = async (criteria, updateData, options = {}) => {
54
+ try {
55
+ return await SocialGroup.findByIdAndUpdate(criteria, updateData, options);
56
+ } catch (error) {
57
+ console.log(error);
58
+ return null;
59
+ }
60
+ };
61
+
62
+ const deleteSocialGroupById = async (socialGroupId) => {
63
+ try {
64
+ return await SocialGroup.findByIdAndDelete(socialGroupId);
65
+ } catch (error) {
66
+ console.log(error);
67
+ return null;
68
+ }
69
+ };
70
+
71
+ const findSocialGroup = async (criteria, selectFields, populateOptions) => {
72
+ try {
73
+ let query = SocialGroup.findOne(criteria);
74
+
75
+ if (selectFields) {
76
+ query = query.select(selectFields);
77
+ }
78
+
79
+ if (populateOptions) {
80
+ query = query.populate(populateOptions);
81
+ }
82
+
83
+ return await query.exec();
84
+ } catch (error) {
85
+ console.error(error);
86
+ return null;
87
+ }
88
+ };
89
+
90
+ const findSocialGroups = async (criteria) => {
91
+ try {
92
+ return await SocialGroup.find(criteria);
93
+ } catch (error) {
94
+ console.log(error);
95
+ return null;
96
+ }
97
+ };
98
+
99
+ const socialGroupByAggregation = async (pipeline) => {
100
+ try {
101
+ return await SocialGroup.aggregate(pipeline);
102
+ } catch (error) {
103
+ console.log(error);
104
+ return null;
105
+ }
106
+ };
107
+
108
+ const socialGroupUpdateMany = async (criteria, updateData, options = {}) => {
109
+ try {
110
+ return await SocialGroup.updateMany(criteria, updateData, options);
111
+ } catch (error) {
112
+ console.log(error);
113
+ return null;
114
+ }
115
+ };
116
+
117
+ module.exports = {
118
+ SocialGroup,
119
+ createNewSocialGroup,
120
+ findSocialGroupById,
121
+ updateSocialGroupById,
122
+ deleteSocialGroupById,
123
+ findSocialGroup,
124
+ findSocialGroups,
125
+ socialGroupByAggregation,
126
+ socialGroupUpdateMany,
127
+ };
@@ -0,0 +1,40 @@
1
+ const mongoose = require("mongoose");
2
+ const { Schema } = mongoose;
3
+
4
+ const SocialPostSchema = new Schema(
5
+ {
6
+ type: { type: String, default: "single" },
7
+ postType: { type: String, default: "post" },
8
+ platformType: { type: String, default: "facebook" },
9
+ isScheduledPost: { type: Boolean, default: false },
10
+ workspaceId: {
11
+ type: Schema.Types.ObjectId,
12
+ ref: "Workspace",
13
+ default: null,
14
+ },
15
+ pageId: { type: String, default: "" },
16
+ pageName: { type: String, default: "" },
17
+ pageLogo: { type: String, default: "" },
18
+ pageToken: { type: String, default: "" },
19
+ caption: { type: String, default: "" },
20
+ permanentLink: { type: String, default: "" },
21
+ attachments: [{
22
+ link: { type: String, default: ""},
23
+ src: { type: String, default: "" },
24
+ caption: { type: String, default: "" },
25
+ mediaType: { type: String, default: "" }
26
+ }],
27
+ socialProfile: { type: Schema.Types.ObjectId, ref: "Integration", default: null },
28
+ status: { type: String, default: "scheduled" },
29
+ scheduleDate: {type: Date, default: null },
30
+ queued: { type: Boolean, default: false },
31
+ isDeleted: { type: Boolean, default: false },
32
+ publishedAt: { type: String, default: "" },
33
+ publishedBy: { type: Schema.Types.ObjectId, ref: "User", default: null },
34
+ },
35
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
36
+ );
37
+
38
+ const SocialPost = mongoose.model("SocialPost", SocialPostSchema);
39
+ module.exports = SocialPost;
40
+
@@ -0,0 +1,56 @@
1
+ const mongoose = require("mongoose");
2
+ const { Schema } = mongoose;
3
+
4
+ const socialProfileSchema = new mongoose.Schema(
5
+ {
6
+ pageName: { type: String, default: "" },
7
+ pageToken: { type: String, default: "" },
8
+ platformType: { type: String, default: "" },
9
+ pageId: { type: String, default: "" },
10
+ pageIcon: { type: String, default: "" },
11
+ pageCoverUrl: { type: String, default: "" },
12
+ username: { type: String, default: "" },
13
+ workspaceId: {
14
+ type: Schema.Types.ObjectId,
15
+ ref: "Workspace",
16
+ default: null,
17
+ },
18
+ isDeleted: { type: Boolean, default: false },
19
+ userId: { type: Schema.Types.ObjectId, ref: "User", default: null },
20
+ options: {
21
+ type: Object,
22
+ default: null,
23
+ },
24
+ },
25
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
26
+ );
27
+
28
+ const SocialProfile = mongoose.model("socialProfile", socialProfileSchema);
29
+
30
+ const getSocialProfile = async (profileId) => {
31
+ try {
32
+ return await SocialProfile.findOne({
33
+ _id: mongoose.Types.ObjectId(profileId),
34
+ });
35
+ } catch (error) {
36
+ throw error;
37
+ }
38
+ };
39
+ const findByPageId = async (pageId) => {
40
+ try {
41
+ let obj = { pageId: pageId, isDeleted: false };
42
+ const fetchingSocialProfile = await SocialProfile.findOne(obj);
43
+ if (fetchingSocialProfile) {
44
+ return fetchingSocialProfile;
45
+ }
46
+ return null;
47
+ } catch (err) {
48
+ return null;
49
+ }
50
+ };
51
+
52
+ module.exports = {
53
+ getSocialProfile,
54
+ findByPageId,
55
+ SocialProfile,
56
+ };
@@ -0,0 +1,86 @@
1
+ const mongoose = require("mongoose");
2
+
3
+ const StorySchema = new mongoose.Schema(
4
+ {
5
+ option: { type: String, default: "" },
6
+ images: [String],
7
+ shareAt: { type: String, default: "" },
8
+ userId: { type: String, default: "" },
9
+ delay: { type: String, default: "" },
10
+ status: { type: String, default: "pending" },
11
+ workspaceId: { type: String, default: "" },
12
+ timeZone: { type: String, default: "" },
13
+ pageId: { type: String, default: "" },
14
+ pageName: { type: String, default: "" },
15
+ pageLogo: { type: String, default: "" },
16
+ accessToken: { type: String, default: "" },
17
+ type: { type: String, default: "" },
18
+ productIds: [{ productId: { type: String, default: "" } }],
19
+ isDeleted: { type: Boolean, default: false },
20
+ isNotified: { type: Boolean, default: false },
21
+ },
22
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
23
+ );
24
+
25
+ const Story = mongoose.model("Story", StorySchema);
26
+
27
+ const storiesByAggregation = async (pipeline) => {
28
+ try {
29
+ return await Story.aggregate(pipeline);
30
+ } catch (err) {
31
+ return [];
32
+ }
33
+ };
34
+ const findStory = async (obj) => {
35
+ try {
36
+ return await Story.find(obj);
37
+ } catch (err) {
38
+ return err;
39
+ }
40
+ };
41
+ const findSingleStory = async (obj) => {
42
+ try {
43
+ return await Story.findOne(obj);
44
+ } catch (err) {
45
+ return err;
46
+ }
47
+ };
48
+ const deleteSingleStory = async (obj) => {
49
+ try {
50
+ return await Story.deleteOne(obj);
51
+ } catch (err) {
52
+ return err;
53
+ }
54
+ };
55
+ const saveStory = async (obj) => {
56
+ try {
57
+ let story = new Story(obj);
58
+ return await story.save();
59
+ } catch (err) {
60
+ return err;
61
+ }
62
+ };
63
+ const saveScheduledStory = async (obj) => {
64
+ try {
65
+ return await Story.insertMany(obj);
66
+ } catch (err) {
67
+ return [];
68
+ }
69
+ };
70
+ const findPendingStories = async (obj) => {
71
+ try {
72
+ return await Story.find(obj).exec();
73
+ } catch (err) {
74
+ return [];
75
+ }
76
+ };
77
+ module.exports = {
78
+ storiesByAggregation,
79
+ findStory,
80
+ findSingleStory,
81
+ deleteSingleStory,
82
+ saveStory,
83
+ saveScheduledStory,
84
+ findPendingStories,
85
+ Story,
86
+ };
package/models/Tag.js ADDED
@@ -0,0 +1,77 @@
1
+ const mongoose = require("mongoose");
2
+ const { Schema } = mongoose;
3
+ const TagSchema = new Schema(
4
+ {
5
+ name: { type: String, default: "" },
6
+ workspaceId: {
7
+ type: Schema.Types.ObjectId,
8
+ ref: "Workspace",
9
+ default: null,
10
+ },
11
+ oldId: { type: String, default: "" },
12
+ webTagId: { type: Number, default: "" },
13
+ createdBy: { type: Schema.Types.ObjectId, ref: "User", default: null },
14
+ updatedBy: { type: Schema.Types.ObjectId, ref: "User", default: null },
15
+ isDeleted: { type: Boolean, default: false },
16
+ },
17
+ { timestamps: true, toJSON: { virtuals: true }, toObject: { virtuals: true } }
18
+ );
19
+
20
+ const Tag = mongoose.model("Tag", TagSchema);
21
+
22
+ const tagsByAggregation = async (aggregate) => {
23
+ try {
24
+ return await Tag.aggregate(aggregate);
25
+ } catch (err) {
26
+ return [];
27
+ }
28
+ };
29
+
30
+ const findTags = async (obj) => {
31
+ try {
32
+ return await Tag.find(obj);
33
+ } catch (err) {
34
+ return [];
35
+ }
36
+ };
37
+
38
+ const findSingleTag = async (obj) => {
39
+ try {
40
+ return await Tag.findOne(obj);
41
+ } catch (err) {
42
+ return null;
43
+ }
44
+ };
45
+
46
+ const createTag = async (obj) => {
47
+ try {
48
+ const tag = new Tag(obj);
49
+ return await tag.save();
50
+ } catch (err) {
51
+ return null;
52
+ }
53
+ };
54
+ const softDeleteTags = async (workspaceId, convertingIds, type) => {
55
+ try {
56
+ const filter = {
57
+ workspaceId: workspaceId,
58
+ isDeleted: false,
59
+ };
60
+ filter[type] = { $in: convertingIds };
61
+ const update = { $set: { isDeleted: true } };
62
+ const result = await Tag.updateMany(filter, update);
63
+ return result;
64
+ } catch (err) {
65
+ return [];
66
+ }
67
+ };
68
+
69
+ module.exports = {
70
+ Tag,
71
+ tagsByAggregation,
72
+ findTags,
73
+ findSingleTag,
74
+ createTag,
75
+ softDeleteTags,
76
+ Tag,
77
+ };
@@ -0,0 +1,76 @@
1
+ const mongoose = require("mongoose");
2
+ const { Schema } = mongoose;
3
+
4
+ const templateSchema = new mongoose.Schema({
5
+ text: [
6
+ {
7
+ id: String,
8
+ textId: String,
9
+ text: String,
10
+ fontSize: String,
11
+ color: String,
12
+ fontFamily: String,
13
+ fontWeight: String,
14
+ textDecoration: String,
15
+ fontStyle: String,
16
+ x: Number,
17
+ y: Number,
18
+ width: Number,
19
+ rotation: { type: Number, default: 0 },
20
+ },
21
+ ],
22
+ image: [
23
+ {
24
+ id: String,
25
+ src: String,
26
+ url: String,
27
+ x: Number,
28
+ y: Number,
29
+ height: Number,
30
+ width: Number,
31
+ type: { type: String, default: "logo" },
32
+ },
33
+ ],
34
+ height: String,
35
+ width: String,
36
+ back: [
37
+ {
38
+ src: String,
39
+ id: String,
40
+ x: Number,
41
+ y: Number,
42
+ height: Number,
43
+ width: Number,
44
+ },
45
+ ],
46
+ display: [
47
+ {
48
+ id: String,
49
+ src: String,
50
+ x: Number,
51
+ y: Number,
52
+ height: Number,
53
+ width: Number,
54
+ rotation: { type: Number, default: 0 },
55
+ },
56
+ ],
57
+ preview: {
58
+ id: String,
59
+ src: String,
60
+ x: Number,
61
+ y: Number,
62
+ height: Number,
63
+ width: Number,
64
+ rotation: { type: Number, default: 0 },
65
+ },
66
+ frameId: {
67
+ type: Schema.Types.ObjectId,
68
+ ref: "TemplateFrame",
69
+ },
70
+ name: { type: String, default: "" },
71
+ canColor: String,
72
+ userId: String,
73
+ workspaceId: { type: String, default: "" },
74
+ });
75
+
76
+ module.exports = mongoose.model("Template", templateSchema);