@dynamatix/gb-schemas 2.3.288 → 2.3.290
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/dist/applicants/applicant-welcome-call.model.d.ts.map +1 -1
- package/dist/applicants/applicant-welcome-call.model.js +102 -7
- package/dist/shared/audit-log.model.d.ts +180 -0
- package/dist/shared/audit-log.model.d.ts.map +1 -0
- package/dist/shared/audit-log.model.js +43 -0
- package/dist/shared/document.model.d.ts +180 -0
- package/dist/shared/document.model.d.ts.map +1 -0
- package/dist/shared/document.model.js +40 -0
- package/dist/shared/queue.model.d.ts +180 -0
- package/dist/shared/queue.model.d.ts.map +1 -0
- package/dist/shared/queue.model.js +42 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applicant-welcome-call.model.d.ts","sourceRoot":"","sources":["../../applicants/applicant-welcome-call.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"applicant-welcome-call.model.d.ts","sourceRoot":"","sources":["../../applicants/applicant-welcome-call.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAksBhC,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA4D,CAAC;AAEnF,eAAe,gBAAgB,CAAC"}
|
|
@@ -237,7 +237,7 @@ welcomeCallSchema.virtual('customerCurrentResidentialAddress').get(function () {
|
|
|
237
237
|
applicant.addressLine2,
|
|
238
238
|
applicant.addressLine3,
|
|
239
239
|
applicant.addressCity,
|
|
240
|
-
|
|
240
|
+
countryName,
|
|
241
241
|
applicant.addressPostCode
|
|
242
242
|
].filter(part => part && part.trim() !== '');
|
|
243
243
|
return addressParts.join(', ');
|
|
@@ -270,6 +270,9 @@ welcomeCallSchema.virtual('applicantEmployerBusinessName').get(function () {
|
|
|
270
270
|
if (employment.employerName && employment.employerName.trim() !== '') {
|
|
271
271
|
return employment.employerName;
|
|
272
272
|
}
|
|
273
|
+
else {
|
|
274
|
+
return '';
|
|
275
|
+
}
|
|
273
276
|
// Field exists but no data - return empty string
|
|
274
277
|
return '';
|
|
275
278
|
}
|
|
@@ -285,6 +288,9 @@ welcomeCallSchema.virtual('applicantEmployerBusinessName').get(function () {
|
|
|
285
288
|
if (selfEmployment.nameOfBusiness && selfEmployment.nameOfBusiness.trim() !== '') {
|
|
286
289
|
return selfEmployment.nameOfBusiness;
|
|
287
290
|
}
|
|
291
|
+
else {
|
|
292
|
+
return '';
|
|
293
|
+
}
|
|
288
294
|
// Field exists but no data - return empty string
|
|
289
295
|
return '';
|
|
290
296
|
}
|
|
@@ -341,7 +347,7 @@ welcomeCallSchema.virtual('otherApplicantsNameAndDOB').get(function () {
|
|
|
341
347
|
return 'N/A';
|
|
342
348
|
}
|
|
343
349
|
// Format each other applicant as: "First and middle names, last name, Date of birth"
|
|
344
|
-
const formattedApplicants = otherApplicants.map((applicant) => {
|
|
350
|
+
const formattedApplicants = otherApplicants.map((applicant, index) => {
|
|
345
351
|
// Check if applicant is an ObjectId (not populated)
|
|
346
352
|
if (typeof applicant === 'string' || (applicant.constructor && applicant.constructor.name === 'ObjectId')) {
|
|
347
353
|
return null; // Skip unpopulated references
|
|
@@ -379,11 +385,17 @@ welcomeCallSchema.virtual('otherApplicantsNameAndDOB').get(function () {
|
|
|
379
385
|
}
|
|
380
386
|
}
|
|
381
387
|
}
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
388
|
+
const isLast = index === otherApplicants.length - 1;
|
|
389
|
+
const comma = isLast ? '' : ',';
|
|
390
|
+
// Format as an HTML line (with bold labels and inline values)
|
|
391
|
+
return `
|
|
392
|
+
<div class="applicant-line">
|
|
393
|
+
<span class="readonly-data">${fullFirstName}, ${lastName}, ${formattedDOB}${comma}</span>
|
|
394
|
+
</div>
|
|
395
|
+
`;
|
|
396
|
+
}).filter((line) => line && line.trim() !== '');
|
|
397
|
+
// Join all applicants as HTML (no \n needed)
|
|
398
|
+
return formattedApplicants.join('');
|
|
387
399
|
}
|
|
388
400
|
}
|
|
389
401
|
// If application not populated or no applicants, return "N/A"
|
|
@@ -559,6 +571,89 @@ welcomeCallSchema.virtual('initialRatePercentage').get(function () {
|
|
|
559
571
|
}
|
|
560
572
|
return null;
|
|
561
573
|
});
|
|
574
|
+
// Virtual property for finance summary HTML
|
|
575
|
+
welcomeCallSchema.virtual('financeSummaryHtml').get(function () {
|
|
576
|
+
let application = null;
|
|
577
|
+
if (this.applicantId && typeof this.applicantId === 'object' && !(typeof this.applicantId.toHexString === 'function') && this.applicantId.applicationId) {
|
|
578
|
+
application = this.applicantId.applicationId;
|
|
579
|
+
}
|
|
580
|
+
else if (this.applicationId && typeof this.applicationId === 'object') {
|
|
581
|
+
application = this.applicationId;
|
|
582
|
+
}
|
|
583
|
+
else {
|
|
584
|
+
return '-';
|
|
585
|
+
}
|
|
586
|
+
if (application) {
|
|
587
|
+
// Initialize summary data
|
|
588
|
+
let product = '';
|
|
589
|
+
let financeTerm = '';
|
|
590
|
+
let monthlyFinance = '';
|
|
591
|
+
let rentalIncome = '';
|
|
592
|
+
let occupancy = '';
|
|
593
|
+
// Get product information (first 3 characters)
|
|
594
|
+
if (application.selectedProduct && typeof application.selectedProduct === 'string') {
|
|
595
|
+
const extracted = application.selectedProduct.split('(')[0].trim();
|
|
596
|
+
product = `${extracted} product`;
|
|
597
|
+
}
|
|
598
|
+
else if (application.productId && typeof application.productId === 'object' && application.productId.selectedProduct) {
|
|
599
|
+
const extracted = application.productId.selectedProduct.split('(')[0].trim();
|
|
600
|
+
product = `${extracted} product`;
|
|
601
|
+
}
|
|
602
|
+
else {
|
|
603
|
+
product = '-';
|
|
604
|
+
}
|
|
605
|
+
// Get finance term from productId if available
|
|
606
|
+
if (application.productId && typeof application.productId === 'object') {
|
|
607
|
+
if (application.productId.numberOfYearsToRepay !== undefined && application.productId.numberOfYearsToRepay !== null) {
|
|
608
|
+
financeTerm = `${application.productId.numberOfYearsToRepay} year finance term`;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
else {
|
|
612
|
+
financeTerm = '-';
|
|
613
|
+
}
|
|
614
|
+
// Get rental income from mortgage - mortgageId is at application level
|
|
615
|
+
let mortgage = null;
|
|
616
|
+
if (application.mortgageId && typeof application.mortgageId === 'object') {
|
|
617
|
+
mortgage = application.mortgageId;
|
|
618
|
+
}
|
|
619
|
+
if (mortgage) {
|
|
620
|
+
// Get rental income - check if it exists (even if 0)
|
|
621
|
+
if (mortgage.monthlyRentalIncome !== undefined && mortgage.monthlyRentalIncome !== null) {
|
|
622
|
+
// Convert to number first, then format
|
|
623
|
+
const numericValue = Number(mortgage.monthlyRentalIncome);
|
|
624
|
+
const rentalValue = isNaN(numericValue) ? '0.00' : numericValue.toFixed(2);
|
|
625
|
+
rentalIncome = `£${rentalValue}`;
|
|
626
|
+
}
|
|
627
|
+
// Get finance amount from loanRequired
|
|
628
|
+
if (mortgage.loanRequired !== undefined && mortgage.loanRequired !== null) {
|
|
629
|
+
const numericValue = Number(mortgage.loanRequired);
|
|
630
|
+
const financeValue = isNaN(numericValue) ? '0.00' : numericValue.toFixed(2);
|
|
631
|
+
monthlyFinance = `£${financeValue}`;
|
|
632
|
+
}
|
|
633
|
+
// Get occupancy information from mortgage
|
|
634
|
+
if (mortgage.proposedTenantsLids && Array.isArray(mortgage.proposedTenantsLids) && mortgage.proposedTenantsLids.length > 0) {
|
|
635
|
+
// Get the first proposed tenant type
|
|
636
|
+
const firstTenant = mortgage.proposedTenantsLids[0];
|
|
637
|
+
if (firstTenant && typeof firstTenant === 'object' && firstTenant.name) {
|
|
638
|
+
occupancy = firstTenant.name;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
else {
|
|
642
|
+
occupancy = '-';
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
// Create HTML content
|
|
646
|
+
const summaryContent = `
|
|
647
|
+
<div class="flex align-items-center mb-2"><p class="text-bold m-0 readonly-data">Product:</p> <span class="readonly-data ml-2">${product}</span></div>
|
|
648
|
+
<div class="flex align-items-center mb-2"><p class="text-bold m-0 readonly-data">Finance Term:</p> <span class="readonly-data ml-2">${financeTerm}</span></div>
|
|
649
|
+
<div class="flex align-items-center mb-2"><p class="text-bold m-0 readonly-data">Monthly Finance:</p> <span class="readonly-data ml-2">${monthlyFinance}</span></div>
|
|
650
|
+
<div class="flex align-items-center mb-2"><p class="text-bold m-0 readonly-data">Rental Income:</p> <span class="readonly-data ml-2">${rentalIncome}</span></div>
|
|
651
|
+
<div class="flex align-items-center"><p class="text-bold m-0 readonly-data">Occupancy:</p> <span class="readonly-data ml-2">${occupancy}</span></div>
|
|
652
|
+
`;
|
|
653
|
+
return summaryContent;
|
|
654
|
+
}
|
|
655
|
+
return '-';
|
|
656
|
+
});
|
|
562
657
|
applyAuditMiddleware(welcomeCallSchema, "ApplicantWelcomeCall");
|
|
563
658
|
// Apply workflow plugin to the schema
|
|
564
659
|
applyWorkflowPlugin(welcomeCallSchema, 'applicantwelcomecall');
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/// <reference path="../value-objects/pound.d.ts" />
|
|
2
|
+
/// <reference path="../value-objects/account-number.d.ts" />
|
|
3
|
+
/// <reference path="../value-objects/sort-code.d.ts" />
|
|
4
|
+
/// <reference types="mongoose/types/aggregate" />
|
|
5
|
+
/// <reference types="mongoose/types/callback" />
|
|
6
|
+
/// <reference types="mongoose/types/collection" />
|
|
7
|
+
/// <reference types="mongoose/types/connection" />
|
|
8
|
+
/// <reference types="mongoose/types/cursor" />
|
|
9
|
+
/// <reference types="mongoose/types/document" />
|
|
10
|
+
/// <reference types="mongoose/types/error" />
|
|
11
|
+
/// <reference types="mongoose/types/expressions" />
|
|
12
|
+
/// <reference types="mongoose/types/helpers" />
|
|
13
|
+
/// <reference types="mongoose/types/middlewares" />
|
|
14
|
+
/// <reference types="mongoose/types/indexes" />
|
|
15
|
+
/// <reference types="mongoose/types/models" />
|
|
16
|
+
/// <reference types="mongoose/types/mongooseoptions" />
|
|
17
|
+
/// <reference types="mongoose/types/pipelinestage" />
|
|
18
|
+
/// <reference types="mongoose/types/populate" />
|
|
19
|
+
/// <reference types="mongoose/types/query" />
|
|
20
|
+
/// <reference types="mongoose/types/schemaoptions" />
|
|
21
|
+
/// <reference types="mongoose/types/session" />
|
|
22
|
+
/// <reference types="mongoose/types/types" />
|
|
23
|
+
/// <reference types="mongoose/types/utility" />
|
|
24
|
+
/// <reference types="mongoose/types/validation" />
|
|
25
|
+
/// <reference types="mongoose/types/virtuals" />
|
|
26
|
+
/// <reference types="mongoose/types/schematypes" />
|
|
27
|
+
/// <reference types="mongoose/types/inferschematype" />
|
|
28
|
+
/// <reference types="mongoose/types/inferrawdoctype" />
|
|
29
|
+
import mongoose from "mongoose";
|
|
30
|
+
declare const AuditLogModel: mongoose.Model<{
|
|
31
|
+
name: string;
|
|
32
|
+
action: "read" | "create" | "update" | "delete";
|
|
33
|
+
timestamp: NativeDate;
|
|
34
|
+
recordId: mongoose.Types.ObjectId;
|
|
35
|
+
isSystemGenerated: boolean;
|
|
36
|
+
metadata?: any;
|
|
37
|
+
source?: string | null | undefined;
|
|
38
|
+
oldValue?: any;
|
|
39
|
+
newValue?: any;
|
|
40
|
+
fieldName?: string | null | undefined;
|
|
41
|
+
userId?: mongoose.Types.ObjectId | null | undefined;
|
|
42
|
+
ipAddress?: string | null | undefined;
|
|
43
|
+
userAgent?: string | null | undefined;
|
|
44
|
+
sessionId?: string | null | undefined;
|
|
45
|
+
externalData?: {
|
|
46
|
+
apprivoAuditId?: string | null | undefined;
|
|
47
|
+
syncStatus?: "pending" | "synced" | "failed" | null | undefined;
|
|
48
|
+
syncedAt?: NativeDate | null | undefined;
|
|
49
|
+
externalSystemId?: string | null | undefined;
|
|
50
|
+
} | null | undefined;
|
|
51
|
+
severity?: "low" | "medium" | "high" | "critical" | null | undefined;
|
|
52
|
+
}, {}, {}, {}, mongoose.Document<unknown, {}, {
|
|
53
|
+
name: string;
|
|
54
|
+
action: "read" | "create" | "update" | "delete";
|
|
55
|
+
timestamp: NativeDate;
|
|
56
|
+
recordId: mongoose.Types.ObjectId;
|
|
57
|
+
isSystemGenerated: boolean;
|
|
58
|
+
metadata?: any;
|
|
59
|
+
source?: string | null | undefined;
|
|
60
|
+
oldValue?: any;
|
|
61
|
+
newValue?: any;
|
|
62
|
+
fieldName?: string | null | undefined;
|
|
63
|
+
userId?: mongoose.Types.ObjectId | null | undefined;
|
|
64
|
+
ipAddress?: string | null | undefined;
|
|
65
|
+
userAgent?: string | null | undefined;
|
|
66
|
+
sessionId?: string | null | undefined;
|
|
67
|
+
externalData?: {
|
|
68
|
+
apprivoAuditId?: string | null | undefined;
|
|
69
|
+
syncStatus?: "pending" | "synced" | "failed" | null | undefined;
|
|
70
|
+
syncedAt?: NativeDate | null | undefined;
|
|
71
|
+
externalSystemId?: string | null | undefined;
|
|
72
|
+
} | null | undefined;
|
|
73
|
+
severity?: "low" | "medium" | "high" | "critical" | null | undefined;
|
|
74
|
+
}, {}> & {
|
|
75
|
+
name: string;
|
|
76
|
+
action: "read" | "create" | "update" | "delete";
|
|
77
|
+
timestamp: NativeDate;
|
|
78
|
+
recordId: mongoose.Types.ObjectId;
|
|
79
|
+
isSystemGenerated: boolean;
|
|
80
|
+
metadata?: any;
|
|
81
|
+
source?: string | null | undefined;
|
|
82
|
+
oldValue?: any;
|
|
83
|
+
newValue?: any;
|
|
84
|
+
fieldName?: string | null | undefined;
|
|
85
|
+
userId?: mongoose.Types.ObjectId | null | undefined;
|
|
86
|
+
ipAddress?: string | null | undefined;
|
|
87
|
+
userAgent?: string | null | undefined;
|
|
88
|
+
sessionId?: string | null | undefined;
|
|
89
|
+
externalData?: {
|
|
90
|
+
apprivoAuditId?: string | null | undefined;
|
|
91
|
+
syncStatus?: "pending" | "synced" | "failed" | null | undefined;
|
|
92
|
+
syncedAt?: NativeDate | null | undefined;
|
|
93
|
+
externalSystemId?: string | null | undefined;
|
|
94
|
+
} | null | undefined;
|
|
95
|
+
severity?: "low" | "medium" | "high" | "critical" | null | undefined;
|
|
96
|
+
} & {
|
|
97
|
+
_id: mongoose.Types.ObjectId;
|
|
98
|
+
} & {
|
|
99
|
+
__v: number;
|
|
100
|
+
}, mongoose.Schema<any, mongoose.Model<any, any, any, any, any, any>, {}, {}, {}, {}, {
|
|
101
|
+
timestamps: false;
|
|
102
|
+
toJSON: {
|
|
103
|
+
virtuals: true;
|
|
104
|
+
};
|
|
105
|
+
toObject: {
|
|
106
|
+
virtuals: true;
|
|
107
|
+
};
|
|
108
|
+
}, {
|
|
109
|
+
name: string;
|
|
110
|
+
action: "read" | "create" | "update" | "delete";
|
|
111
|
+
timestamp: NativeDate;
|
|
112
|
+
recordId: mongoose.Types.ObjectId;
|
|
113
|
+
isSystemGenerated: boolean;
|
|
114
|
+
metadata?: any;
|
|
115
|
+
source?: string | null | undefined;
|
|
116
|
+
oldValue?: any;
|
|
117
|
+
newValue?: any;
|
|
118
|
+
fieldName?: string | null | undefined;
|
|
119
|
+
userId?: mongoose.Types.ObjectId | null | undefined;
|
|
120
|
+
ipAddress?: string | null | undefined;
|
|
121
|
+
userAgent?: string | null | undefined;
|
|
122
|
+
sessionId?: string | null | undefined;
|
|
123
|
+
externalData?: {
|
|
124
|
+
apprivoAuditId?: string | null | undefined;
|
|
125
|
+
syncStatus?: "pending" | "synced" | "failed" | null | undefined;
|
|
126
|
+
syncedAt?: NativeDate | null | undefined;
|
|
127
|
+
externalSystemId?: string | null | undefined;
|
|
128
|
+
} | null | undefined;
|
|
129
|
+
severity?: "low" | "medium" | "high" | "critical" | null | undefined;
|
|
130
|
+
}, mongoose.Document<unknown, {}, mongoose.FlatRecord<{
|
|
131
|
+
name: string;
|
|
132
|
+
action: "read" | "create" | "update" | "delete";
|
|
133
|
+
timestamp: NativeDate;
|
|
134
|
+
recordId: mongoose.Types.ObjectId;
|
|
135
|
+
isSystemGenerated: boolean;
|
|
136
|
+
metadata?: any;
|
|
137
|
+
source?: string | null | undefined;
|
|
138
|
+
oldValue?: any;
|
|
139
|
+
newValue?: any;
|
|
140
|
+
fieldName?: string | null | undefined;
|
|
141
|
+
userId?: mongoose.Types.ObjectId | null | undefined;
|
|
142
|
+
ipAddress?: string | null | undefined;
|
|
143
|
+
userAgent?: string | null | undefined;
|
|
144
|
+
sessionId?: string | null | undefined;
|
|
145
|
+
externalData?: {
|
|
146
|
+
apprivoAuditId?: string | null | undefined;
|
|
147
|
+
syncStatus?: "pending" | "synced" | "failed" | null | undefined;
|
|
148
|
+
syncedAt?: NativeDate | null | undefined;
|
|
149
|
+
externalSystemId?: string | null | undefined;
|
|
150
|
+
} | null | undefined;
|
|
151
|
+
severity?: "low" | "medium" | "high" | "critical" | null | undefined;
|
|
152
|
+
}>, {}> & mongoose.FlatRecord<{
|
|
153
|
+
name: string;
|
|
154
|
+
action: "read" | "create" | "update" | "delete";
|
|
155
|
+
timestamp: NativeDate;
|
|
156
|
+
recordId: mongoose.Types.ObjectId;
|
|
157
|
+
isSystemGenerated: boolean;
|
|
158
|
+
metadata?: any;
|
|
159
|
+
source?: string | null | undefined;
|
|
160
|
+
oldValue?: any;
|
|
161
|
+
newValue?: any;
|
|
162
|
+
fieldName?: string | null | undefined;
|
|
163
|
+
userId?: mongoose.Types.ObjectId | null | undefined;
|
|
164
|
+
ipAddress?: string | null | undefined;
|
|
165
|
+
userAgent?: string | null | undefined;
|
|
166
|
+
sessionId?: string | null | undefined;
|
|
167
|
+
externalData?: {
|
|
168
|
+
apprivoAuditId?: string | null | undefined;
|
|
169
|
+
syncStatus?: "pending" | "synced" | "failed" | null | undefined;
|
|
170
|
+
syncedAt?: NativeDate | null | undefined;
|
|
171
|
+
externalSystemId?: string | null | undefined;
|
|
172
|
+
} | null | undefined;
|
|
173
|
+
severity?: "low" | "medium" | "high" | "critical" | null | undefined;
|
|
174
|
+
}> & {
|
|
175
|
+
_id: mongoose.Types.ObjectId;
|
|
176
|
+
} & {
|
|
177
|
+
__v: number;
|
|
178
|
+
}>>;
|
|
179
|
+
export default AuditLogModel;
|
|
180
|
+
//# sourceMappingURL=audit-log.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-log.model.d.ts","sourceRoot":"","sources":["../../shared/audit-log.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AA6ChC,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA6C,CAAC;AACjE,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import mongoose from "mongoose";
|
|
2
|
+
const auditLogSchema = new mongoose.Schema({
|
|
3
|
+
name: { type: String, required: true }, // Collection/model name
|
|
4
|
+
recordId: { type: mongoose.Schema.Types.ObjectId, required: true }, // ID of the record being audited
|
|
5
|
+
action: { type: String, required: true, enum: ['create', 'update', 'delete', 'read'] },
|
|
6
|
+
userId: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: false }, // User who performed the action
|
|
7
|
+
timestamp: { type: Date, default: Date.now, required: true },
|
|
8
|
+
oldValue: { type: mongoose.Schema.Types.Mixed, required: false }, // Previous value
|
|
9
|
+
newValue: { type: mongoose.Schema.Types.Mixed, required: false }, // New value
|
|
10
|
+
fieldName: { type: String, required: false }, // Specific field that changed
|
|
11
|
+
ipAddress: { type: String, required: false },
|
|
12
|
+
userAgent: { type: String, required: false },
|
|
13
|
+
sessionId: { type: String, required: false },
|
|
14
|
+
source: { type: String, required: false, default: 'application' }, // Source of the change
|
|
15
|
+
metadata: { type: mongoose.Schema.Types.Mixed, required: false },
|
|
16
|
+
externalData: {
|
|
17
|
+
apprivoAuditId: { type: String, required: false }, // External system audit ID
|
|
18
|
+
syncStatus: { type: String, required: false, enum: ['pending', 'synced', 'failed'] },
|
|
19
|
+
syncedAt: { type: Date, required: false },
|
|
20
|
+
externalSystemId: { type: String, required: false }
|
|
21
|
+
},
|
|
22
|
+
isSystemGenerated: { type: Boolean, default: false },
|
|
23
|
+
severity: { type: String, required: false, enum: ['low', 'medium', 'high', 'critical'], default: 'low' }
|
|
24
|
+
}, {
|
|
25
|
+
timestamps: false, // We use our own timestamp field
|
|
26
|
+
toJSON: { virtuals: true },
|
|
27
|
+
toObject: { virtuals: true }
|
|
28
|
+
});
|
|
29
|
+
// Virtual for formatted timestamp
|
|
30
|
+
auditLogSchema.virtual('formattedTimestamp').get(function () {
|
|
31
|
+
return this.timestamp ? this.timestamp.toISOString() : null;
|
|
32
|
+
});
|
|
33
|
+
// Add indexes to match database
|
|
34
|
+
auditLogSchema.index({ 'externalData.apprivoAuditId': 1 }); // External audit ID lookup
|
|
35
|
+
auditLogSchema.index({ name: 1, newValue: 1, recordId: 1, timestamp: -1 }); // Complex compound index
|
|
36
|
+
auditLogSchema.index({ name: 1, recordId: 1 }); // Filter by collection and record
|
|
37
|
+
auditLogSchema.index({ recordId: 1, timestamp: -1, _id: -1 }); // Record history with fallback sort
|
|
38
|
+
auditLogSchema.index({ timestamp: -1 }); // Sort by recent changes
|
|
39
|
+
auditLogSchema.index({ userId: 1, timestamp: -1 }); // User activity history
|
|
40
|
+
auditLogSchema.index({ action: 1, timestamp: -1 }); // Filter by action type
|
|
41
|
+
auditLogSchema.index({ name: 1, action: 1, timestamp: -1 }); // Collection-specific action history
|
|
42
|
+
const AuditLogModel = mongoose.model("AuditLog", auditLogSchema);
|
|
43
|
+
export default AuditLogModel;
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/// <reference path="../value-objects/pound.d.ts" />
|
|
2
|
+
/// <reference path="../value-objects/account-number.d.ts" />
|
|
3
|
+
/// <reference path="../value-objects/sort-code.d.ts" />
|
|
4
|
+
/// <reference types="mongoose/types/aggregate" />
|
|
5
|
+
/// <reference types="mongoose/types/callback" />
|
|
6
|
+
/// <reference types="mongoose/types/collection" />
|
|
7
|
+
/// <reference types="mongoose/types/connection" />
|
|
8
|
+
/// <reference types="mongoose/types/cursor" />
|
|
9
|
+
/// <reference types="mongoose/types/document" />
|
|
10
|
+
/// <reference types="mongoose/types/error" />
|
|
11
|
+
/// <reference types="mongoose/types/expressions" />
|
|
12
|
+
/// <reference types="mongoose/types/helpers" />
|
|
13
|
+
/// <reference types="mongoose/types/middlewares" />
|
|
14
|
+
/// <reference types="mongoose/types/indexes" />
|
|
15
|
+
/// <reference types="mongoose/types/models" />
|
|
16
|
+
/// <reference types="mongoose/types/mongooseoptions" />
|
|
17
|
+
/// <reference types="mongoose/types/pipelinestage" />
|
|
18
|
+
/// <reference types="mongoose/types/populate" />
|
|
19
|
+
/// <reference types="mongoose/types/query" />
|
|
20
|
+
/// <reference types="mongoose/types/schemaoptions" />
|
|
21
|
+
/// <reference types="mongoose/types/session" />
|
|
22
|
+
/// <reference types="mongoose/types/types" />
|
|
23
|
+
/// <reference types="mongoose/types/utility" />
|
|
24
|
+
/// <reference types="mongoose/types/validation" />
|
|
25
|
+
/// <reference types="mongoose/types/virtuals" />
|
|
26
|
+
/// <reference types="mongoose/types/schematypes" />
|
|
27
|
+
/// <reference types="mongoose/types/inferschematype" />
|
|
28
|
+
/// <reference types="mongoose/types/inferrawdoctype" />
|
|
29
|
+
import mongoose from "mongoose";
|
|
30
|
+
declare const DocumentModel: mongoose.Model<{
|
|
31
|
+
createdAt: NativeDate;
|
|
32
|
+
updatedAt: NativeDate;
|
|
33
|
+
} & {
|
|
34
|
+
isActive: boolean;
|
|
35
|
+
applicationId: mongoose.Types.ObjectId;
|
|
36
|
+
status: "pending" | "uploaded" | "verified" | "rejected" | "archived";
|
|
37
|
+
category: string;
|
|
38
|
+
fileName: string;
|
|
39
|
+
originalName: string;
|
|
40
|
+
mimeType: string;
|
|
41
|
+
fileSize: number;
|
|
42
|
+
filePath: string;
|
|
43
|
+
uploadedBy: mongoose.Types.ObjectId;
|
|
44
|
+
tags: string[];
|
|
45
|
+
metadata?: any;
|
|
46
|
+
contextId?: mongoose.Types.ObjectId | null | undefined;
|
|
47
|
+
rejectionReason?: string | null | undefined;
|
|
48
|
+
subCategory?: string | null | undefined;
|
|
49
|
+
verifiedBy?: mongoose.Types.ObjectId | null | undefined;
|
|
50
|
+
verifiedAt?: NativeDate | null | undefined;
|
|
51
|
+
expiresAt?: NativeDate | null | undefined;
|
|
52
|
+
}, {}, {}, {}, mongoose.Document<unknown, {}, {
|
|
53
|
+
createdAt: NativeDate;
|
|
54
|
+
updatedAt: NativeDate;
|
|
55
|
+
} & {
|
|
56
|
+
isActive: boolean;
|
|
57
|
+
applicationId: mongoose.Types.ObjectId;
|
|
58
|
+
status: "pending" | "uploaded" | "verified" | "rejected" | "archived";
|
|
59
|
+
category: string;
|
|
60
|
+
fileName: string;
|
|
61
|
+
originalName: string;
|
|
62
|
+
mimeType: string;
|
|
63
|
+
fileSize: number;
|
|
64
|
+
filePath: string;
|
|
65
|
+
uploadedBy: mongoose.Types.ObjectId;
|
|
66
|
+
tags: string[];
|
|
67
|
+
metadata?: any;
|
|
68
|
+
contextId?: mongoose.Types.ObjectId | null | undefined;
|
|
69
|
+
rejectionReason?: string | null | undefined;
|
|
70
|
+
subCategory?: string | null | undefined;
|
|
71
|
+
verifiedBy?: mongoose.Types.ObjectId | null | undefined;
|
|
72
|
+
verifiedAt?: NativeDate | null | undefined;
|
|
73
|
+
expiresAt?: NativeDate | null | undefined;
|
|
74
|
+
}, {}> & {
|
|
75
|
+
createdAt: NativeDate;
|
|
76
|
+
updatedAt: NativeDate;
|
|
77
|
+
} & {
|
|
78
|
+
isActive: boolean;
|
|
79
|
+
applicationId: mongoose.Types.ObjectId;
|
|
80
|
+
status: "pending" | "uploaded" | "verified" | "rejected" | "archived";
|
|
81
|
+
category: string;
|
|
82
|
+
fileName: string;
|
|
83
|
+
originalName: string;
|
|
84
|
+
mimeType: string;
|
|
85
|
+
fileSize: number;
|
|
86
|
+
filePath: string;
|
|
87
|
+
uploadedBy: mongoose.Types.ObjectId;
|
|
88
|
+
tags: string[];
|
|
89
|
+
metadata?: any;
|
|
90
|
+
contextId?: mongoose.Types.ObjectId | null | undefined;
|
|
91
|
+
rejectionReason?: string | null | undefined;
|
|
92
|
+
subCategory?: string | null | undefined;
|
|
93
|
+
verifiedBy?: mongoose.Types.ObjectId | null | undefined;
|
|
94
|
+
verifiedAt?: NativeDate | null | undefined;
|
|
95
|
+
expiresAt?: NativeDate | null | undefined;
|
|
96
|
+
} & {
|
|
97
|
+
_id: mongoose.Types.ObjectId;
|
|
98
|
+
} & {
|
|
99
|
+
__v: number;
|
|
100
|
+
}, mongoose.Schema<any, mongoose.Model<any, any, any, any, any, any>, {}, {}, {}, {}, {
|
|
101
|
+
timestamps: true;
|
|
102
|
+
toJSON: {
|
|
103
|
+
virtuals: true;
|
|
104
|
+
};
|
|
105
|
+
toObject: {
|
|
106
|
+
virtuals: true;
|
|
107
|
+
};
|
|
108
|
+
}, {
|
|
109
|
+
createdAt: NativeDate;
|
|
110
|
+
updatedAt: NativeDate;
|
|
111
|
+
} & {
|
|
112
|
+
isActive: boolean;
|
|
113
|
+
applicationId: mongoose.Types.ObjectId;
|
|
114
|
+
status: "pending" | "uploaded" | "verified" | "rejected" | "archived";
|
|
115
|
+
category: string;
|
|
116
|
+
fileName: string;
|
|
117
|
+
originalName: string;
|
|
118
|
+
mimeType: string;
|
|
119
|
+
fileSize: number;
|
|
120
|
+
filePath: string;
|
|
121
|
+
uploadedBy: mongoose.Types.ObjectId;
|
|
122
|
+
tags: string[];
|
|
123
|
+
metadata?: any;
|
|
124
|
+
contextId?: mongoose.Types.ObjectId | null | undefined;
|
|
125
|
+
rejectionReason?: string | null | undefined;
|
|
126
|
+
subCategory?: string | null | undefined;
|
|
127
|
+
verifiedBy?: mongoose.Types.ObjectId | null | undefined;
|
|
128
|
+
verifiedAt?: NativeDate | null | undefined;
|
|
129
|
+
expiresAt?: NativeDate | null | undefined;
|
|
130
|
+
}, mongoose.Document<unknown, {}, mongoose.FlatRecord<{
|
|
131
|
+
createdAt: NativeDate;
|
|
132
|
+
updatedAt: NativeDate;
|
|
133
|
+
} & {
|
|
134
|
+
isActive: boolean;
|
|
135
|
+
applicationId: mongoose.Types.ObjectId;
|
|
136
|
+
status: "pending" | "uploaded" | "verified" | "rejected" | "archived";
|
|
137
|
+
category: string;
|
|
138
|
+
fileName: string;
|
|
139
|
+
originalName: string;
|
|
140
|
+
mimeType: string;
|
|
141
|
+
fileSize: number;
|
|
142
|
+
filePath: string;
|
|
143
|
+
uploadedBy: mongoose.Types.ObjectId;
|
|
144
|
+
tags: string[];
|
|
145
|
+
metadata?: any;
|
|
146
|
+
contextId?: mongoose.Types.ObjectId | null | undefined;
|
|
147
|
+
rejectionReason?: string | null | undefined;
|
|
148
|
+
subCategory?: string | null | undefined;
|
|
149
|
+
verifiedBy?: mongoose.Types.ObjectId | null | undefined;
|
|
150
|
+
verifiedAt?: NativeDate | null | undefined;
|
|
151
|
+
expiresAt?: NativeDate | null | undefined;
|
|
152
|
+
}>, {}> & mongoose.FlatRecord<{
|
|
153
|
+
createdAt: NativeDate;
|
|
154
|
+
updatedAt: NativeDate;
|
|
155
|
+
} & {
|
|
156
|
+
isActive: boolean;
|
|
157
|
+
applicationId: mongoose.Types.ObjectId;
|
|
158
|
+
status: "pending" | "uploaded" | "verified" | "rejected" | "archived";
|
|
159
|
+
category: string;
|
|
160
|
+
fileName: string;
|
|
161
|
+
originalName: string;
|
|
162
|
+
mimeType: string;
|
|
163
|
+
fileSize: number;
|
|
164
|
+
filePath: string;
|
|
165
|
+
uploadedBy: mongoose.Types.ObjectId;
|
|
166
|
+
tags: string[];
|
|
167
|
+
metadata?: any;
|
|
168
|
+
contextId?: mongoose.Types.ObjectId | null | undefined;
|
|
169
|
+
rejectionReason?: string | null | undefined;
|
|
170
|
+
subCategory?: string | null | undefined;
|
|
171
|
+
verifiedBy?: mongoose.Types.ObjectId | null | undefined;
|
|
172
|
+
verifiedAt?: NativeDate | null | undefined;
|
|
173
|
+
expiresAt?: NativeDate | null | undefined;
|
|
174
|
+
}> & {
|
|
175
|
+
_id: mongoose.Types.ObjectId;
|
|
176
|
+
} & {
|
|
177
|
+
__v: number;
|
|
178
|
+
}>>;
|
|
179
|
+
export default DocumentModel;
|
|
180
|
+
//# sourceMappingURL=document.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.model.d.ts","sourceRoot":"","sources":["../../shared/document.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AA0ChC,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA6C,CAAC;AACjE,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import mongoose from "mongoose";
|
|
2
|
+
import { applyAuditMiddleware } from "@dynamatix/cat-shared/middlewares";
|
|
3
|
+
import { applyWorkflowPlugin } from "./workflow.plugin";
|
|
4
|
+
const documentSchema = new mongoose.Schema({
|
|
5
|
+
applicationId: { type: mongoose.Schema.Types.ObjectId, ref: "Application", required: true },
|
|
6
|
+
contextId: { type: mongoose.Schema.Types.ObjectId, required: false },
|
|
7
|
+
status: { type: String, required: true, enum: ['pending', 'uploaded', 'verified', 'rejected', 'archived'] },
|
|
8
|
+
category: { type: String, required: true },
|
|
9
|
+
subCategory: { type: String, required: false },
|
|
10
|
+
fileName: { type: String, required: true },
|
|
11
|
+
originalName: { type: String, required: true },
|
|
12
|
+
mimeType: { type: String, required: true },
|
|
13
|
+
fileSize: { type: Number, required: true },
|
|
14
|
+
filePath: { type: String, required: true },
|
|
15
|
+
uploadedBy: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true },
|
|
16
|
+
verifiedBy: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: false },
|
|
17
|
+
verifiedAt: { type: Date, required: false },
|
|
18
|
+
rejectionReason: { type: String, required: false },
|
|
19
|
+
metadata: { type: mongoose.Schema.Types.Mixed, required: false },
|
|
20
|
+
tags: [{ type: String }],
|
|
21
|
+
isActive: { type: Boolean, default: true },
|
|
22
|
+
expiresAt: { type: Date, required: false }
|
|
23
|
+
}, {
|
|
24
|
+
timestamps: true,
|
|
25
|
+
toJSON: { virtuals: true },
|
|
26
|
+
toObject: { virtuals: true }
|
|
27
|
+
});
|
|
28
|
+
applyAuditMiddleware(documentSchema, "Document");
|
|
29
|
+
applyWorkflowPlugin(documentSchema, 'document');
|
|
30
|
+
// Add indexes to match database
|
|
31
|
+
documentSchema.index({ applicationId: 1 }); // Filter by application
|
|
32
|
+
documentSchema.index({ contextId: 1 }); // Filter by context
|
|
33
|
+
documentSchema.index({ status: 1 }); // Filter by status
|
|
34
|
+
documentSchema.index({ category: 1 }); // Filter by category
|
|
35
|
+
documentSchema.index({ subCategory: 1 }); // Filter by subcategory
|
|
36
|
+
documentSchema.index({ applicationId: 1, status: 1 }); // Compound: application + status
|
|
37
|
+
documentSchema.index({ contextId: 1, status: 1 }); // Compound: context + status
|
|
38
|
+
documentSchema.index({ category: 1, status: 1 }); // Compound: category + status
|
|
39
|
+
const DocumentModel = mongoose.model("Document", documentSchema);
|
|
40
|
+
export default DocumentModel;
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/// <reference path="../value-objects/pound.d.ts" />
|
|
2
|
+
/// <reference path="../value-objects/account-number.d.ts" />
|
|
3
|
+
/// <reference path="../value-objects/sort-code.d.ts" />
|
|
4
|
+
/// <reference types="mongoose/types/aggregate" />
|
|
5
|
+
/// <reference types="mongoose/types/callback" />
|
|
6
|
+
/// <reference types="mongoose/types/collection" />
|
|
7
|
+
/// <reference types="mongoose/types/connection" />
|
|
8
|
+
/// <reference types="mongoose/types/cursor" />
|
|
9
|
+
/// <reference types="mongoose/types/document" />
|
|
10
|
+
/// <reference types="mongoose/types/error" />
|
|
11
|
+
/// <reference types="mongoose/types/expressions" />
|
|
12
|
+
/// <reference types="mongoose/types/helpers" />
|
|
13
|
+
/// <reference types="mongoose/types/middlewares" />
|
|
14
|
+
/// <reference types="mongoose/types/indexes" />
|
|
15
|
+
/// <reference types="mongoose/types/models" />
|
|
16
|
+
/// <reference types="mongoose/types/mongooseoptions" />
|
|
17
|
+
/// <reference types="mongoose/types/pipelinestage" />
|
|
18
|
+
/// <reference types="mongoose/types/populate" />
|
|
19
|
+
/// <reference types="mongoose/types/query" />
|
|
20
|
+
/// <reference types="mongoose/types/schemaoptions" />
|
|
21
|
+
/// <reference types="mongoose/types/session" />
|
|
22
|
+
/// <reference types="mongoose/types/types" />
|
|
23
|
+
/// <reference types="mongoose/types/utility" />
|
|
24
|
+
/// <reference types="mongoose/types/validation" />
|
|
25
|
+
/// <reference types="mongoose/types/virtuals" />
|
|
26
|
+
/// <reference types="mongoose/types/schematypes" />
|
|
27
|
+
/// <reference types="mongoose/types/inferschematype" />
|
|
28
|
+
/// <reference types="mongoose/types/inferrawdoctype" />
|
|
29
|
+
import mongoose from "mongoose";
|
|
30
|
+
declare const QueueModel: mongoose.Model<{
|
|
31
|
+
createdAt: NativeDate;
|
|
32
|
+
updatedAt: NativeDate;
|
|
33
|
+
} & {
|
|
34
|
+
isActive: boolean;
|
|
35
|
+
name: string;
|
|
36
|
+
retryAttempts: number;
|
|
37
|
+
retryDelay: number;
|
|
38
|
+
priority: number;
|
|
39
|
+
maxConcurrency: number;
|
|
40
|
+
processingTimeout: number;
|
|
41
|
+
assignedUsers: mongoose.Types.ObjectId[];
|
|
42
|
+
description?: string | null | undefined;
|
|
43
|
+
departmentId?: mongoose.Types.ObjectId | null | undefined;
|
|
44
|
+
workflowId?: mongoose.Types.ObjectId | null | undefined;
|
|
45
|
+
settings?: any;
|
|
46
|
+
statistics?: {
|
|
47
|
+
totalProcessed: number;
|
|
48
|
+
totalFailed: number;
|
|
49
|
+
averageProcessingTime: number;
|
|
50
|
+
lastProcessedAt?: NativeDate | null | undefined;
|
|
51
|
+
} | null | undefined;
|
|
52
|
+
}, {}, {}, {}, mongoose.Document<unknown, {}, {
|
|
53
|
+
createdAt: NativeDate;
|
|
54
|
+
updatedAt: NativeDate;
|
|
55
|
+
} & {
|
|
56
|
+
isActive: boolean;
|
|
57
|
+
name: string;
|
|
58
|
+
retryAttempts: number;
|
|
59
|
+
retryDelay: number;
|
|
60
|
+
priority: number;
|
|
61
|
+
maxConcurrency: number;
|
|
62
|
+
processingTimeout: number;
|
|
63
|
+
assignedUsers: mongoose.Types.ObjectId[];
|
|
64
|
+
description?: string | null | undefined;
|
|
65
|
+
departmentId?: mongoose.Types.ObjectId | null | undefined;
|
|
66
|
+
workflowId?: mongoose.Types.ObjectId | null | undefined;
|
|
67
|
+
settings?: any;
|
|
68
|
+
statistics?: {
|
|
69
|
+
totalProcessed: number;
|
|
70
|
+
totalFailed: number;
|
|
71
|
+
averageProcessingTime: number;
|
|
72
|
+
lastProcessedAt?: NativeDate | null | undefined;
|
|
73
|
+
} | null | undefined;
|
|
74
|
+
}, {}> & {
|
|
75
|
+
createdAt: NativeDate;
|
|
76
|
+
updatedAt: NativeDate;
|
|
77
|
+
} & {
|
|
78
|
+
isActive: boolean;
|
|
79
|
+
name: string;
|
|
80
|
+
retryAttempts: number;
|
|
81
|
+
retryDelay: number;
|
|
82
|
+
priority: number;
|
|
83
|
+
maxConcurrency: number;
|
|
84
|
+
processingTimeout: number;
|
|
85
|
+
assignedUsers: mongoose.Types.ObjectId[];
|
|
86
|
+
description?: string | null | undefined;
|
|
87
|
+
departmentId?: mongoose.Types.ObjectId | null | undefined;
|
|
88
|
+
workflowId?: mongoose.Types.ObjectId | null | undefined;
|
|
89
|
+
settings?: any;
|
|
90
|
+
statistics?: {
|
|
91
|
+
totalProcessed: number;
|
|
92
|
+
totalFailed: number;
|
|
93
|
+
averageProcessingTime: number;
|
|
94
|
+
lastProcessedAt?: NativeDate | null | undefined;
|
|
95
|
+
} | null | undefined;
|
|
96
|
+
} & {
|
|
97
|
+
_id: mongoose.Types.ObjectId;
|
|
98
|
+
} & {
|
|
99
|
+
__v: number;
|
|
100
|
+
}, mongoose.Schema<any, mongoose.Model<any, any, any, any, any, any>, {}, {}, {}, {}, {
|
|
101
|
+
timestamps: true;
|
|
102
|
+
toJSON: {
|
|
103
|
+
virtuals: true;
|
|
104
|
+
};
|
|
105
|
+
toObject: {
|
|
106
|
+
virtuals: true;
|
|
107
|
+
};
|
|
108
|
+
}, {
|
|
109
|
+
createdAt: NativeDate;
|
|
110
|
+
updatedAt: NativeDate;
|
|
111
|
+
} & {
|
|
112
|
+
isActive: boolean;
|
|
113
|
+
name: string;
|
|
114
|
+
retryAttempts: number;
|
|
115
|
+
retryDelay: number;
|
|
116
|
+
priority: number;
|
|
117
|
+
maxConcurrency: number;
|
|
118
|
+
processingTimeout: number;
|
|
119
|
+
assignedUsers: mongoose.Types.ObjectId[];
|
|
120
|
+
description?: string | null | undefined;
|
|
121
|
+
departmentId?: mongoose.Types.ObjectId | null | undefined;
|
|
122
|
+
workflowId?: mongoose.Types.ObjectId | null | undefined;
|
|
123
|
+
settings?: any;
|
|
124
|
+
statistics?: {
|
|
125
|
+
totalProcessed: number;
|
|
126
|
+
totalFailed: number;
|
|
127
|
+
averageProcessingTime: number;
|
|
128
|
+
lastProcessedAt?: NativeDate | null | undefined;
|
|
129
|
+
} | null | undefined;
|
|
130
|
+
}, mongoose.Document<unknown, {}, mongoose.FlatRecord<{
|
|
131
|
+
createdAt: NativeDate;
|
|
132
|
+
updatedAt: NativeDate;
|
|
133
|
+
} & {
|
|
134
|
+
isActive: boolean;
|
|
135
|
+
name: string;
|
|
136
|
+
retryAttempts: number;
|
|
137
|
+
retryDelay: number;
|
|
138
|
+
priority: number;
|
|
139
|
+
maxConcurrency: number;
|
|
140
|
+
processingTimeout: number;
|
|
141
|
+
assignedUsers: mongoose.Types.ObjectId[];
|
|
142
|
+
description?: string | null | undefined;
|
|
143
|
+
departmentId?: mongoose.Types.ObjectId | null | undefined;
|
|
144
|
+
workflowId?: mongoose.Types.ObjectId | null | undefined;
|
|
145
|
+
settings?: any;
|
|
146
|
+
statistics?: {
|
|
147
|
+
totalProcessed: number;
|
|
148
|
+
totalFailed: number;
|
|
149
|
+
averageProcessingTime: number;
|
|
150
|
+
lastProcessedAt?: NativeDate | null | undefined;
|
|
151
|
+
} | null | undefined;
|
|
152
|
+
}>, {}> & mongoose.FlatRecord<{
|
|
153
|
+
createdAt: NativeDate;
|
|
154
|
+
updatedAt: NativeDate;
|
|
155
|
+
} & {
|
|
156
|
+
isActive: boolean;
|
|
157
|
+
name: string;
|
|
158
|
+
retryAttempts: number;
|
|
159
|
+
retryDelay: number;
|
|
160
|
+
priority: number;
|
|
161
|
+
maxConcurrency: number;
|
|
162
|
+
processingTimeout: number;
|
|
163
|
+
assignedUsers: mongoose.Types.ObjectId[];
|
|
164
|
+
description?: string | null | undefined;
|
|
165
|
+
departmentId?: mongoose.Types.ObjectId | null | undefined;
|
|
166
|
+
workflowId?: mongoose.Types.ObjectId | null | undefined;
|
|
167
|
+
settings?: any;
|
|
168
|
+
statistics?: {
|
|
169
|
+
totalProcessed: number;
|
|
170
|
+
totalFailed: number;
|
|
171
|
+
averageProcessingTime: number;
|
|
172
|
+
lastProcessedAt?: NativeDate | null | undefined;
|
|
173
|
+
} | null | undefined;
|
|
174
|
+
}> & {
|
|
175
|
+
_id: mongoose.Types.ObjectId;
|
|
176
|
+
} & {
|
|
177
|
+
__v: number;
|
|
178
|
+
}>>;
|
|
179
|
+
export default QueueModel;
|
|
180
|
+
//# sourceMappingURL=queue.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.model.d.ts","sourceRoot":"","sources":["../../shared/queue.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AA6ChC,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAuC,CAAC;AACxD,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import mongoose from "mongoose";
|
|
2
|
+
import { applyAuditMiddleware } from "@dynamatix/cat-shared/middlewares";
|
|
3
|
+
import { applyWorkflowPlugin } from "./workflow.plugin";
|
|
4
|
+
const queueSchema = new mongoose.Schema({
|
|
5
|
+
name: { type: String, required: true, unique: true },
|
|
6
|
+
description: { type: String, required: false },
|
|
7
|
+
isActive: { type: Boolean, default: true },
|
|
8
|
+
priority: { type: Number, default: 0 },
|
|
9
|
+
maxConcurrency: { type: Number, default: 1 },
|
|
10
|
+
retryAttempts: { type: Number, default: 3 },
|
|
11
|
+
retryDelay: { type: Number, default: 5000 }, // milliseconds
|
|
12
|
+
processingTimeout: { type: Number, default: 300000 }, // 5 minutes in milliseconds
|
|
13
|
+
assignedUsers: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }],
|
|
14
|
+
departmentId: { type: mongoose.Schema.Types.ObjectId, ref: "Department", required: false },
|
|
15
|
+
workflowId: { type: mongoose.Schema.Types.ObjectId, ref: "Workflow", required: false },
|
|
16
|
+
settings: { type: mongoose.Schema.Types.Mixed, required: false },
|
|
17
|
+
statistics: {
|
|
18
|
+
totalProcessed: { type: Number, default: 0 },
|
|
19
|
+
totalFailed: { type: Number, default: 0 },
|
|
20
|
+
averageProcessingTime: { type: Number, default: 0 },
|
|
21
|
+
lastProcessedAt: { type: Date, required: false }
|
|
22
|
+
}
|
|
23
|
+
}, {
|
|
24
|
+
timestamps: true,
|
|
25
|
+
toJSON: { virtuals: true },
|
|
26
|
+
toObject: { virtuals: true }
|
|
27
|
+
});
|
|
28
|
+
// Virtual for current queue size (would need to be populated from related collections)
|
|
29
|
+
queueSchema.virtual('currentSize').get(function () {
|
|
30
|
+
// This would typically be calculated by counting related queue items
|
|
31
|
+
return 0;
|
|
32
|
+
});
|
|
33
|
+
applyAuditMiddleware(queueSchema, "Queue");
|
|
34
|
+
applyWorkflowPlugin(queueSchema, 'queue');
|
|
35
|
+
// Add indexes to match database
|
|
36
|
+
queueSchema.index({ name: 1 }, { unique: true }); // Unique queue name
|
|
37
|
+
queueSchema.index({ isActive: 1 }); // Filter by active status
|
|
38
|
+
queueSchema.index({ priority: -1 }); // Sort by priority (highest first)
|
|
39
|
+
queueSchema.index({ departmentId: 1 }); // Filter by department
|
|
40
|
+
queueSchema.index({ isActive: 1, priority: -1 }); // Compound: active + priority
|
|
41
|
+
const QueueModel = mongoose.model("Queue", queueSchema);
|
|
42
|
+
export default QueueModel;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamatix/gb-schemas",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.290",
|
|
4
4
|
"description": "All the schemas for gatehouse bank back-end",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
},
|
|
36
36
|
"homepage": "https://github.com/DynamatixAnalyticsPvtLtd/gb-schemas#readme",
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@dynamatix/cat-shared": "^0.0.
|
|
38
|
+
"@dynamatix/cat-shared": "^0.0.129",
|
|
39
39
|
"dotenv": "^16.4.5",
|
|
40
40
|
"mongodb": "^6.14.2",
|
|
41
41
|
"mongoose": "^8.9.5"
|