codebase-models 1.0.7 → 2.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 (145) hide show
  1. package/.github/workflows/npm-publish.yml +33 -0
  2. package/dist/index.d.ts +4 -3
  3. package/dist/index.js +7 -5
  4. package/dist/src/models/Announcement.d.ts +6 -5
  5. package/dist/src/models/Announcement.js +29 -9
  6. package/dist/src/models/Audience.d.ts +1 -0
  7. package/dist/src/models/Audience.js +5 -0
  8. package/dist/src/models/{Experiments.d.ts → BqPreCompiledData.d.ts} +12 -30
  9. package/dist/src/models/{ClientExperiment.js → BqPreCompiledData.js} +26 -46
  10. package/dist/src/models/CVRReport.d.ts +1 -0
  11. package/dist/src/models/CVRReport.js +13 -0
  12. package/dist/src/models/Client.d.ts +1 -1
  13. package/dist/src/models/Client.js +31 -51
  14. package/dist/src/models/ClientAdditionalRevenue.d.ts +1 -1
  15. package/dist/src/models/ClientAdditionalRevenue.js +3 -2
  16. package/dist/src/models/ClientLearning.d.ts +1 -1
  17. package/dist/src/models/ClientLearning.js +10 -6
  18. package/dist/src/models/ClientLinks.d.ts +1 -1
  19. package/dist/src/models/ClientLinks.js +15 -6
  20. package/dist/src/models/ClientNextSteps.d.ts +1 -1
  21. package/dist/src/models/ClientNextSteps.js +3 -2
  22. package/dist/src/models/ClientNote.d.ts +1 -1
  23. package/dist/src/models/ClientNote.js +3 -2
  24. package/dist/src/models/ClientReportsTemp.d.ts +1 -1
  25. package/dist/src/models/ClientReportsTemp.js +20 -2
  26. package/dist/src/models/ClientRetention.d.ts +1 -0
  27. package/dist/src/models/ClientRetention.js +18 -0
  28. package/dist/src/models/ClientScript.d.ts +1 -1
  29. package/dist/src/models/ClientScript.js +24 -8
  30. package/dist/src/models/ClientStrategy.d.ts +1 -1
  31. package/dist/src/models/ClientStrategy.js +3 -2
  32. package/dist/src/models/ClientSurvay.d.ts +1 -0
  33. package/dist/src/models/ClientSurvay.js +5 -0
  34. package/dist/src/models/Environment.d.ts +2 -0
  35. package/dist/src/models/Environment.js +26 -2
  36. package/dist/src/models/Faqs.d.ts +1 -0
  37. package/dist/src/models/Faqs.js +5 -0
  38. package/dist/src/models/Feedback.d.ts +1 -1
  39. package/dist/src/models/Feedback.js +3 -2
  40. package/dist/src/models/Goal.d.ts +2 -1
  41. package/dist/src/models/Goal.js +33 -11
  42. package/dist/src/models/Hypothesis.d.ts +2 -0
  43. package/dist/src/models/Hypothesis.js +49 -9
  44. package/dist/src/models/HypothesisSheet.d.ts +1 -1
  45. package/dist/src/models/HypothesisSheet.js +26 -2
  46. package/dist/src/models/LandingPages.d.ts +3 -0
  47. package/dist/src/models/LandingPages.js +29 -0
  48. package/dist/src/models/NewIdeas.d.ts +1 -1
  49. package/dist/src/models/NewIdeas.js +3 -2
  50. package/dist/src/models/Notification.d.ts +1 -0
  51. package/dist/src/models/Notification.js +29 -1
  52. package/dist/src/models/{ClientExperiment.d.ts → Organization.d.ts} +18 -29
  53. package/dist/src/models/{Experiments.js → Organization.js} +36 -54
  54. package/dist/src/models/Page.d.ts +3 -1
  55. package/dist/src/models/Page.js +56 -4
  56. package/dist/src/models/PageElement.d.ts +3 -0
  57. package/dist/src/models/PageElement.js +59 -7
  58. package/dist/src/models/PageTestType.d.ts +2 -0
  59. package/dist/src/models/PageTestType.js +41 -5
  60. package/dist/src/models/Portfolio.d.ts +1 -0
  61. package/dist/src/models/Portfolio.js +5 -0
  62. package/dist/src/models/PrecalculationFilters.d.ts +36 -0
  63. package/dist/src/models/PrecalculationFilters.js +77 -0
  64. package/dist/src/models/QueryLog.d.ts +1 -1
  65. package/dist/src/models/QueryLog.js +3 -2
  66. package/dist/src/models/ReadNotification.d.ts +1 -0
  67. package/dist/src/models/ReadNotification.js +29 -1
  68. package/dist/src/models/Report.d.ts +2 -1
  69. package/dist/src/models/Report.js +32 -48
  70. package/dist/src/models/Role.d.ts +3 -0
  71. package/dist/src/models/Role.js +50 -7
  72. package/dist/src/models/SavedSegment.d.ts +1 -0
  73. package/dist/src/models/SavedSegment.js +5 -0
  74. package/dist/src/models/Segment.d.ts +1 -0
  75. package/dist/src/models/Segment.js +5 -0
  76. package/dist/src/models/SegmentCombination.d.ts +1 -0
  77. package/dist/src/models/SegmentCombination.js +5 -0
  78. package/dist/src/models/Snippet.d.ts +2 -1
  79. package/dist/src/models/Snippet.js +28 -3
  80. package/dist/src/models/StageInCustomerJourney.d.ts +3 -1
  81. package/dist/src/models/StageInCustomerJourney.js +56 -4
  82. package/dist/src/models/Tag.d.ts +1 -0
  83. package/dist/src/models/Tag.js +29 -1
  84. package/dist/src/models/Temp.d.ts +1 -0
  85. package/dist/src/models/Temp.js +29 -1
  86. package/dist/src/models/Test.d.ts +16 -15
  87. package/dist/src/models/Test.js +82 -185
  88. package/dist/src/models/TestSequentialValue.d.ts +1 -0
  89. package/dist/src/models/TestSequentialValue.js +5 -0
  90. package/dist/src/models/Tier.d.ts +1 -0
  91. package/dist/src/models/Tier.js +29 -1
  92. package/dist/src/models/Trigger.d.ts +1 -0
  93. package/dist/src/models/Trigger.js +29 -1
  94. package/dist/src/models/User.d.ts +1 -0
  95. package/dist/src/models/User.js +9 -10
  96. package/index.ts +6 -4
  97. package/package.json +1 -1
  98. package/src/models/Announcement.ts +50 -27
  99. package/src/models/Audience.ts +6 -0
  100. package/src/models/BqPreCompiledData.ts +62 -0
  101. package/src/models/CVRReport.ts +17 -0
  102. package/src/models/Client.ts +39 -59
  103. package/src/models/ClientAdditionalRevenue.ts +4 -3
  104. package/src/models/ClientLearning.ts +11 -7
  105. package/src/models/ClientLinks.ts +18 -7
  106. package/src/models/ClientNextSteps.ts +4 -3
  107. package/src/models/ClientNote.ts +4 -3
  108. package/src/models/ClientReportsTemp.ts +24 -3
  109. package/src/models/ClientRetention.ts +27 -1
  110. package/src/models/ClientScript.ts +26 -9
  111. package/src/models/ClientStrategy.ts +4 -3
  112. package/src/models/ClientSurvay.ts +6 -0
  113. package/src/models/Environment.ts +31 -3
  114. package/src/models/Faqs.ts +6 -0
  115. package/src/models/Feedback.ts +4 -3
  116. package/src/models/Goal.ts +36 -12
  117. package/src/models/Hypothesis.ts +29 -8
  118. package/src/models/HypothesisSheet.ts +3 -2
  119. package/src/models/LandingPages.ts +34 -0
  120. package/src/models/NewIdeas.ts +4 -3
  121. package/src/models/Notification.ts +6 -0
  122. package/src/models/Organization.ts +86 -0
  123. package/src/models/Page.ts +62 -5
  124. package/src/models/PageElement.ts +38 -7
  125. package/src/models/PageTestType.ts +21 -4
  126. package/src/models/Portfolio.ts +6 -0
  127. package/src/models/PrecalculationFilters.ts +67 -0
  128. package/src/models/QueryLog.ts +4 -3
  129. package/src/models/ReadNotification.ts +6 -0
  130. package/src/models/Report.ts +54 -66
  131. package/src/models/Role.ts +31 -6
  132. package/src/models/SavedSegment.ts +6 -0
  133. package/src/models/Segment.ts +6 -0
  134. package/src/models/SegmentCombination.ts +6 -0
  135. package/src/models/Snippet.ts +32 -4
  136. package/src/models/StageInCustomerJourney.ts +33 -5
  137. package/src/models/Tag.ts +6 -0
  138. package/src/models/Temp.ts +6 -0
  139. package/src/models/Test.ts +155 -243
  140. package/src/models/TestSequentialValue.ts +6 -0
  141. package/src/models/Tier.ts +6 -0
  142. package/src/models/Trigger.ts +6 -0
  143. package/src/models/User.ts +11 -10
  144. package/src/models/ClientExperiment.ts +0 -113
  145. package/src/models/Experiments.ts +0 -118
