@unchainedshop/core-enrollments 4.3.4 → 4.5.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.
- package/README.md +108 -3
- package/lib/addToDate.d.ts +0 -1
- package/lib/addToDate.js +1 -6
- package/lib/db/EnrollmentsCollection.d.ts +8 -8
- package/lib/db/EnrollmentsCollection.js +8 -10
- package/lib/enrollments-index.d.ts +4 -5
- package/lib/enrollments-index.js +4 -5
- package/lib/enrollments-settings.d.ts +12 -4
- package/lib/enrollments-settings.js +3 -3
- package/lib/module/configureEnrollmentsModule.d.ts +4 -5
- package/lib/module/configureEnrollmentsModule.js +4 -8
- package/package.json +12 -12
- package/lib/addToDate.d.ts.map +0 -1
- package/lib/addToDate.js.map +0 -1
- package/lib/db/EnrollmentsCollection.d.ts.map +0 -1
- package/lib/db/EnrollmentsCollection.js.map +0 -1
- package/lib/enrollments-index.d.ts.map +0 -1
- package/lib/enrollments-index.js.map +0 -1
- package/lib/enrollments-settings.d.ts.map +0 -1
- package/lib/enrollments-settings.js.map +0 -1
- package/lib/module/configureEnrollmentsModule.d.ts.map +0 -1
- package/lib/module/configureEnrollmentsModule.js.map +0 -1
- package/src/addToDate.ts +0 -58
- package/src/db/EnrollmentsCollection.ts +0 -99
- package/src/enrollments-index.ts +0 -4
- package/src/enrollments-settings.ts +0 -22
- package/src/module/buildFindSelector.test.ts +0 -43
- package/src/module/configureEnrollmentsModule.ts +0 -308
- package/tsconfig.json +0 -10
package/README.md
CHANGED
|
@@ -1,5 +1,110 @@
|
|
|
1
|
-
|
|
1
|
+
[](https://npmjs.com/package/@unchainedshop/core-enrollments)
|
|
2
|
+
[](https://opensource.org/licenses/EUPL-1.2)
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
# @unchainedshop/core-enrollments
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
Enrollment (subscription) management module for the Unchained Engine. Handles recurring subscriptions, subscription periods, and automatic order generation.
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install @unchainedshop/core-enrollments
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { configureEnrollmentsModule, EnrollmentStatus } from '@unchainedshop/core-enrollments';
|
|
18
|
+
|
|
19
|
+
const enrollmentsModule = await configureEnrollmentsModule({ db });
|
|
20
|
+
|
|
21
|
+
// Create an enrollment
|
|
22
|
+
const enrollmentId = await enrollmentsModule.create({
|
|
23
|
+
userId: 'user-123',
|
|
24
|
+
productId: 'plan-product-456',
|
|
25
|
+
quantity: 1,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// Activate enrollment
|
|
29
|
+
await enrollmentsModule.activate(enrollmentId);
|
|
30
|
+
|
|
31
|
+
// Find active enrollments
|
|
32
|
+
const enrollments = await enrollmentsModule.findEnrollments({
|
|
33
|
+
status: EnrollmentStatus.ACTIVE,
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## API Overview
|
|
38
|
+
|
|
39
|
+
### Module Configuration
|
|
40
|
+
|
|
41
|
+
| Export | Description |
|
|
42
|
+
|--------|-------------|
|
|
43
|
+
| `configureEnrollmentsModule` | Configure and return the enrollments module |
|
|
44
|
+
|
|
45
|
+
### Queries
|
|
46
|
+
|
|
47
|
+
| Method | Description |
|
|
48
|
+
|--------|-------------|
|
|
49
|
+
| `findEnrollment` | Find enrollment by ID |
|
|
50
|
+
| `findEnrollments` | Find enrollments with filtering and pagination |
|
|
51
|
+
| `count` | Count enrollments matching query |
|
|
52
|
+
| `enrollmentExists` | Check if enrollment exists |
|
|
53
|
+
|
|
54
|
+
### Mutations
|
|
55
|
+
|
|
56
|
+
| Method | Description |
|
|
57
|
+
|--------|-------------|
|
|
58
|
+
| `create` | Create a new enrollment |
|
|
59
|
+
| `update` | Update enrollment data |
|
|
60
|
+
| `delete` | Delete an enrollment |
|
|
61
|
+
| `activate` | Activate an enrollment |
|
|
62
|
+
| `terminate` | Terminate an enrollment |
|
|
63
|
+
|
|
64
|
+
### Period Management
|
|
65
|
+
|
|
66
|
+
| Method | Description |
|
|
67
|
+
|--------|-------------|
|
|
68
|
+
| `addPeriod` | Add a billing period |
|
|
69
|
+
| `findPeriod` | Find a specific period |
|
|
70
|
+
| `isExpired` | Check if enrollment is expired |
|
|
71
|
+
|
|
72
|
+
### Utilities
|
|
73
|
+
|
|
74
|
+
| Export | Description |
|
|
75
|
+
|--------|-------------|
|
|
76
|
+
| `addToDate` | Add time interval to date |
|
|
77
|
+
|
|
78
|
+
### Constants
|
|
79
|
+
|
|
80
|
+
| Export | Description |
|
|
81
|
+
|--------|-------------|
|
|
82
|
+
| `EnrollmentStatus` | Status values (INITIAL, ACTIVE, PAUSED, TERMINATED) |
|
|
83
|
+
|
|
84
|
+
### Settings
|
|
85
|
+
|
|
86
|
+
| Export | Description |
|
|
87
|
+
|--------|-------------|
|
|
88
|
+
| `enrollmentsSettings` | Access enrollment module settings |
|
|
89
|
+
|
|
90
|
+
### Types
|
|
91
|
+
|
|
92
|
+
| Export | Description |
|
|
93
|
+
|--------|-------------|
|
|
94
|
+
| `Enrollment` | Enrollment document type |
|
|
95
|
+
| `EnrollmentPeriod` | Period document type |
|
|
96
|
+
| `EnrollmentsModule` | Module interface type |
|
|
97
|
+
|
|
98
|
+
## Events
|
|
99
|
+
|
|
100
|
+
| Event | Description |
|
|
101
|
+
|-------|-------------|
|
|
102
|
+
| `ENROLLMENT_CREATE` | Enrollment created |
|
|
103
|
+
| `ENROLLMENT_UPDATE` | Enrollment updated |
|
|
104
|
+
| `ENROLLMENT_REMOVE` | Enrollment deleted |
|
|
105
|
+
| `ENROLLMENT_ACTIVATE` | Enrollment activated |
|
|
106
|
+
| `ENROLLMENT_TERMINATE` | Enrollment terminated |
|
|
107
|
+
|
|
108
|
+
## License
|
|
109
|
+
|
|
110
|
+
EUPL-1.2
|
package/lib/addToDate.d.ts
CHANGED
package/lib/addToDate.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
// @ts-nocheck
|
|
3
|
-
/* esm.sh - esbuild bundle(date-fns@4.1.0/add) es2022 production */
|
|
4
1
|
const F = Math.pow(10, 8) * 24 * 60 * 60 * 1e3, b = -F;
|
|
5
2
|
const N = 3600;
|
|
6
3
|
const a = N * 24, k = a * 7, Y = a * 365.2425, T = Y / 12, w = T * 3, p = Symbol.for('constructDateFrom');
|
|
@@ -9,7 +6,7 @@ function r(t, o) {
|
|
|
9
6
|
? t(o)
|
|
10
7
|
: t && typeof t == 'object' && p in t
|
|
11
8
|
? t[p](o)
|
|
12
|
-
: t instanceof Date
|
|
9
|
+
: t instanceof Date
|
|
13
10
|
? new t.constructor(o)
|
|
14
11
|
: new Date(o);
|
|
15
12
|
}
|
|
@@ -35,5 +32,3 @@ export function addToDate(t, o, e) {
|
|
|
35
32
|
let { years: n = 0, months: i = 0, weeks: s = 0, days: m = 0, hours: I = 0, minutes: l = 0, seconds: h = 0, } = o, u = c(t, e?.in), d = i || n ? x(u, i + n * 12) : u, y = m || s ? f(d, m + s * 7) : d, D = l + I * 60, M = (h + D * 60) * 1e3;
|
|
36
33
|
return r(e?.in || t, +y + M);
|
|
37
34
|
}
|
|
38
|
-
//# sourceMappingURL=add.js.map
|
|
39
|
-
//# sourceMappingURL=addToDate.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { mongodb } from '@unchainedshop/mongodb';
|
|
2
|
-
import { TimestampFields, LogFields, Address, Contact } from '@unchainedshop/mongodb';
|
|
2
|
+
import { type TimestampFields, type LogFields, type Address, type Contact } from '@unchainedshop/mongodb';
|
|
3
3
|
export interface EnrollmentPeriod {
|
|
4
4
|
start: Date;
|
|
5
5
|
end: Date;
|
|
@@ -14,12 +14,13 @@ export interface EnrollmentPlan {
|
|
|
14
14
|
productId: string;
|
|
15
15
|
quantity: number;
|
|
16
16
|
}
|
|
17
|
-
export declare
|
|
18
|
-
INITIAL
|
|
19
|
-
ACTIVE
|
|
20
|
-
PAUSED
|
|
21
|
-
TERMINATED
|
|
22
|
-
}
|
|
17
|
+
export declare const EnrollmentStatus: {
|
|
18
|
+
readonly INITIAL: "INITIAL";
|
|
19
|
+
readonly ACTIVE: "ACTIVE";
|
|
20
|
+
readonly PAUSED: "PAUSED";
|
|
21
|
+
readonly TERMINATED: "TERMINATED";
|
|
22
|
+
};
|
|
23
|
+
export type EnrollmentStatus = (typeof EnrollmentStatus)[keyof typeof EnrollmentStatus];
|
|
23
24
|
export interface EnrollmentOrderPositionTemplate {
|
|
24
25
|
context?: any;
|
|
25
26
|
configuration?: {
|
|
@@ -61,4 +62,3 @@ export type Enrollment = {
|
|
|
61
62
|
userId: string;
|
|
62
63
|
} & LogFields & TimestampFields;
|
|
63
64
|
export declare const EnrollmentsCollection: (db: mongodb.Db) => Promise<mongodb.Collection<Enrollment>>;
|
|
64
|
-
//# sourceMappingURL=EnrollmentsCollection.d.ts.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { buildDbIndexes, isDocumentDBCompatModeEnabled } from '@unchainedshop/mongodb';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
1
|
+
import { mongodb, buildDbIndexes, isDocumentDBCompatModeEnabled } from '@unchainedshop/mongodb';
|
|
2
|
+
import {} from '@unchainedshop/mongodb';
|
|
3
|
+
export const EnrollmentStatus = {
|
|
4
|
+
INITIAL: 'INITIAL',
|
|
5
|
+
ACTIVE: 'ACTIVE',
|
|
6
|
+
PAUSED: 'PAUSED',
|
|
7
|
+
TERMINATED: 'TERMINATED',
|
|
8
|
+
};
|
|
9
9
|
export const EnrollmentsCollection = async (db) => {
|
|
10
10
|
const Enrollments = db.collection('enrollments');
|
|
11
11
|
if (!isDocumentDBCompatModeEnabled()) {
|
|
@@ -33,7 +33,6 @@ export const EnrollmentsCollection = async (db) => {
|
|
|
33
33
|
},
|
|
34
34
|
]);
|
|
35
35
|
}
|
|
36
|
-
// Enrollment Indexes
|
|
37
36
|
await buildDbIndexes(Enrollments, [
|
|
38
37
|
{ index: { userId: 1 } },
|
|
39
38
|
{ index: { productId: 1 } },
|
|
@@ -42,4 +41,3 @@ export const EnrollmentsCollection = async (db) => {
|
|
|
42
41
|
]);
|
|
43
42
|
return Enrollments;
|
|
44
43
|
};
|
|
45
|
-
//# sourceMappingURL=EnrollmentsCollection.js.map
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
export * from './db/EnrollmentsCollection.
|
|
2
|
-
export * from './module/configureEnrollmentsModule.
|
|
3
|
-
export * from './enrollments-settings.
|
|
4
|
-
export * from './addToDate.
|
|
5
|
-
//# sourceMappingURL=enrollments-index.d.ts.map
|
|
1
|
+
export * from './db/EnrollmentsCollection.ts';
|
|
2
|
+
export * from './module/configureEnrollmentsModule.ts';
|
|
3
|
+
export * from './enrollments-settings.ts';
|
|
4
|
+
export * from './addToDate.ts';
|
package/lib/enrollments-index.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
4
|
-
export * from
|
|
5
|
-
//# sourceMappingURL=enrollments-index.js.map
|
|
1
|
+
export * from "./db/EnrollmentsCollection.js";
|
|
2
|
+
export * from "./module/configureEnrollmentsModule.js";
|
|
3
|
+
export * from "./enrollments-settings.js";
|
|
4
|
+
export * from "./addToDate.js";
|
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import type { Enrollment } from './db/EnrollmentsCollection.ts';
|
|
2
|
+
export interface ScheduleData {
|
|
3
|
+
schedules: {
|
|
4
|
+
s?: number[];
|
|
5
|
+
m?: number[];
|
|
6
|
+
h?: number[];
|
|
7
|
+
D?: number[];
|
|
8
|
+
M?: number[];
|
|
9
|
+
d?: number[];
|
|
10
|
+
}[];
|
|
11
|
+
}
|
|
3
12
|
export interface EnrollmentSettings {
|
|
4
|
-
autoSchedulingSchedule:
|
|
13
|
+
autoSchedulingSchedule: ScheduleData;
|
|
5
14
|
enrollmentNumberHashFn: (enrollment: Enrollment, index: number) => string;
|
|
6
15
|
configureSettings: (options?: EnrollmentsSettingsOptions) => void;
|
|
7
16
|
}
|
|
8
17
|
export type EnrollmentsSettingsOptions = Omit<Partial<typeof enrollmentsSettings>, 'configureSettings'>;
|
|
9
18
|
export declare const enrollmentsSettings: EnrollmentSettings;
|
|
10
|
-
//# sourceMappingURL=enrollments-settings.d.ts.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import later from '@breejs/later';
|
|
2
1
|
import { generateRandomHash } from '@unchainedshop/utils';
|
|
3
|
-
const everyHourSchedule =
|
|
2
|
+
const everyHourSchedule = {
|
|
3
|
+
schedules: [{ s: [0], m: [0, 59] }],
|
|
4
|
+
};
|
|
4
5
|
export const enrollmentsSettings = {
|
|
5
6
|
autoSchedulingSchedule: everyHourSchedule,
|
|
6
7
|
enrollmentNumberHashFn: generateRandomHash,
|
|
@@ -9,4 +10,3 @@ export const enrollmentsSettings = {
|
|
|
9
10
|
this.enrollmentNumberHashFn = enrollmentNumberHashFn || generateRandomHash;
|
|
10
11
|
},
|
|
11
12
|
};
|
|
12
|
-
//# sourceMappingURL=enrollments-settings.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { SortOption } from '@unchainedshop/utils';
|
|
2
|
-
import { Enrollment, EnrollmentPeriod, EnrollmentPlan, EnrollmentStatus } from '../db/EnrollmentsCollection.
|
|
3
|
-
import { mongodb, Address, Contact, ModuleInput } from '@unchainedshop/mongodb';
|
|
4
|
-
import { EnrollmentsSettingsOptions } from '../enrollments-settings.
|
|
1
|
+
import { type SortOption } from '@unchainedshop/utils';
|
|
2
|
+
import { type Enrollment, type EnrollmentPeriod, type EnrollmentPlan, EnrollmentStatus } from '../db/EnrollmentsCollection.ts';
|
|
3
|
+
import { mongodb, type Address, type Contact, type ModuleInput } from '@unchainedshop/mongodb';
|
|
4
|
+
import { type EnrollmentsSettingsOptions } from '../enrollments-settings.ts';
|
|
5
5
|
export interface EnrollmentQuery {
|
|
6
6
|
status?: EnrollmentStatus[];
|
|
7
7
|
userId?: string;
|
|
@@ -50,4 +50,3 @@ export declare const configureEnrollmentsModule: ({ db, options: enrollmentOptio
|
|
|
50
50
|
deleteInactiveUserEnrollments: (userId: string) => Promise<number>;
|
|
51
51
|
}>;
|
|
52
52
|
export type EnrollmentsModule = Awaited<ReturnType<typeof configureEnrollmentsModule>>;
|
|
53
|
-
//# sourceMappingURL=configureEnrollmentsModule.d.ts.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { SortDirection } from '@unchainedshop/utils';
|
|
2
|
-
import { EnrollmentStatus, } from
|
|
2
|
+
import { EnrollmentStatus, } from "../db/EnrollmentsCollection.js";
|
|
3
3
|
import { emit, registerEvents } from '@unchainedshop/events';
|
|
4
|
-
import { generateDbFilterById, buildSortOptions, generateDbObjectId, assertDocumentDBCompatMode, } from '@unchainedshop/mongodb';
|
|
5
|
-
import { EnrollmentsCollection } from
|
|
6
|
-
import { enrollmentsSettings } from
|
|
4
|
+
import { generateDbFilterById, buildSortOptions, mongodb, generateDbObjectId, assertDocumentDBCompatMode, } from '@unchainedshop/mongodb';
|
|
5
|
+
import { EnrollmentsCollection } from "../db/EnrollmentsCollection.js";
|
|
6
|
+
import { enrollmentsSettings } from "../enrollments-settings.js";
|
|
7
7
|
const ENROLLMENT_EVENTS = [
|
|
8
8
|
'ENROLLMENT_ADD_PERIOD',
|
|
9
9
|
'ENROLLMENT_CREATE',
|
|
@@ -87,7 +87,6 @@ export const configureEnrollmentsModule = async ({ db, options: enrollmentOption
|
|
|
87
87
|
return enrollment;
|
|
88
88
|
};
|
|
89
89
|
return {
|
|
90
|
-
// Queries
|
|
91
90
|
count: async (query) => {
|
|
92
91
|
const enrollmentCount = await Enrollments.countDocuments(buildFindSelector(query));
|
|
93
92
|
return enrollmentCount;
|
|
@@ -112,14 +111,12 @@ export const configureEnrollmentsModule = async ({ db, options: enrollmentOption
|
|
|
112
111
|
});
|
|
113
112
|
return enrollments.toArray();
|
|
114
113
|
},
|
|
115
|
-
// Transformations
|
|
116
114
|
normalizedStatus: (enrollment) => {
|
|
117
115
|
return enrollment.status === null
|
|
118
116
|
? EnrollmentStatus.INITIAL
|
|
119
117
|
: enrollment.status;
|
|
120
118
|
},
|
|
121
119
|
isExpired,
|
|
122
|
-
// Mutations
|
|
123
120
|
addEnrollmentPeriod: async (enrollmentId, period) => {
|
|
124
121
|
const { start, end, orderId, isTrial } = period;
|
|
125
122
|
const selector = generateDbFilterById(enrollmentId);
|
|
@@ -210,4 +207,3 @@ export const configureEnrollmentsModule = async ({ db, options: enrollmentOption
|
|
|
210
207
|
},
|
|
211
208
|
};
|
|
212
209
|
};
|
|
213
|
-
//# sourceMappingURL=configureEnrollmentsModule.js.map
|
package/package.json
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unchainedshop/core-enrollments",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.5.0",
|
|
4
4
|
"main": "lib/enrollments-index.js",
|
|
5
5
|
"types": "lib/enrollments-index.d.ts",
|
|
6
6
|
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
7
8
|
"scripts": {
|
|
8
9
|
"clean": "tsc -b --clean",
|
|
9
10
|
"build": "tsc -b",
|
|
10
11
|
"prepublishOnly": "npm run clean && npm run build",
|
|
11
12
|
"watch": "tsc -w",
|
|
12
|
-
"test": "
|
|
13
|
-
"test:watch": "
|
|
13
|
+
"test": "node --test",
|
|
14
|
+
"test:watch": "node --test --watch"
|
|
14
15
|
},
|
|
15
16
|
"repository": {
|
|
16
17
|
"type": "git",
|
|
@@ -22,8 +23,10 @@
|
|
|
22
23
|
"core"
|
|
23
24
|
],
|
|
24
25
|
"authors": [
|
|
25
|
-
"
|
|
26
|
-
"
|
|
26
|
+
"Pascal Kaufmann",
|
|
27
|
+
"Mikael Araya",
|
|
28
|
+
"Vedran Rudelj",
|
|
29
|
+
"Joël Meiller"
|
|
27
30
|
],
|
|
28
31
|
"license": "EUPL-1.2",
|
|
29
32
|
"bugs": {
|
|
@@ -31,15 +34,12 @@
|
|
|
31
34
|
},
|
|
32
35
|
"homepage": "https://github.com/unchainedshop/unchained#readme",
|
|
33
36
|
"dependencies": {
|
|
34
|
-
"@
|
|
35
|
-
"@unchainedshop/
|
|
36
|
-
"@unchainedshop/
|
|
37
|
-
"@unchainedshop/utils": "^4.3.0"
|
|
37
|
+
"@unchainedshop/events": "^4.5.0",
|
|
38
|
+
"@unchainedshop/logger": "^4.5.0",
|
|
39
|
+
"@unchainedshop/utils": "^4.5.0"
|
|
38
40
|
},
|
|
39
41
|
"devDependencies": {
|
|
40
|
-
"@types/
|
|
41
|
-
"@types/node": "^24.0.13",
|
|
42
|
-
"tsx": "^4.20.3",
|
|
42
|
+
"@types/node": "^25.0.0",
|
|
43
43
|
"typescript": "^5.8.3"
|
|
44
44
|
}
|
|
45
45
|
}
|
package/lib/addToDate.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"addToDate.d.ts","sourceRoot":"","sources":["../src/addToDate.ts"],"names":[],"mappings":"AAwCA,wBAAgB,SAAS,CAAC,CAAC,KAAA,EAAE,CAAC,KAAA,EAAE,CAAC,CAAC,EAAE,GAAG,OAgBtC"}
|
package/lib/addToDate.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"addToDate.js","sourceRoot":"","sources":["../src/addToDate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EnrollmentsCollection.d.ts","sourceRoot":"","sources":["../../src/db/EnrollmentsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAiD,MAAM,wBAAwB,CAAC;AAChG,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,IAAI,CAAC;IACZ,GAAG,EAAE,IAAI,CAAC;IACV,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,IAAI,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,oBAAY,gBAAgB;IAC1B,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,UAAU,eAAe;CAC1B;AAED,MAAM,WAAW,+BAA+B;IAC9C,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,aAAa,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,IAAI,CAAC;IACvD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE;QACR,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,OAAO,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;IACF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,OAAO,CAAC,EAAE;QACR,iBAAiB,EAAE,MAAM,CAAC;QAC1B,OAAO,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;IACF,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,SAAS,GACX,eAAe,CAAC;AAElB,eAAO,MAAM,qBAAqB,GAAU,IAAI,OAAO,CAAC,EAAE,4CAsCzD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EnrollmentsCollection.js","sourceRoot":"","sources":["../../src/db/EnrollmentsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,cAAc,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAgBhG,MAAM,CAAN,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,uCAAmB,CAAA;IACnB,qCAAiB,CAAA;IACjB,qCAAiB,CAAA;IACjB,6CAAyB,CAAA;AAC3B,CAAC,EALW,gBAAgB,KAAhB,gBAAgB,QAK3B;AAuCD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,EAAc,EAAE,EAAE;IAC5D,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAa,aAAa,CAAC,CAAC;IAE7D,IAAI,CAAC,6BAA6B,EAAE,EAAE,CAAC;QACrC,MAAM,cAAc,CAAa,WAAW,EAAE;YAC5C;gBACE,KAAK,EAAE;oBACL,GAAG,EAAE,MAAM;oBACX,MAAM,EAAE,MAAM;oBACd,gBAAgB,EAAE,MAAM;oBACxB,MAAM,EAAE,MAAM;oBACd,mBAAmB,EAAE,MAAM;oBAC3B,sBAAsB,EAAE,MAAM;iBACxB;gBACR,OAAO,EAAE;oBACP,OAAO,EAAE;wBACP,GAAG,EAAE,CAAC;wBACN,MAAM,EAAE,CAAC;wBACT,gBAAgB,EAAE,CAAC;wBACnB,mBAAmB,EAAE,CAAC;wBACtB,sBAAsB,EAAE,CAAC;wBACzB,MAAM,EAAE,CAAC;qBACV;oBACD,IAAI,EAAE,4BAA4B;iBACnC;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,qBAAqB;IACrB,MAAM,cAAc,CAAa,WAAW,EAAE;QAC5C,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;QACxB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE;QAC3B,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;QACxB,EAAE,KAAK,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,EAAE;KACnC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enrollments-index.d.ts","sourceRoot":"","sources":["../src/enrollments-index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enrollments-index.js","sourceRoot":"","sources":["../src/enrollments-index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enrollments-settings.d.ts","sourceRoot":"","sources":["../src/enrollments-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,eAAe,CAAC;AAElC,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAI3D,MAAM,WAAW,kBAAkB;IACjC,sBAAsB,EAAE,KAAK,CAAC,YAAY,CAAC;IAC3C,sBAAsB,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1E,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE,0BAA0B,KAAK,IAAI,CAAC;CACnE;AAED,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,mBAAmB,CAAC,EAAE,mBAAmB,CAAC,CAAC;AAExG,eAAO,MAAM,mBAAmB,EAAE,kBAOjC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enrollments-settings.js","sourceRoot":"","sources":["../src/enrollments-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAU/D,MAAM,CAAC,MAAM,mBAAmB,GAAuB;IACrD,sBAAsB,EAAE,iBAAiB;IACzC,sBAAsB,EAAE,kBAAkB;IAC1C,iBAAiB,CAAC,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,GAAG,EAAE;QACvE,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,IAAI,iBAAiB,CAAC;QAC1E,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,IAAI,kBAAkB,CAAC;IAC7E,CAAC;CACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"configureEnrollmentsModule.d.ts","sourceRoot":"","sources":["../../src/module/configureEnrollmentsModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EACjB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAGL,OAAO,EACP,OAAO,EACP,OAAO,EAEP,WAAW,EAEZ,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAuB,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAE7F,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AASD,eAAO,MAAM,iBAAiB,GAAI,iCAAiC,eAAe,+BAYjF,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAU,qCAG9C,WAAW,CAAC,0BAA0B,CAAC;mBAsFjB,eAAe;+CAIa;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE;6BAO5D;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,YAC5C,OAAO,CAAC,WAAW;yDAgB5B,eAAe,GAAG;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;KACrB,KAAG,OAAO,CAAC,UAAU,EAAE,CAAC;mCAYM,UAAU,KAAG,gBAAgB;4BA3H/B,UAAU,qBAAqB;QAAE,aAAa,CAAC,EAAE,IAAI,CAAA;KAAE;wCAoI1C,MAAM,UAAU,gBAAgB;+DAgCvE,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC,GACnE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,KAAG,OAAO,CAAC,UAAU,CAAC;2BAoBvC,MAAM;oDAamB,MAAM,WAAW,MAAM;yCAxIxD,MAAM;kCAAN,MAAM;kCAAN,MAAM;mCAAN,MAAM;;;;kCAAN,MAAM;;;;+BA8JM,MAAM,QAAQ,cAAc;iCA5M/C,MAAM,oBACG;QAAE,MAAM,EAAE,gBAAgB,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;4CA8NpB,MAAM;EAQvD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"configureEnrollmentsModule.js","sourceRoot":"","sources":["../../src/module/configureEnrollmentsModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAc,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAIL,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAIhB,kBAAkB,EAElB,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAA8B,MAAM,4BAA4B,CAAC;AAQ7F,MAAM,iBAAiB,GAAa;IAClC,uBAAuB;IACvB,mBAAmB;IACnB,mBAAmB;IACnB,mBAAmB;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAmB,EAAE,EAAE;IACpF,MAAM,QAAQ,GAA+B;QAC3C,OAAO,EAAE,IAAI;KACd,CAAC;IACF,IAAI,MAAM;QAAE,QAAQ,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAC9C,IAAI,MAAM;QAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;IAErC,IAAI,WAAW,EAAE,CAAC;QAChB,0BAA0B,EAAE,CAAC;QAC7B,QAAQ,CAAC,KAAK,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,EAAE,EAC/C,EAAE,EACF,OAAO,EAAE,iBAAiB,GAAG,EAAE,GACS,EAAE,EAAE;IAC5C,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAElC,mBAAmB,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAEzD,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAEpD,MAAM,SAAS,GAAG,CAAC,UAAsB,EAAE,EAAE,aAAa,EAA4B,EAAE,EAAE;QACxF,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAC1E,IAAI,CAAC,UAAU,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,YAAY,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;IACvD,CAAC,CAAC;IAEF,MAAM,uBAAuB,GAAG,KAAK,EAAE,UAAsB,EAAE,KAAK,GAAG,CAAC,EAAmB,EAAE;QAC3F,MAAM,SAAS,GAAG,mBAAmB,CAAC,sBAAsB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAChF,IAAI,CAAC,MAAM,WAAW,CAAC,cAAc,CAAC,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5F,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,uBAAuB,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EACxB,YAAoB,EACpB,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAA+C,EAClE,EAAE;QACF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAE3D,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAC7B,IAAI,UAAU,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,UAAU,CAAC;QAEpD,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,QAAQ,GAGV;YACF,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE;YACrC,KAAK,EAAE;gBACL,GAAG,EAAE;oBACH,IAAI;oBACJ,MAAM;oBACN,IAAI;iBACL;aACF;SACF,CAAC;QAEF,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,gBAAgB,CAAC,MAAM;gBAC1B,QAAQ,CAAC,IAAI,CAAC,gBAAgB,GAAG,MAAM,uBAAuB,CAAC,UAAU,CAAC,CAAC;gBAC3E,MAAM;YACR,KAAK,gBAAgB,CAAC,UAAU;gBAC9B,QAAQ,CAAC,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;gBACrE,MAAM;YACR;gBACE,MAAM;QACV,CAAC;QAED,MAAM,iBAAiB,GAAG,MAAM,WAAW,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE;YAC/E,cAAc,EAAE,OAAO;SACxB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,mBAAmB,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEjE,OAAO,iBAAiB,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,qBAAqB,GACzB,CAAI,QAAgB,EAAE,EAAE,CACxB,KAAK,EAAE,YAAoB,EAAE,UAAa,EAAE,EAAE;QAC5C,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,gBAAgB,CACnD,oBAAoB,CAAC,YAAY,CAAC,EAClC;YACE,IAAI,EAAE;gBACJ,OAAO,EAAE,IAAI,IAAI,EAAE;gBACnB,CAAC,QAAQ,CAAC,EAAE,UAAU;aACvB;SACF,EACD,EAAE,cAAc,EAAE,OAAO,EAAE,CAC5B,CAAC;QACF,MAAM,IAAI,CAAC,mBAAmB,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACjE,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;IAEJ,OAAO;QACL,UAAU;QACV,KAAK,EAAE,KAAK,EAAE,KAAsB,EAAE,EAAE;YACtC,MAAM,eAAe,GAAG,MAAM,WAAW,CAAC,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YACnF,OAAO,eAAe,CAAC;QACzB,CAAC;QACD,yBAAyB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAyB,EAAE,EAAE;YACxE,MAAM,QAAQ,GAA+B,EAAE,SAAS,EAAE,CAAC;YAC3D,QAAQ,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9E,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QAED,cAAc,EAAE,KAAK,EACnB,MAAsD,EACtD,OAA6B,EAC7B,EAAE;YACF,IAAI,cAAc,IAAI,MAAM,EAAE,CAAC;gBAC7B,OAAO,WAAW,CAAC,OAAO,CAAC,oBAAoB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;YACjF,CAAC;YACD,OAAO,WAAW,CAAC,OAAO,CACxB,EAAE,iBAAiB,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAClE,OAAO,CACR,CAAC;QACJ,CAAC;QAED,eAAe,EAAE,KAAK,EAAE,EACtB,KAAK,EACL,MAAM,EACN,IAAI,EACJ,GAAG,KAAK,EAKT,EAAyB,EAAE;YAC1B,MAAM,iBAAiB,GAAiB,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC;YACvF,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE;gBAC7D,IAAI,EAAE,MAAM;gBACZ,KAAK;gBACL,IAAI,EAAE,gBAAgB,CAAC,IAAI,IAAI,iBAAiB,CAAC;aAClD,CAAC,CAAC;YAEH,OAAO,WAAW,CAAC,OAAO,EAAE,CAAC;QAC/B,CAAC;QAED,kBAAkB;QAClB,gBAAgB,EAAE,CAAC,UAAsB,EAAoB,EAAE;YAC7D,OAAO,UAAU,CAAC,MAAM,KAAK,IAAI;gBAC/B,CAAC,CAAC,gBAAgB,CAAC,OAAO;gBAC1B,CAAC,CAAE,UAAU,CAAC,MAA2B,CAAC;QAC9C,CAAC;QAED,SAAS;QAET,YAAY;QACZ,mBAAmB,EAAE,KAAK,EAAE,YAAoB,EAAE,MAAwB,EAAE,EAAE;YAC5E,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;YAChD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,gBAAgB,CACnD,QAAQ,EACR;gBACE,KAAK,EAAE;oBACL,OAAO,EAAE;wBACP,KAAK;wBACL,GAAG;wBACH,OAAO;wBACP,OAAO;qBACR;iBACF;gBACD,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI,IAAI,EAAE;iBACpB;aACF,EACD;gBACE,cAAc,EAAE,OAAO;aACxB,CACF,CAAC;YAEF,IAAI,CAAC,UAAU;gBAAE,OAAO,IAAI,CAAC;YAC7B,MAAM,IAAI,CAAC,uBAAuB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YACpD,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,EACb,WAAW,EACX,YAAY,EACZ,GAAG,cAAc,EAE2B,EAAuB,EAAE;YACrE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC;gBAC/D,GAAG,EAAE,kBAAkB,EAAE;gBACzB,OAAO,EAAE,IAAI,IAAI,EAAE;gBACnB,GAAG,cAAc;gBACjB,MAAM,EAAE,gBAAgB,CAAC,OAAO;gBAChC,OAAO,EAAE,EAAE;gBACX,YAAY;gBACZ,WAAW;gBACX,aAAa,EAAE,cAAc,CAAC,aAAa,IAAI,EAAE;gBACjD,GAAG,EAAE,EAAE;aACR,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC;gBAC5C,GAAG,EAAE,YAAY;aAClB,CAAC,CAAe,CAAC;YAClB,MAAM,IAAI,CAAC,mBAAmB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YAChD,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,YAAoB,EAAE,EAAE;YACrC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,MAAM,WAAW,CAAC,SAAS,CACjE,oBAAoB,CAAC,YAAY,CAAC,EAClC;gBACE,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI,IAAI,EAAE;iBACpB;aACF,CACF,CAAC;YACF,MAAM,IAAI,CAAC,mBAAmB,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;YAClD,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,+BAA+B,EAAE,KAAK,EAAE,YAAoB,EAAE,OAAe,EAAE,EAAE;YAC/E,MAAM,QAAQ,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;YACpD,OAAO,WAAW,CAAC,gBAAgB,CACjC,QAAQ,EACR;gBACE,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI,IAAI,EAAE;iBACpB;gBACD,KAAK,EAAE;oBACL,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE;iBACpD;aACF,EACD,EAAE,cAAc,EAAE,OAAO,EAAE,CAC5B,CAAC;QACJ,CAAC;QAED,oBAAoB,EAAE,qBAAqB,CAAU,gBAAgB,CAAC;QACtE,aAAa,EAAE,qBAAqB,CAAU,SAAS,CAAC;QACxD,aAAa,EAAE,qBAAqB,CAAM,MAAM,CAAC;QACjD,cAAc,EAAE,qBAAqB,CAAyB,UAAU,CAAC;QACzE,aAAa,EAAE,qBAAqB,CAAwB,SAAS,CAAC;QAEtE,UAAU,EAAE,KAAK,EAAE,YAAoB,EAAE,IAAoB,EAAE,EAAE;YAC/D,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,gBAAgB,CACnD,oBAAoB,CAAC,YAAY,CAAC,EAClC;gBACE,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI,IAAI,EAAE;oBACnB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,aAAa,EAAE,IAAI,CAAC,aAAa;iBAClC;aACF,EACD,EAAE,cAAc,EAAE,OAAO,EAAE,CAC5B,CAAC;YACF,IAAI,CAAC,UAAU;gBAAE,OAAO,IAAI,CAAC;YAC7B,MAAM,IAAI,CAAC,mBAAmB,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/D,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,YAAY;QACZ,6BAA6B,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;YACtD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC;gBACpD,MAAM;gBACN,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,UAAU,CAAC,EAAE;aAC/E,CAAC,CAAC;YACH,OAAO,YAAY,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
package/src/addToDate.ts
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
// @ts-nocheck
|
|
3
|
-
|
|
4
|
-
/* esm.sh - esbuild bundle(date-fns@4.1.0/add) es2022 production */
|
|
5
|
-
const F = Math.pow(10, 8) * 24 * 60 * 60 * 1e3,
|
|
6
|
-
b = -F;
|
|
7
|
-
const N = 3600;
|
|
8
|
-
const a = N * 24,
|
|
9
|
-
k = a * 7,
|
|
10
|
-
Y = a * 365.2425,
|
|
11
|
-
T = Y / 12,
|
|
12
|
-
w = T * 3,
|
|
13
|
-
p = Symbol.for('constructDateFrom');
|
|
14
|
-
function r(t, o) {
|
|
15
|
-
return typeof t == 'function'
|
|
16
|
-
? t(o)
|
|
17
|
-
: t && typeof t == 'object' && p in t
|
|
18
|
-
? t[p](o)
|
|
19
|
-
: t instanceof Date // @ts-ignore
|
|
20
|
-
? new t.constructor(o)
|
|
21
|
-
: new Date(o);
|
|
22
|
-
}
|
|
23
|
-
function c(t, o) {
|
|
24
|
-
return r(o || t, t);
|
|
25
|
-
}
|
|
26
|
-
function f(t, o, e) {
|
|
27
|
-
const n = c(t, e?.in);
|
|
28
|
-
return isNaN(o) ? r(e?.in || t, NaN) : (o && n.setDate(n.getDate() + o), n);
|
|
29
|
-
}
|
|
30
|
-
function x(t, o, e) {
|
|
31
|
-
const n = c(t, e?.in);
|
|
32
|
-
if (isNaN(o)) return r(e?.in || t, NaN);
|
|
33
|
-
if (!o) return n;
|
|
34
|
-
const i = n.getDate(),
|
|
35
|
-
s = r(e?.in || t, n.getTime());
|
|
36
|
-
s.setMonth(n.getMonth() + o + 1, 0);
|
|
37
|
-
const m = s.getDate();
|
|
38
|
-
return i >= m ? s : (n.setFullYear(s.getFullYear(), s.getMonth(), i), n);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function addToDate(t, o, e?: any) {
|
|
42
|
-
let {
|
|
43
|
-
years: n = 0,
|
|
44
|
-
months: i = 0,
|
|
45
|
-
weeks: s = 0,
|
|
46
|
-
days: m = 0,
|
|
47
|
-
hours: I = 0,
|
|
48
|
-
minutes: l = 0,
|
|
49
|
-
seconds: h = 0,
|
|
50
|
-
} = o,
|
|
51
|
-
u = c(t, e?.in),
|
|
52
|
-
d = i || n ? x(u, i + n * 12) : u,
|
|
53
|
-
y = m || s ? f(d, m + s * 7) : d,
|
|
54
|
-
D = l + I * 60,
|
|
55
|
-
M = (h + D * 60) * 1e3;
|
|
56
|
-
return r(e?.in || t, +y + M);
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=add.js.map
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { mongodb, buildDbIndexes, isDocumentDBCompatModeEnabled } from '@unchainedshop/mongodb';
|
|
2
|
-
import { TimestampFields, LogFields, Address, Contact } from '@unchainedshop/mongodb';
|
|
3
|
-
|
|
4
|
-
export interface EnrollmentPeriod {
|
|
5
|
-
start: Date;
|
|
6
|
-
end: Date;
|
|
7
|
-
orderId?: string;
|
|
8
|
-
isTrial?: boolean;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface EnrollmentPlan {
|
|
12
|
-
configuration: { key: string; value: string }[] | null;
|
|
13
|
-
productId: string;
|
|
14
|
-
quantity: number;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export enum EnrollmentStatus {
|
|
18
|
-
INITIAL = 'INITIAL',
|
|
19
|
-
ACTIVE = 'ACTIVE',
|
|
20
|
-
PAUSED = 'PAUSED',
|
|
21
|
-
TERMINATED = 'TERMINATED',
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface EnrollmentOrderPositionTemplate {
|
|
25
|
-
context?: any;
|
|
26
|
-
configuration?: { key: string; value: string }[];
|
|
27
|
-
originalProductId: string;
|
|
28
|
-
productId: string;
|
|
29
|
-
quantity: number;
|
|
30
|
-
quotationId?: string;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export type Enrollment = {
|
|
34
|
-
_id: string;
|
|
35
|
-
billingAddress: Address;
|
|
36
|
-
configuration: { key: string; value: string }[] | null;
|
|
37
|
-
contact: Contact;
|
|
38
|
-
context?: any;
|
|
39
|
-
countryCode: string;
|
|
40
|
-
currencyCode: string;
|
|
41
|
-
delivery: {
|
|
42
|
-
deliveryProviderId?: string;
|
|
43
|
-
context?: any;
|
|
44
|
-
};
|
|
45
|
-
enrollmentNumber?: string;
|
|
46
|
-
orderIdForFirstPeriod?: string;
|
|
47
|
-
expires?: Date;
|
|
48
|
-
meta?: any;
|
|
49
|
-
payment?: {
|
|
50
|
-
paymentProviderId: string;
|
|
51
|
-
context?: any;
|
|
52
|
-
};
|
|
53
|
-
periods: EnrollmentPeriod[];
|
|
54
|
-
productId: string;
|
|
55
|
-
quantity?: number;
|
|
56
|
-
status: EnrollmentStatus | null;
|
|
57
|
-
userId: string;
|
|
58
|
-
} & LogFields &
|
|
59
|
-
TimestampFields;
|
|
60
|
-
|
|
61
|
-
export const EnrollmentsCollection = async (db: mongodb.Db) => {
|
|
62
|
-
const Enrollments = db.collection<Enrollment>('enrollments');
|
|
63
|
-
|
|
64
|
-
if (!isDocumentDBCompatModeEnabled()) {
|
|
65
|
-
await buildDbIndexes<Enrollment>(Enrollments, [
|
|
66
|
-
{
|
|
67
|
-
index: {
|
|
68
|
-
_id: 'text',
|
|
69
|
-
userId: 'text',
|
|
70
|
-
enrollmentNumber: 'text',
|
|
71
|
-
status: 'text',
|
|
72
|
-
'contact.telNumber': 'text',
|
|
73
|
-
'contact.emailAddress': 'text',
|
|
74
|
-
} as any,
|
|
75
|
-
options: {
|
|
76
|
-
weights: {
|
|
77
|
-
_id: 8,
|
|
78
|
-
userId: 3,
|
|
79
|
-
enrollmentNumber: 6,
|
|
80
|
-
'contact.telNumber': 5,
|
|
81
|
-
'contact.emailAddress': 4,
|
|
82
|
-
status: 1,
|
|
83
|
-
},
|
|
84
|
-
name: 'enrollment_fulltext_search',
|
|
85
|
-
},
|
|
86
|
-
},
|
|
87
|
-
]);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Enrollment Indexes
|
|
91
|
-
await buildDbIndexes<Enrollment>(Enrollments, [
|
|
92
|
-
{ index: { userId: 1 } },
|
|
93
|
-
{ index: { productId: 1 } },
|
|
94
|
-
{ index: { status: 1 } },
|
|
95
|
-
{ index: { enrollmentNumber: 1 } },
|
|
96
|
-
]);
|
|
97
|
-
|
|
98
|
-
return Enrollments;
|
|
99
|
-
};
|
package/src/enrollments-index.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import later from '@breejs/later';
|
|
2
|
-
import { generateRandomHash } from '@unchainedshop/utils';
|
|
3
|
-
import { Enrollment } from './db/EnrollmentsCollection.js';
|
|
4
|
-
|
|
5
|
-
const everyHourSchedule = later.parse.text('every 59 minutes');
|
|
6
|
-
|
|
7
|
-
export interface EnrollmentSettings {
|
|
8
|
-
autoSchedulingSchedule: later.ScheduleData;
|
|
9
|
-
enrollmentNumberHashFn: (enrollment: Enrollment, index: number) => string;
|
|
10
|
-
configureSettings: (options?: EnrollmentsSettingsOptions) => void;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export type EnrollmentsSettingsOptions = Omit<Partial<typeof enrollmentsSettings>, 'configureSettings'>;
|
|
14
|
-
|
|
15
|
-
export const enrollmentsSettings: EnrollmentSettings = {
|
|
16
|
-
autoSchedulingSchedule: everyHourSchedule,
|
|
17
|
-
enrollmentNumberHashFn: generateRandomHash,
|
|
18
|
-
configureSettings({ autoSchedulingSchedule, enrollmentNumberHashFn } = {}) {
|
|
19
|
-
this.autoSchedulingSchedule = autoSchedulingSchedule || everyHourSchedule;
|
|
20
|
-
this.enrollmentNumberHashFn = enrollmentNumberHashFn || generateRandomHash;
|
|
21
|
-
},
|
|
22
|
-
};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test';
|
|
2
|
-
import assert from 'node:assert';
|
|
3
|
-
import { buildFindSelector } from './configureEnrollmentsModule.js';
|
|
4
|
-
import { EnrollmentStatus } from '../db/EnrollmentsCollection.js';
|
|
5
|
-
|
|
6
|
-
describe('buildFindSelector', () => {
|
|
7
|
-
it('Should correct filter when passed status, userId and queryString', () => {
|
|
8
|
-
assert.deepStrictEqual(
|
|
9
|
-
buildFindSelector({
|
|
10
|
-
queryString: 'Hello World',
|
|
11
|
-
status: [EnrollmentStatus.ACTIVE],
|
|
12
|
-
userId: 'admin-id',
|
|
13
|
-
}),
|
|
14
|
-
{
|
|
15
|
-
deleted: null,
|
|
16
|
-
status: { $in: ['ACTIVE'] },
|
|
17
|
-
userId: 'admin-id',
|
|
18
|
-
$text: { $search: 'Hello World' },
|
|
19
|
-
},
|
|
20
|
-
);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('Should correct filter when passed userId and queryString', () => {
|
|
24
|
-
assert.deepStrictEqual(buildFindSelector({ queryString: 'Hello World', userId: 'admin-id' }), {
|
|
25
|
-
deleted: null,
|
|
26
|
-
userId: 'admin-id',
|
|
27
|
-
$text: { $search: 'Hello World' },
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('Should correct filter when passed queryString', () => {
|
|
32
|
-
assert.deepStrictEqual(buildFindSelector({ queryString: 'Hello World' }), {
|
|
33
|
-
deleted: null,
|
|
34
|
-
$text: { $search: 'Hello World' },
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('Should correct filter when passed no argument', () => {
|
|
39
|
-
assert.deepStrictEqual(buildFindSelector({}), {
|
|
40
|
-
deleted: null,
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
});
|
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
import { SortDirection, SortOption } from '@unchainedshop/utils';
|
|
2
|
-
import {
|
|
3
|
-
Enrollment,
|
|
4
|
-
EnrollmentPeriod,
|
|
5
|
-
EnrollmentPlan,
|
|
6
|
-
EnrollmentStatus,
|
|
7
|
-
} from '../db/EnrollmentsCollection.js';
|
|
8
|
-
import { emit, registerEvents } from '@unchainedshop/events';
|
|
9
|
-
import {
|
|
10
|
-
generateDbFilterById,
|
|
11
|
-
buildSortOptions,
|
|
12
|
-
mongodb,
|
|
13
|
-
Address,
|
|
14
|
-
Contact,
|
|
15
|
-
generateDbObjectId,
|
|
16
|
-
ModuleInput,
|
|
17
|
-
assertDocumentDBCompatMode,
|
|
18
|
-
} from '@unchainedshop/mongodb';
|
|
19
|
-
import { EnrollmentsCollection } from '../db/EnrollmentsCollection.js';
|
|
20
|
-
import { enrollmentsSettings, EnrollmentsSettingsOptions } from '../enrollments-settings.js';
|
|
21
|
-
|
|
22
|
-
export interface EnrollmentQuery {
|
|
23
|
-
status?: EnrollmentStatus[];
|
|
24
|
-
userId?: string;
|
|
25
|
-
queryString?: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const ENROLLMENT_EVENTS: string[] = [
|
|
29
|
-
'ENROLLMENT_ADD_PERIOD',
|
|
30
|
-
'ENROLLMENT_CREATE',
|
|
31
|
-
'ENROLLMENT_REMOVE',
|
|
32
|
-
'ENROLLMENT_UPDATE',
|
|
33
|
-
];
|
|
34
|
-
|
|
35
|
-
export const buildFindSelector = ({ queryString, status, userId }: EnrollmentQuery) => {
|
|
36
|
-
const selector: mongodb.Filter<Enrollment> = {
|
|
37
|
-
deleted: null,
|
|
38
|
-
};
|
|
39
|
-
if (status) selector.status = { $in: status };
|
|
40
|
-
if (userId) selector.userId = userId;
|
|
41
|
-
|
|
42
|
-
if (queryString) {
|
|
43
|
-
assertDocumentDBCompatMode();
|
|
44
|
-
selector.$text = { $search: queryString };
|
|
45
|
-
}
|
|
46
|
-
return selector;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
export const configureEnrollmentsModule = async ({
|
|
50
|
-
db,
|
|
51
|
-
options: enrollmentOptions = {},
|
|
52
|
-
}: ModuleInput<EnrollmentsSettingsOptions>) => {
|
|
53
|
-
registerEvents(ENROLLMENT_EVENTS);
|
|
54
|
-
|
|
55
|
-
enrollmentsSettings.configureSettings(enrollmentOptions);
|
|
56
|
-
|
|
57
|
-
const Enrollments = await EnrollmentsCollection(db);
|
|
58
|
-
|
|
59
|
-
const isExpired = (enrollment: Enrollment, { referenceDate }: { referenceDate?: Date }) => {
|
|
60
|
-
const relevantDate = referenceDate ? new Date(referenceDate) : new Date();
|
|
61
|
-
if (!enrollment.expires) return false;
|
|
62
|
-
const expiryDate = new Date(enrollment.expires);
|
|
63
|
-
return relevantDate.getTime() > expiryDate.getTime();
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
const findNewEnrollmentNumber = async (enrollment: Enrollment, index = 0): Promise<string> => {
|
|
67
|
-
const newHashID = enrollmentsSettings.enrollmentNumberHashFn(enrollment, index);
|
|
68
|
-
if ((await Enrollments.countDocuments({ enrollmentNumber: newHashID }, { limit: 1 })) === 0) {
|
|
69
|
-
return newHashID;
|
|
70
|
-
}
|
|
71
|
-
return findNewEnrollmentNumber(enrollment, index + 1);
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
const updateStatus = async (
|
|
75
|
-
enrollmentId: string,
|
|
76
|
-
{ status, info = '' }: { status: EnrollmentStatus; info?: string },
|
|
77
|
-
) => {
|
|
78
|
-
const selector = generateDbFilterById(enrollmentId);
|
|
79
|
-
const enrollment = await Enrollments.findOne(selector, {});
|
|
80
|
-
|
|
81
|
-
if (!enrollment) return null;
|
|
82
|
-
if (enrollment.status === status) return enrollment;
|
|
83
|
-
|
|
84
|
-
const date = new Date();
|
|
85
|
-
const modifier: {
|
|
86
|
-
$set: Partial<Enrollment>;
|
|
87
|
-
$push: { log: Enrollment['log'][0] };
|
|
88
|
-
} = {
|
|
89
|
-
$set: { status, updated: new Date() },
|
|
90
|
-
$push: {
|
|
91
|
-
log: {
|
|
92
|
-
date,
|
|
93
|
-
status,
|
|
94
|
-
info,
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
switch (status) {
|
|
100
|
-
case EnrollmentStatus.ACTIVE:
|
|
101
|
-
modifier.$set.enrollmentNumber = await findNewEnrollmentNumber(enrollment);
|
|
102
|
-
break;
|
|
103
|
-
case EnrollmentStatus.TERMINATED:
|
|
104
|
-
modifier.$set.expires = enrollment.periods?.pop()?.end || new Date();
|
|
105
|
-
break;
|
|
106
|
-
default:
|
|
107
|
-
break;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const updatedEnrollment = await Enrollments.findOneAndUpdate(selector, modifier, {
|
|
111
|
-
returnDocument: 'after',
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
await emit('ENROLLMENT_UPDATE', { enrollment, field: 'status' });
|
|
115
|
-
|
|
116
|
-
return updatedEnrollment;
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
const updateEnrollmentField =
|
|
120
|
-
<T>(fieldKey: string) =>
|
|
121
|
-
async (enrollmentId: string, fieldValue: T) => {
|
|
122
|
-
const enrollment = await Enrollments.findOneAndUpdate(
|
|
123
|
-
generateDbFilterById(enrollmentId),
|
|
124
|
-
{
|
|
125
|
-
$set: {
|
|
126
|
-
updated: new Date(),
|
|
127
|
-
[fieldKey]: fieldValue,
|
|
128
|
-
},
|
|
129
|
-
},
|
|
130
|
-
{ returnDocument: 'after' },
|
|
131
|
-
);
|
|
132
|
-
await emit('ENROLLMENT_UPDATE', { enrollment, field: fieldKey });
|
|
133
|
-
return enrollment;
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
return {
|
|
137
|
-
// Queries
|
|
138
|
-
count: async (query: EnrollmentQuery) => {
|
|
139
|
-
const enrollmentCount = await Enrollments.countDocuments(buildFindSelector(query));
|
|
140
|
-
return enrollmentCount;
|
|
141
|
-
},
|
|
142
|
-
openEnrollmentWithProduct: async ({ productId }: { productId: string }) => {
|
|
143
|
-
const selector: mongodb.Filter<Enrollment> = { productId };
|
|
144
|
-
selector.status = { $in: [EnrollmentStatus.ACTIVE, EnrollmentStatus.PAUSED] };
|
|
145
|
-
return Enrollments.findOne(selector);
|
|
146
|
-
},
|
|
147
|
-
|
|
148
|
-
findEnrollment: async (
|
|
149
|
-
params: { enrollmentId: string } | { orderId: string },
|
|
150
|
-
options?: mongodb.FindOptions,
|
|
151
|
-
) => {
|
|
152
|
-
if ('enrollmentId' in params) {
|
|
153
|
-
return Enrollments.findOne(generateDbFilterById(params.enrollmentId), options);
|
|
154
|
-
}
|
|
155
|
-
return Enrollments.findOne(
|
|
156
|
-
{ 'periods.orderId': params.orderId, deleted: { $exists: false } },
|
|
157
|
-
options,
|
|
158
|
-
);
|
|
159
|
-
},
|
|
160
|
-
|
|
161
|
-
findEnrollments: async ({
|
|
162
|
-
limit,
|
|
163
|
-
offset,
|
|
164
|
-
sort,
|
|
165
|
-
...query
|
|
166
|
-
}: EnrollmentQuery & {
|
|
167
|
-
limit?: number;
|
|
168
|
-
offset?: number;
|
|
169
|
-
sort?: SortOption[];
|
|
170
|
-
}): Promise<Enrollment[]> => {
|
|
171
|
-
const defaultSortOption: SortOption[] = [{ key: 'created', value: SortDirection.ASC }];
|
|
172
|
-
const enrollments = Enrollments.find(buildFindSelector(query), {
|
|
173
|
-
skip: offset,
|
|
174
|
-
limit,
|
|
175
|
-
sort: buildSortOptions(sort || defaultSortOption),
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
return enrollments.toArray();
|
|
179
|
-
},
|
|
180
|
-
|
|
181
|
-
// Transformations
|
|
182
|
-
normalizedStatus: (enrollment: Enrollment): EnrollmentStatus => {
|
|
183
|
-
return enrollment.status === null
|
|
184
|
-
? EnrollmentStatus.INITIAL
|
|
185
|
-
: (enrollment.status as EnrollmentStatus);
|
|
186
|
-
},
|
|
187
|
-
|
|
188
|
-
isExpired,
|
|
189
|
-
|
|
190
|
-
// Mutations
|
|
191
|
-
addEnrollmentPeriod: async (enrollmentId: string, period: EnrollmentPeriod) => {
|
|
192
|
-
const { start, end, orderId, isTrial } = period;
|
|
193
|
-
const selector = generateDbFilterById(enrollmentId);
|
|
194
|
-
const enrollment = await Enrollments.findOneAndUpdate(
|
|
195
|
-
selector,
|
|
196
|
-
{
|
|
197
|
-
$push: {
|
|
198
|
-
periods: {
|
|
199
|
-
start,
|
|
200
|
-
end,
|
|
201
|
-
orderId,
|
|
202
|
-
isTrial,
|
|
203
|
-
},
|
|
204
|
-
},
|
|
205
|
-
$set: {
|
|
206
|
-
updated: new Date(),
|
|
207
|
-
},
|
|
208
|
-
},
|
|
209
|
-
{
|
|
210
|
-
returnDocument: 'after',
|
|
211
|
-
},
|
|
212
|
-
);
|
|
213
|
-
|
|
214
|
-
if (!enrollment) return null;
|
|
215
|
-
await emit('ENROLLMENT_ADD_PERIOD', { enrollment });
|
|
216
|
-
return enrollment;
|
|
217
|
-
},
|
|
218
|
-
|
|
219
|
-
create: async ({
|
|
220
|
-
countryCode,
|
|
221
|
-
currencyCode,
|
|
222
|
-
...enrollmentData
|
|
223
|
-
}: Omit<Enrollment, 'status' | 'periods' | 'log' | '_id' | 'created'> &
|
|
224
|
-
Pick<Partial<Enrollment>, '_id' | 'created'>): Promise<Enrollment> => {
|
|
225
|
-
const { insertedId: enrollmentId } = await Enrollments.insertOne({
|
|
226
|
-
_id: generateDbObjectId(),
|
|
227
|
-
created: new Date(),
|
|
228
|
-
...enrollmentData,
|
|
229
|
-
status: EnrollmentStatus.INITIAL,
|
|
230
|
-
periods: [],
|
|
231
|
-
currencyCode,
|
|
232
|
-
countryCode,
|
|
233
|
-
configuration: enrollmentData.configuration || [],
|
|
234
|
-
log: [],
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
const enrollment = (await Enrollments.findOne({
|
|
238
|
-
_id: enrollmentId,
|
|
239
|
-
})) as Enrollment;
|
|
240
|
-
await emit('ENROLLMENT_CREATE', { enrollment });
|
|
241
|
-
return enrollment;
|
|
242
|
-
},
|
|
243
|
-
|
|
244
|
-
delete: async (enrollmentId: string) => {
|
|
245
|
-
const { modifiedCount: deletedCount } = await Enrollments.updateOne(
|
|
246
|
-
generateDbFilterById(enrollmentId),
|
|
247
|
-
{
|
|
248
|
-
$set: {
|
|
249
|
-
deleted: new Date(),
|
|
250
|
-
},
|
|
251
|
-
},
|
|
252
|
-
);
|
|
253
|
-
await emit('ENROLLMENT_REMOVE', { enrollmentId });
|
|
254
|
-
return deletedCount;
|
|
255
|
-
},
|
|
256
|
-
|
|
257
|
-
removeEnrollmentPeriodByOrderId: async (enrollmentId: string, orderId: string) => {
|
|
258
|
-
const selector = generateDbFilterById(enrollmentId);
|
|
259
|
-
return Enrollments.findOneAndUpdate(
|
|
260
|
-
selector,
|
|
261
|
-
{
|
|
262
|
-
$set: {
|
|
263
|
-
updated: new Date(),
|
|
264
|
-
},
|
|
265
|
-
$pull: {
|
|
266
|
-
periods: { orderId: { $in: [orderId, undefined] } },
|
|
267
|
-
},
|
|
268
|
-
},
|
|
269
|
-
{ returnDocument: 'after' },
|
|
270
|
-
);
|
|
271
|
-
},
|
|
272
|
-
|
|
273
|
-
updateBillingAddress: updateEnrollmentField<Address>('billingAddress'),
|
|
274
|
-
updateContact: updateEnrollmentField<Contact>('contact'),
|
|
275
|
-
updateContext: updateEnrollmentField<any>('meta'),
|
|
276
|
-
updateDelivery: updateEnrollmentField<Enrollment['delivery']>('delivery'),
|
|
277
|
-
updatePayment: updateEnrollmentField<Enrollment['payment']>('payment'),
|
|
278
|
-
|
|
279
|
-
updatePlan: async (enrollmentId: string, plan: EnrollmentPlan) => {
|
|
280
|
-
const enrollment = await Enrollments.findOneAndUpdate(
|
|
281
|
-
generateDbFilterById(enrollmentId),
|
|
282
|
-
{
|
|
283
|
-
$set: {
|
|
284
|
-
updated: new Date(),
|
|
285
|
-
productId: plan.productId,
|
|
286
|
-
quantity: plan.quantity,
|
|
287
|
-
configuration: plan.configuration,
|
|
288
|
-
},
|
|
289
|
-
},
|
|
290
|
-
{ returnDocument: 'after' },
|
|
291
|
-
);
|
|
292
|
-
if (!enrollment) return null;
|
|
293
|
-
await emit('ENROLLMENT_UPDATE', { enrollment, field: 'plan' });
|
|
294
|
-
return enrollment;
|
|
295
|
-
},
|
|
296
|
-
|
|
297
|
-
updateStatus,
|
|
298
|
-
deleteInactiveUserEnrollments: async (userId: string) => {
|
|
299
|
-
const { deletedCount } = await Enrollments.deleteMany({
|
|
300
|
-
userId,
|
|
301
|
-
status: { $in: [null, EnrollmentStatus.INITIAL, EnrollmentStatus.TERMINATED] },
|
|
302
|
-
});
|
|
303
|
-
return deletedCount;
|
|
304
|
-
},
|
|
305
|
-
};
|
|
306
|
-
};
|
|
307
|
-
|
|
308
|
-
export type EnrollmentsModule = Awaited<ReturnType<typeof configureEnrollmentsModule>>;
|