@stamhoofd/models 2.12.0 → 2.16.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/dist/src/factories/GroupFactory.js +13 -6
- package/dist/src/factories/GroupFactory.js.map +1 -1
- package/dist/src/factories/MemberFactory.js +10 -4
- package/dist/src/factories/MemberFactory.js.map +1 -1
- package/dist/src/factories/OrganizationFactory.js +11 -6
- package/dist/src/factories/OrganizationFactory.js.map +1 -1
- package/dist/src/factories/ParentFactory.js +2 -3
- package/dist/src/factories/ParentFactory.js.map +1 -1
- package/dist/src/factories/RecordFactory.js +1 -0
- package/dist/src/factories/RecordFactory.js.map +1 -1
- package/dist/src/factories/RegisterCodeFactory.js +2 -3
- package/dist/src/factories/RegisterCodeFactory.js.map +1 -1
- package/dist/src/factories/RegistrationFactory.js +2 -0
- package/dist/src/factories/RegistrationFactory.js.map +1 -1
- package/dist/src/factories/UserFactory.js +15 -5
- package/dist/src/factories/UserFactory.js.map +1 -1
- package/dist/src/factories/WebshopFactory.js +7 -3
- package/dist/src/factories/WebshopFactory.js.map +1 -1
- package/dist/src/helpers/DNSValidator.js +1 -2
- package/dist/src/helpers/DNSValidator.js.map +1 -1
- package/dist/src/helpers/EmailBuilder.d.ts +23 -5
- package/dist/src/helpers/EmailBuilder.d.ts.map +1 -1
- package/dist/src/helpers/EmailBuilder.js +73 -21
- package/dist/src/helpers/EmailBuilder.js.map +1 -1
- package/dist/src/helpers/GroupBuilder.js +2 -2
- package/dist/src/helpers/GroupBuilder.js.map +1 -1
- package/dist/src/helpers/Handlebars.js +3 -5
- package/dist/src/helpers/Handlebars.js.map +1 -1
- package/dist/src/helpers/InvoiceBuilder.js +11 -10
- package/dist/src/helpers/InvoiceBuilder.js.map +1 -1
- package/dist/src/helpers/MemberMerger.d.ts +13 -0
- package/dist/src/helpers/MemberMerger.d.ts.map +1 -0
- package/dist/src/helpers/MemberMerger.js +328 -0
- package/dist/src/helpers/MemberMerger.js.map +1 -0
- package/dist/src/helpers/MemberMerger.test.d.ts +2 -0
- package/dist/src/helpers/MemberMerger.test.d.ts.map +1 -0
- package/dist/src/helpers/MemberMerger.test.js +592 -0
- package/dist/src/helpers/MemberMerger.test.js.map +1 -0
- package/dist/src/helpers/RateLimiter.d.ts.map +1 -1
- package/dist/src/helpers/RateLimiter.js +10 -5
- package/dist/src/helpers/RateLimiter.js.map +1 -1
- package/dist/src/helpers/WebshopCounter.js +2 -2
- package/dist/src/helpers/WebshopCounter.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/migrations/1605262045-import-postcodes.js +10 -2
- package/dist/src/migrations/1723736282-merged-members.sql +19 -0
- package/dist/src/models/BalanceItem.js +41 -35
- package/dist/src/models/BalanceItem.js.map +1 -1
- package/dist/src/models/BalanceItemPayment.js +14 -11
- package/dist/src/models/BalanceItemPayment.js.map +1 -1
- package/dist/src/models/BuckarooPayment.js +5 -2
- package/dist/src/models/BuckarooPayment.js.map +1 -1
- package/dist/src/models/Document.js +24 -23
- package/dist/src/models/Document.js.map +1 -1
- package/dist/src/models/DocumentTemplate.js +36 -25
- package/dist/src/models/DocumentTemplate.js.map +1 -1
- package/dist/src/models/Email.d.ts.map +1 -1
- package/dist/src/models/Email.js +36 -38
- package/dist/src/models/Email.js.map +1 -1
- package/dist/src/models/EmailRecipient.js +15 -13
- package/dist/src/models/EmailRecipient.js.map +1 -1
- package/dist/src/models/EmailTemplate.d.ts +5 -0
- package/dist/src/models/EmailTemplate.d.ts.map +1 -1
- package/dist/src/models/EmailTemplate.js +30 -7
- package/dist/src/models/EmailTemplate.js.map +1 -1
- package/dist/src/models/EmailVerificationCode.js +32 -25
- package/dist/src/models/EmailVerificationCode.js.map +1 -1
- package/dist/src/models/Event.js +15 -12
- package/dist/src/models/Event.js.map +1 -1
- package/dist/src/models/Group.js +24 -21
- package/dist/src/models/Group.js.map +1 -1
- package/dist/src/models/Image.d.ts +0 -1
- package/dist/src/models/Image.d.ts.map +1 -1
- package/dist/src/models/Image.js +12 -14
- package/dist/src/models/Image.js.map +1 -1
- package/dist/src/models/Member.d.ts.map +1 -1
- package/dist/src/models/Member.js +34 -32
- package/dist/src/models/Member.js.map +1 -1
- package/dist/src/models/MemberPlatformMembership.js +22 -16
- package/dist/src/models/MemberPlatformMembership.js.map +1 -1
- package/dist/src/models/MemberResponsibilityRecord.js +10 -8
- package/dist/src/models/MemberResponsibilityRecord.js.map +1 -1
- package/dist/src/models/MergedMember.d.ts +23 -0
- package/dist/src/models/MergedMember.d.ts.map +1 -0
- package/dist/src/models/MergedMember.js +126 -0
- package/dist/src/models/MergedMember.js.map +1 -0
- package/dist/src/models/MolliePayment.js +5 -2
- package/dist/src/models/MolliePayment.js.map +1 -1
- package/dist/src/models/MollieToken.js +14 -14
- package/dist/src/models/MollieToken.js.map +1 -1
- package/dist/src/models/OneTimeToken.js +15 -13
- package/dist/src/models/OneTimeToken.js.map +1 -1
- package/dist/src/models/Order.d.ts +1 -1
- package/dist/src/models/Order.d.ts.map +1 -1
- package/dist/src/models/Order.js +42 -52
- package/dist/src/models/Order.js.map +1 -1
- package/dist/src/models/Organization.d.ts.map +1 -1
- package/dist/src/models/Organization.js +64 -66
- package/dist/src/models/Organization.js.map +1 -1
- package/dist/src/models/OrganizationRegistrationPeriod.js +8 -7
- package/dist/src/models/OrganizationRegistrationPeriod.js.map +1 -1
- package/dist/src/models/PasswordToken.js +9 -5
- package/dist/src/models/PasswordToken.js.map +1 -1
- package/dist/src/models/PayconiqPayment.js +12 -14
- package/dist/src/models/PayconiqPayment.js.map +1 -1
- package/dist/src/models/Payment.d.ts.map +1 -1
- package/dist/src/models/Payment.js +41 -35
- package/dist/src/models/Payment.js.map +1 -1
- package/dist/src/models/Platform.js +8 -10
- package/dist/src/models/Platform.js.map +1 -1
- package/dist/src/models/RegisterCode.js +12 -9
- package/dist/src/models/RegisterCode.js.map +1 -1
- package/dist/src/models/Registration.d.ts.map +1 -1
- package/dist/src/models/Registration.js +65 -80
- package/dist/src/models/Registration.js.map +1 -1
- package/dist/src/models/RegistrationPeriod.js +11 -9
- package/dist/src/models/RegistrationPeriod.js.map +1 -1
- package/dist/src/models/STCredit.js +11 -7
- package/dist/src/models/STCredit.js.map +1 -1
- package/dist/src/models/STInvoice.js +45 -45
- package/dist/src/models/STInvoice.js.map +1 -1
- package/dist/src/models/STPackage.d.ts.map +1 -1
- package/dist/src/models/STPackage.js +58 -62
- package/dist/src/models/STPackage.js.map +1 -1
- package/dist/src/models/STPendingInvoice.js +17 -16
- package/dist/src/models/STPendingInvoice.js.map +1 -1
- package/dist/src/models/StripeAccount.js +15 -14
- package/dist/src/models/StripeAccount.js.map +1 -1
- package/dist/src/models/StripeCheckoutSession.js +10 -10
- package/dist/src/models/StripeCheckoutSession.js.map +1 -1
- package/dist/src/models/StripePaymentIntent.js +10 -10
- package/dist/src/models/StripePaymentIntent.js.map +1 -1
- package/dist/src/models/Ticket.js +46 -32
- package/dist/src/models/Ticket.js.map +1 -1
- package/dist/src/models/Token.js +12 -5
- package/dist/src/models/Token.js.map +1 -1
- package/dist/src/models/UsedRegisterCode.js +15 -11
- package/dist/src/models/UsedRegisterCode.js.map +1 -1
- package/dist/src/models/User.d.ts +2 -1
- package/dist/src/models/User.d.ts.map +1 -1
- package/dist/src/models/User.js +51 -29
- package/dist/src/models/User.js.map +1 -1
- package/dist/src/models/UserPermissions.js +11 -8
- package/dist/src/models/UserPermissions.js.map +1 -1
- package/dist/src/models/Webshop.js +41 -37
- package/dist/src/models/Webshop.js.map +1 -1
- package/dist/src/models/WebshopDiscountCode.js +13 -9
- package/dist/src/models/WebshopDiscountCode.js.map +1 -1
- package/dist/src/models/addresses/City.js +9 -8
- package/dist/src/models/addresses/City.js.map +1 -1
- package/dist/src/models/addresses/PostalCode.js +7 -3
- package/dist/src/models/addresses/PostalCode.js.map +1 -1
- package/dist/src/models/addresses/Province.js +5 -2
- package/dist/src/models/addresses/Province.js.map +1 -1
- package/dist/src/models/addresses/Street.js +6 -3
- package/dist/src/models/addresses/Street.js.map +1 -1
- package/dist/src/models/index.d.ts +1 -0
- package/dist/src/models/index.d.ts.map +1 -1
- package/dist/src/models/index.js +3 -1
- package/dist/src/models/index.js.map +1 -1
- package/dist/src/structures/OrganizationServerMetaData.js +30 -27
- package/dist/src/structures/OrganizationServerMetaData.js.map +1 -1
- package/package.json +3 -3
- package/src/helpers/EmailBuilder.ts +95 -17
- package/src/helpers/MemberMerger.test.ts +719 -0
- package/src/helpers/MemberMerger.ts +497 -0
- package/src/helpers/RateLimiter.ts +1 -0
- package/src/index.ts +2 -1
- package/src/migrations/1723736282-merged-members.sql +19 -0
- package/src/models/Email.ts +9 -11
- package/src/models/EmailTemplate.ts +20 -1
- package/src/models/Member.ts +7 -8
- package/src/models/MergedMember.ts +112 -0
- package/src/models/Order.ts +11 -21
- package/src/models/Organization.ts +17 -26
- package/src/models/Payment.ts +1 -0
- package/src/models/Registration.ts +17 -45
- package/src/models/STPackage.ts +8 -16
- package/src/models/User.ts +24 -1
- package/src/models/index.ts +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stamhoofd/models",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.16.0",
|
|
4
4
|
"main": "./dist/src/index.js",
|
|
5
5
|
"types": "./dist/src/index.d.ts",
|
|
6
6
|
"license": "UNLICENCED",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"base-x": "^3.0.9"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@simonbackx/simple-database": "1.
|
|
27
|
+
"@simonbackx/simple-database": "1.25.0"
|
|
28
28
|
},
|
|
29
|
-
"gitHead": "
|
|
29
|
+
"gitHead": "d5f1a4dda2c1623058e96e8ff25d837b28e51bd6"
|
|
30
30
|
}
|
|
@@ -1,18 +1,91 @@
|
|
|
1
1
|
import { EmailAddress, EmailBuilder } from "@stamhoofd/email";
|
|
2
|
-
import { Recipient, Replacement } from "@stamhoofd/structures";
|
|
2
|
+
import { EmailTemplateType, Recipient, Replacement } from "@stamhoofd/structures";
|
|
3
3
|
import { Formatter } from "@stamhoofd/utility";
|
|
4
4
|
|
|
5
|
-
import { Organization, Platform, User } from "../models";
|
|
6
5
|
import { SimpleError } from "@simonbackx/simple-errors";
|
|
6
|
+
import { EmailTemplate, Organization, Platform, User } from "../models";
|
|
7
7
|
|
|
8
|
-
export
|
|
8
|
+
export type EmailTemplateOptions = {
|
|
9
|
+
type: EmailTemplateType,
|
|
10
|
+
webshopId?: string | null,
|
|
11
|
+
groupId?: string | null,
|
|
12
|
+
organizationId?: string | null
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export async function getEmailTemplate(data: EmailTemplateOptions) {
|
|
16
|
+
// Most specific template: for specific group
|
|
17
|
+
const q = EmailTemplate.select()
|
|
18
|
+
.where('type', data.type)
|
|
19
|
+
|
|
20
|
+
if (data.groupId) {
|
|
21
|
+
q.where('groupId', data.groupId)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (data.organizationId) {
|
|
25
|
+
q.where('organizationId', data.organizationId)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (data.webshopId) {
|
|
29
|
+
q.where('webshopId', data.webshopId)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let templates = await q.limit(1).fetch()
|
|
33
|
+
|
|
34
|
+
// Specific for organization
|
|
35
|
+
if (templates.length == 0 && (data.groupId || data.webshopId) && data.organizationId) {
|
|
36
|
+
templates = await EmailTemplate.select()
|
|
37
|
+
.where('type', data.type)
|
|
38
|
+
.where('organizationId', data.organizationId)
|
|
39
|
+
.where('groupId', null)
|
|
40
|
+
.where('webshopId', null)
|
|
41
|
+
.limit(1)
|
|
42
|
+
.fetch()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Default for platform
|
|
46
|
+
if (templates.length == 0 && (data.groupId || data.webshopId || data.organizationId)) {
|
|
47
|
+
templates = await EmailTemplate.select()
|
|
48
|
+
.where('type', data.type)
|
|
49
|
+
.where('organizationId', null)
|
|
50
|
+
.where('groupId', null)
|
|
51
|
+
.where('webshopId', null)
|
|
52
|
+
.limit(1)
|
|
53
|
+
.fetch()
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (templates.length == 0) {
|
|
57
|
+
console.error("Could not find email template for type "+data.type)
|
|
58
|
+
return
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return templates[0]
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
export async function getEmailBuilderForTemplate(organization: Organization|null, options: Omit<EmailBuilderOptions, "subject" | "html"> & { template: Omit<EmailTemplateOptions, "organizationId"> }) {
|
|
66
|
+
const template = await getEmailTemplate({
|
|
67
|
+
...options.template,
|
|
68
|
+
organizationId: organization?.id ?? null
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
if (!template) {
|
|
72
|
+
return undefined
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return await getEmailBuilder(organization, {
|
|
76
|
+
...options,
|
|
77
|
+
subject: template.subject,
|
|
78
|
+
html: template.html
|
|
79
|
+
})
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export type EmailBuilderOptions = {
|
|
9
83
|
defaultReplacements?: Replacement[],
|
|
10
84
|
recipients: Recipient[],
|
|
11
85
|
from: string,
|
|
12
86
|
replyTo?: string|null,
|
|
13
87
|
subject: string,
|
|
14
|
-
|
|
15
|
-
html: string | null,
|
|
88
|
+
html: string,
|
|
16
89
|
attachments?: {
|
|
17
90
|
filename: string;
|
|
18
91
|
content: string;
|
|
@@ -23,8 +96,14 @@ export async function getEmailBuilder(organization: Organization|null, email: {
|
|
|
23
96
|
unsubscribeType?: 'all'|'marketing',
|
|
24
97
|
fromStamhoofd?: boolean,
|
|
25
98
|
singleBcc?: string,
|
|
99
|
+
replaceAll?: {from: string, to: string}[], // replace in all e-mails, not recipient dependent
|
|
26
100
|
callback?: (error: Error|null) => void; // for each email
|
|
27
|
-
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* @param organization defines replacements and unsubsribe behaviour
|
|
105
|
+
*/
|
|
106
|
+
export async function getEmailBuilder(organization: Organization|null, email: EmailBuilderOptions) {
|
|
28
107
|
const platform = await Platform.getSharedStruct()
|
|
29
108
|
// Update recipients
|
|
30
109
|
const cleaned: Recipient[] = []
|
|
@@ -86,16 +165,21 @@ export async function getEmailBuilder(organization: Organization|null, email: {
|
|
|
86
165
|
if (organization) {
|
|
87
166
|
const extra = organization.meta.getEmailReplacements()
|
|
88
167
|
recipient.replacements.push(...extra)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Defaults
|
|
171
|
+
const extra = platform.config.getEmailReplacements()
|
|
172
|
+
recipient.replacements.push(...extra)
|
|
93
173
|
}
|
|
94
174
|
|
|
95
175
|
const queue = email.recipients.slice()
|
|
96
176
|
|
|
97
177
|
let emailIndex = 0;
|
|
98
178
|
|
|
179
|
+
for (const s of email.replaceAll ?? []) {
|
|
180
|
+
email.html = email.html.replaceAll(s.from, s.to)
|
|
181
|
+
}
|
|
182
|
+
|
|
99
183
|
// Create e-mail builder
|
|
100
184
|
const builder: EmailBuilder = () => {
|
|
101
185
|
const recipient = queue.shift()
|
|
@@ -105,15 +189,9 @@ export async function getEmailBuilder(organization: Organization|null, email: {
|
|
|
105
189
|
|
|
106
190
|
let replacedHtml = email.html
|
|
107
191
|
let replacedSubject = email.subject
|
|
108
|
-
//let replacedText = email.text
|
|
109
192
|
|
|
110
193
|
for (const replacement of recipient.replacements) {
|
|
111
|
-
|
|
112
|
-
replacedHtml = replacedHtml.replaceAll("{{"+replacement.token+"}}", replacement.html ?? Formatter.escapeHtml(replacement.value))
|
|
113
|
-
}
|
|
114
|
-
//if (replacedText) {
|
|
115
|
-
// replacedText = replacedText.replaceAll("{{"+replacement.token+"}}", replacement.value)
|
|
116
|
-
//}
|
|
194
|
+
replacedHtml = replacedHtml.replaceAll("{{"+replacement.token+"}}", replacement.html ?? Formatter.escapeHtml(replacement.value))
|
|
117
195
|
replacedSubject = replacedSubject.replaceAll("{{"+replacement.token+"}}", replacement.value)
|
|
118
196
|
}
|
|
119
197
|
|