@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
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Model } from
|
|
2
|
-
import { SQL } from
|
|
1
|
+
import { Model } from '@simonbackx/simple-database';
|
|
2
|
+
import { SQL } from '@stamhoofd/sql';
|
|
3
3
|
import {
|
|
4
4
|
Address,
|
|
5
5
|
BooleanStatus,
|
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
Parent,
|
|
9
9
|
ParentType,
|
|
10
10
|
RecordAnswer,
|
|
11
|
-
} from
|
|
12
|
-
import { Formatter } from
|
|
11
|
+
} from '@stamhoofd/structures';
|
|
12
|
+
import { Formatter } from '@stamhoofd/utility';
|
|
13
13
|
import {
|
|
14
14
|
BalanceItem,
|
|
15
15
|
Document,
|
|
@@ -19,13 +19,13 @@ import {
|
|
|
19
19
|
MergedMember,
|
|
20
20
|
Registration,
|
|
21
21
|
User,
|
|
22
|
-
} from
|
|
22
|
+
} from '../models';
|
|
23
23
|
|
|
24
24
|
export async function mergeMultipleMembers(members: Member[]) {
|
|
25
25
|
const { base, others } = selectBaseMember(members);
|
|
26
26
|
|
|
27
27
|
if (!base.existsInDatabase) {
|
|
28
|
-
throw Error(
|
|
28
|
+
throw Error('Base member does not exist in database');
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
for (const other of others) {
|
|
@@ -50,14 +50,14 @@ export async function findEqualMembers({
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
export async function mergeTwoMembers(base: Member, other: Member): Promise<void> {
|
|
53
|
-
console.log('Merging two member', base.id, other.id, base.details.name, other.details.name)
|
|
53
|
+
console.log('Merging two member', base.id, other.id, base.details.name, other.details.name);
|
|
54
54
|
|
|
55
55
|
if (base.id === other.id) {
|
|
56
|
-
throw new Error('Cannot merge the same member')
|
|
56
|
+
throw new Error('Cannot merge the same member');
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
if (!base.existsInDatabase) {
|
|
60
|
-
throw new Error('Cannot merge to base member that does not exist in database')
|
|
60
|
+
throw new Error('Cannot merge to base member that does not exist in database');
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
mergeMemberDetails(base, other);
|
|
@@ -75,7 +75,7 @@ export async function mergeTwoMembers(base: Member, other: Member): Promise<void
|
|
|
75
75
|
await base.save();
|
|
76
76
|
|
|
77
77
|
if (other.existsInDatabase) {
|
|
78
|
-
console.log('Deleting duplicate member', other.id, other.details.name)
|
|
78
|
+
console.log('Deleting duplicate member', other.id, other.details.name);
|
|
79
79
|
|
|
80
80
|
// store other member in merged_member table
|
|
81
81
|
const mergedMember = MergedMember.fromMember(other, base.id);
|
|
@@ -97,12 +97,12 @@ async function mergeResponsibilities(base: Member, other: Member) {
|
|
|
97
97
|
async function getResponsibilities(memberId: string) {
|
|
98
98
|
const rows = await SQL.select()
|
|
99
99
|
.from(SQL.table(MemberResponsibilityRecord.table))
|
|
100
|
-
.where(SQL.column(
|
|
100
|
+
.where(SQL.column('memberId'), memberId)
|
|
101
101
|
.fetch();
|
|
102
102
|
|
|
103
103
|
return MemberResponsibilityRecord.fromRows(
|
|
104
104
|
rows,
|
|
105
|
-
MemberResponsibilityRecord.table
|
|
105
|
+
MemberResponsibilityRecord.table,
|
|
106
106
|
);
|
|
107
107
|
}
|
|
108
108
|
|
|
@@ -112,22 +112,22 @@ async function mergeResponsibilities(base: Member, other: Member) {
|
|
|
112
112
|
// Delete duplicate responsibilities where endDate is null -> keep responsibility with oldest start date
|
|
113
113
|
for (const otherResponsibility of otherResponsibilities) {
|
|
114
114
|
// check if equal responsibilities exist
|
|
115
|
-
const otherResponsibilitiesWithoutCurrent
|
|
116
|
-
otherResponsibilities.filter(
|
|
117
|
-
|
|
115
|
+
const otherResponsibilitiesWithoutCurrent
|
|
116
|
+
= otherResponsibilities.filter(
|
|
117
|
+
o => o.id !== otherResponsibility.id,
|
|
118
118
|
);
|
|
119
119
|
const equalResponsibilities = baseResponsibilities
|
|
120
120
|
.concat(otherResponsibilitiesWithoutCurrent)
|
|
121
121
|
.filter((baseResponsibility) => {
|
|
122
122
|
return (
|
|
123
|
-
baseResponsibility.responsibilityId
|
|
124
|
-
|
|
125
|
-
baseResponsibility.organizationId
|
|
126
|
-
|
|
127
|
-
baseResponsibility.groupId
|
|
128
|
-
|
|
129
|
-
baseResponsibility.endDate === null
|
|
130
|
-
otherResponsibility.endDate === null
|
|
123
|
+
baseResponsibility.responsibilityId
|
|
124
|
+
=== otherResponsibility.responsibilityId
|
|
125
|
+
&& baseResponsibility.organizationId
|
|
126
|
+
=== otherResponsibility.organizationId
|
|
127
|
+
&& baseResponsibility.groupId
|
|
128
|
+
=== otherResponsibility.groupId
|
|
129
|
+
&& baseResponsibility.endDate === null
|
|
130
|
+
&& otherResponsibility.endDate === null
|
|
131
131
|
);
|
|
132
132
|
});
|
|
133
133
|
|
|
@@ -139,22 +139,22 @@ async function mergeResponsibilities(base: Member, other: Member) {
|
|
|
139
139
|
// sort on startDate
|
|
140
140
|
.sort((a, b) => a.startDate.getTime() - b.startDate.getTime());
|
|
141
141
|
|
|
142
|
-
const responsibilityWithOldestStartDate
|
|
143
|
-
allEqualResponsibilities[0];
|
|
142
|
+
const responsibilityWithOldestStartDate
|
|
143
|
+
= allEqualResponsibilities[0];
|
|
144
144
|
|
|
145
145
|
const responsibilitiesToDelete = allEqualResponsibilities.slice(
|
|
146
146
|
1,
|
|
147
|
-
undefined
|
|
147
|
+
undefined,
|
|
148
148
|
);
|
|
149
149
|
|
|
150
150
|
for (const responsibilityToDelete of responsibilitiesToDelete) {
|
|
151
151
|
const baseIndex = baseResponsibilities.indexOf(
|
|
152
|
-
responsibilityToDelete
|
|
152
|
+
responsibilityToDelete,
|
|
153
153
|
);
|
|
154
154
|
if (baseIndex !== -1) baseResponsibilities.splice(baseIndex, 1);
|
|
155
155
|
else {
|
|
156
156
|
const otherIndex = otherResponsibilities.indexOf(
|
|
157
|
-
responsibilityToDelete
|
|
157
|
+
responsibilityToDelete,
|
|
158
158
|
);
|
|
159
159
|
if (otherIndex !== -1)
|
|
160
160
|
otherResponsibilities.splice(otherIndex, 1);
|
|
@@ -169,7 +169,8 @@ async function mergeResponsibilities(base: Member, other: Member) {
|
|
|
169
169
|
responsibilityWithOldestStartDate.memberId = base.id;
|
|
170
170
|
await responsibilityWithOldestStartDate.save();
|
|
171
171
|
}
|
|
172
|
-
}
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
173
174
|
otherResponsibility.memberId = base.id;
|
|
174
175
|
await otherResponsibility.save();
|
|
175
176
|
}
|
|
@@ -195,7 +196,7 @@ class ModelWithMemberId extends Model {
|
|
|
195
196
|
async function mergeModels<M extends typeof ModelWithMemberId>(
|
|
196
197
|
base: Member,
|
|
197
198
|
other: Member,
|
|
198
|
-
model: M
|
|
199
|
+
model: M,
|
|
199
200
|
) {
|
|
200
201
|
const baseId = base.id;
|
|
201
202
|
const otherModels = await model.where({
|
|
@@ -215,11 +216,11 @@ export function mergeMemberDetails(base: Member, other: Member): void {
|
|
|
215
216
|
otherDetails.cleanData();
|
|
216
217
|
|
|
217
218
|
// string details
|
|
218
|
-
mergeStringIfBaseNotSet(baseDetails, otherDetails,
|
|
219
|
-
mergeStringIfBaseNotSet(baseDetails, otherDetails,
|
|
219
|
+
mergeStringIfBaseNotSet(baseDetails, otherDetails, 'firstName');
|
|
220
|
+
mergeStringIfBaseNotSet(baseDetails, otherDetails, 'lastName');
|
|
220
221
|
|
|
221
|
-
mergeStringIfBaseNotSet(baseDetails, otherDetails,
|
|
222
|
-
mergeStringIfBaseNotSet(baseDetails, otherDetails,
|
|
222
|
+
mergeStringIfBaseNotSet(baseDetails, otherDetails, 'memberNumber');
|
|
223
|
+
mergeStringIfBaseNotSet(baseDetails, otherDetails, 'uitpasNumber');
|
|
223
224
|
|
|
224
225
|
// email
|
|
225
226
|
mergeEmail(baseDetails, otherDetails);
|
|
@@ -236,19 +237,19 @@ export function mergeMemberDetails(base: Member, other: Member): void {
|
|
|
236
237
|
mergeNotes(baseDetails, otherDetails);
|
|
237
238
|
|
|
238
239
|
// date
|
|
239
|
-
mergeIfBaseNotSet(baseDetails, otherDetails,
|
|
240
|
+
mergeIfBaseNotSet(baseDetails, otherDetails, 'birthDay');
|
|
240
241
|
|
|
241
242
|
// boolean status
|
|
242
243
|
mergeBooleanStatusIfBaseNotSet(
|
|
243
244
|
baseDetails,
|
|
244
245
|
otherDetails,
|
|
245
|
-
|
|
246
|
+
'requiresFinancialSupport',
|
|
246
247
|
);
|
|
247
248
|
|
|
248
249
|
mergeBooleanStatusIfBaseNotSet(
|
|
249
250
|
baseDetails,
|
|
250
251
|
otherDetails,
|
|
251
|
-
|
|
252
|
+
'dataPermissions',
|
|
252
253
|
);
|
|
253
254
|
|
|
254
255
|
// address
|
|
@@ -261,11 +262,11 @@ export function mergeMemberDetails(base: Member, other: Member): void {
|
|
|
261
262
|
baseDetails.emergencyContacts = baseDetails.emergencyContacts.concat(
|
|
262
263
|
// add contacts that are not yet in the list
|
|
263
264
|
otherDetails.emergencyContacts.filter(
|
|
264
|
-
|
|
265
|
-
!baseDetails.emergencyContacts.some(
|
|
266
|
-
baseContact.isEqual(otherContact)
|
|
267
|
-
)
|
|
268
|
-
)
|
|
265
|
+
otherContact =>
|
|
266
|
+
!baseDetails.emergencyContacts.some(baseContact =>
|
|
267
|
+
baseContact.isEqual(otherContact),
|
|
268
|
+
),
|
|
269
|
+
),
|
|
269
270
|
);
|
|
270
271
|
|
|
271
272
|
// review times
|
|
@@ -279,21 +280,21 @@ export function mergeMemberDetails(base: Member, other: Member): void {
|
|
|
279
280
|
baseDetails.unverifiedEmails = Formatter.uniqueArray(
|
|
280
281
|
baseDetails.unverifiedEmails.concat(
|
|
281
282
|
otherDetails.unverifiedEmails.filter(
|
|
282
|
-
|
|
283
|
-
)
|
|
284
|
-
)
|
|
283
|
+
email => !isNullOrEmpty(email),
|
|
284
|
+
),
|
|
285
|
+
),
|
|
285
286
|
);
|
|
286
287
|
baseDetails.unverifiedPhones = Formatter.uniqueArray(
|
|
287
288
|
baseDetails.unverifiedPhones.concat(
|
|
288
289
|
otherDetails.unverifiedPhones.filter(
|
|
289
|
-
|
|
290
|
-
)
|
|
291
|
-
)
|
|
290
|
+
phone => !isNullOrEmpty(phone),
|
|
291
|
+
),
|
|
292
|
+
),
|
|
292
293
|
);
|
|
293
294
|
|
|
294
295
|
// unverified addresses
|
|
295
296
|
for (const address of otherDetails.unverifiedAddresses) {
|
|
296
|
-
if (!baseDetails.unverifiedAddresses.some(
|
|
297
|
+
if (!baseDetails.unverifiedAddresses.some(a => a.id === address.id)) {
|
|
297
298
|
baseDetails.unverifiedAddresses.push(address);
|
|
298
299
|
}
|
|
299
300
|
}
|
|
@@ -304,10 +305,10 @@ export function selectBaseMember(members: Member[]): {
|
|
|
304
305
|
others: Member[];
|
|
305
306
|
} {
|
|
306
307
|
if (members.length < 2) {
|
|
307
|
-
throw Error(
|
|
308
|
+
throw Error('Members array length is less than 2.');
|
|
308
309
|
}
|
|
309
310
|
const sorted = members.sort(
|
|
310
|
-
(m1, m2) => (m2.existsInDatabase ? 0 : m2.createdAt.getTime()) - (m1.existsInDatabase ? 0 : m1.createdAt.getTime())
|
|
311
|
+
(m1, m2) => (m2.existsInDatabase ? 0 : m2.createdAt.getTime()) - (m1.existsInDatabase ? 0 : m1.createdAt.getTime()),
|
|
311
312
|
);
|
|
312
313
|
|
|
313
314
|
return { base: sorted[0], others: sorted.slice(1, undefined) };
|
|
@@ -321,9 +322,11 @@ function mergeAnswers(base: MemberDetails, other: MemberDetails) {
|
|
|
321
322
|
|
|
322
323
|
if (!baseAnswer) {
|
|
323
324
|
newAnswers.set(otherId, otherAnswer);
|
|
324
|
-
}
|
|
325
|
+
}
|
|
326
|
+
else if (otherAnswer.date >= baseAnswer.date) {
|
|
325
327
|
newAnswers.set(otherId, otherAnswer);
|
|
326
|
-
}
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
327
330
|
// keep existing, this one is more up-to-date, don't add the other answer
|
|
328
331
|
}
|
|
329
332
|
}
|
|
@@ -333,9 +336,11 @@ function mergeAnswers(base: MemberDetails, other: MemberDetails) {
|
|
|
333
336
|
function mergeNotes(base: MemberDetails, other: MemberDetails) {
|
|
334
337
|
if (base.notes && other.notes) {
|
|
335
338
|
base.notes = `${base.notes}\n${other.notes}`;
|
|
336
|
-
}
|
|
339
|
+
}
|
|
340
|
+
else if (base.notes) {
|
|
337
341
|
return;
|
|
338
|
-
}
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
339
344
|
base.notes = other.notes;
|
|
340
345
|
}
|
|
341
346
|
}
|
|
@@ -348,9 +353,9 @@ function mergeParents(base: MemberDetails, other: MemberDetails) {
|
|
|
348
353
|
for (const otherParent of otherParents) {
|
|
349
354
|
// equal if same first and last name
|
|
350
355
|
const equalBaseParent = baseParents.find(
|
|
351
|
-
|
|
352
|
-
hasEqualStringValue(baseParent, otherParent,
|
|
353
|
-
hasEqualStringValue(baseParent, otherParent,
|
|
356
|
+
baseParent =>
|
|
357
|
+
hasEqualStringValue(baseParent, otherParent, 'firstName')
|
|
358
|
+
&& hasEqualStringValue(baseParent, otherParent, 'lastName'),
|
|
354
359
|
);
|
|
355
360
|
|
|
356
361
|
if (!equalBaseParent) {
|
|
@@ -368,8 +373,8 @@ function mergeParent(base: Parent, other: Parent, baseDetails: MemberDetails) {
|
|
|
368
373
|
if (base.type === ParentType.Other) {
|
|
369
374
|
base.type = other.type;
|
|
370
375
|
}
|
|
371
|
-
mergeStringIfBaseNotSet(base, other,
|
|
372
|
-
mergeStringIfBaseNotSet(base, other,
|
|
376
|
+
mergeStringIfBaseNotSet(base, other, 'firstName');
|
|
377
|
+
mergeStringIfBaseNotSet(base, other, 'lastName');
|
|
373
378
|
// add other emails to alternative emails
|
|
374
379
|
mergeEmail(base, other);
|
|
375
380
|
mergePhone(base, other, baseDetails);
|
|
@@ -377,14 +382,14 @@ function mergeParent(base: Parent, other: Parent, baseDetails: MemberDetails) {
|
|
|
377
382
|
}
|
|
378
383
|
|
|
379
384
|
function mergeEmail(
|
|
380
|
-
base: { email: string | null
|
|
381
|
-
other: { email: string | null
|
|
385
|
+
base: { email: string | null; alternativeEmails: string[] },
|
|
386
|
+
other: { email: string | null; alternativeEmails: string[] },
|
|
382
387
|
) {
|
|
383
|
-
const isEmailMerged = mergeStringIfBaseNotSet(base, other,
|
|
388
|
+
const isEmailMerged = mergeStringIfBaseNotSet(base, other, 'email');
|
|
384
389
|
base.alternativeEmails = Formatter.uniqueArray([...base.alternativeEmails, ...other.alternativeEmails]);
|
|
385
390
|
|
|
386
391
|
if (!isEmailMerged && !isNullOrEmpty(other.email)) {
|
|
387
|
-
if (!base.alternativeEmails.some(
|
|
392
|
+
if (!base.alternativeEmails.some(email => email === other.email!)) {
|
|
388
393
|
base.alternativeEmails.push(other.email!);
|
|
389
394
|
}
|
|
390
395
|
}
|
|
@@ -393,13 +398,13 @@ function mergeEmail(
|
|
|
393
398
|
function mergePhone(
|
|
394
399
|
base: { phone: string | null | undefined },
|
|
395
400
|
other: { phone: string | null | undefined },
|
|
396
|
-
baseDetails: MemberDetails
|
|
401
|
+
baseDetails: MemberDetails,
|
|
397
402
|
) {
|
|
398
|
-
const isPhoneMerged = mergeStringIfBaseNotSet(base, other,
|
|
403
|
+
const isPhoneMerged = mergeStringIfBaseNotSet(base, other, 'phone');
|
|
399
404
|
const otherPhone = other.phone;
|
|
400
405
|
if (!isPhoneMerged && !isNullOrEmpty(otherPhone)) {
|
|
401
406
|
if (
|
|
402
|
-
!baseDetails.unverifiedPhones.some(
|
|
407
|
+
!baseDetails.unverifiedPhones.some(phone => phone === otherPhone)
|
|
403
408
|
) {
|
|
404
409
|
baseDetails.unverifiedPhones.push(otherPhone!);
|
|
405
410
|
}
|
|
@@ -409,18 +414,19 @@ function mergePhone(
|
|
|
409
414
|
function mergeAddress(
|
|
410
415
|
base: { address: Address | null | undefined },
|
|
411
416
|
other: { address: Address | null | undefined },
|
|
412
|
-
baseDetails: MemberDetails
|
|
417
|
+
baseDetails: MemberDetails,
|
|
413
418
|
) {
|
|
414
419
|
const baseAddress = base.address;
|
|
415
420
|
const otherAddress = other.address;
|
|
416
421
|
|
|
417
422
|
if (!baseAddress) {
|
|
418
423
|
base.address = otherAddress;
|
|
419
|
-
}
|
|
424
|
+
}
|
|
425
|
+
else if (otherAddress && baseAddress.id !== otherAddress.id) {
|
|
420
426
|
// add other address to unverified addresses
|
|
421
427
|
if (
|
|
422
428
|
!baseDetails.unverifiedAddresses.some(
|
|
423
|
-
|
|
429
|
+
address => address.id === otherAddress.id,
|
|
424
430
|
)
|
|
425
431
|
) {
|
|
426
432
|
baseDetails.unverifiedAddresses.push(otherAddress);
|
|
@@ -431,7 +437,7 @@ function mergeAddress(
|
|
|
431
437
|
function mergeStringIfBaseNotSet<T, K extends keyof T>(
|
|
432
438
|
base: T,
|
|
433
439
|
other: T,
|
|
434
|
-
key: K & (T[K] extends string | null | undefined ? K : never)
|
|
440
|
+
key: K & (T[K] extends string | null | undefined ? K : never),
|
|
435
441
|
): boolean {
|
|
436
442
|
const baseValue = base[key] as string | null | undefined;
|
|
437
443
|
if (!isNullOrEmpty(baseValue)) {
|
|
@@ -451,7 +457,7 @@ function mergeIfBaseNotSet<T, K extends keyof T>(
|
|
|
451
457
|
base: T,
|
|
452
458
|
other: T,
|
|
453
459
|
key: K &
|
|
454
|
-
(T[K] extends number | Date | boolean | null | undefined ? K : never)
|
|
460
|
+
(T[K] extends number | Date | boolean | null | undefined ? K : never),
|
|
455
461
|
): boolean {
|
|
456
462
|
const baseValue = base[key] as number | Date | boolean | null | undefined;
|
|
457
463
|
if (!(baseValue === null || baseValue === undefined)) return false;
|
|
@@ -464,7 +470,7 @@ function mergeIfBaseNotSet<T, K extends keyof T>(
|
|
|
464
470
|
function mergeBooleanStatusIfBaseNotSet<T, K extends keyof T>(
|
|
465
471
|
base: T,
|
|
466
472
|
other: T,
|
|
467
|
-
key: K & (T[K] extends BooleanStatus | null | undefined ? K : never)
|
|
473
|
+
key: K & (T[K] extends BooleanStatus | null | undefined ? K : never),
|
|
468
474
|
): boolean {
|
|
469
475
|
const otherValue = other[key] as BooleanStatus | null | undefined;
|
|
470
476
|
if (otherValue === null || otherValue === undefined) return false;
|
|
@@ -493,17 +499,17 @@ function mergeBooleanStatusIfBaseNotSet<T, K extends keyof T>(
|
|
|
493
499
|
function hasEqualStringValue<T, K extends keyof T>(
|
|
494
500
|
a: T,
|
|
495
501
|
b: T,
|
|
496
|
-
key: K & (T[K] extends string | null | undefined ? K : never)
|
|
502
|
+
key: K & (T[K] extends string | null | undefined ? K : never),
|
|
497
503
|
) {
|
|
498
504
|
return hasValueAndIsEqual(
|
|
499
505
|
a[key] as string | null | undefined,
|
|
500
|
-
b[key] as string | null | undefined
|
|
506
|
+
b[key] as string | null | undefined,
|
|
501
507
|
);
|
|
502
508
|
}
|
|
503
509
|
|
|
504
510
|
function hasValueAndIsEqual(
|
|
505
511
|
a: string | null | undefined,
|
|
506
|
-
b: string | null | undefined
|
|
512
|
+
b: string | null | undefined,
|
|
507
513
|
): boolean {
|
|
508
514
|
if (isNullOrEmpty(a) || isNullOrEmpty(b)) return false;
|
|
509
515
|
return isStringEqual(a as string, b as string);
|
|
@@ -518,5 +524,5 @@ function toLowerTrim(name: string) {
|
|
|
518
524
|
}
|
|
519
525
|
|
|
520
526
|
function isNullOrEmpty(value: string | null | undefined) {
|
|
521
|
-
return value === null || value === undefined || value.trim() ===
|
|
527
|
+
return value === null || value === undefined || value.trim() === '';
|
|
522
528
|
}
|
|
@@ -1,76 +1,74 @@
|
|
|
1
|
-
import { SimpleError } from
|
|
1
|
+
import { SimpleError } from '@simonbackx/simple-errors';
|
|
2
2
|
|
|
3
3
|
export class RateLimitWindow {
|
|
4
|
-
start: Date = new Date()
|
|
5
|
-
windows: Map<string, number> = new Map()
|
|
4
|
+
start: Date = new Date();
|
|
5
|
+
windows: Map<string, number> = new Map();
|
|
6
6
|
|
|
7
|
-
limit: number
|
|
7
|
+
limit: number;
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* in ms
|
|
11
11
|
*/
|
|
12
|
-
duration: number
|
|
12
|
+
duration: number;
|
|
13
13
|
|
|
14
14
|
constructor(options: {
|
|
15
|
-
limit: number
|
|
16
|
-
duration: number
|
|
15
|
+
limit: number;
|
|
16
|
+
duration: number;
|
|
17
17
|
}) {
|
|
18
|
-
this.limit = options.limit
|
|
19
|
-
this.duration = options.duration
|
|
18
|
+
this.limit = options.limit;
|
|
19
|
+
this.duration = options.duration;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
isExpired() {
|
|
23
|
-
return this.age > this.duration
|
|
23
|
+
return this.age > this.duration;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
get age() {
|
|
27
|
-
return Date.now() - this.start.getTime()
|
|
27
|
+
return Date.now() - this.start.getTime();
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
track(key: string, amount = 1) {
|
|
31
31
|
if (this.isExpired()) {
|
|
32
32
|
// We have a shared window
|
|
33
|
-
this.start = new Date()
|
|
34
|
-
this.windows.clear()
|
|
33
|
+
this.start = new Date();
|
|
34
|
+
this.windows.clear();
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
let w = this.windows.get(key) ?? 0
|
|
38
|
-
w += amount
|
|
37
|
+
let w = this.windows.get(key) ?? 0;
|
|
38
|
+
w += amount;
|
|
39
39
|
|
|
40
40
|
if (w > this.limit) {
|
|
41
|
-
const retryAfter = Math.ceil((this.duration - this.age) / 1000)
|
|
41
|
+
const retryAfter = Math.ceil((this.duration - this.age) / 1000);
|
|
42
42
|
throw new SimpleError({
|
|
43
43
|
code: 'rate_limit',
|
|
44
|
-
message: `Rate limit exceeded (${w} ${amount > 1 ? '('+amount+' added)' : ''} requests in ${Math.round(this.age/1000)}s). Retry after ${retryAfter}s. Check your code and try to reduce the number of (parallel) requests you make. Add waiting periods if needed.`,
|
|
44
|
+
message: `Rate limit exceeded (${w} ${amount > 1 ? '(' + amount + ' added)' : ''} requests in ${Math.round(this.age / 1000)}s). Retry after ${retryAfter}s. Check your code and try to reduce the number of (parallel) requests you make. Add waiting periods if needed.`,
|
|
45
45
|
human: `Oeps! Te veel aanvragen. Om spam te vermijden is jouw aanvraag tijdelijk geblokkeerd. Probeer het over ${retryAfter} seconden opnieuw.`,
|
|
46
|
-
statusCode: 429
|
|
47
|
-
})
|
|
46
|
+
statusCode: 429,
|
|
47
|
+
});
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
// Save
|
|
51
|
-
this.windows.set(key, w)
|
|
51
|
+
this.windows.set(key, w);
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
|
|
56
55
|
export class RateLimiter {
|
|
57
|
-
windows: RateLimitWindow[] = []
|
|
56
|
+
windows: RateLimitWindow[] = [];
|
|
58
57
|
|
|
59
58
|
constructor(options: {
|
|
60
|
-
limits: {duration: number
|
|
59
|
+
limits: { duration: number; limit: number }[];
|
|
61
60
|
}) {
|
|
62
|
-
|
|
63
61
|
for (const limit of options.limits) {
|
|
64
62
|
this.windows.push(new RateLimitWindow({
|
|
65
63
|
limit: limit.limit,
|
|
66
|
-
duration: limit.duration
|
|
67
|
-
}))
|
|
64
|
+
duration: limit.duration,
|
|
65
|
+
}));
|
|
68
66
|
}
|
|
69
67
|
}
|
|
70
68
|
|
|
71
69
|
track(key: string, amount = 1) {
|
|
72
70
|
for (const window of this.windows) {
|
|
73
|
-
window.track(key, amount)
|
|
71
|
+
window.track(key, amount);
|
|
74
72
|
}
|
|
75
73
|
}
|
|
76
74
|
}
|