@@ -2,48 +2,71 @@ import mongoose, { Document, Schema, model } from "mongoose";
2
2
 
3
3
  export interface IAnnouncement extends Document {
4
4
  title: string;
5
- description?: String;
6
- active?: Boolean;
7
- forRoles?: mongoose.Schema.Types.ObjectId;
8
- forUsers?: mongoose.Schema.Types.ObjectId;
9
- readBy?: mongoose.Schema.Types.ObjectId;
5
+ description?: string;
6
+ active?: boolean;
7
+ forRoles?: mongoose.Schema.Types.ObjectId[];
8
+ forUsers?: mongoose.Schema.Types.ObjectId[];
9
+ readBy?: mongoose.Schema.Types.ObjectId[];
10
+ organizationId?: mongoose.Schema.Types.ObjectId;
10
11
  }
11
12
 
12
13
  const AnnouncementSchema = new Schema<IAnnouncement>(
13
14
  {
14
- title: {
15
- type: String,
16
- required: true,
15
+ organizationId: {
16
+ type: mongoose.Schema.Types.ObjectId,
17
+ ref: "organization",
18
+ default: null,
17
19
  },
18
- description: {
19
- type: String,
20
- required: false,
20
+ title: {
21
+ type: String,
22
+ required: true,
23
+ trim: true
21
24
  },
22
- active: {
23
- type: Boolean,
24
- default: true,
25
+ description: {
26
+ type: String,
27
+ trim: true
25
28
  },
26
- forRoles: {
27
- type: [mongoose.Schema.Types.ObjectId],
28
- required: true,
29
- ref: "role",
29
+ active: {
30
+ type: Boolean,
31
+ default: true
30
32
  },
31
- forUsers: {
32
- type: [mongoose.Schema.Types.ObjectId],
33
- required: false,
34
- ref: "user",
33
+ forRoles: {
34
+ type: [mongoose.Schema.Types.ObjectId],
35
+ required: true,
36
+ ref: "role"
35
37
  },
36
- readBy: {
37
- type: [mongoose.Schema.Types.ObjectId],
38
- required: false,
39
- ref: "user",
38
+ forUsers: {
39
+ type: [mongoose.Schema.Types.ObjectId],
40
+ ref: "user"
40
41
  },
42
+ readBy: {
43
+ type: [mongoose.Schema.Types.ObjectId],
44
+ ref: "user"
45
+ }
41
46
  },
42
47
  {
43
- timestamps: true,
48
+ timestamps: true
44
49
  }
45
50
  );
46
51
 
52
+ // Add compound indexes for better query performance
53
+ AnnouncementSchema.index({ active: 1, createdAt: -1 }); // For active announcements sorted by date
54
+ AnnouncementSchema.index({ forRoles: 1, active: 1 }); // For role-based announcements
55
+ AnnouncementSchema.index({ forUsers: 1, active: 1 }); // For user-specific announcements
56
+ AnnouncementSchema.index({ readBy: 1 }); // For tracking read status
57
+ AnnouncementSchema.index({ title: 1 }, { collation: { locale: 'en', strength: 2 } }); // Case-insensitive title search
58
+
59
+ // Add text index for full-text search
60
+ // AnnouncementSchema.index({
61
+ // title: 'text',
62
+ // description: 'text'
63
+ // }, {
64
+ // weights: {
65
+ // title: 10,
66
+ // description: 5
67
+ // }
68
+ // });
69
+
47
70
  const Announcement = model<IAnnouncement>("announcement", AnnouncementSchema);
48
71
 
49
72
  export default Announcement;
@@ -1,6 +1,7 @@
1
1
  import mongoose, { Document, Schema, model } from "mongoose";
2
2
 
3
3
  export interface IAudience extends Document {
4
+ organizationId?: mongoose.Schema.Types.ObjectId;
4
5
  name: string;
5
6
  rules_js?: string;
6
7
  client?: mongoose.Schema.Types.ObjectId;
@@ -8,6 +9,11 @@ export interface IAudience extends Document {
8
9
 
9
10
  const AudienceSchema = new Schema<IAudience>(
10
11
  {
12
+ organizationId: {
13
+ type: mongoose.Schema.Types.ObjectId,
14
+ ref: "organization",
15
+ default: null,
16
+ },
11
17
  name: {
12
18
  type: String,
13
19
  required: true,
@@ -0,0 +1,62 @@
1
+ import mongoose, { Document, Schema, model } from "mongoose";
2
+
3
+ export interface IBqPreCompiledData extends Document {
4
+ title: string;
5
+ organizationId: mongoose.Schema.Types.ObjectId;
6
+ client: mongoose.Schema.Types.ObjectId;
7
+ test: mongoose.Schema.Types.ObjectId;
8
+ from: Date;
9
+ to: Date;
10
+ filters: any;
11
+ otherFilters: any;
12
+ cloudurl: string;
13
+ }
14
+
15
+ const BqPreCompiledDataSchema = new Schema<IBqPreCompiledData>({
16
+ title: {
17
+ type: String,
18
+ default: null,
19
+ },
20
+ organizationId: {
21
+ type: mongoose.Schema.Types.ObjectId,
22
+ ref: "organization",
23
+ default: null,
24
+ },
25
+ client: {
26
+ type: mongoose.Schema.Types.ObjectId,
27
+ ref: "client",
28
+ default: null,
29
+ },
30
+ test: {
31
+ type: mongoose.Schema.Types.ObjectId,
32
+ ref: "test",
33
+ default: null,
34
+ },
35
+ from: {
36
+ type: Date,
37
+ default: null,
38
+ },
39
+ filters: {
40
+ type: Object,
41
+ default: null,
42
+ },
43
+ to: {
44
+ type: Date,
45
+ default: null,
46
+ },
47
+ otherFilters: {
48
+ type: Object,
49
+ default: null,
50
+ },
51
+ cloudurl: {
52
+ type: String,
53
+ default: null,
54
+ },
55
+ }, {
56
+ timestamps: true
57
+ });
58
+
59
+ BqPreCompiledDataSchema.index({ organizationId: 1, client: 1 });
60
+ const BqPreCompiledData = model<IBqPreCompiledData>("bqprecompileddata", BqPreCompiledDataSchema);
61
+
62
+ export default BqPreCompiledData;
@@ -1,19 +1,27 @@
1
1
  import mongoose, { Document, Schema, model } from "mongoose";
2
2
 
3
3
  export interface ICVRReport extends Document {
4
+ organizationId?: mongoose.Schema.Types.ObjectId;
4
5
  reportLink?: string;
5
6
  client?: mongoose.Schema.Types.ObjectId;
6
7
  }
7
8
 
8
9
  const CVRReportSchema = new Schema<ICVRReport>(
9
10
  {
11
+ organizationId: {
12
+ type: mongoose.Schema.Types.ObjectId,
13
+ ref: "organization",
14
+ default: null,
15
+ },
10
16
  reportLink: {
11
17
  type: String,
12
18
  default: null,
19
+ trim: true,
13
20
  },
14
21
  client: {
15
22
  type: mongoose.Schema.Types.ObjectId,
16
23
  ref: "client",
24
+ index: true,
17
25
  },
18
26
  },
19
27
  {
@@ -21,5 +29,14 @@ const CVRReportSchema = new Schema<ICVRReport>(
21
29
  }
22
30
  );
23
31
 
32
+ // Compound index for client and reportLink
33
+ CVRReportSchema.index({ client: 1 });
34
+
35
+ // Sparse index for reportLink
36
+ CVRReportSchema.index({ reportLink: 1 }, { sparse: true });
37
+
38
+ // TTL index for automatic cleanup of old reports (1 year)
39
+ CVRReportSchema.index({ createdAt: 1 }, { expireAfterSeconds: 31536000 });
40
+
24
41
  const CVRReport = model<ICVRReport>("cvrreport", CVRReportSchema);
25
42
  export default CVRReport;
@@ -12,11 +12,11 @@ export interface IProperty extends Document {
12
12
  const PropertySchema: Schema = new Schema<IProperty>({
13
13
  propertyname: { type: String, required: true },
14
14
  viewId: { type: String, required: true },
15
- platform: { type: String, required: false, default: "UA" },
15
+ platform: { type: String, default: "GA4" }
16
16
  });
17
17
 
18
18
  export interface IClient extends Document {
19
- organisationId?: string;
19
+ organizationId?: mongoose.Schema.Types.ObjectId;
20
20
  name: string;
21
21
  slug?: string;
22
22
  viewId?: string;
@@ -37,71 +37,51 @@ export interface IClient extends Document {
37
37
 
38
38
  const ClientSchema: Schema = new Schema<IClient>(
39
39
  {
40
- organisationId: {
41
- type: String,
42
- default: null,
43
- },
44
- name: {
45
- type: String,
46
- required: true,
47
- },
48
- slug: { type: String, slug: ["name"], slugPaddingSize: 4, unique: true },
49
- viewId: {
50
- type: String,
51
- },
52
- portfolioClient: {
53
- type: Boolean,
54
- default: false,
40
+ organizationId: { type: mongoose.Schema.Types.ObjectId,
41
+ ref: "organization",
42
+ default: null },
43
+ name: { type: String, required: true },
44
+ slug: {
45
+ type: String,
46
+ slug: ["name"],
47
+ slugPaddingSize: 4,
48
+ unique: true
55
49
  },
50
+ viewId: { type: String },
51
+ portfolioClient: { type: Boolean, default: false },
56
52
  gaproperties: [PropertySchema],
57
- tier: {
58
- type: mongoose.Schema.Types.ObjectId,
59
- ref: "tier",
60
- default: null,
61
- },
62
- active: {
63
- type: Boolean,
64
- default: true,
65
- },
66
- currency: {
67
- type: String,
68
- default: "USD",
69
- },
70
- logo: {
71
- type: String,
72
- default: "",
73
- },
74
- createdBy: {
75
- type: mongoose.Schema.Types.ObjectId,
76
- ref: "user",
77
- default: null,
78
- },
79
- onboardDate: {
80
- type: Date,
81
- default: new Date(),
82
- },
83
- bqClientId: {
84
- type: String,
85
- default: null,
86
- },
87
- defaultDataSet: {
88
- type: String,
89
- },
90
- NDAStatus: {
91
- type: Boolean,
92
- default: false,
93
- },
94
- retainerValue: {
95
- type: Number,
53
+ tier: {
54
+ type: mongoose.Schema.Types.ObjectId,
55
+ ref: "tier",
56
+ default: null
96
57
  },
97
- useIntraDayTable: {
98
- type: Boolean,
58
+ active: { type: Boolean, default: true },
59
+ currency: { type: String, default: "USD" },
60
+ logo: { type: String, default: "" },
61
+ createdBy: {
62
+ type: mongoose.Schema.Types.ObjectId,
63
+ ref: "user",
64
+ default: null
99
65
  },
66
+ onboardDate: { type: Date, default: Date.now },
67
+ bqClientId: { type: String, default: null },
68
+ defaultDataSet: { type: String },
69
+ NDAStatus: { type: Boolean, default: false },
70
+ retainerValue: { type: Number },
71
+ useIntraDayTable: { type: Boolean }
100
72
  },
101
- { timestamps: true }
73
+ {
74
+ timestamps: true
75
+ }
102
76
  );
103
77
 
78
+ // Add compound indexes for better query performance
104
79
  ClientSchema.index({ active: 1 });
80
+ ClientSchema.index({ organizationId: 1, active: 1 });
81
+ ClientSchema.index({ name: 1 }, { collation: { locale: 'en', strength: 2 } }); // Case-insensitive search
82
+ ClientSchema.index({ tier: 1, active: 1 }); // For tier-based queries
83
+ ClientSchema.index({ onboardDate: 1 }); // For date-based queries
84
+ ClientSchema.index({ portfolioClient: 1, active: 1 }); // For portfolio client queries
105
85
 
106
86
  const Client = model<IClient>("client", ClientSchema);
107
87
 
@@ -1,7 +1,7 @@
1
1
  import mongoose, { Document, Schema, model } from "mongoose";
2
2
 
3
3
  export interface IClientAdditionalRevenue extends Document {
4
- organisationId?: string;
4
+ organizationId?: mongoose.Schema.Types.ObjectId;
5
5
  client?: mongoose.Schema.Types.ObjectId;
6
6
  additionalRevenueForTests: IAdditionalRevenue;
7
7
  createdBy?: mongoose.Schema.Types.ObjectId;
@@ -36,8 +36,9 @@ const AdditionalRevenueSchema = new Schema<IAdditionalRevenue>({
36
36
 
37
37
  const ClientAdditionalRevenueSchema = new Schema<IClientAdditionalRevenue>(
38
38
  {
39
- organisationId: {
40
- type: String,
39
+ organizationId: {
40
+ type: mongoose.Schema.Types.ObjectId,
41
+ ref: "organization",
41
42
  default: null,
42
43
  },
43
44
  client: {
@@ -2,7 +2,7 @@ import mongoose, { Document, Schema, model } from "mongoose";
2
2
 
3
3
  export interface IClientLearning extends Document {
4
4
  name: string;
5
- organisationId?: string;
5
+ organizationId?: mongoose.Schema.Types.ObjectId;
6
6
  client?: mongoose.Schema.Types.ObjectId;
7
7
  viewId?: string;
8
8
  createdBy?: mongoose.Schema.Types.ObjectId;
@@ -13,9 +13,11 @@ const ClientLearningSchema = new Schema<IClientLearning>(
13
13
  name: {
14
14
  type: String,
15
15
  required: true,
16
+ trim: true,
16
17
  },
17
- organisationId: {
18
- type: String,
18
+ organizationId: {
19
+ type: mongoose.Schema.Types.ObjectId,
20
+ ref: "organization",
19
21
  default: null,
20
22
  },
21
23
  client: {
@@ -35,10 +37,12 @@ const ClientLearningSchema = new Schema<IClientLearning>(
35
37
  }
36
38
  );
37
39
 
38
- ClientLearningSchema.index({
39
- client: 1,
40
- viewId: 1,
41
- });
40
+ // Compound indexes for common query patterns
41
+ ClientLearningSchema.index({ client: 1 });
42
+ // Sparse indexes for optional fields
43
+ ClientLearningSchema.index({ organisationId: 1 }, { sparse: true });
44
+ // Case-insensitive index for name
45
+ ClientLearningSchema.index({ name: 1 }, { collation: { locale: 'en', strength: 2 } });
42
46
 
43
47
  const ClientLearning = model<IClientLearning>(
44
48
  "clientlearning",
@@ -1,7 +1,7 @@
1
1
  import mongoose, { Document, Schema, model } from "mongoose";
2
2
 
3
3
  export interface IClientLinks extends Document {
4
- organisationId?: string;
4
+ organizationId?: mongoose.Schema.Types.ObjectId;
5
5
  title: string;
6
6
  description?: string;
7
7
  link?: string;
@@ -13,20 +13,24 @@ export interface IClientLinks extends Document {
13
13
 
14
14
  const ClientLinksSchema = new Schema<IClientLinks>(
15
15
  {
16
- organisationId: {
17
- type: String,
16
+ organizationId: {
17
+ type: mongoose.Schema.Types.ObjectId,
18
+ ref: "organization",
18
19
  default: null,
19
20
  },
20
21
  title: {
21
22
  type: String,
22
23
  required: true,
24
+ trim: true,
23
25
  },
24
26
  description: {
25
27
  type: String,
28
+ trim: true,
26
29
  },
27
30
  link: {
28
31
  type: String,
29
32
  required: true,
33
+ trim: true,
30
34
  },
31
35
  client: {
32
36
  type: mongoose.Schema.Types.ObjectId,
@@ -49,10 +53,17 @@ const ClientLinksSchema = new Schema<IClientLinks>(
49
53
  }
50
54
  );
51
55
 
52
- ClientLinksSchema.index({
53
- client: 1,
54
- viewId: 1,
55
- });
56
+ // Compound indexes for common query patterns
57
+ ClientLinksSchema.index({ client: 1 });
58
+ ClientLinksSchema.index({ client: 1, private: 1 });
59
+ ClientLinksSchema.index({ client: 1, createdAt: -1 });
60
+
61
+ // Sparse indexes for optional fields
62
+ ClientLinksSchema.index({ viewId: 1 }, { sparse: true });
63
+ ClientLinksSchema.index({ organisationId: 1 }, { sparse: true });
64
+
65
+ // Case-insensitive indexes
66
+ ClientLinksSchema.index({ title: 1 }, { collation: { locale: 'en', strength: 2 } });
56
67
 
57
68
  const ClientLinks = model<IClientLinks>("clientlink", ClientLinksSchema);
58
69
  export default ClientLinks;
@@ -2,7 +2,7 @@ import mongoose, { Document, Schema, model } from "mongoose";
2
2
 
3
3
  export interface IClientNextSteps extends Document {
4
4
  name: string;
5
- organisationId?: string;
5
+ organizationId?: mongoose.Schema.Types.ObjectId;
6
6
  client?: mongoose.Schema.Types.ObjectId;
7
7
  viewId?: string;
8
8
  createdBy?: mongoose.Schema.Types.ObjectId;
@@ -14,8 +14,9 @@ const ClientNextStepsSchema = new Schema<IClientNextSteps>(
14
14
  type: String,
15
15
  required: true,
16
16
  },
17
- organisationId: {
18
- type: String,
17
+ organizationId: {
18
+ type: mongoose.Schema.Types.ObjectId,
19
+ ref: "organization",
19
20
  default: null,
20
21
  },
21
22
  client: {
@@ -1,7 +1,7 @@
1
1
  import mongoose, { Document, Schema, model } from "mongoose";
2
2
 
3
3
  export interface IClientNote extends Document {
4
- organisationId?: string;
4
+ organizationId?: mongoose.Schema.Types.ObjectId;
5
5
  client?: mongoose.Schema.Types.ObjectId;
6
6
  viewId?: string;
7
7
  pageType?: mongoose.Schema.Types.ObjectId;
@@ -14,8 +14,9 @@ export interface IClientNote extends Document {
14
14
 
15
15
  const ClientNoteSchema = new Schema<IClientNote>(
16
16
  {
17
- organisationId: {
18
- type: String,
17
+ organizationId: {
18
+ type: mongoose.Schema.Types.ObjectId,
19
+ ref: "organization",
19
20
  default: null,
20
21
  },
21
22
  client: {
@@ -1,7 +1,7 @@
1
1
  import mongoose, { Schema, model } from "mongoose";
2
2
 
3
3
  export interface IClientReportsTemp extends Document {
4
- organisationId?: string;
4
+ organizationId?: mongoose.Schema.Types.ObjectId;
5
5
  client?: mongoose.Schema.Types.ObjectId;
6
6
  viewId?: string;
7
7
  test?: mongoose.Schema.Types.ObjectId;
@@ -15,8 +15,9 @@ export interface IClientReportsTemp extends Document {
15
15
 
16
16
  const ClientReportsTempSchema = new Schema<IClientReportsTemp>(
17
17
  {
18
- organisationId: {
19
- type: String,
18
+ organizationId: {
19
+ type: mongoose.Schema.Types.ObjectId,
20
+ ref: "organization",
20
21
  default: null,
21
22
  },
22
23
  client: {
@@ -32,12 +33,15 @@ const ClientReportsTempSchema = new Schema<IClientReportsTemp>(
32
33
  },
33
34
  filters: {
34
35
  type: String,
36
+ trim: true,
35
37
  },
36
38
  metricsFilters: {
37
39
  type: String,
40
+ trim: true,
38
41
  },
39
42
  date: {
40
43
  type: Date,
44
+ index: true,
41
45
  },
42
46
  report: {
43
47
  type: mongoose.Schema.Types.Mixed,
@@ -45,6 +49,7 @@ const ClientReportsTempSchema = new Schema<IClientReportsTemp>(
45
49
  deactivated: {
46
50
  type: Boolean,
47
51
  default: false,
52
+ index: true,
48
53
  },
49
54
  createdBy: {
50
55
  type: mongoose.Schema.Types.ObjectId,
@@ -56,6 +61,22 @@ const ClientReportsTempSchema = new Schema<IClientReportsTemp>(
56
61
  }
57
62
  );
58
63
 
64
+ // Compound indexes for common query patterns
65
+ ClientReportsTempSchema.index({ client: 1 });
66
+ ClientReportsTempSchema.index({ client: 1, test: 1 });
67
+ ClientReportsTempSchema.index({ client: 1, deactivated: 1 });
68
+ ClientReportsTempSchema.index({ client: 1, date: -1 });
69
+ ClientReportsTempSchema.index({ createdBy: 1, date: -1 });
70
+ ClientReportsTempSchema.index({ organisationId: 1, client: 1 });
71
+
72
+ // Sparse indexes for optional fields
73
+ ClientReportsTempSchema.index({ viewId: 1 }, { sparse: true });
74
+ ClientReportsTempSchema.index({ organisationId: 1 }, { sparse: true });
75
+ ClientReportsTempSchema.index({ test: 1 }, { sparse: true });
76
+
77
+ // TTL index for automatic cleanup of old reports
78
+ ClientReportsTempSchema.index({ date: 1 }, { expireAfterSeconds: 86400 }); // 24 hours
79
+
59
80
  const ClientReportsTemp = model<IClientReportsTemp>(
60
81
  "clientreportstemp",
61
82
  ClientReportsTempSchema
@@ -1,6 +1,7 @@
1
1
  import mongoose, { Document, Schema, model } from "mongoose";
2
2
 
3
3
  export interface IClientRetention extends Document {
4
+ organizationId?: mongoose.Schema.Types.ObjectId;
4
5
  client?: mongoose.Schema.Types.ObjectId;
5
6
  viewId?: string;
6
7
  year: Number;
@@ -16,10 +17,16 @@ export interface IClientRetention extends Document {
16
17
 
17
18
  const ClientRetentionSchema = new Schema<IClientRetention>(
18
19
  {
20
+ organizationId: {
21
+ type: mongoose.Schema.Types.ObjectId,
22
+ ref: "organization",
23
+ default: null,
24
+ },
19
25
  client: {
20
26
  type: mongoose.Schema.Types.ObjectId,
21
27
  ref: "client",
22
28
  required: true,
29
+ index: true,
23
30
  },
24
31
  viewId: {
25
32
  type: String,
@@ -29,6 +36,7 @@ const ClientRetentionSchema = new Schema<IClientRetention>(
29
36
  type: Number,
30
37
  required: true,
31
38
  default: new Date().getFullYear(),
39
+ index: true,
32
40
  },
33
41
  retentions: {
34
42
  type: [
@@ -59,7 +67,7 @@ const ClientRetentionSchema = new Schema<IClientRetention>(
59
67
  retainerValue: {
60
68
  type: Number,
61
69
  required: true,
62
- default:0,
70
+ default: 0,
63
71
  },
64
72
  otherPayments: {
65
73
  type: Number,
@@ -75,6 +83,24 @@ const ClientRetentionSchema = new Schema<IClientRetention>(
75
83
  }
76
84
  );
77
85
 
86
+ // Compound indexes for common query patterns
87
+ ClientRetentionSchema.index({ client: 1, year: 1 });
88
+ ClientRetentionSchema.index({ client: 1, viewId: 1 });
89
+ ClientRetentionSchema.index({ year: 1, "retentions.month": 1 });
90
+ ClientRetentionSchema.index({ client: 1, "retentions.active": 1 });
91
+
92
+ // Sparse indexes for optional fields
93
+ ClientRetentionSchema.index({ viewId: 1 }, { sparse: true });
94
+
95
+ // Partial index for active retentions
96
+ ClientRetentionSchema.index(
97
+ { "retentions.active": 1 },
98
+ { partialFilterExpression: { "retentions.active": true } }
99
+ );
100
+
101
+ // Index for sorting by retainer value
102
+ ClientRetentionSchema.index({ "retentions.retainerValue": -1 });
103
+
78
104
  const ClientRetention = model<IClientRetention>(
79
105
  "ClientRetention",
80
106
  ClientRetentionSchema