@stamhoofd/models 2.39.0 → 2.40.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/AddressFactory.d.ts +3 -4
- package/dist/src/factories/AddressFactory.d.ts.map +1 -1
- package/dist/src/factories/AddressFactory.js +13 -13
- package/dist/src/factories/EmergencyContactFactory.d.ts +3 -4
- package/dist/src/factories/EmergencyContactFactory.d.ts.map +1 -1
- package/dist/src/factories/EmergencyContactFactory.js +27 -27
- package/dist/src/factories/EmergencyContactFactory.js.map +1 -1
- package/dist/src/factories/GroupFactory.d.ts +4 -4
- package/dist/src/factories/GroupFactory.d.ts.map +1 -1
- package/dist/src/factories/GroupFactory.js +8 -8
- package/dist/src/factories/GroupFactory.js.map +1 -1
- package/dist/src/factories/MemberFactory.d.ts +4 -4
- package/dist/src/factories/MemberFactory.d.ts.map +1 -1
- package/dist/src/factories/MemberFactory.js +17 -17
- package/dist/src/factories/MemberFactory.js.map +1 -1
- package/dist/src/factories/OrganizationFactory.d.ts +4 -4
- package/dist/src/factories/OrganizationFactory.js +8 -8
- package/dist/src/factories/OrganizationFactory.js.map +1 -1
- package/dist/src/factories/ParentFactory.d.ts +1 -1
- package/dist/src/factories/ParentFactory.js +19 -19
- package/dist/src/factories/ParentFactory.js.map +1 -1
- package/dist/src/factories/RecordFactory.d.ts +2 -3
- package/dist/src/factories/RecordFactory.d.ts.map +1 -1
- package/dist/src/factories/RecordFactory.js +1 -1
- package/dist/src/factories/RecordFactory.js.map +1 -1
- package/dist/src/factories/RegisterCodeFactory.d.ts +2 -2
- package/dist/src/factories/RegisterCodeFactory.d.ts.map +1 -1
- package/dist/src/factories/RegisterCodeFactory.js +2 -2
- package/dist/src/factories/RegistrationFactory.d.ts +3 -3
- package/dist/src/factories/RegistrationFactory.d.ts.map +1 -1
- package/dist/src/factories/RegistrationFactory.js.map +1 -1
- package/dist/src/factories/RegistrationPeriodFactory.d.ts +2 -2
- package/dist/src/factories/RegistrationPeriodFactory.js.map +1 -1
- package/dist/src/factories/UserFactory.d.ts +3 -3
- package/dist/src/factories/UserFactory.d.ts.map +1 -1
- package/dist/src/factories/UserFactory.js +3 -3
- package/dist/src/factories/UserFactory.js.map +1 -1
- package/dist/src/factories/WebshopFactory.d.ts +4 -4
- package/dist/src/factories/WebshopFactory.d.ts.map +1 -1
- package/dist/src/factories/WebshopFactory.js +1 -1
- package/dist/src/factories/WebshopFactory.js.map +1 -1
- package/dist/src/helpers/DNSValidator.d.ts +1 -1
- package/dist/src/helpers/DNSValidator.d.ts.map +1 -1
- package/dist/src/helpers/DNSValidator.js +33 -33
- package/dist/src/helpers/DNSValidator.js.map +1 -1
- package/dist/src/helpers/EmailBuilder.d.ts +10 -10
- package/dist/src/helpers/EmailBuilder.d.ts.map +1 -1
- package/dist/src/helpers/EmailBuilder.js +34 -34
- package/dist/src/helpers/EmailBuilder.js.map +1 -1
- package/dist/src/helpers/GroupBuilder.d.ts.map +1 -1
- package/dist/src/helpers/GroupBuilder.js +57 -57
- package/dist/src/helpers/GroupBuilder.js.map +1 -1
- package/dist/src/helpers/Handlebars.d.ts.map +1 -1
- package/dist/src/helpers/Handlebars.js +29 -29
- package/dist/src/helpers/Handlebars.js.map +1 -1
- package/dist/src/helpers/MemberMerger.d.ts +1 -1
- package/dist/src/helpers/MemberMerger.d.ts.map +1 -1
- package/dist/src/helpers/MemberMerger.js +33 -33
- package/dist/src/helpers/MemberMerger.js.map +1 -1
- package/dist/src/helpers/MemberMerger.test.js +194 -194
- package/dist/src/helpers/MemberMerger.test.js.map +1 -1
- package/dist/src/helpers/RateLimiter.d.ts.map +1 -1
- package/dist/src/helpers/RateLimiter.js +2 -2
- package/dist/src/helpers/RateLimiter.js.map +1 -1
- package/dist/src/helpers/SetupStepsUpdater.d.ts +22 -0
- package/dist/src/helpers/SetupStepsUpdater.d.ts.map +1 -0
- package/dist/src/helpers/SetupStepsUpdater.js +255 -0
- package/dist/src/helpers/SetupStepsUpdater.js.map +1 -0
- package/dist/src/helpers/WebshopCounter.d.ts +1 -1
- package/dist/src/helpers/WebshopCounter.d.ts.map +1 -1
- package/dist/src/helpers/WebshopCounter.js +1 -1
- package/dist/src/helpers/WebshopCounter.js.map +1 -1
- package/dist/src/helpers/WebshopCounter.test.js +6 -6
- package/dist/src/helpers/WebshopCounter.test.js.map +1 -1
- package/dist/src/index.d.ts +20 -19
- 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 +12 -12
- package/dist/src/migrations/1605262046-import-postcodes-nl.js +10 -10
- package/dist/src/models/BalanceItem.d.ts.map +1 -1
- package/dist/src/models/BalanceItem.js +37 -37
- package/dist/src/models/BalanceItem.js.map +1 -1
- package/dist/src/models/BalanceItemPayment.d.ts.map +1 -1
- package/dist/src/models/BalanceItemPayment.js +13 -13
- package/dist/src/models/BalanceItemPayment.js.map +1 -1
- package/dist/src/models/BuckarooPayment.d.ts +1 -1
- package/dist/src/models/BuckarooPayment.d.ts.map +1 -1
- package/dist/src/models/BuckarooPayment.js +5 -5
- package/dist/src/models/BuckarooPayment.js.map +1 -1
- package/dist/src/models/CachedOutstandingBalance.d.ts.map +1 -1
- package/dist/src/models/CachedOutstandingBalance.js +37 -37
- package/dist/src/models/CachedOutstandingBalance.js.map +1 -1
- package/dist/src/models/Document.d.ts +4 -4
- package/dist/src/models/Document.d.ts.map +1 -1
- package/dist/src/models/Document.js +27 -27
- package/dist/src/models/Document.js.map +1 -1
- package/dist/src/models/DocumentTemplate.d.ts +4 -4
- package/dist/src/models/DocumentTemplate.d.ts.map +1 -1
- package/dist/src/models/DocumentTemplate.js +72 -72
- 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 +63 -64
- package/dist/src/models/Email.js.map +1 -1
- package/dist/src/models/EmailRecipient.d.ts.map +1 -1
- package/dist/src/models/EmailRecipient.js +20 -20
- package/dist/src/models/EmailRecipient.js.map +1 -1
- package/dist/src/models/EmailTemplate.d.ts +3 -3
- package/dist/src/models/EmailTemplate.d.ts.map +1 -1
- package/dist/src/models/EmailTemplate.js +16 -16
- package/dist/src/models/EmailTemplate.js.map +1 -1
- package/dist/src/models/EmailVerificationCode.d.ts +2 -2
- package/dist/src/models/EmailVerificationCode.d.ts.map +1 -1
- package/dist/src/models/EmailVerificationCode.js +57 -55
- package/dist/src/models/EmailVerificationCode.js.map +1 -1
- package/dist/src/models/Event.d.ts +2 -2
- package/dist/src/models/Event.d.ts.map +1 -1
- package/dist/src/models/Event.js +15 -15
- package/dist/src/models/Event.js.map +1 -1
- package/dist/src/models/Group.d.ts +3 -1
- package/dist/src/models/Group.d.ts.map +1 -1
- package/dist/src/models/Group.js +46 -35
- package/dist/src/models/Group.js.map +1 -1
- package/dist/src/models/Image.d.ts +1 -1
- package/dist/src/models/Image.d.ts.map +1 -1
- package/dist/src/models/Image.js +26 -26
- package/dist/src/models/Image.js.map +1 -1
- package/dist/src/models/Member.d.ts +8 -8
- package/dist/src/models/Member.d.ts.map +1 -1
- package/dist/src/models/Member.js +60 -60
- package/dist/src/models/Member.js.map +1 -1
- package/dist/src/models/MemberPlatformMembership.d.ts +3 -3
- package/dist/src/models/MemberPlatformMembership.d.ts.map +1 -1
- package/dist/src/models/MemberPlatformMembership.js +26 -26
- package/dist/src/models/MemberPlatformMembership.js.map +1 -1
- package/dist/src/models/MemberResponsibilityRecord.d.ts.map +1 -1
- package/dist/src/models/MemberResponsibilityRecord.js +13 -13
- package/dist/src/models/MemberResponsibilityRecord.js.map +1 -1
- package/dist/src/models/MergedMember.d.ts +3 -3
- package/dist/src/models/MergedMember.d.ts.map +1 -1
- package/dist/src/models/MergedMember.js +19 -19
- package/dist/src/models/MergedMember.js.map +1 -1
- package/dist/src/models/MolliePayment.d.ts +1 -1
- package/dist/src/models/MolliePayment.d.ts.map +1 -1
- package/dist/src/models/MolliePayment.js +5 -5
- package/dist/src/models/MolliePayment.js.map +1 -1
- package/dist/src/models/MollieToken.d.ts.map +1 -1
- package/dist/src/models/MollieToken.js +60 -60
- package/dist/src/models/MollieToken.js.map +1 -1
- package/dist/src/models/OneTimeToken.d.ts +2 -2
- package/dist/src/models/OneTimeToken.d.ts.map +1 -1
- package/dist/src/models/OneTimeToken.js +13 -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 +70 -70
- package/dist/src/models/Order.js.map +1 -1
- package/dist/src/models/Organization.d.ts +5 -5
- package/dist/src/models/Organization.d.ts.map +1 -1
- package/dist/src/models/Organization.js +127 -127
- package/dist/src/models/Organization.js.map +1 -1
- package/dist/src/models/OrganizationRegistrationPeriod.d.ts.map +1 -1
- package/dist/src/models/OrganizationRegistrationPeriod.js +15 -15
- package/dist/src/models/OrganizationRegistrationPeriod.js.map +1 -1
- package/dist/src/models/PasswordToken.d.ts +3 -3
- package/dist/src/models/PasswordToken.d.ts.map +1 -1
- package/dist/src/models/PasswordToken.js +17 -17
- package/dist/src/models/PasswordToken.js.map +1 -1
- package/dist/src/models/PayconiqPayment.d.ts +1 -1
- package/dist/src/models/PayconiqPayment.d.ts.map +1 -1
- package/dist/src/models/PayconiqPayment.js +49 -49
- package/dist/src/models/PayconiqPayment.js.map +1 -1
- package/dist/src/models/Payment.d.ts +3 -3
- package/dist/src/models/Payment.d.ts.map +1 -1
- package/dist/src/models/Payment.js +36 -36
- package/dist/src/models/Payment.js.map +1 -1
- package/dist/src/models/Platform.d.ts +2 -2
- package/dist/src/models/Platform.d.ts.map +1 -1
- package/dist/src/models/Platform.js +8 -8
- package/dist/src/models/Platform.js.map +1 -1
- package/dist/src/models/RegisterCode.d.ts +1 -1
- package/dist/src/models/RegisterCode.d.ts.map +1 -1
- package/dist/src/models/RegisterCode.js +11 -11
- package/dist/src/models/RegisterCode.js.map +1 -1
- package/dist/src/models/Registration.d.ts +1 -1
- package/dist/src/models/Registration.d.ts.map +1 -1
- package/dist/src/models/Registration.js +88 -88
- package/dist/src/models/Registration.js.map +1 -1
- package/dist/src/models/RegistrationPeriod.d.ts.map +1 -1
- package/dist/src/models/RegistrationPeriod.js +12 -12
- package/dist/src/models/RegistrationPeriod.js.map +1 -1
- package/dist/src/models/STCredit.d.ts +1 -1
- package/dist/src/models/STCredit.d.ts.map +1 -1
- package/dist/src/models/STCredit.js +12 -12
- package/dist/src/models/STCredit.js.map +1 -1
- package/dist/src/models/STInvoice.d.ts +1 -1
- package/dist/src/models/STInvoice.d.ts.map +1 -1
- package/dist/src/models/STInvoice.js +16 -16
- package/dist/src/models/STInvoice.js.map +1 -1
- package/dist/src/models/STPackage.d.ts +1 -1
- package/dist/src/models/STPackage.d.ts.map +1 -1
- package/dist/src/models/STPackage.js +39 -39
- package/dist/src/models/STPackage.js.map +1 -1
- package/dist/src/models/STPendingInvoice.d.ts +1 -1
- package/dist/src/models/STPendingInvoice.d.ts.map +1 -1
- package/dist/src/models/STPendingInvoice.js +11 -11
- package/dist/src/models/STPendingInvoice.js.map +1 -1
- package/dist/src/models/StripeAccount.d.ts.map +1 -1
- package/dist/src/models/StripeAccount.js +13 -13
- package/dist/src/models/StripeAccount.js.map +1 -1
- package/dist/src/models/StripeCheckoutSession.d.ts +1 -1
- package/dist/src/models/StripeCheckoutSession.d.ts.map +1 -1
- package/dist/src/models/StripeCheckoutSession.js +7 -7
- package/dist/src/models/StripeCheckoutSession.js.map +1 -1
- package/dist/src/models/StripePaymentIntent.d.ts +1 -1
- package/dist/src/models/StripePaymentIntent.d.ts.map +1 -1
- package/dist/src/models/StripePaymentIntent.js +7 -7
- package/dist/src/models/StripePaymentIntent.js.map +1 -1
- package/dist/src/models/Ticket.d.ts +2 -2
- package/dist/src/models/Ticket.d.ts.map +1 -1
- package/dist/src/models/Ticket.js +23 -23
- package/dist/src/models/Ticket.js.map +1 -1
- package/dist/src/models/Token.d.ts +3 -3
- package/dist/src/models/Token.d.ts.map +1 -1
- package/dist/src/models/Token.js +27 -27
- package/dist/src/models/Token.js.map +1 -1
- package/dist/src/models/Token.test.js +11 -11
- package/dist/src/models/UsedRegisterCode.d.ts +1 -1
- package/dist/src/models/UsedRegisterCode.d.ts.map +1 -1
- package/dist/src/models/UsedRegisterCode.js +10 -10
- package/dist/src/models/UsedRegisterCode.js.map +1 -1
- package/dist/src/models/User.d.ts +4 -4
- package/dist/src/models/User.d.ts.map +1 -1
- package/dist/src/models/User.js +53 -51
- package/dist/src/models/User.js.map +1 -1
- package/dist/src/models/UserPermissions.d.ts +3 -3
- package/dist/src/models/UserPermissions.d.ts.map +1 -1
- package/dist/src/models/UserPermissions.js +12 -12
- package/dist/src/models/UserPermissions.js.map +1 -1
- package/dist/src/models/Webshop.d.ts +1 -1
- package/dist/src/models/Webshop.d.ts.map +1 -1
- package/dist/src/models/Webshop.js +23 -23
- package/dist/src/models/Webshop.js.map +1 -1
- package/dist/src/models/WebshopDiscountCode.d.ts +1 -1
- package/dist/src/models/WebshopDiscountCode.d.ts.map +1 -1
- package/dist/src/models/WebshopDiscountCode.js +16 -16
- package/dist/src/models/WebshopDiscountCode.js.map +1 -1
- package/dist/src/models/addresses/City.d.ts.map +1 -1
- package/dist/src/models/addresses/City.js +9 -9
- package/dist/src/models/addresses/City.js.map +1 -1
- package/dist/src/models/addresses/PostalCode.d.ts.map +1 -1
- package/dist/src/models/addresses/PostalCode.js +11 -11
- package/dist/src/models/addresses/PostalCode.js.map +1 -1
- package/dist/src/models/addresses/PostalCode.test.js +22 -22
- package/dist/src/models/addresses/PostalCode.test.js.map +1 -1
- package/dist/src/models/addresses/Province.d.ts.map +1 -1
- package/dist/src/models/addresses/Province.js +5 -5
- package/dist/src/models/addresses/Province.js.map +1 -1
- package/dist/src/models/addresses/Street.d.ts.map +1 -1
- package/dist/src/models/addresses/Street.js +6 -6
- package/dist/src/models/addresses/Street.js.map +1 -1
- package/dist/src/models/index.d.ts +46 -46
- package/dist/src/models/index.d.ts.map +1 -1
- package/dist/src/models/index.js +0 -1
- package/dist/src/models/index.js.map +1 -1
- package/dist/src/structures/OrganizationServerMetaData.d.ts.map +1 -1
- package/dist/src/structures/OrganizationServerMetaData.js +4 -4
- package/dist/src/structures/OrganizationServerMetaData.js.map +1 -1
- package/dist/tests/jest.global.setup.d.ts.map +1 -1
- package/dist/tests/jest.global.setup.js +15 -13
- package/dist/tests/jest.global.setup.js.map +1 -1
- package/dist/tests/jest.setup.js +3 -1
- package/dist/tests/jest.setup.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +3 -3
- package/src/factories/AddressFactory.ts +17 -17
- package/src/factories/EmergencyContactFactory.ts +30 -31
- package/src/factories/GroupFactory.ts +30 -30
- package/src/factories/MemberFactory.ts +41 -38
- package/src/factories/OrganizationFactory.ts +15 -15
- package/src/factories/ParentFactory.ts +24 -24
- package/src/factories/RecordFactory.ts +5 -4
- package/src/factories/RegisterCodeFactory.ts +7 -7
- package/src/factories/RegistrationFactory.ts +16 -16
- package/src/factories/RegistrationPeriodFactory.ts +5 -5
- package/src/factories/UserFactory.ts +20 -19
- package/src/factories/WebshopFactory.ts +14 -14
- package/src/helpers/DNSValidator.ts +89 -84
- package/src/helpers/EmailBuilder.ts +141 -135
- package/src/helpers/GroupBuilder.ts +181 -181
- package/src/helpers/Handlebars.ts +57 -54
- package/src/helpers/MemberMerger.test.ts +702 -702
- package/src/helpers/MemberMerger.ts +83 -77
- package/src/helpers/RateLimiter.ts +25 -27
- package/src/helpers/SetupStepsUpdater.ts +402 -0
- package/src/helpers/WebshopCounter.test.ts +12 -12
- package/src/helpers/WebshopCounter.ts +20 -19
- package/src/index.ts +20 -19
- package/src/migrations/1605262045-import-postcodes.ts +59 -63
- package/src/migrations/1605262046-import-postcodes-nl.ts +41 -43
- package/src/models/BalanceItem.ts +173 -172
- package/src/models/BalanceItemPayment.ts +32 -33
- package/src/models/BuckarooPayment.ts +7 -7
- package/src/models/CachedOutstandingBalance.ts +98 -99
- package/src/models/Document.ts +90 -87
- package/src/models/DocumentTemplate.ts +207 -198
- package/src/models/Email.ts +198 -200
- package/src/models/EmailRecipient.ts +38 -39
- package/src/models/EmailTemplate.ts +36 -37
- package/src/models/EmailVerificationCode.ts +146 -142
- package/src/models/Event.ts +53 -53
- package/src/models/Group.ts +136 -123
- package/src/models/Image.ts +48 -48
- package/src/models/Member.ts +277 -275
- package/src/models/MemberPlatformMembership.ts +71 -71
- package/src/models/MemberResponsibilityRecord.ts +32 -32
- package/src/models/MergedMember.ts +77 -77
- package/src/models/MolliePayment.ts +7 -7
- package/src/models/MollieToken.ts +131 -126
- package/src/models/OneTimeToken.ts +40 -39
- package/src/models/Order.ts +379 -372
- package/src/models/Organization.ts +332 -325
- package/src/models/OrganizationRegistrationPeriod.ts +50 -50
- package/src/models/PasswordToken.ts +42 -42
- package/src/models/PayconiqPayment.ts +80 -76
- package/src/models/Payment.ts +86 -86
- package/src/models/Platform.ts +21 -22
- package/src/models/RegisterCode.ts +26 -26
- package/src/models/Registration.ts +167 -168
- package/src/models/RegistrationPeriod.ts +29 -29
- package/src/models/STCredit.ts +24 -25
- package/src/models/STInvoice.ts +34 -34
- package/src/models/STPackage.ts +143 -136
- package/src/models/STPendingInvoice.ts +26 -26
- package/src/models/StripeAccount.ts +27 -27
- package/src/models/StripeCheckoutSession.ts +10 -10
- package/src/models/StripePaymentIntent.ts +10 -10
- package/src/models/Ticket.ts +51 -52
- package/src/models/Token.test.ts +13 -13
- package/src/models/Token.ts +64 -63
- package/src/models/UsedRegisterCode.ts +20 -21
- package/src/models/User.ts +148 -144
- package/src/models/UserPermissions.ts +25 -28
- package/src/models/Webshop.ts +53 -53
- package/src/models/WebshopDiscountCode.ts +33 -33
- package/src/models/addresses/City.ts +12 -12
- package/src/models/addresses/PostalCode.test.ts +68 -69
- package/src/models/addresses/PostalCode.ts +57 -57
- package/src/models/addresses/Province.ts +8 -8
- package/src/models/addresses/Street.ts +10 -12
- package/src/models/index.ts +54 -55
- package/src/structures/OrganizationServerMetaData.ts +36 -36
|
@@ -15,7 +15,7 @@ const EmailBuilder_1 = require("../helpers/EmailBuilder");
|
|
|
15
15
|
const OrganizationServerMetaData_1 = require("../structures/OrganizationServerMetaData");
|
|
16
16
|
const _1 = require("./");
|
|
17
17
|
class Organization extends simple_database_1.Model {
|
|
18
|
-
static table =
|
|
18
|
+
static table = 'organizations';
|
|
19
19
|
id;
|
|
20
20
|
name;
|
|
21
21
|
/// URL to a website page or a Facebook page (including http)
|
|
@@ -48,7 +48,7 @@ class Organization extends simple_database_1.Model {
|
|
|
48
48
|
* Return default locale confiruation
|
|
49
49
|
*/
|
|
50
50
|
get i18n() {
|
|
51
|
-
return new backend_i18n_1.I18n(
|
|
51
|
+
return new backend_i18n_1.I18n('nl', this.address.country);
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
54
54
|
* Makes sure empty name is replaced with organization name
|
|
@@ -69,18 +69,18 @@ class Organization extends simple_database_1.Model {
|
|
|
69
69
|
static async getByEmail(email) {
|
|
70
70
|
if (email.startsWith('noreply-')) {
|
|
71
71
|
// Trim
|
|
72
|
-
email = email.substring(
|
|
72
|
+
email = email.substring('noreply-'.length);
|
|
73
73
|
}
|
|
74
74
|
for (const domain of [
|
|
75
75
|
...Object.values(STAMHOOFD.domains.defaultBroadcastEmail ?? {}),
|
|
76
76
|
...Object.values(STAMHOOFD.domains.defaultTransactionalEmail ?? {}),
|
|
77
77
|
]) {
|
|
78
|
-
if (email.endsWith(
|
|
79
|
-
const uri = email.substring(0, email.length - (
|
|
78
|
+
if (email.endsWith('@' + domain)) {
|
|
79
|
+
const uri = email.substring(0, email.length - ('@' + domain).length);
|
|
80
80
|
return await Organization.getByURI(uri);
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
|
-
const at = email.indexOf(
|
|
83
|
+
const at = email.indexOf('@');
|
|
84
84
|
const domain = email.substring(at + 1);
|
|
85
85
|
const [rows] = await simple_database_1.Database.select(`SELECT ${this.getDefaultSelect()} FROM ${this.table} WHERE privateMeta->"$.value.mailDomain" = ? LIMIT 1`, [domain]);
|
|
86
86
|
if (rows.length == 0) {
|
|
@@ -117,23 +117,23 @@ class Organization extends simple_database_1.Model {
|
|
|
117
117
|
const splitted = host.split('.');
|
|
118
118
|
if (splitted.length < 2) {
|
|
119
119
|
throw new simple_errors_1.SimpleError({
|
|
120
|
-
code:
|
|
121
|
-
message:
|
|
120
|
+
code: 'invalid_host',
|
|
121
|
+
message: 'Please specify the organization in the hostname',
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
124
|
const id = splitted[0];
|
|
125
125
|
const organization = await this.getByID(id);
|
|
126
126
|
if (!organization) {
|
|
127
127
|
throw new simple_errors_1.SimpleError({
|
|
128
|
-
code:
|
|
129
|
-
message:
|
|
128
|
+
code: 'invalid_organization',
|
|
129
|
+
message: 'No organization known for host ' + host,
|
|
130
130
|
});
|
|
131
131
|
}
|
|
132
132
|
if (!organization.active && !options?.allowInactive) {
|
|
133
133
|
throw new simple_errors_1.SimpleError({
|
|
134
|
-
code:
|
|
135
|
-
message:
|
|
136
|
-
human: 'Deze groep is gearchiveerd'
|
|
134
|
+
code: 'archived',
|
|
135
|
+
message: 'This organization is archived',
|
|
136
|
+
human: 'Deze groep is gearchiveerd',
|
|
137
137
|
});
|
|
138
138
|
}
|
|
139
139
|
return organization;
|
|
@@ -144,8 +144,8 @@ class Organization extends simple_database_1.Model {
|
|
|
144
144
|
getHost(i18n) {
|
|
145
145
|
if (this.registerDomain) {
|
|
146
146
|
let d = this.registerDomain;
|
|
147
|
-
if (i18n && i18n.language
|
|
148
|
-
d +=
|
|
147
|
+
if (i18n && i18n.language !== this.i18n.language) {
|
|
148
|
+
d += '/' + i18n.language;
|
|
149
149
|
}
|
|
150
150
|
return d;
|
|
151
151
|
}
|
|
@@ -155,21 +155,21 @@ class Organization extends simple_database_1.Model {
|
|
|
155
155
|
if (!STAMHOOFD.domains.registration) {
|
|
156
156
|
return STAMHOOFD.domains.dashboard + '/' + (i18n?.locale ?? this.i18n.locale) + '/leden/' + this.uri;
|
|
157
157
|
}
|
|
158
|
-
let defaultDomain = STAMHOOFD.domains.registration[this.address.country] ?? STAMHOOFD.domains.registration[
|
|
159
|
-
if (i18n && i18n.language
|
|
160
|
-
defaultDomain +=
|
|
158
|
+
let defaultDomain = STAMHOOFD.domains.registration[this.address.country] ?? STAMHOOFD.domains.registration[''];
|
|
159
|
+
if (i18n && i18n.language !== this.i18n.language) {
|
|
160
|
+
defaultDomain += '/' + i18n.language;
|
|
161
161
|
}
|
|
162
|
-
return this.uri +
|
|
162
|
+
return this.uri + '.' + defaultDomain;
|
|
163
163
|
}
|
|
164
164
|
get marketingDomain() {
|
|
165
|
-
return STAMHOOFD.domains.marketing[this.address.country] ?? STAMHOOFD.domains.marketing[
|
|
165
|
+
return STAMHOOFD.domains.marketing[this.address.country] ?? STAMHOOFD.domains.marketing[''];
|
|
166
166
|
}
|
|
167
167
|
getApiHost() {
|
|
168
168
|
const defaultDomain = STAMHOOFD.domains.api;
|
|
169
169
|
if (!defaultDomain) {
|
|
170
|
-
throw new Error(
|
|
170
|
+
throw new Error('Missing hostname in environment');
|
|
171
171
|
}
|
|
172
|
-
return this.id +
|
|
172
|
+
return this.id + '.' + defaultDomain;
|
|
173
173
|
}
|
|
174
174
|
_cachedPeriod;
|
|
175
175
|
async getPeriod() {
|
|
@@ -218,13 +218,13 @@ class Organization extends simple_database_1.Model {
|
|
|
218
218
|
// Check initial status
|
|
219
219
|
let isValidRecords = true;
|
|
220
220
|
for (const record of organization.privateMeta.dnsRecords) {
|
|
221
|
-
if (record.status
|
|
221
|
+
if (record.status !== structures_1.DNSRecordStatus.Valid) {
|
|
222
222
|
isValidRecords = false;
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
225
|
const { allValid } = await (0, DNSValidator_1.validateDNSRecords)(organization.privateMeta.dnsRecords);
|
|
226
226
|
if (organization.registerDomain ?? organization.privateMeta.pendingRegisterDomain) {
|
|
227
|
-
const registerDomainRecord = (organization.privateMeta.pendingRegisterDomain ?? organization.registerDomain) +
|
|
227
|
+
const registerDomainRecord = (organization.privateMeta.pendingRegisterDomain ?? organization.registerDomain) + '.';
|
|
228
228
|
const records = organization.privateMeta.dnsRecords.filter(r => r.name === registerDomainRecord);
|
|
229
229
|
const areRegisterDomainRecordsValid = records.length === 0 || records.every(r => r.status === structures_1.DNSRecordStatus.Valid);
|
|
230
230
|
if (areRegisterDomainRecordsValid) {
|
|
@@ -232,7 +232,7 @@ class Organization extends simple_database_1.Model {
|
|
|
232
232
|
if (organization.privateMeta.pendingRegisterDomain !== null) {
|
|
233
233
|
organization.registerDomain = organization.privateMeta.pendingRegisterDomain;
|
|
234
234
|
organization.privateMeta.pendingRegisterDomain = null;
|
|
235
|
-
console.log(
|
|
235
|
+
console.log('Did set register domain for ' + this.id + ' to ' + organization.registerDomain);
|
|
236
236
|
}
|
|
237
237
|
}
|
|
238
238
|
else {
|
|
@@ -241,7 +241,7 @@ class Organization extends simple_database_1.Model {
|
|
|
241
241
|
// We need to clear it, to prevent sending e-mails with invalid links
|
|
242
242
|
organization.privateMeta.pendingRegisterDomain = organization.privateMeta.pendingRegisterDomain ?? organization.registerDomain;
|
|
243
243
|
organization.registerDomain = null;
|
|
244
|
-
console.log(
|
|
244
|
+
console.log('Cleared register domain for ' + this.id + ' because of invalid non txt records');
|
|
245
245
|
}
|
|
246
246
|
}
|
|
247
247
|
}
|
|
@@ -263,7 +263,7 @@ class Organization extends simple_database_1.Model {
|
|
|
263
263
|
console.warn('DNS settings became stable for ' + this.name + ' ' + this.id);
|
|
264
264
|
await this.sendEmailTemplate({
|
|
265
265
|
type: structures_1.EmailTemplateType.OrganizationStableDNS,
|
|
266
|
-
bcc: true
|
|
266
|
+
bcc: true,
|
|
267
267
|
});
|
|
268
268
|
}
|
|
269
269
|
else if (!wasActive && this.privateMeta.mailDomainActive && (!didSendDomainSetupMail || didSendWarning) && !organization.serverMeta.isDNSUnstable) {
|
|
@@ -271,12 +271,12 @@ class Organization extends simple_database_1.Model {
|
|
|
271
271
|
await organization.save();
|
|
272
272
|
if (!didSendDomainSetupMail) {
|
|
273
273
|
await this.sendEmailTemplate({
|
|
274
|
-
type: structures_1.EmailTemplateType.OrganizationDNSSetupComplete
|
|
274
|
+
type: structures_1.EmailTemplateType.OrganizationDNSSetupComplete,
|
|
275
275
|
});
|
|
276
276
|
}
|
|
277
277
|
else {
|
|
278
278
|
await this.sendEmailTemplate({
|
|
279
|
-
type: structures_1.EmailTemplateType.OrganizationValidDNS
|
|
279
|
+
type: structures_1.EmailTemplateType.OrganizationValidDNS,
|
|
280
280
|
});
|
|
281
281
|
}
|
|
282
282
|
}
|
|
@@ -298,42 +298,42 @@ class Organization extends simple_database_1.Model {
|
|
|
298
298
|
console.warn('DNS settings became instable for ' + this.name + ' ' + this.id);
|
|
299
299
|
await this.sendEmailTemplate({
|
|
300
300
|
type: structures_1.EmailTemplateType.OrganizationUnstableDNS,
|
|
301
|
-
bcc: true
|
|
301
|
+
bcc: true,
|
|
302
302
|
});
|
|
303
303
|
}
|
|
304
304
|
else if (!organization.serverMeta.isDNSUnstable && organization.serverMeta.didSendDomainSetupMail && organization.serverMeta.DNSRecordWarningCount == 0) {
|
|
305
305
|
organization.serverMeta.DNSRecordWarningCount += 1;
|
|
306
306
|
await organization.save();
|
|
307
307
|
await this.sendEmailTemplate({
|
|
308
|
-
type: structures_1.EmailTemplateType.OrganizationInvalidDNS
|
|
308
|
+
type: structures_1.EmailTemplateType.OrganizationInvalidDNS,
|
|
309
309
|
});
|
|
310
310
|
}
|
|
311
311
|
}
|
|
312
312
|
}
|
|
313
313
|
async sendEmailTemplate(data) {
|
|
314
314
|
const recipients = await this.getAdminRecipients();
|
|
315
|
-
const defaultI18n = new backend_i18n_1.I18n(
|
|
315
|
+
const defaultI18n = new backend_i18n_1.I18n('nl', structures_1.Country.Belgium);
|
|
316
316
|
const i18n = this.i18n;
|
|
317
317
|
const replaceAll = [
|
|
318
318
|
{
|
|
319
319
|
from: defaultI18n.localizedDomains.marketing(),
|
|
320
|
-
to: i18n.localizedDomains.marketing()
|
|
320
|
+
to: i18n.localizedDomains.marketing(),
|
|
321
321
|
},
|
|
322
322
|
{
|
|
323
|
-
from: defaultI18n.$t(
|
|
324
|
-
to: i18n.$t(
|
|
323
|
+
from: defaultI18n.$t('59b85264-c4c3-4cf6-8923-9b43282b2787'),
|
|
324
|
+
to: i18n.$t('59b85264-c4c3-4cf6-8923-9b43282b2787'),
|
|
325
325
|
},
|
|
326
326
|
{
|
|
327
|
-
from: defaultI18n.$t(
|
|
328
|
-
to: i18n.$t(
|
|
329
|
-
}
|
|
327
|
+
from: defaultI18n.$t('6b3555a2-ace4-4f37-a1fd-18921552f2b5'),
|
|
328
|
+
to: i18n.$t('6b3555a2-ace4-4f37-a1fd-18921552f2b5'),
|
|
329
|
+
},
|
|
330
330
|
];
|
|
331
331
|
// Create e-mail builder
|
|
332
332
|
const builder = await (0, EmailBuilder_1.getEmailBuilderForTemplate)(this, {
|
|
333
333
|
replaceAll,
|
|
334
334
|
recipients,
|
|
335
335
|
template: {
|
|
336
|
-
type: data.type
|
|
336
|
+
type: data.type,
|
|
337
337
|
},
|
|
338
338
|
from: data.personal ? email_1.Email.getPersonalEmailFor(this.i18n) : email_1.Email.getInternalEmailFor(this.i18n),
|
|
339
339
|
singleBcc: data.bcc ? 'simon@stamhoofd.be' : undefined,
|
|
@@ -342,11 +342,11 @@ class Organization extends simple_database_1.Model {
|
|
|
342
342
|
defaultReplacements: [
|
|
343
343
|
structures_1.Replacement.create({
|
|
344
344
|
token: 'mailDomain',
|
|
345
|
-
value: this.privateMeta.mailDomain ?? this.privateMeta.pendingMailDomain ?? ''
|
|
346
|
-
})
|
|
345
|
+
value: this.privateMeta.mailDomain ?? this.privateMeta.pendingMailDomain ?? '',
|
|
346
|
+
}),
|
|
347
347
|
],
|
|
348
348
|
unsubscribeType: 'marketing',
|
|
349
|
-
fromStamhoofd: true
|
|
349
|
+
fromStamhoofd: true,
|
|
350
350
|
});
|
|
351
351
|
if (builder) {
|
|
352
352
|
email_1.Email.schedule(builder);
|
|
@@ -354,10 +354,10 @@ class Organization extends simple_database_1.Model {
|
|
|
354
354
|
}
|
|
355
355
|
async deleteAWSMailIdenitity(mailDomain) {
|
|
356
356
|
// Protect specific domain names
|
|
357
|
-
if ([
|
|
357
|
+
if (['stamhoofd.be', 'stamhoofd.nl', 'stamhoofd.shop', 'stamhoofd.app', 'stamhoofd.email'].includes(mailDomain)) {
|
|
358
358
|
return;
|
|
359
359
|
}
|
|
360
|
-
if (STAMHOOFD.environment
|
|
360
|
+
if (STAMHOOFD.environment !== 'production') {
|
|
361
361
|
// Temporary ignore this
|
|
362
362
|
return;
|
|
363
363
|
}
|
|
@@ -367,22 +367,22 @@ class Organization extends simple_database_1.Model {
|
|
|
367
367
|
let existing = undefined;
|
|
368
368
|
try {
|
|
369
369
|
existing = await sesv2.getEmailIdentity({
|
|
370
|
-
EmailIdentity: mailDomain
|
|
370
|
+
EmailIdentity: mailDomain,
|
|
371
371
|
}).promise();
|
|
372
372
|
exists = true;
|
|
373
373
|
// Check if DKIM keys are the same
|
|
374
374
|
if (existing.VerifiedForSendingStatus === true) {
|
|
375
|
-
console.log(
|
|
375
|
+
console.log('Cant delete AWS mail idenitiy @' + this.id + ' for ' + mailDomain + ': already validated and might be in use by other organizations');
|
|
376
376
|
return;
|
|
377
377
|
}
|
|
378
|
-
console.log(
|
|
378
|
+
console.log('Deleting AWS mail idenitiy @' + this.id + ' for ' + mailDomain);
|
|
379
379
|
await sesv2.deleteEmailIdentity({
|
|
380
|
-
EmailIdentity: mailDomain
|
|
380
|
+
EmailIdentity: mailDomain,
|
|
381
381
|
}).promise();
|
|
382
|
-
console.log(
|
|
382
|
+
console.log('Deleted AWS mail idenitiy @' + this.id + ' for ' + this.privateMeta.mailDomain);
|
|
383
383
|
}
|
|
384
384
|
catch (e) {
|
|
385
|
-
console.error(
|
|
385
|
+
console.error('Could not delete AWS email identitiy @' + this.id + ' for ' + this.privateMeta.mailDomain);
|
|
386
386
|
console.error(e);
|
|
387
387
|
}
|
|
388
388
|
}
|
|
@@ -394,12 +394,12 @@ class Organization extends simple_database_1.Model {
|
|
|
394
394
|
return;
|
|
395
395
|
}
|
|
396
396
|
// Protect specific domain names
|
|
397
|
-
if ([
|
|
398
|
-
console.error(
|
|
397
|
+
if (['stamhoofd.be', 'stamhoofd.nl', 'stamhoofd.shop', 'stamhoofd.app', 'stamhoofd.email'].includes(this.privateMeta.mailDomain)) {
|
|
398
|
+
console.error('Tried to validate AWS mail identity with protected domains @' + this.id);
|
|
399
399
|
this.privateMeta.mailDomainActive = false;
|
|
400
400
|
return;
|
|
401
401
|
}
|
|
402
|
-
if (STAMHOOFD.environment
|
|
402
|
+
if (STAMHOOFD.environment !== 'production') {
|
|
403
403
|
// Temporary ignore this
|
|
404
404
|
this.privateMeta.mailDomainActive = true;
|
|
405
405
|
return;
|
|
@@ -410,24 +410,24 @@ class Organization extends simple_database_1.Model {
|
|
|
410
410
|
let existing = undefined;
|
|
411
411
|
try {
|
|
412
412
|
existing = await sesv2.getEmailIdentity({
|
|
413
|
-
EmailIdentity: this.privateMeta.mailDomain
|
|
413
|
+
EmailIdentity: this.privateMeta.mailDomain,
|
|
414
414
|
}).promise();
|
|
415
415
|
exists = true;
|
|
416
|
-
console.log(
|
|
417
|
-
if (existing.ConfigurationSetName !==
|
|
416
|
+
console.log('AWS mail idenitiy exists already: just checking the verification status in AWS @' + this.id);
|
|
417
|
+
if (existing.ConfigurationSetName !== 'stamhoofd-domains') {
|
|
418
418
|
// Not allowed to use this identity
|
|
419
419
|
this.privateMeta.mailDomainActive = false;
|
|
420
|
-
console.error(
|
|
420
|
+
console.error('Organization is not allowed to use email identity ' + this.privateMeta.mailDomain + ' @' + this.id + ', got ' + existing.ConfigurationSetName);
|
|
421
421
|
return;
|
|
422
422
|
}
|
|
423
423
|
this.privateMeta.mailDomainActive = existing.VerifiedForSendingStatus ?? false;
|
|
424
424
|
if (existing.VerifiedForSendingStatus !== true) {
|
|
425
|
-
console.error(
|
|
425
|
+
console.error('Not validated @' + this.id);
|
|
426
426
|
}
|
|
427
|
-
if (existing.VerifiedForSendingStatus !== true && existing.DkimAttributes?.Status ===
|
|
428
|
-
console.error(
|
|
427
|
+
if (existing.VerifiedForSendingStatus !== true && existing.DkimAttributes?.Status === 'FAILED') {
|
|
428
|
+
console.error('AWS failed to verify DKIM records. Triggering a forced recheck @' + this.id);
|
|
429
429
|
await sesv2.deleteEmailIdentity({
|
|
430
|
-
EmailIdentity: this.privateMeta.mailDomain
|
|
430
|
+
EmailIdentity: this.privateMeta.mailDomain,
|
|
431
431
|
}).promise();
|
|
432
432
|
// Recreate it immediately
|
|
433
433
|
exists = false;
|
|
@@ -437,39 +437,39 @@ class Organization extends simple_database_1.Model {
|
|
|
437
437
|
console.error(e);
|
|
438
438
|
}
|
|
439
439
|
if (!exists) {
|
|
440
|
-
console.log(
|
|
440
|
+
console.log('Creating email identity in AWS SES...');
|
|
441
441
|
const result = await sesv2.createEmailIdentity({
|
|
442
442
|
EmailIdentity: this.privateMeta.mailDomain,
|
|
443
|
-
ConfigurationSetName:
|
|
443
|
+
ConfigurationSetName: 'stamhoofd-domains',
|
|
444
444
|
DkimSigningAttributes: {
|
|
445
445
|
DomainSigningPrivateKey: this.serverMeta.privateDKIMKey,
|
|
446
|
-
DomainSigningSelector:
|
|
446
|
+
DomainSigningSelector: 'stamhoofd',
|
|
447
447
|
},
|
|
448
448
|
Tags: [
|
|
449
449
|
{
|
|
450
|
-
|
|
451
|
-
|
|
450
|
+
Key: 'OrganizationId',
|
|
451
|
+
Value: this.id,
|
|
452
452
|
},
|
|
453
453
|
{
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
}
|
|
457
|
-
]
|
|
454
|
+
Key: 'Environment',
|
|
455
|
+
Value: STAMHOOFD.environment ?? 'Unknown',
|
|
456
|
+
},
|
|
457
|
+
],
|
|
458
458
|
}).promise();
|
|
459
459
|
this.privateMeta.mailDomainActive = result.VerifiedForSendingStatus ?? false;
|
|
460
460
|
// Disable email forwarding of bounces and complaints
|
|
461
461
|
// We handle this now with the configuration set
|
|
462
462
|
await sesv2.putEmailIdentityFeedbackAttributes({
|
|
463
463
|
EmailIdentity: this.privateMeta.mailDomain,
|
|
464
|
-
EmailForwardingEnabled: false
|
|
464
|
+
EmailForwardingEnabled: false,
|
|
465
465
|
}).promise();
|
|
466
466
|
}
|
|
467
467
|
if (this.privateMeta.mailFromDomain && (!exists || (existing && (!existing.MailFromAttributes || existing.MailFromAttributes.MailFromDomain !== this.privateMeta.mailFromDomain)))) {
|
|
468
468
|
// Also set a from domain, to fix SPF
|
|
469
|
-
console.log(
|
|
469
|
+
console.log('Setting mail from domain: ' + this.privateMeta.mailFromDomain + ' for ' + this.id);
|
|
470
470
|
const params = {
|
|
471
471
|
EmailIdentity: this.privateMeta.mailDomain,
|
|
472
|
-
BehaviorOnMxFailure:
|
|
472
|
+
BehaviorOnMxFailure: 'USE_DEFAULT_VALUE',
|
|
473
473
|
MailFromDomain: this.privateMeta.mailFromDomain,
|
|
474
474
|
};
|
|
475
475
|
await sesv2.putEmailIdentityMailFromAttributes(params).promise();
|
|
@@ -482,7 +482,7 @@ class Organization extends simple_database_1.Model {
|
|
|
482
482
|
if (this.createdAt > days7 && !this.serverMeta.hasEmail(structures_1.EmailTemplateType.OrganizationDripWelcome)) {
|
|
483
483
|
await this.sendEmailTemplate({
|
|
484
484
|
type: structures_1.EmailTemplateType.OrganizationDripWelcome,
|
|
485
|
-
personal: true
|
|
485
|
+
personal: true,
|
|
486
486
|
});
|
|
487
487
|
this.serverMeta.addEmail(structures_1.EmailTemplateType.OrganizationDripWelcome);
|
|
488
488
|
await this.save();
|
|
@@ -496,7 +496,7 @@ class Organization extends simple_database_1.Model {
|
|
|
496
496
|
// 7 days checkin
|
|
497
497
|
await this.sendEmailTemplate({
|
|
498
498
|
type: structures_1.EmailTemplateType.OrganizationDripWebshopTrialCheckin,
|
|
499
|
-
personal: true
|
|
499
|
+
personal: true,
|
|
500
500
|
});
|
|
501
501
|
this.serverMeta.addEmail(structures_1.EmailTemplateType.OrganizationDripWebshopTrialCheckin);
|
|
502
502
|
this.serverMeta.addEmail(structures_1.EmailTemplateType.OrganizationDripMembersTrialCheckin); // also mark members checkin
|
|
@@ -513,7 +513,7 @@ class Organization extends simple_database_1.Model {
|
|
|
513
513
|
// 7 days checkin
|
|
514
514
|
await this.sendEmailTemplate({
|
|
515
515
|
type: structures_1.EmailTemplateType.OrganizationDripMembersTrialCheckin,
|
|
516
|
-
personal: true
|
|
516
|
+
personal: true,
|
|
517
517
|
});
|
|
518
518
|
this.serverMeta.addEmail(structures_1.EmailTemplateType.OrganizationDripMembersTrialCheckin);
|
|
519
519
|
this.serverMeta.addEmail(structures_1.EmailTemplateType.OrganizationDripWebshopTrialCheckin); // Also mark webshop trial checkin
|
|
@@ -529,7 +529,7 @@ class Organization extends simple_database_1.Model {
|
|
|
529
529
|
if (deactivatedTime !== null && deactivatedTime < 14 * 24 * 60 * 60 * 1000 && deactivatedTime > 7 * 24 * 60 * 60 * 1000) {
|
|
530
530
|
await this.sendEmailTemplate({
|
|
531
531
|
type: structures_1.EmailTemplateType.OrganizationDripWebshopTrialExpired,
|
|
532
|
-
personal: true
|
|
532
|
+
personal: true,
|
|
533
533
|
});
|
|
534
534
|
this.serverMeta.addEmail(structures_1.EmailTemplateType.OrganizationDripWebshopTrialExpired);
|
|
535
535
|
this.serverMeta.addEmail(structures_1.EmailTemplateType.OrganizationDripMembersTrialExpired); // also mark members
|
|
@@ -544,7 +544,7 @@ class Organization extends simple_database_1.Model {
|
|
|
544
544
|
if (deactivatedTime !== null && deactivatedTime < 14 * 24 * 60 * 60 * 1000 && deactivatedTime > 7 * 24 * 60 * 60 * 1000) {
|
|
545
545
|
await this.sendEmailTemplate({
|
|
546
546
|
type: structures_1.EmailTemplateType.OrganizationDripMembersTrialExpired,
|
|
547
|
-
personal: true
|
|
547
|
+
personal: true,
|
|
548
548
|
});
|
|
549
549
|
this.serverMeta.addEmail(structures_1.EmailTemplateType.OrganizationDripMembersTrialExpired);
|
|
550
550
|
this.serverMeta.addEmail(structures_1.EmailTemplateType.OrganizationDripWebshopTrialExpired); // also mark webshops
|
|
@@ -563,7 +563,7 @@ class Organization extends simple_database_1.Model {
|
|
|
563
563
|
await this.sendEmailTemplate({
|
|
564
564
|
type: structures_1.EmailTemplateType.OrganizationDripTrialExpiredReminder,
|
|
565
565
|
personal: true,
|
|
566
|
-
bcc: true
|
|
566
|
+
bcc: true,
|
|
567
567
|
});
|
|
568
568
|
this.serverMeta.addEmail(structures_1.EmailTemplateType.OrganizationDripTrialExpiredReminder);
|
|
569
569
|
await this.save();
|
|
@@ -578,7 +578,7 @@ class Organization extends simple_database_1.Model {
|
|
|
578
578
|
await this.sendEmailTemplate({
|
|
579
579
|
type: structures_1.EmailTemplateType.OrganizationDripWebshopNotRenewed,
|
|
580
580
|
personal: true,
|
|
581
|
-
bcc: true
|
|
581
|
+
bcc: true,
|
|
582
582
|
});
|
|
583
583
|
this.serverMeta.addEmail(structures_1.EmailTemplateType.OrganizationDripWebshopNotRenewed);
|
|
584
584
|
await this.save();
|
|
@@ -593,7 +593,7 @@ class Organization extends simple_database_1.Model {
|
|
|
593
593
|
await this.sendEmailTemplate({
|
|
594
594
|
type: structures_1.EmailTemplateType.OrganizationDripMembersNotRenewed,
|
|
595
595
|
personal: true,
|
|
596
|
-
bcc: true
|
|
596
|
+
bcc: true,
|
|
597
597
|
});
|
|
598
598
|
this.serverMeta.addEmail(structures_1.EmailTemplateType.OrganizationDripMembersNotRenewed);
|
|
599
599
|
await this.save();
|
|
@@ -612,8 +612,8 @@ class Organization extends simple_database_1.Model {
|
|
|
612
612
|
return [
|
|
613
613
|
{
|
|
614
614
|
name: sender.name,
|
|
615
|
-
email: sender.email
|
|
616
|
-
}
|
|
615
|
+
email: sender.email,
|
|
616
|
+
},
|
|
617
617
|
];
|
|
618
618
|
}
|
|
619
619
|
return await this.getAdminToEmails();
|
|
@@ -636,10 +636,10 @@ class Organization extends simple_database_1.Model {
|
|
|
636
636
|
*/
|
|
637
637
|
async getAdminToEmails() {
|
|
638
638
|
const filtered = await this.getFullAdmins();
|
|
639
|
-
if (STAMHOOFD.environment ===
|
|
639
|
+
if (STAMHOOFD.environment === 'production') {
|
|
640
640
|
if (filtered.length > 1) {
|
|
641
641
|
// remove stamhoofd email addresses
|
|
642
|
-
const f = filtered.flatMap(f => f.getEmailTo()).filter(e => !e.email.endsWith(
|
|
642
|
+
const f = filtered.flatMap(f => f.getEmailTo()).filter(e => !e.email.endsWith('@stamhoofd.be') && !e.email.endsWith('@stamhoofd.nl'));
|
|
643
643
|
if (f.length > 0) {
|
|
644
644
|
return f;
|
|
645
645
|
}
|
|
@@ -652,23 +652,23 @@ class Organization extends simple_database_1.Model {
|
|
|
652
652
|
*/
|
|
653
653
|
async getAdminRecipients() {
|
|
654
654
|
let filtered = await this.getFullAdmins();
|
|
655
|
-
if (STAMHOOFD.environment ===
|
|
655
|
+
if (STAMHOOFD.environment === 'production') {
|
|
656
656
|
if (filtered.length > 1) {
|
|
657
657
|
// remove stamhoofd email addresses
|
|
658
|
-
filtered = filtered.filter(e => !e.email.endsWith(
|
|
658
|
+
filtered = filtered.filter(e => !e.email.endsWith('@stamhoofd.be') && !e.email.endsWith('@stamhoofd.nl'));
|
|
659
659
|
}
|
|
660
660
|
}
|
|
661
|
-
return filtered.flatMap(f => {
|
|
661
|
+
return filtered.flatMap((f) => {
|
|
662
662
|
return structures_1.Recipient.create({
|
|
663
663
|
firstName: f.firstName,
|
|
664
664
|
lastName: f.lastName,
|
|
665
665
|
email: f.email,
|
|
666
666
|
replacements: [
|
|
667
667
|
structures_1.Replacement.create({
|
|
668
|
-
token:
|
|
669
|
-
value: this.name
|
|
670
|
-
})
|
|
671
|
-
]
|
|
668
|
+
token: 'organizationName',
|
|
669
|
+
value: this.name,
|
|
670
|
+
}),
|
|
671
|
+
],
|
|
672
672
|
});
|
|
673
673
|
});
|
|
674
674
|
}
|
|
@@ -678,9 +678,9 @@ class Organization extends simple_database_1.Model {
|
|
|
678
678
|
getDefaultFrom(i18n, withName = true, type = 'broadcast') {
|
|
679
679
|
const domain = type === 'transactional' ? i18n.localizedDomains.defaultTransactionalEmail() : i18n.localizedDomains.defaultBroadcastEmail();
|
|
680
680
|
if (!withName) {
|
|
681
|
-
return ('noreply-' + this.uri +
|
|
681
|
+
return ('noreply-' + this.uri + '@' + domain);
|
|
682
682
|
}
|
|
683
|
-
return '"' + this.name.replaceAll("
|
|
683
|
+
return '"' + this.name.replaceAll('"', '\\"') + '" <' + ('noreply-' + this.uri + '@' + domain) + '>';
|
|
684
684
|
}
|
|
685
685
|
/**
|
|
686
686
|
* @deprecated Switch to EmailBuilder.sendEmailTemplate
|
|
@@ -696,23 +696,23 @@ class Organization extends simple_database_1.Model {
|
|
|
696
696
|
if (sender) {
|
|
697
697
|
replyTo = sender.email;
|
|
698
698
|
// Can we send from this e-mail or reply-to?
|
|
699
|
-
if (replyTo && this.privateMeta.mailDomain && this.privateMeta.mailDomainActive && sender.email.endsWith(
|
|
699
|
+
if (replyTo && this.privateMeta.mailDomain && this.privateMeta.mailDomainActive && sender.email.endsWith('@' + this.privateMeta.mailDomain)) {
|
|
700
700
|
from = sender.email;
|
|
701
701
|
replyTo = undefined;
|
|
702
702
|
}
|
|
703
703
|
// Include name in form field
|
|
704
704
|
if (sender.name) {
|
|
705
|
-
from = '"' + sender.name.replaceAll("
|
|
705
|
+
from = '"' + sender.name.replaceAll('"', '\\"') + '" <' + from + '>';
|
|
706
706
|
}
|
|
707
707
|
else {
|
|
708
|
-
from = '"' + this.name.replaceAll("
|
|
708
|
+
from = '"' + this.name.replaceAll('"', '\\"') + '" <' + from + '>';
|
|
709
709
|
}
|
|
710
710
|
if (replyTo) {
|
|
711
711
|
if (sender.name) {
|
|
712
|
-
replyTo = '"' + sender.name.replaceAll("
|
|
712
|
+
replyTo = '"' + sender.name.replaceAll('"', '\\"') + '" <' + replyTo + '>';
|
|
713
713
|
}
|
|
714
714
|
else {
|
|
715
|
-
replyTo = '"' + this.name.replaceAll("
|
|
715
|
+
replyTo = '"' + this.name.replaceAll('"', '\\"') + '" <' + replyTo + '>';
|
|
716
716
|
}
|
|
717
717
|
}
|
|
718
718
|
return { from, replyTo };
|
|
@@ -724,37 +724,37 @@ class Organization extends simple_database_1.Model {
|
|
|
724
724
|
*/
|
|
725
725
|
getDefaultEmail(strongDefault = false) {
|
|
726
726
|
// Send confirmation e-mail
|
|
727
|
-
let from = strongDefault ? this.getDefaultFrom(this.i18n, false) : this.uri +
|
|
727
|
+
let from = strongDefault ? this.getDefaultFrom(this.i18n, false) : this.uri + '@stamhoofd.email';
|
|
728
728
|
const sender = this.privateMeta.emails.find(e => e.default) ?? this.privateMeta.emails[0];
|
|
729
729
|
let replyTo = undefined;
|
|
730
730
|
if (sender) {
|
|
731
731
|
replyTo = sender.email;
|
|
732
732
|
// Can we send from this e-mail or reply-to?
|
|
733
|
-
if (replyTo && this.privateMeta.mailDomain && this.privateMeta.mailDomainActive && sender.email.endsWith(
|
|
733
|
+
if (replyTo && this.privateMeta.mailDomain && this.privateMeta.mailDomainActive && sender.email.endsWith('@' + this.privateMeta.mailDomain)) {
|
|
734
734
|
from = sender.email;
|
|
735
735
|
replyTo = undefined;
|
|
736
736
|
}
|
|
737
737
|
// Include name in form field
|
|
738
738
|
if (sender.name) {
|
|
739
|
-
from = '"' + sender.name.replaceAll("
|
|
739
|
+
from = '"' + sender.name.replaceAll('"', '\\"') + '" <' + from + '>';
|
|
740
740
|
}
|
|
741
741
|
else {
|
|
742
|
-
from = '"' + this.name.replaceAll("
|
|
742
|
+
from = '"' + this.name.replaceAll('"', '\\"') + '" <' + from + '>';
|
|
743
743
|
}
|
|
744
744
|
if (replyTo) {
|
|
745
745
|
if (sender.name) {
|
|
746
|
-
replyTo = '"' + sender.name.replaceAll("
|
|
746
|
+
replyTo = '"' + sender.name.replaceAll('"', '\\"') + '" <' + replyTo + '>';
|
|
747
747
|
}
|
|
748
748
|
else {
|
|
749
|
-
replyTo = '"' + this.name.replaceAll("
|
|
749
|
+
replyTo = '"' + this.name.replaceAll('"', '\\"') + '" <' + replyTo + '>';
|
|
750
750
|
}
|
|
751
751
|
}
|
|
752
752
|
}
|
|
753
753
|
else {
|
|
754
|
-
from = '"' + this.name.replaceAll("
|
|
754
|
+
from = '"' + this.name.replaceAll('"', '\\"') + '" <' + from + '>';
|
|
755
755
|
}
|
|
756
756
|
return {
|
|
757
|
-
from, replyTo
|
|
757
|
+
from, replyTo,
|
|
758
758
|
};
|
|
759
759
|
}
|
|
760
760
|
async getPaymentProviderFor(method, config) {
|
|
@@ -771,7 +771,7 @@ class Organization extends simple_database_1.Model {
|
|
|
771
771
|
throw new simple_errors_1.SimpleError({
|
|
772
772
|
code: 'payment_provider_not_configured',
|
|
773
773
|
message: 'Payment provider not configured for ' + method,
|
|
774
|
-
human: 'Deze betaalmethode werd helaas niet volledig geconfigureerd. Probeer later even opnieuw, neem contact met ons op of kies een andere betaalmethode.'
|
|
774
|
+
human: 'Deze betaalmethode werd helaas niet volledig geconfigureerd. Probeer later even opnieuw, neem contact met ons op of kies een andere betaalmethode.',
|
|
775
775
|
});
|
|
776
776
|
}
|
|
777
777
|
if (provider !== structures_1.PaymentProvider.Stripe && stripeAccount) {
|
|
@@ -779,7 +779,7 @@ class Organization extends simple_database_1.Model {
|
|
|
779
779
|
}
|
|
780
780
|
return {
|
|
781
781
|
provider,
|
|
782
|
-
stripeAccount
|
|
782
|
+
stripeAccount,
|
|
783
783
|
};
|
|
784
784
|
}
|
|
785
785
|
async getConnectedPaymentProviders() {
|
|
@@ -803,65 +803,65 @@ class Organization extends simple_database_1.Model {
|
|
|
803
803
|
exports.Organization = Organization;
|
|
804
804
|
tslib_1.__decorate([
|
|
805
805
|
(0, simple_database_1.column)({
|
|
806
|
-
primary: true, type:
|
|
806
|
+
primary: true, type: 'string', beforeSave(value) {
|
|
807
807
|
return value ?? (0, uuid_1.v4)();
|
|
808
|
-
}
|
|
808
|
+
},
|
|
809
809
|
})
|
|
810
810
|
], Organization.prototype, "id", void 0);
|
|
811
811
|
tslib_1.__decorate([
|
|
812
|
-
(0, simple_database_1.column)({ type:
|
|
812
|
+
(0, simple_database_1.column)({ type: 'string' })
|
|
813
813
|
], Organization.prototype, "name", void 0);
|
|
814
814
|
tslib_1.__decorate([
|
|
815
|
-
(0, simple_database_1.column)({ type:
|
|
815
|
+
(0, simple_database_1.column)({ type: 'string', nullable: true })
|
|
816
816
|
], Organization.prototype, "website", void 0);
|
|
817
817
|
tslib_1.__decorate([
|
|
818
|
-
(0, simple_database_1.column)({ type:
|
|
818
|
+
(0, simple_database_1.column)({ type: 'string', nullable: true })
|
|
819
819
|
], Organization.prototype, "registerDomain", void 0);
|
|
820
820
|
tslib_1.__decorate([
|
|
821
|
-
(0, simple_database_1.column)({ type:
|
|
821
|
+
(0, simple_database_1.column)({ type: 'string' })
|
|
822
822
|
], Organization.prototype, "uri", void 0);
|
|
823
823
|
tslib_1.__decorate([
|
|
824
|
-
(0, simple_database_1.column)({ type:
|
|
824
|
+
(0, simple_database_1.column)({ type: 'string' })
|
|
825
825
|
], Organization.prototype, "periodId", void 0);
|
|
826
826
|
tslib_1.__decorate([
|
|
827
|
-
(0, simple_database_1.column)({ type:
|
|
827
|
+
(0, simple_database_1.column)({ type: 'json', decoder: structures_1.OrganizationMetaData })
|
|
828
828
|
], Organization.prototype, "meta", void 0);
|
|
829
829
|
tslib_1.__decorate([
|
|
830
|
-
(0, simple_database_1.column)({ type:
|
|
830
|
+
(0, simple_database_1.column)({ type: 'json', decoder: structures_1.OrganizationPrivateMetaData })
|
|
831
831
|
], Organization.prototype, "privateMeta", void 0);
|
|
832
832
|
tslib_1.__decorate([
|
|
833
|
-
(0, simple_database_1.column)({ type:
|
|
833
|
+
(0, simple_database_1.column)({ type: 'json', decoder: OrganizationServerMetaData_1.OrganizationServerMetaData })
|
|
834
834
|
], Organization.prototype, "serverMeta", void 0);
|
|
835
835
|
tslib_1.__decorate([
|
|
836
|
-
(0, simple_database_1.column)({ type:
|
|
836
|
+
(0, simple_database_1.column)({ type: 'json', decoder: structures_1.Address })
|
|
837
837
|
], Organization.prototype, "address", void 0);
|
|
838
838
|
tslib_1.__decorate([
|
|
839
839
|
(0, simple_database_1.column)({
|
|
840
|
-
type:
|
|
841
|
-
return this.name +
|
|
842
|
-
}
|
|
840
|
+
type: 'string', beforeSave: function () {
|
|
841
|
+
return this.name + '\n' + this.address.toString();
|
|
842
|
+
},
|
|
843
843
|
})
|
|
844
844
|
], Organization.prototype, "searchIndex", void 0);
|
|
845
845
|
tslib_1.__decorate([
|
|
846
846
|
(0, simple_database_1.column)({
|
|
847
|
-
type:
|
|
847
|
+
type: 'datetime', beforeSave(old) {
|
|
848
848
|
if (old !== undefined) {
|
|
849
849
|
return old;
|
|
850
850
|
}
|
|
851
851
|
const date = new Date();
|
|
852
852
|
date.setMilliseconds(0);
|
|
853
853
|
return date;
|
|
854
|
-
}
|
|
854
|
+
},
|
|
855
855
|
})
|
|
856
856
|
], Organization.prototype, "createdAt", void 0);
|
|
857
857
|
tslib_1.__decorate([
|
|
858
858
|
(0, simple_database_1.column)({
|
|
859
|
-
type:
|
|
859
|
+
type: 'datetime', beforeSave() {
|
|
860
860
|
const date = new Date();
|
|
861
861
|
date.setMilliseconds(0);
|
|
862
862
|
return date;
|
|
863
863
|
},
|
|
864
|
-
skipUpdate: true
|
|
864
|
+
skipUpdate: true,
|
|
865
865
|
})
|
|
866
866
|
], Organization.prototype, "updatedAt", void 0);
|
|
867
867
|
tslib_1.__decorate([
|