@stamhoofd/backend 2.59.0 → 2.61.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/index.ts +4 -0
- package/package.json +10 -10
- package/src/audit-logs/DocumentTemplateLogger.ts +22 -0
- package/src/audit-logs/EmailAddressLogger.ts +45 -0
- package/src/audit-logs/EmailLogger.ts +67 -0
- package/src/audit-logs/EmailTemplateLogger.ts +33 -0
- package/src/audit-logs/MemberPlatformMembershipLogger.ts +6 -3
- package/src/audit-logs/ModelLogger.ts +23 -6
- package/src/audit-logs/OrderLogger.ts +2 -2
- package/src/audit-logs/OrganizationLogger.ts +1 -11
- package/src/audit-logs/UserLogger.ts +45 -0
- package/src/crons/amazon-ses.ts +324 -0
- package/src/crons/clearExcelCache.ts +3 -0
- package/src/crons/endFunctionsOfUsersWithoutRegistration.ts +3 -0
- package/src/crons/index.ts +4 -0
- package/src/crons/postmark.ts +223 -0
- package/src/crons.ts +3 -315
- package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.ts +3 -3
- package/src/endpoints/global/platform/PatchPlatformEnpoint.ts +2 -1
- package/src/endpoints/global/registration/RegisterMembersEndpoint.ts +38 -25
- package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.ts +2 -1
- package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.ts +3 -11
- package/src/helpers/MemberUserSyncer.ts +11 -7
- package/src/helpers/PeriodHelper.ts +2 -1
- package/src/helpers/SetupStepUpdater.ts +503 -0
- package/src/seeds/1726847064-setup-steps.ts +1 -1
- package/src/seeds/1733319079-fill-paying-organization-ids.ts +68 -0
- package/src/services/AuditLogService.ts +19 -14
- package/src/services/DocumentService.ts +43 -0
- package/src/services/RegistrationService.ts +2 -0
- package/src/services/diff.ts +514 -0
- package/src/sql-filters/events.ts +13 -1
- package/src/crons/updateSetupSteps.ts +0 -9
- package/src/services/explainPatch.ts +0 -851
package/index.ts
CHANGED
|
@@ -16,6 +16,8 @@ import { ContextMiddleware } from './src/middleware/ContextMiddleware';
|
|
|
16
16
|
import { Platform } from '@stamhoofd/models';
|
|
17
17
|
import { AuditLogService } from './src/services/AuditLogService';
|
|
18
18
|
import { PlatformMembershipService } from './src/services/PlatformMembershipService';
|
|
19
|
+
import { DocumentService } from './src/services/DocumentService';
|
|
20
|
+
import { SetupStepUpdater } from './src/helpers/SetupStepUpdater';
|
|
19
21
|
|
|
20
22
|
process.on('unhandledRejection', (error: Error) => {
|
|
21
23
|
console.error('unhandledRejection');
|
|
@@ -189,6 +191,8 @@ const start = async () => {
|
|
|
189
191
|
|
|
190
192
|
AuditLogService.listen();
|
|
191
193
|
PlatformMembershipService.listen();
|
|
194
|
+
DocumentService.listen();
|
|
195
|
+
SetupStepUpdater.listen();
|
|
192
196
|
};
|
|
193
197
|
|
|
194
198
|
start().catch((error) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stamhoofd/backend",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.61.0",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -37,14 +37,14 @@
|
|
|
37
37
|
"@simonbackx/simple-encoding": "2.18.0",
|
|
38
38
|
"@simonbackx/simple-endpoints": "1.15.0",
|
|
39
39
|
"@simonbackx/simple-logging": "^1.0.1",
|
|
40
|
-
"@stamhoofd/backend-i18n": "2.
|
|
41
|
-
"@stamhoofd/backend-middleware": "2.
|
|
42
|
-
"@stamhoofd/email": "2.
|
|
43
|
-
"@stamhoofd/models": "2.
|
|
44
|
-
"@stamhoofd/queues": "2.
|
|
45
|
-
"@stamhoofd/sql": "2.
|
|
46
|
-
"@stamhoofd/structures": "2.
|
|
47
|
-
"@stamhoofd/utility": "2.
|
|
40
|
+
"@stamhoofd/backend-i18n": "2.61.0",
|
|
41
|
+
"@stamhoofd/backend-middleware": "2.61.0",
|
|
42
|
+
"@stamhoofd/email": "2.61.0",
|
|
43
|
+
"@stamhoofd/models": "2.61.0",
|
|
44
|
+
"@stamhoofd/queues": "2.61.0",
|
|
45
|
+
"@stamhoofd/sql": "2.61.0",
|
|
46
|
+
"@stamhoofd/structures": "2.61.0",
|
|
47
|
+
"@stamhoofd/utility": "2.61.0",
|
|
48
48
|
"archiver": "^7.0.1",
|
|
49
49
|
"aws-sdk": "^2.885.0",
|
|
50
50
|
"axios": "1.6.8",
|
|
@@ -64,5 +64,5 @@
|
|
|
64
64
|
"publishConfig": {
|
|
65
65
|
"access": "public"
|
|
66
66
|
},
|
|
67
|
-
"gitHead": "
|
|
67
|
+
"gitHead": "3df41cac9090d5e99abdbc51e4a4a02e9ea1784a"
|
|
68
68
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { DocumentTemplate } from '@stamhoofd/models';
|
|
2
|
+
import { getDefaultGenerator, ModelLogger } from './ModelLogger';
|
|
3
|
+
import { AuditLogReplacement, AuditLogReplacementType, AuditLogType } from '@stamhoofd/structures';
|
|
4
|
+
|
|
5
|
+
export const DocumentTemplateLogger = new ModelLogger(DocumentTemplate, {
|
|
6
|
+
skipKeys: ['html'],
|
|
7
|
+
optionsGenerator: getDefaultGenerator({
|
|
8
|
+
created: AuditLogType.DocumentTemplateAdded,
|
|
9
|
+
updated: AuditLogType.DocumentTemplateEdited,
|
|
10
|
+
deleted: AuditLogType.DocumentTemplateDeleted,
|
|
11
|
+
}),
|
|
12
|
+
|
|
13
|
+
createReplacements(model) {
|
|
14
|
+
return new Map([
|
|
15
|
+
['d', AuditLogReplacement.create({
|
|
16
|
+
id: model.id,
|
|
17
|
+
value: model.settings.name,
|
|
18
|
+
type: AuditLogReplacementType.DocumentTemplate,
|
|
19
|
+
})],
|
|
20
|
+
]);
|
|
21
|
+
},
|
|
22
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { EmailAddress } from '@stamhoofd/email';
|
|
2
|
+
import { AuditLogReplacement, AuditLogReplacementType, AuditLogType } from '@stamhoofd/structures';
|
|
3
|
+
import { ModelLogger } from './ModelLogger';
|
|
4
|
+
|
|
5
|
+
export const EmailAddressLogger = new ModelLogger(EmailAddress, {
|
|
6
|
+
async optionsGenerator(event) {
|
|
7
|
+
if (event.type === 'deleted') {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const wasUnsubscribed = event.type === 'updated' ? !!event.originalFields.unsubscribedAll : false;
|
|
12
|
+
const isUnsubscribed = event.model.unsubscribedAll;
|
|
13
|
+
|
|
14
|
+
if (!wasUnsubscribed && isUnsubscribed) {
|
|
15
|
+
return {
|
|
16
|
+
type: AuditLogType.EmailAddressUnsubscribed,
|
|
17
|
+
data: {},
|
|
18
|
+
generatePatchList: false,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const wasUnsubscribedMarketing = event.type === 'updated' ? !!event.originalFields.unsubscribedMarketing : false;
|
|
23
|
+
const isUnsubscribedMarketing = event.model.unsubscribedMarketing;
|
|
24
|
+
|
|
25
|
+
if (!wasUnsubscribedMarketing && isUnsubscribedMarketing) {
|
|
26
|
+
return {
|
|
27
|
+
type: AuditLogType.EmailAddressUnsubscribed,
|
|
28
|
+
data: {},
|
|
29
|
+
generatePatchList: false,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
createReplacements(model, options) {
|
|
35
|
+
const map = new Map([
|
|
36
|
+
['e', AuditLogReplacement.create({
|
|
37
|
+
id: model.id,
|
|
38
|
+
value: model.email || '',
|
|
39
|
+
type: AuditLogReplacementType.EmailAddress,
|
|
40
|
+
})],
|
|
41
|
+
]);
|
|
42
|
+
return map;
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
});
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Email, EmailRecipient, replaceHtml } from '@stamhoofd/models';
|
|
2
|
+
import { AuditLogReplacement, AuditLogReplacementType, AuditLogType, EmailStatus } from '@stamhoofd/structures';
|
|
3
|
+
import { Formatter } from '@stamhoofd/utility';
|
|
4
|
+
import { ModelLogger } from './ModelLogger';
|
|
5
|
+
|
|
6
|
+
export const EmailLogger = new ModelLogger(Email, {
|
|
7
|
+
async optionsGenerator(event) {
|
|
8
|
+
if (event.type === 'deleted') {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
let oldStatus = EmailStatus.Draft;
|
|
12
|
+
|
|
13
|
+
if (event.type === 'updated') {
|
|
14
|
+
oldStatus = event.originalFields.status as EmailStatus;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const newStatus = event.model.status as EmailStatus;
|
|
18
|
+
if (newStatus === oldStatus) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (newStatus !== EmailStatus.Sent && newStatus !== EmailStatus.Sending) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (newStatus === EmailStatus.Sent) {
|
|
27
|
+
const recipient = await EmailRecipient.select().where('emailId', event.model.id).whereNot('sentAt', null).first(false);
|
|
28
|
+
// Get first recipient
|
|
29
|
+
return {
|
|
30
|
+
type: AuditLogType.EmailSent,
|
|
31
|
+
data: {
|
|
32
|
+
recipient,
|
|
33
|
+
},
|
|
34
|
+
generatePatchList: false,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
type: AuditLogType.EmailSending,
|
|
40
|
+
data: {
|
|
41
|
+
recipient: null,
|
|
42
|
+
},
|
|
43
|
+
generatePatchList: false,
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
createReplacements(model, options) {
|
|
48
|
+
const map = new Map([
|
|
49
|
+
['e', AuditLogReplacement.create({
|
|
50
|
+
id: model.id,
|
|
51
|
+
value: model.subject || '',
|
|
52
|
+
type: AuditLogReplacementType.Email,
|
|
53
|
+
})],
|
|
54
|
+
['c', AuditLogReplacement.create({
|
|
55
|
+
value: Formatter.integer(model.recipientCount ?? 0),
|
|
56
|
+
count: model.recipientCount ?? 0,
|
|
57
|
+
})],
|
|
58
|
+
]);
|
|
59
|
+
if (options.data.recipient) {
|
|
60
|
+
map.set('html', AuditLogReplacement.html(
|
|
61
|
+
replaceHtml(model.html ?? '', options.data.recipient?.replacements ?? []),
|
|
62
|
+
));
|
|
63
|
+
}
|
|
64
|
+
return map;
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { EmailTemplate } from '@stamhoofd/models';
|
|
2
|
+
import { AuditLogReplacement, AuditLogReplacementType, AuditLogType } from '@stamhoofd/structures';
|
|
3
|
+
import { getDefaultGenerator, ModelLogger } from './ModelLogger';
|
|
4
|
+
const defaultGenerator = getDefaultGenerator({
|
|
5
|
+
created: AuditLogType.EmailTemplateAdded,
|
|
6
|
+
updated: AuditLogType.EmailTemplateEdited,
|
|
7
|
+
deleted: AuditLogType.EmailTemplateDeleted,
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
export const EmailTemplateLogger = new ModelLogger(EmailTemplate, {
|
|
11
|
+
skipKeys: ['json', 'text'], // html uses a special rendering method
|
|
12
|
+
async optionsGenerator(event) {
|
|
13
|
+
const result = await defaultGenerator(event);
|
|
14
|
+
|
|
15
|
+
if (!result) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Manually inject helper methods to compare html
|
|
20
|
+
|
|
21
|
+
return result;
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
createReplacements(model) {
|
|
25
|
+
return new Map([
|
|
26
|
+
['e', AuditLogReplacement.create({
|
|
27
|
+
id: model.id,
|
|
28
|
+
value: model.type.includes('Saved') ? model.subject : model.type, // Translated in UI
|
|
29
|
+
type: AuditLogReplacementType.EmailTemplate,
|
|
30
|
+
})],
|
|
31
|
+
]);
|
|
32
|
+
},
|
|
33
|
+
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Member, MemberPlatformMembership } from '@stamhoofd/models';
|
|
2
|
-
import { AuditLogReplacement, AuditLogReplacementType, AuditLogType
|
|
1
|
+
import { Member, MemberPlatformMembership, Platform } from '@stamhoofd/models';
|
|
2
|
+
import { AuditLogReplacement, AuditLogReplacementType, AuditLogType } from '@stamhoofd/structures';
|
|
3
3
|
import { Formatter } from '@stamhoofd/utility';
|
|
4
4
|
import { getDefaultGenerator, ModelLogger } from './ModelLogger';
|
|
5
5
|
|
|
@@ -29,6 +29,7 @@ export const MemberPlatformMembershipLogger = new ModelLogger(MemberPlatformMemb
|
|
|
29
29
|
...result,
|
|
30
30
|
data: {
|
|
31
31
|
member,
|
|
32
|
+
platform: await Platform.getSharedStruct(),
|
|
32
33
|
},
|
|
33
34
|
objectId: event.model.memberId,
|
|
34
35
|
};
|
|
@@ -39,10 +40,12 @@ export const MemberPlatformMembershipLogger = new ModelLogger(MemberPlatformMemb
|
|
|
39
40
|
},
|
|
40
41
|
|
|
41
42
|
createReplacements(model, options) {
|
|
43
|
+
const name = options.data.platform.config.membershipTypes.find(r => r.id === model.membershipTypeId)?.name;
|
|
44
|
+
|
|
42
45
|
const map = new Map([
|
|
43
46
|
['pm', AuditLogReplacement.create({
|
|
44
47
|
id: model.membershipTypeId,
|
|
45
|
-
value:
|
|
48
|
+
value: name,
|
|
46
49
|
type: AuditLogReplacementType.PlatformMembershipType,
|
|
47
50
|
})],
|
|
48
51
|
['m', AuditLogReplacement.create({
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Model, ModelEvent } from '@simonbackx/simple-database';
|
|
2
2
|
import { AuditLog } from '@stamhoofd/models';
|
|
3
|
-
import { AuditLogReplacement, AuditLogSource, AuditLogType } from '@stamhoofd/structures';
|
|
3
|
+
import { AuditLogPatchItem, AuditLogPatchItemType, AuditLogReplacement, AuditLogSource, AuditLogType } from '@stamhoofd/structures';
|
|
4
4
|
import { ContextInstance } from '../helpers/Context';
|
|
5
5
|
import { AuditLogService } from '../services/AuditLogService';
|
|
6
|
-
import {
|
|
6
|
+
import { diffUnknown } from '../services/diff';
|
|
7
7
|
|
|
8
8
|
export type ModelEventLogOptions<D> = {
|
|
9
9
|
type: AuditLogType;
|
|
@@ -24,6 +24,8 @@ type EventOptionsGenerator<M extends Model, D> = (event: ModelEvent<M>) => Model
|
|
|
24
24
|
export type ModelLoggerOptions<M extends Model, D = undefined> = {
|
|
25
25
|
optionsGenerator: EventOptionsGenerator<M, D>;
|
|
26
26
|
skipKeys?: string[];
|
|
27
|
+
sensitiveKeys?: string[];
|
|
28
|
+
renamedKeys?: Record<string, string>;
|
|
27
29
|
generateDescription?(event: ModelEvent<M>, options: ModelEventLogOptions<D>): string | null | undefined;
|
|
28
30
|
createReplacements?(model: M, options: ModelEventLogOptions<D>): Map<string, AuditLogReplacement>;
|
|
29
31
|
postProcess?(event: ModelEvent<M>, options: ModelEventLogOptions<D>, log: AuditLog): Promise<void> | void;
|
|
@@ -88,10 +90,13 @@ export class ModelLogger<ModelType extends typeof Model, M extends InstanceType<
|
|
|
88
90
|
model: ModelType;
|
|
89
91
|
optionsGenerator: EventOptionsGenerator<M, D>;
|
|
90
92
|
skipKeys: string[] = [];
|
|
93
|
+
sensitiveKeys: string[] = [];
|
|
94
|
+
renamedKeys: Record<string, string> = {};
|
|
91
95
|
generateDescription?: (event: ModelEvent<M>, options: ModelEventLogOptions<D>) => string | null | undefined;
|
|
92
96
|
createReplacements?: (model: M, options: ModelEventLogOptions<D>) => Map<string, AuditLogReplacement>;
|
|
93
97
|
postProcess?: (event: ModelEvent<M>, options: ModelEventLogOptions<D>, log: AuditLog) => Promise<void> | void;
|
|
94
98
|
static sharedSkipKeys = ['id', 'createdAt', 'updatedAt', 'deletedAt'];
|
|
99
|
+
static sharedSensitiveKeys = ['password'];
|
|
95
100
|
|
|
96
101
|
constructor(model: ModelType, options: ModelLoggerOptions<M, D>) {
|
|
97
102
|
this.model = model;
|
|
@@ -100,6 +105,8 @@ export class ModelLogger<ModelType extends typeof Model, M extends InstanceType<
|
|
|
100
105
|
this.generateDescription = options.generateDescription;
|
|
101
106
|
this.createReplacements = options.createReplacements;
|
|
102
107
|
this.postProcess = options.postProcess;
|
|
108
|
+
this.sensitiveKeys = options.sensitiveKeys ?? [];
|
|
109
|
+
this.renamedKeys = options.renamedKeys ?? {};
|
|
103
110
|
}
|
|
104
111
|
|
|
105
112
|
async logEvent(event: ModelEvent<M>) {
|
|
@@ -150,10 +157,20 @@ export class ModelLogger<ModelType extends typeof Model, M extends InstanceType<
|
|
|
150
157
|
// Ignore relations
|
|
151
158
|
continue;
|
|
152
159
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
160
|
+
const renamedKey = this.renamedKeys?.[key] ?? key;
|
|
161
|
+
if (ModelLogger.sharedSensitiveKeys.includes(key) || (this.skipKeys && this.skipKeys.includes(key))) {
|
|
162
|
+
log.patchList.push(AuditLogPatchItem.create({
|
|
163
|
+
key: AuditLogReplacement.key(renamedKey),
|
|
164
|
+
type: AuditLogPatchItemType.Changed,
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
log.patchList.push(...diffUnknown(
|
|
169
|
+
key in oldModel ? oldModel[key] : undefined,
|
|
170
|
+
key in event.model ? event.model[key] : undefined,
|
|
171
|
+
AuditLogReplacement.key(renamedKey),
|
|
172
|
+
));
|
|
173
|
+
}
|
|
157
174
|
}
|
|
158
175
|
|
|
159
176
|
// Remove skipped keys
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Order, Webshop } from '@stamhoofd/models';
|
|
2
|
-
import { getDefaultGenerator, ModelLogger } from './ModelLogger';
|
|
3
2
|
import { AuditLogReplacement, AuditLogReplacementType, AuditLogType, OrderStatus } from '@stamhoofd/structures';
|
|
3
|
+
import { getDefaultGenerator, ModelLogger } from './ModelLogger';
|
|
4
4
|
|
|
5
5
|
const defaultGenerator = getDefaultGenerator({
|
|
6
6
|
created: AuditLogType.OrderAdded,
|
|
@@ -46,7 +46,7 @@ export const OrderLogger = new ModelLogger(Order, {
|
|
|
46
46
|
value: options.data.webshop.meta.name,
|
|
47
47
|
type: AuditLogReplacementType.Webshop,
|
|
48
48
|
})],
|
|
49
|
-
['
|
|
49
|
+
['o', AuditLogReplacement.create({
|
|
50
50
|
id: model.id,
|
|
51
51
|
value: model.number ? `bestelling #${model.number}` : `bestelling van ${model.data.customer.name}`,
|
|
52
52
|
type: AuditLogReplacementType.Order,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Organization } from '@stamhoofd/models';
|
|
2
|
+
import { AuditLogType } from '@stamhoofd/structures';
|
|
2
3
|
import { getDefaultGenerator, ModelLogger } from './ModelLogger';
|
|
3
|
-
import { AuditLogReplacement, AuditLogReplacementType, AuditLogType } from '@stamhoofd/structures';
|
|
4
4
|
|
|
5
5
|
export const OrganizationLogger = new ModelLogger(Organization, {
|
|
6
6
|
skipKeys: ['searchIndex'],
|
|
@@ -10,16 +10,6 @@ export const OrganizationLogger = new ModelLogger(Organization, {
|
|
|
10
10
|
deleted: AuditLogType.OrganizationDeleted,
|
|
11
11
|
}),
|
|
12
12
|
|
|
13
|
-
createReplacements(model) {
|
|
14
|
-
return new Map([
|
|
15
|
-
['o', AuditLogReplacement.create({
|
|
16
|
-
id: model.id,
|
|
17
|
-
value: model.name,
|
|
18
|
-
type: AuditLogReplacementType.Organization,
|
|
19
|
-
})],
|
|
20
|
-
]);
|
|
21
|
-
},
|
|
22
|
-
|
|
23
13
|
postProcess(event, options, log) {
|
|
24
14
|
log.organizationId = event.model.id;
|
|
25
15
|
},
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { User } from '@stamhoofd/models';
|
|
2
|
+
import { AuditLogReplacement, AuditLogReplacementType, AuditLogType } from '@stamhoofd/structures';
|
|
3
|
+
import { getDefaultGenerator, ModelLogger } from './ModelLogger';
|
|
4
|
+
|
|
5
|
+
const defaultGenerator = getDefaultGenerator({
|
|
6
|
+
created: AuditLogType.UserAdded,
|
|
7
|
+
updated: AuditLogType.UserEdited,
|
|
8
|
+
deleted: AuditLogType.UserDeleted,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export const UserLogger = new ModelLogger(User, {
|
|
12
|
+
skipKeys: ['meta'],
|
|
13
|
+
sensitiveKeys: ['password'],
|
|
14
|
+
renamedKeys: {
|
|
15
|
+
memberId: 'linkedMember',
|
|
16
|
+
verified: 'emailVerified',
|
|
17
|
+
},
|
|
18
|
+
async optionsGenerator(event) {
|
|
19
|
+
const result = await defaultGenerator(event);
|
|
20
|
+
|
|
21
|
+
if (!result) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (!event.model.hasAccount() && !event.model.permissions) {
|
|
26
|
+
// Do not log changes to placeholder users
|
|
27
|
+
|
|
28
|
+
if (event.type !== 'updated' || (event.originalFields.permissions === null)) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return result;
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
createReplacements: (model, options) => {
|
|
37
|
+
return new Map([
|
|
38
|
+
['u', AuditLogReplacement.create({
|
|
39
|
+
id: model.id,
|
|
40
|
+
value: model.email,
|
|
41
|
+
type: AuditLogReplacementType.User,
|
|
42
|
+
})],
|
|
43
|
+
]);
|
|
44
|
+
},
|
|
45
|
+
});
|