@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.
Files changed (183) hide show
  1. package/dist/src/factories/GroupFactory.js +13 -6
  2. package/dist/src/factories/GroupFactory.js.map +1 -1
  3. package/dist/src/factories/MemberFactory.js +10 -4
  4. package/dist/src/factories/MemberFactory.js.map +1 -1
  5. package/dist/src/factories/OrganizationFactory.js +11 -6
  6. package/dist/src/factories/OrganizationFactory.js.map +1 -1
  7. package/dist/src/factories/ParentFactory.js +2 -3
  8. package/dist/src/factories/ParentFactory.js.map +1 -1
  9. package/dist/src/factories/RecordFactory.js +1 -0
  10. package/dist/src/factories/RecordFactory.js.map +1 -1
  11. package/dist/src/factories/RegisterCodeFactory.js +2 -3
  12. package/dist/src/factories/RegisterCodeFactory.js.map +1 -1
  13. package/dist/src/factories/RegistrationFactory.js +2 -0
  14. package/dist/src/factories/RegistrationFactory.js.map +1 -1
  15. package/dist/src/factories/UserFactory.js +15 -5
  16. package/dist/src/factories/UserFactory.js.map +1 -1
  17. package/dist/src/factories/WebshopFactory.js +7 -3
  18. package/dist/src/factories/WebshopFactory.js.map +1 -1
  19. package/dist/src/helpers/DNSValidator.js +1 -2
  20. package/dist/src/helpers/DNSValidator.js.map +1 -1
  21. package/dist/src/helpers/EmailBuilder.d.ts +23 -5
  22. package/dist/src/helpers/EmailBuilder.d.ts.map +1 -1
  23. package/dist/src/helpers/EmailBuilder.js +73 -21
  24. package/dist/src/helpers/EmailBuilder.js.map +1 -1
  25. package/dist/src/helpers/GroupBuilder.js +2 -2
  26. package/dist/src/helpers/GroupBuilder.js.map +1 -1
  27. package/dist/src/helpers/Handlebars.js +3 -5
  28. package/dist/src/helpers/Handlebars.js.map +1 -1
  29. package/dist/src/helpers/InvoiceBuilder.js +11 -10
  30. package/dist/src/helpers/InvoiceBuilder.js.map +1 -1
  31. package/dist/src/helpers/MemberMerger.d.ts +13 -0
  32. package/dist/src/helpers/MemberMerger.d.ts.map +1 -0
  33. package/dist/src/helpers/MemberMerger.js +328 -0
  34. package/dist/src/helpers/MemberMerger.js.map +1 -0
  35. package/dist/src/helpers/MemberMerger.test.d.ts +2 -0
  36. package/dist/src/helpers/MemberMerger.test.d.ts.map +1 -0
  37. package/dist/src/helpers/MemberMerger.test.js +592 -0
  38. package/dist/src/helpers/MemberMerger.test.js.map +1 -0
  39. package/dist/src/helpers/RateLimiter.d.ts.map +1 -1
  40. package/dist/src/helpers/RateLimiter.js +10 -5
  41. package/dist/src/helpers/RateLimiter.js.map +1 -1
  42. package/dist/src/helpers/WebshopCounter.js +2 -2
  43. package/dist/src/helpers/WebshopCounter.js.map +1 -1
  44. package/dist/src/index.d.ts +1 -0
  45. package/dist/src/index.d.ts.map +1 -1
  46. package/dist/src/index.js +1 -0
  47. package/dist/src/index.js.map +1 -1
  48. package/dist/src/migrations/1605262045-import-postcodes.js +10 -2
  49. package/dist/src/migrations/1723736282-merged-members.sql +19 -0
  50. package/dist/src/models/BalanceItem.js +41 -35
  51. package/dist/src/models/BalanceItem.js.map +1 -1
  52. package/dist/src/models/BalanceItemPayment.js +14 -11
  53. package/dist/src/models/BalanceItemPayment.js.map +1 -1
  54. package/dist/src/models/BuckarooPayment.js +5 -2
  55. package/dist/src/models/BuckarooPayment.js.map +1 -1
  56. package/dist/src/models/Document.js +24 -23
  57. package/dist/src/models/Document.js.map +1 -1
  58. package/dist/src/models/DocumentTemplate.js +36 -25
  59. package/dist/src/models/DocumentTemplate.js.map +1 -1
  60. package/dist/src/models/Email.d.ts.map +1 -1
  61. package/dist/src/models/Email.js +36 -38
  62. package/dist/src/models/Email.js.map +1 -1
  63. package/dist/src/models/EmailRecipient.js +15 -13
  64. package/dist/src/models/EmailRecipient.js.map +1 -1
  65. package/dist/src/models/EmailTemplate.d.ts +5 -0
  66. package/dist/src/models/EmailTemplate.d.ts.map +1 -1
  67. package/dist/src/models/EmailTemplate.js +30 -7
  68. package/dist/src/models/EmailTemplate.js.map +1 -1
  69. package/dist/src/models/EmailVerificationCode.js +32 -25
  70. package/dist/src/models/EmailVerificationCode.js.map +1 -1
  71. package/dist/src/models/Event.js +15 -12
  72. package/dist/src/models/Event.js.map +1 -1
  73. package/dist/src/models/Group.js +24 -21
  74. package/dist/src/models/Group.js.map +1 -1
  75. package/dist/src/models/Image.d.ts +0 -1
  76. package/dist/src/models/Image.d.ts.map +1 -1
  77. package/dist/src/models/Image.js +12 -14
  78. package/dist/src/models/Image.js.map +1 -1
  79. package/dist/src/models/Member.d.ts.map +1 -1
  80. package/dist/src/models/Member.js +34 -32
  81. package/dist/src/models/Member.js.map +1 -1
  82. package/dist/src/models/MemberPlatformMembership.js +22 -16
  83. package/dist/src/models/MemberPlatformMembership.js.map +1 -1
  84. package/dist/src/models/MemberResponsibilityRecord.js +10 -8
  85. package/dist/src/models/MemberResponsibilityRecord.js.map +1 -1
  86. package/dist/src/models/MergedMember.d.ts +23 -0
  87. package/dist/src/models/MergedMember.d.ts.map +1 -0
  88. package/dist/src/models/MergedMember.js +126 -0
  89. package/dist/src/models/MergedMember.js.map +1 -0
  90. package/dist/src/models/MolliePayment.js +5 -2
  91. package/dist/src/models/MolliePayment.js.map +1 -1
  92. package/dist/src/models/MollieToken.js +14 -14
  93. package/dist/src/models/MollieToken.js.map +1 -1
  94. package/dist/src/models/OneTimeToken.js +15 -13
  95. package/dist/src/models/OneTimeToken.js.map +1 -1
  96. package/dist/src/models/Order.d.ts +1 -1
  97. package/dist/src/models/Order.d.ts.map +1 -1
  98. package/dist/src/models/Order.js +42 -52
  99. package/dist/src/models/Order.js.map +1 -1
  100. package/dist/src/models/Organization.d.ts.map +1 -1
  101. package/dist/src/models/Organization.js +64 -66
  102. package/dist/src/models/Organization.js.map +1 -1
  103. package/dist/src/models/OrganizationRegistrationPeriod.js +8 -7
  104. package/dist/src/models/OrganizationRegistrationPeriod.js.map +1 -1
  105. package/dist/src/models/PasswordToken.js +9 -5
  106. package/dist/src/models/PasswordToken.js.map +1 -1
  107. package/dist/src/models/PayconiqPayment.js +12 -14
  108. package/dist/src/models/PayconiqPayment.js.map +1 -1
  109. package/dist/src/models/Payment.d.ts.map +1 -1
  110. package/dist/src/models/Payment.js +41 -35
  111. package/dist/src/models/Payment.js.map +1 -1
  112. package/dist/src/models/Platform.js +8 -10
  113. package/dist/src/models/Platform.js.map +1 -1
  114. package/dist/src/models/RegisterCode.js +12 -9
  115. package/dist/src/models/RegisterCode.js.map +1 -1
  116. package/dist/src/models/Registration.d.ts.map +1 -1
  117. package/dist/src/models/Registration.js +65 -80
  118. package/dist/src/models/Registration.js.map +1 -1
  119. package/dist/src/models/RegistrationPeriod.js +11 -9
  120. package/dist/src/models/RegistrationPeriod.js.map +1 -1
  121. package/dist/src/models/STCredit.js +11 -7
  122. package/dist/src/models/STCredit.js.map +1 -1
  123. package/dist/src/models/STInvoice.js +45 -45
  124. package/dist/src/models/STInvoice.js.map +1 -1
  125. package/dist/src/models/STPackage.d.ts.map +1 -1
  126. package/dist/src/models/STPackage.js +58 -62
  127. package/dist/src/models/STPackage.js.map +1 -1
  128. package/dist/src/models/STPendingInvoice.js +17 -16
  129. package/dist/src/models/STPendingInvoice.js.map +1 -1
  130. package/dist/src/models/StripeAccount.js +15 -14
  131. package/dist/src/models/StripeAccount.js.map +1 -1
  132. package/dist/src/models/StripeCheckoutSession.js +10 -10
  133. package/dist/src/models/StripeCheckoutSession.js.map +1 -1
  134. package/dist/src/models/StripePaymentIntent.js +10 -10
  135. package/dist/src/models/StripePaymentIntent.js.map +1 -1
  136. package/dist/src/models/Ticket.js +46 -32
  137. package/dist/src/models/Ticket.js.map +1 -1
  138. package/dist/src/models/Token.js +12 -5
  139. package/dist/src/models/Token.js.map +1 -1
  140. package/dist/src/models/UsedRegisterCode.js +15 -11
  141. package/dist/src/models/UsedRegisterCode.js.map +1 -1
  142. package/dist/src/models/User.d.ts +2 -1
  143. package/dist/src/models/User.d.ts.map +1 -1
  144. package/dist/src/models/User.js +51 -29
  145. package/dist/src/models/User.js.map +1 -1
  146. package/dist/src/models/UserPermissions.js +11 -8
  147. package/dist/src/models/UserPermissions.js.map +1 -1
  148. package/dist/src/models/Webshop.js +41 -37
  149. package/dist/src/models/Webshop.js.map +1 -1
  150. package/dist/src/models/WebshopDiscountCode.js +13 -9
  151. package/dist/src/models/WebshopDiscountCode.js.map +1 -1
  152. package/dist/src/models/addresses/City.js +9 -8
  153. package/dist/src/models/addresses/City.js.map +1 -1
  154. package/dist/src/models/addresses/PostalCode.js +7 -3
  155. package/dist/src/models/addresses/PostalCode.js.map +1 -1
  156. package/dist/src/models/addresses/Province.js +5 -2
  157. package/dist/src/models/addresses/Province.js.map +1 -1
  158. package/dist/src/models/addresses/Street.js +6 -3
  159. package/dist/src/models/addresses/Street.js.map +1 -1
  160. package/dist/src/models/index.d.ts +1 -0
  161. package/dist/src/models/index.d.ts.map +1 -1
  162. package/dist/src/models/index.js +3 -1
  163. package/dist/src/models/index.js.map +1 -1
  164. package/dist/src/structures/OrganizationServerMetaData.js +30 -27
  165. package/dist/src/structures/OrganizationServerMetaData.js.map +1 -1
  166. package/package.json +3 -3
  167. package/src/helpers/EmailBuilder.ts +95 -17
  168. package/src/helpers/MemberMerger.test.ts +719 -0
  169. package/src/helpers/MemberMerger.ts +497 -0
  170. package/src/helpers/RateLimiter.ts +1 -0
  171. package/src/index.ts +2 -1
  172. package/src/migrations/1723736282-merged-members.sql +19 -0
  173. package/src/models/Email.ts +9 -11
  174. package/src/models/EmailTemplate.ts +20 -1
  175. package/src/models/Member.ts +7 -8
  176. package/src/models/MergedMember.ts +112 -0
  177. package/src/models/Order.ts +11 -21
  178. package/src/models/Organization.ts +17 -26
  179. package/src/models/Payment.ts +1 -0
  180. package/src/models/Registration.ts +17 -45
  181. package/src/models/STPackage.ts +8 -16
  182. package/src/models/User.ts +24 -1
  183. 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.12.0",
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.24.0"
27
+ "@simonbackx/simple-database": "1.25.0"
28
28
  },
29
- "gitHead": "8ebb85db900fd76ec9dad8bbd4767b60b635cb19"
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 async function getEmailBuilder(organization: Organization|null, email: {
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
- //text: string | null,
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
- } else {
90
- const extra = platform.config.getEmailReplacements()
91
- recipient.replacements.push(...extra)
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
- if (replacedHtml) {
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