@stamhoofd/backend 2.118.1 → 2.120.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. package/package.json +32 -22
  2. package/src/audit-logs/ModelLogger.ts +4 -2
  3. package/src/audit-logs/OrderLogger.ts +1 -1
  4. package/src/boot.ts +32 -14
  5. package/src/crons/balance-emails.ts +4 -2
  6. package/src/crons/clearExcelCache.test.ts +8 -8
  7. package/src/crons/update-cached-balances.ts +40 -14
  8. package/src/debug.ts +3 -2
  9. package/src/decoders/StringArrayDecoder.ts +1 -1
  10. package/src/decoders/StringNullableDecoder.ts +1 -1
  11. package/src/email-recipient-loaders/documents.ts +2 -1
  12. package/src/email-recipient-loaders/members.ts +2 -1
  13. package/src/email-recipient-loaders/orders.ts +2 -1
  14. package/src/email-recipient-loaders/payments.ts +6 -3
  15. package/src/email-recipient-loaders/receivable-balances.ts +2 -1
  16. package/src/email-recipient-loaders/registrations.ts +2 -1
  17. package/src/email-replacements/getEmailReplacementsForPayment.ts +8 -7
  18. package/src/endpoints/admin/members/ChargeMembersEndpoint.ts +7 -6
  19. package/src/endpoints/admin/memberships/ChargeMembershipsEndpoint.ts +3 -2
  20. package/src/endpoints/admin/memberships/GetChargeMembershipsSummaryEndpoint.ts +2 -1
  21. package/src/endpoints/admin/organizations/ChargeOrganizationsEndpoint.ts +4 -3
  22. package/src/endpoints/admin/organizations/GetOrganizationsCountEndpoint.ts +3 -2
  23. package/src/endpoints/admin/organizations/GetOrganizationsEndpoint.ts +7 -5
  24. package/src/endpoints/admin/organizations/PatchOrganizationsEndpoint.ts +12 -10
  25. package/src/endpoints/admin/registrations/ChargeRegistrationsEndpoint.ts +4 -3
  26. package/src/endpoints/auth/CreateAdminEndpoint.ts +8 -6
  27. package/src/endpoints/auth/CreateTokenEndpoint.ts +14 -12
  28. package/src/endpoints/auth/DeleteTokenEndpoint.ts +2 -1
  29. package/src/endpoints/auth/DeleteUserEndpoint.ts +2 -1
  30. package/src/endpoints/auth/ForgotPasswordEndpoint.ts +5 -4
  31. package/src/endpoints/auth/GetOtherUserEndpoint.ts +3 -2
  32. package/src/endpoints/auth/GetUserEndpoint.ts +3 -2
  33. package/src/endpoints/auth/OpenIDConnectAuthTokenEndpoint.ts +2 -1
  34. package/src/endpoints/auth/OpenIDConnectCallbackEndpoint.ts +4 -2
  35. package/src/endpoints/auth/OpenIDConnectStartEndpoint.ts +3 -2
  36. package/src/endpoints/auth/PatchUserEndpoint.ts +15 -12
  37. package/src/endpoints/auth/PollEmailVerificationEndpoint.ts +3 -2
  38. package/src/endpoints/auth/RetryEmailVerificationEndpoint.ts +3 -2
  39. package/src/endpoints/auth/SignupEndpoint.ts +5 -4
  40. package/src/endpoints/auth/VerifyEmailEndpoint.ts +6 -5
  41. package/src/endpoints/frontend/FrontendEnvironmentEndpoint.ts +3 -2
  42. package/src/endpoints/global/addresses/SearchRegionsEndpoint.ts +8 -5
  43. package/src/endpoints/global/addresses/ValidateAddressEndpoint.ts +5 -3
  44. package/src/endpoints/global/audit-logs/GetAuditLogsEndpoint.ts +8 -5
  45. package/src/endpoints/global/billing/ActivatePackagesEndpoint.ts +9 -7
  46. package/src/endpoints/global/billing/DeactivatePackageEndpoint.ts +4 -3
  47. package/src/endpoints/global/caddy/CheckDomainCertEndpoint.ts +4 -2
  48. package/src/endpoints/global/email/CreateEmailEndpoint.ts +9 -7
  49. package/src/endpoints/global/email/GetAdminEmailsEndpoint.test.ts +2 -1
  50. package/src/endpoints/global/email/GetAdminEmailsEndpoint.ts +22 -19
  51. package/src/endpoints/global/email/GetEmailAddressEndpoint.ts +6 -4
  52. package/src/endpoints/global/email/GetEmailEndpoint.ts +4 -3
  53. package/src/endpoints/global/email/GetUserEmailsEndpoint.test.ts +3 -2
  54. package/src/endpoints/global/email/GetUserEmailsEndpoint.ts +7 -4
  55. package/src/endpoints/global/email/ManageEmailAddressEndpoint.ts +7 -5
  56. package/src/endpoints/global/email/PatchEmailEndpoint.test.ts +11 -11
  57. package/src/endpoints/global/email/PatchEmailEndpoint.ts +14 -11
  58. package/src/endpoints/global/email-recipients/GetEmailRecipientsCountEndpoint.ts +3 -2
  59. package/src/endpoints/global/email-recipients/GetEmailRecipientsEndpoint.test.ts +2 -1
  60. package/src/endpoints/global/email-recipients/GetEmailRecipientsEndpoint.ts +8 -5
  61. package/src/endpoints/global/email-recipients/RetryEmailRecipientEndpoint.ts +7 -5
  62. package/src/endpoints/global/email-recipients/helpers/validateEmailRecipientFilter.ts +4 -3
  63. package/src/endpoints/global/events/GetEventNotificationsCountEndpoint.ts +3 -2
  64. package/src/endpoints/global/events/GetEventNotificationsEndpoint.ts +9 -6
  65. package/src/endpoints/global/events/GetEventsEndpoint.ts +7 -4
  66. package/src/endpoints/global/events/PatchEventNotificationsEndpoint.test.ts +4 -2
  67. package/src/endpoints/global/events/PatchEventNotificationsEndpoint.ts +17 -15
  68. package/src/endpoints/global/events/PatchEventsEndpoint.test.ts +4 -2
  69. package/src/endpoints/global/events/PatchEventsEndpoint.ts +28 -26
  70. package/src/endpoints/global/files/ExportToExcelEndpoint.ts +8 -5
  71. package/src/endpoints/global/files/GetFileCache.ts +5 -3
  72. package/src/endpoints/global/files/UploadFile.ts +10 -4
  73. package/src/endpoints/global/files/UploadImage.ts +4 -2
  74. package/src/endpoints/global/groups/GetGroupsEndpoint.test.ts +4 -2
  75. package/src/endpoints/global/groups/GetGroupsEndpoint.ts +8 -5
  76. package/src/endpoints/global/members/GetMemberFamilyEndpoint.ts +7 -5
  77. package/src/endpoints/global/members/GetMembersCountEndpoint.ts +3 -2
  78. package/src/endpoints/global/members/GetMembersEndpoint.test.ts +4 -2
  79. package/src/endpoints/global/members/GetMembersEndpoint.ts +10 -8
  80. package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.test.ts +257 -6
  81. package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.ts +162 -107
  82. package/src/endpoints/global/members/helpers/validateGroupFilter.ts +4 -3
  83. package/src/endpoints/global/members/shouldCheckIfMemberIsDuplicate.ts +3 -2
  84. package/src/endpoints/global/organizations/CheckRegisterCodeEndpoint.ts +3 -2
  85. package/src/endpoints/global/organizations/CreateOrganizationEndpoint.test.ts +3 -2
  86. package/src/endpoints/global/organizations/CreateOrganizationEndpoint.ts +8 -7
  87. package/src/endpoints/global/organizations/GetOrganizationFromDomainEndpoint.ts +5 -3
  88. package/src/endpoints/global/organizations/GetOrganizationFromUriEndpoint.ts +5 -3
  89. package/src/endpoints/global/organizations/SearchOrganizationEndpoint.ts +8 -5
  90. package/src/endpoints/global/payments/StripeWebhookEndpoint.ts +4 -2
  91. package/src/endpoints/global/platform/GetPlatformAdminsEndpoint.ts +2 -1
  92. package/src/endpoints/global/platform/GetPlatformEndpoint.ts +3 -2
  93. package/src/endpoints/global/platform/PatchPlatformEnpoint.test.ts +3 -2
  94. package/src/endpoints/global/platform/PatchPlatformEnpoint.ts +7 -4
  95. package/src/endpoints/global/platform-memberships/GetPlatformMembershipsCountEndpoint.ts +47 -0
  96. package/src/endpoints/global/platform-memberships/GetPlatformMembershipsEndpoint.ts +206 -0
  97. package/src/endpoints/global/registration/GetRegistrationsCountEndpoint.ts +3 -2
  98. package/src/endpoints/global/registration/GetRegistrationsEndpoint.test.ts +2 -1
  99. package/src/endpoints/global/registration/GetRegistrationsEndpoint.ts +10 -7
  100. package/src/endpoints/global/registration/GetUserDetailedPayableBalanceEndpoint.ts +4 -2
  101. package/src/endpoints/global/registration/GetUserDocumentsEndpoint.ts +4 -2
  102. package/src/endpoints/global/registration/GetUserMembersEndpoint.ts +3 -2
  103. package/src/endpoints/global/registration/GetUserPayableBalanceEndpoint.ts +2 -1
  104. package/src/endpoints/global/registration/PatchUserMembersEndpoint.test.ts +5 -3
  105. package/src/endpoints/global/registration/PatchUserMembersEndpoint.ts +13 -9
  106. package/src/endpoints/global/registration/RegisterMembersEndpoint.test.ts +50 -49
  107. package/src/endpoints/global/registration/RegisterMembersEndpoint.ts +25 -22
  108. package/src/endpoints/global/registration-periods/GetRegistrationPeriodsEndpoint.ts +8 -5
  109. package/src/endpoints/global/registration-periods/PatchRegistrationPeriodsEndpoint.ts +9 -7
  110. package/src/endpoints/global/sso/GetSSOEndpoint.ts +4 -2
  111. package/src/endpoints/global/sso/SetSSOEndpoint.ts +3 -2
  112. package/src/endpoints/global/webshops/GetWebshopFromDomainEndpoint.ts +4 -2
  113. package/src/endpoints/global/webshops/GetWebshopsCountEndpoint.ts +43 -0
  114. package/src/endpoints/global/webshops/GetWebshopsEndpoint.test.ts +808 -0
  115. package/src/endpoints/global/webshops/GetWebshopsEndpoint.ts +221 -0
  116. package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemEndpoint.ts +4 -3
  117. package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemsCountEndpoint.ts +3 -2
  118. package/src/endpoints/organization/dashboard/balance-items/GetBalanceItemsEndpoint.ts +6 -4
  119. package/src/endpoints/organization/dashboard/balance-items/PatchBalanceItemsEndpoint.ts +15 -13
  120. package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedPayableBalanceEndpoint.ts +4 -2
  121. package/src/endpoints/organization/dashboard/billing/GetOrganizationPayableBalanceEndpoint.ts +4 -2
  122. package/src/endpoints/organization/dashboard/billing/GetPackagesEndpoint.ts +2 -1
  123. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplateXML.ts +3 -2
  124. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesCountEndpoint.ts +3 -2
  125. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesEndpoint.ts +7 -4
  126. package/src/endpoints/organization/dashboard/documents/GetDocumentsCountEndpoint.ts +3 -2
  127. package/src/endpoints/organization/dashboard/documents/GetDocumentsEndpoint.ts +7 -4
  128. package/src/endpoints/organization/dashboard/documents/PatchDocumentEndpoint.ts +9 -7
  129. package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplatesEndpoint.test.ts +4 -2
  130. package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplatesEndpoint.ts +7 -5
  131. package/src/endpoints/organization/dashboard/email/CheckEmailBouncesEndpoint.ts +3 -2
  132. package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.test.ts +36 -1
  133. package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.ts +13 -4
  134. package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.test.ts +4 -2
  135. package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.ts +7 -5
  136. package/src/endpoints/organization/dashboard/invoices/GetInvoicesCountEndpoint.ts +3 -2
  137. package/src/endpoints/organization/dashboard/invoices/GetInvoicesEndpoint.ts +6 -4
  138. package/src/endpoints/organization/dashboard/invoices/PatchInvoicesEndpoint.ts +5 -3
  139. package/src/endpoints/organization/dashboard/mollie/CheckMollieEndpoint.ts +4 -2
  140. package/src/endpoints/organization/dashboard/mollie/ConnectMollieEndpoint.ts +6 -3
  141. package/src/endpoints/organization/dashboard/mollie/DisconnectMollieEndpoint.ts +4 -2
  142. package/src/endpoints/organization/dashboard/mollie/GetMollieDashboardEndpoint.ts +2 -1
  143. package/src/endpoints/organization/dashboard/nolt/CreateNoltTokenEndpoint.ts +2 -1
  144. package/src/endpoints/organization/dashboard/organization/GetOrganizationArchivedGroups.ts +4 -2
  145. package/src/endpoints/organization/dashboard/organization/GetOrganizationDeletedGroups.ts +3 -2
  146. package/src/endpoints/organization/dashboard/organization/GetUitpasClientIdEndpoint.ts +2 -1
  147. package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.test.ts +5 -3
  148. package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.ts +22 -19
  149. package/src/endpoints/organization/dashboard/organization/SearchUitpasOrganizersEndpoint.ts +5 -3
  150. package/src/endpoints/organization/dashboard/organization/SetOrganizationDomainEndpoint.ts +11 -9
  151. package/src/endpoints/organization/dashboard/organization/SetUitpasClientCredentialsEndpoint.ts +8 -7
  152. package/src/endpoints/organization/dashboard/payments/GetMemberBalanceEndpoint.ts +2 -1
  153. package/src/endpoints/organization/dashboard/payments/GetPaymentsCountEndpoint.ts +3 -2
  154. package/src/endpoints/organization/dashboard/payments/GetPaymentsEndpoint.ts +7 -5
  155. package/src/endpoints/organization/dashboard/payments/PatchPaymentsEndpoint.ts +18 -16
  156. package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalanceEndpoint.ts +2 -1
  157. package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalancesCountEndpoint.ts +3 -2
  158. package/src/endpoints/organization/dashboard/receivable-balances/GetReceivableBalancesEndpoint.ts +5 -3
  159. package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.test.ts +2 -1
  160. package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.ts +8 -5
  161. package/src/endpoints/organization/dashboard/registration-periods/MoveRegistrationPeriods.test.ts +4 -2
  162. package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.test.ts +4 -2
  163. package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.ts +32 -29
  164. package/src/endpoints/organization/dashboard/registration-periods/SetupStepReviewEndpoint.ts +6 -3
  165. package/src/endpoints/organization/dashboard/stripe/ConnectStripeEndpoint.ts +3 -2
  166. package/src/endpoints/organization/dashboard/stripe/DeleteStripeAccountEndpoint.ts +3 -2
  167. package/src/endpoints/organization/dashboard/stripe/GetStripeAccountLinkEndpoint.ts +5 -3
  168. package/src/endpoints/organization/dashboard/stripe/GetStripeAccountsEndpoint.ts +2 -1
  169. package/src/endpoints/organization/dashboard/stripe/GetStripeLoginLinkEndpoint.ts +5 -3
  170. package/src/endpoints/organization/dashboard/stripe/UpdateStripeAccountEndpoint.ts +3 -2
  171. package/src/endpoints/organization/dashboard/users/CreateApiUserEndpoint.ts +4 -3
  172. package/src/endpoints/organization/dashboard/users/DeleteUserEndpoint.ts +4 -3
  173. package/src/endpoints/organization/dashboard/users/GetApiUsersEndpoint.ts +3 -2
  174. package/src/endpoints/organization/dashboard/users/GetOrganizationAdminsEndpoint.ts +2 -1
  175. package/src/endpoints/organization/dashboard/users/PatchApiUserEndpoint.ts +6 -4
  176. package/src/endpoints/organization/dashboard/webshops/CreateWebshopEndpoint.ts +7 -6
  177. package/src/endpoints/organization/dashboard/webshops/DeleteWebshopEndpoint.ts +3 -2
  178. package/src/endpoints/organization/dashboard/webshops/GetDiscountCodesEndpoint.ts +4 -2
  179. package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersCountEndpoint.ts +3 -2
  180. package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersEndpoint.ts +7 -4
  181. package/src/endpoints/organization/dashboard/webshops/{GetWebshopTicketsCountEndpoint → GetWebshopTicketsCountEndpoint.ts} +7 -7
  182. package/src/endpoints/organization/dashboard/webshops/GetWebshopTicketsEndpoint.ts +9 -6
  183. package/src/endpoints/organization/dashboard/webshops/GetWebshopUriAvailabilityEndpoint.ts +4 -2
  184. package/src/endpoints/organization/dashboard/webshops/PatchDiscountCodesEndpoint.ts +6 -4
  185. package/src/endpoints/organization/dashboard/webshops/PatchWebshopEndpoint.ts +13 -12
  186. package/src/endpoints/organization/dashboard/webshops/PatchWebshopOrdersEndpoint.ts +4 -2
  187. package/src/endpoints/organization/dashboard/webshops/PatchWebshopTicketsEndpoint.ts +5 -3
  188. package/src/endpoints/organization/dashboard/webshops/SearchUitpasEventsEndpoint.ts +6 -4
  189. package/src/endpoints/organization/dashboard/webshops/VerifyWebshopDomainEndpoint.ts +2 -1
  190. package/src/endpoints/organization/shared/ExchangePaymentEndpoint.ts +6 -4
  191. package/src/endpoints/organization/shared/GetDocumentHtml.ts +4 -3
  192. package/src/endpoints/organization/shared/GetPaymentEndpoint.ts +4 -3
  193. package/src/endpoints/organization/shared/GetUitpasNumberDetailsEndpoint.ts +3 -2
  194. package/src/endpoints/organization/shared/auth/GetOrganizationEndpoint.ts +3 -2
  195. package/src/endpoints/organization/webshops/CheckWebshopDiscountCodesEndpoint.ts +4 -3
  196. package/src/endpoints/organization/webshops/GetOrderByPaymentEndpoint.ts +5 -4
  197. package/src/endpoints/organization/webshops/GetOrderEndpoint.ts +4 -3
  198. package/src/endpoints/organization/webshops/GetTicketsEndpoint.ts +7 -5
  199. package/src/endpoints/organization/webshops/GetWebshopEndpoint.ts +4 -3
  200. package/src/endpoints/organization/webshops/PlaceOrderEndpoint.test.ts +7 -3
  201. package/src/endpoints/organization/webshops/PlaceOrderEndpoint.ts +11 -10
  202. package/src/endpoints/organization/webshops/RetrieveUitpasSocialTariffPriceEndpoint.ts +5 -4
  203. package/src/endpoints/system/HealthEndpoint.test.ts +44 -0
  204. package/src/endpoints/system/HealthEndpoint.ts +14 -6
  205. package/src/excel-loaders/balance-items.ts +19 -17
  206. package/src/excel-loaders/event-notifications.ts +15 -13
  207. package/src/excel-loaders/index.ts +1 -0
  208. package/src/excel-loaders/members.ts +45 -43
  209. package/src/excel-loaders/organizations.ts +26 -25
  210. package/src/excel-loaders/payments.ts +44 -42
  211. package/src/excel-loaders/platform-memberships.ts +202 -0
  212. package/src/excel-loaders/receivable-balances.ts +25 -23
  213. package/src/excel-loaders/registrations.ts +30 -28
  214. package/src/helpers/AddressValidator.test.ts +2 -1
  215. package/src/helpers/AddressValidator.ts +13 -10
  216. package/src/helpers/AdminPermissionChecker.ts +193 -95
  217. package/src/helpers/AuthenticatedStructures.ts +13 -11
  218. package/src/helpers/BuckarooHelper.ts +3 -2
  219. package/src/helpers/Context.ts +8 -6
  220. package/src/helpers/CookieHelper.ts +2 -2
  221. package/src/helpers/FileCache.ts +9 -9
  222. package/src/helpers/ForwardHandler.ts +3 -2
  223. package/src/helpers/GlobalHelper.ts +2 -0
  224. package/src/helpers/GroupBuilder.ts +2 -1
  225. package/src/helpers/GroupedThrottledQueue.test.ts +19 -19
  226. package/src/helpers/LimitedFilteredRequestHelper.ts +1 -1
  227. package/src/helpers/MemberCharger.ts +2 -1
  228. package/src/helpers/MemberUserSyncer.ts +6 -3
  229. package/src/helpers/MembershipCharger.ts +2 -2
  230. package/src/helpers/OrganizationCharger.ts +2 -1
  231. package/src/helpers/PeriodHelper.ts +2 -1
  232. package/src/helpers/SQLTranslatedString.ts +3 -2
  233. package/src/helpers/ServiceFeeHelper.ts +1 -1
  234. package/src/helpers/SetupStepUpdater.ts +6 -5
  235. package/src/helpers/StripeHelper.ts +9 -8
  236. package/src/helpers/TagHelper.test.ts +5 -5
  237. package/src/helpers/TagHelper.ts +2 -1
  238. package/src/helpers/TemporaryMemberAccess.ts +2 -1
  239. package/src/helpers/ThrottledQueue.test.ts +20 -20
  240. package/src/helpers/UitpasTokenRepository.ts +7 -7
  241. package/src/helpers/ViesHelper.ts +5 -4
  242. package/src/helpers/XlsxTransformerColumnHelper.ts +21 -19
  243. package/src/helpers/email-html-helpers.ts +13 -12
  244. package/src/helpers/fetchToAsyncIterator.ts +1 -1
  245. package/src/helpers/outstandingBalanceJoin.ts +2 -1
  246. package/src/helpers/updateMemberDetailsUitpasNumber.ts +5 -4
  247. package/src/middleware/ContextMiddleware.ts +1 -1
  248. package/src/migrate.ts +21 -4
  249. package/src/seeds/0000000003-default-email-templates.ts +1 -1
  250. package/src/seeds/0000000004-single-organization.ts +2 -1
  251. package/src/seeds/1752848561-groups-registration-periods.ts +3 -2
  252. package/src/seeds/1754560914-groups-prices.test.ts +2 -1
  253. package/src/seeds/1754560914-groups-prices.ts +2 -1
  254. package/src/seeds/1755790070-fill-email-recipient-errors.ts +6 -6
  255. package/src/seeds/1755876819-remove-duplicate-members.ts +2 -1
  256. package/src/seeds/1765896674-document-update-year.test.ts +2 -1
  257. package/src/seeds/1773754928-force-save-members.ts +15 -0
  258. package/src/services/AuditLogService.ts +3 -2
  259. package/src/services/BalanceItemPaymentService.ts +2 -2
  260. package/src/services/BalanceItemService.ts +2 -1
  261. package/src/services/BootChecksService.test.ts +33 -0
  262. package/src/services/BootChecksService.ts +21 -0
  263. package/src/services/DatabaseCollationService.test.ts +18 -0
  264. package/src/services/DatabaseCollationService.ts +81 -0
  265. package/src/services/DocumentService.ts +1 -1
  266. package/src/services/EventNotificationService.ts +5 -4
  267. package/src/services/FileSignService.ts +2 -2
  268. package/src/services/InvoiceService.ts +3 -3
  269. package/src/services/MemberNumberService.ts +6 -4
  270. package/src/services/MemberRecordStore.ts +28 -19
  271. package/src/services/PaymentReallocationService.test.ts +2 -1
  272. package/src/services/PaymentReallocationService.ts +2 -1
  273. package/src/services/PaymentService.ts +28 -26
  274. package/src/services/RegistrationService.ts +65 -3
  275. package/src/services/SSOService.ts +13 -9
  276. package/src/services/STPackageService.ts +7 -5
  277. package/src/services/StartupHealthService.ts +15 -0
  278. package/src/services/uitpas/PassholderEndpoints.ts +2 -2
  279. package/src/services/uitpas/UitpasService.ts +11 -8
  280. package/src/services/uitpas/cancelTicketSales.ts +1 -1
  281. package/src/services/uitpas/checkPermissionsFor.ts +9 -9
  282. package/src/services/uitpas/getSocialTariffForEvent.ts +4 -4
  283. package/src/services/uitpas/getSocialTariffForUitpasNumbers.ts +5 -5
  284. package/src/services/uitpas/handleUitpasResponse.ts +1 -1
  285. package/src/services/uitpas/registerTicketSales.ts +4 -4
  286. package/src/services/uitpas/searchUitpasEvents.ts +3 -3
  287. package/src/services/uitpas/searchUitpasOrganizers.ts +3 -3
  288. package/src/sql-filters/audit-logs.ts +2 -1
  289. package/src/sql-filters/balance-item-payments.ts +2 -1
  290. package/src/sql-filters/balance-items.ts +2 -1
  291. package/src/sql-filters/base-registration-filter-compilers.ts +6 -4
  292. package/src/sql-filters/document-templates.ts +2 -1
  293. package/src/sql-filters/documents.ts +2 -1
  294. package/src/sql-filters/email-recipients.ts +2 -1
  295. package/src/sql-filters/emails.ts +2 -1
  296. package/src/sql-filters/event-notifications.ts +2 -1
  297. package/src/sql-filters/events.ts +2 -1
  298. package/src/sql-filters/groups.ts +2 -1
  299. package/src/sql-filters/invoiced-balance-items.ts +2 -1
  300. package/src/sql-filters/invoices.ts +2 -1
  301. package/src/sql-filters/member-responsibility-records.ts +2 -1
  302. package/src/sql-filters/members.ts +8 -7
  303. package/src/sql-filters/orders.ts +3 -2
  304. package/src/sql-filters/organization-registration-periods.ts +2 -1
  305. package/src/sql-filters/organizations.ts +2 -1
  306. package/src/sql-filters/payments.ts +2 -1
  307. package/src/sql-filters/platform-memberships.ts +67 -0
  308. package/src/sql-filters/receivable-balances.ts +2 -1
  309. package/src/sql-filters/registration-periods.ts +2 -1
  310. package/src/sql-filters/registrations.ts +2 -1
  311. package/src/sql-filters/tickets.ts +2 -1
  312. package/src/sql-filters/users.ts +2 -1
  313. package/src/sql-filters/webshops.ts +38 -0
  314. package/src/sql-sorters/audit-logs.ts +3 -2
  315. package/src/sql-sorters/balance-items.ts +3 -2
  316. package/src/sql-sorters/document-templates.ts +3 -2
  317. package/src/sql-sorters/documents.ts +3 -2
  318. package/src/sql-sorters/email-recipients.ts +3 -2
  319. package/src/sql-sorters/emails.ts +3 -2
  320. package/src/sql-sorters/event-notifications.ts +3 -2
  321. package/src/sql-sorters/events.ts +3 -2
  322. package/src/sql-sorters/groups.ts +3 -2
  323. package/src/sql-sorters/invoices.ts +3 -2
  324. package/src/sql-sorters/members.ts +3 -2
  325. package/src/sql-sorters/orders.ts +3 -2
  326. package/src/sql-sorters/organization-registration-periods.ts +3 -2
  327. package/src/sql-sorters/organizations.ts +3 -2
  328. package/src/sql-sorters/payments.ts +3 -2
  329. package/src/sql-sorters/platform-memberships.ts +40 -0
  330. package/src/sql-sorters/receivable-balances.ts +3 -2
  331. package/src/sql-sorters/registration-periods.ts +3 -2
  332. package/src/sql-sorters/registrations.ts +3 -2
  333. package/src/sql-sorters/tickets.ts +3 -2
  334. package/src/sql-sorters/webshops.ts +40 -0
  335. package/tests/actions/patchOrganizationMember.ts +5 -4
  336. package/tests/actions/patchPaymentStatus.ts +2 -2
  337. package/tests/actions/patchUserMember.ts +6 -4
  338. package/tests/e2e/api-rate-limits.test.ts +4 -5
  339. package/tests/e2e/bundle-discounts.test.ts +3 -2
  340. package/tests/e2e/charge-members.test.ts +7 -5
  341. package/tests/e2e/documents.test.ts +3 -2
  342. package/tests/e2e/private-files.test.ts +11 -13
  343. package/tests/e2e/register.test.ts +6 -5
  344. package/tests/e2e/stock.test.ts +6 -8
  345. package/tests/e2e/tickets.test.ts +4 -2
  346. package/tests/helpers/StripeMocker.ts +3 -3
  347. package/tests/init/initAdmin.ts +4 -2
  348. package/tests/init/initBundleDiscount.ts +3 -2
  349. package/tests/init/initPayconiq.ts +1 -1
  350. package/tests/init/initPermissionRole.ts +4 -2
  351. package/tests/init/initPlatformRecordCategory.ts +1 -1
  352. package/tests/init/initStripe.ts +1 -1
  353. package/tests/vitest.global.setup.ts +26 -0
  354. package/tests/{jest.setup.ts → vitest.setup.ts} +4 -3
  355. package/tsconfig.build.json +17 -0
  356. package/tsconfig.json +10 -41
  357. package/tsconfig.test.json +17 -0
  358. package/vitest.config.js +13 -0
  359. package/eslint.config.mjs +0 -5
  360. package/jest.config.cjs +0 -27
  361. package/tests/jest.global.setup.ts +0 -33
  362. package/tests/toMatchMap.ts +0 -68
@@ -1,11 +1,14 @@
1
- import { Decoder } from '@simonbackx/simple-encoding';
2
- import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
1
+ import type { Decoder } from '@simonbackx/simple-encoding';
2
+ import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
3
+ import { Endpoint, Response } from '@simonbackx/simple-endpoints';
3
4
  import { SimpleError } from '@simonbackx/simple-errors';
4
5
  import { EventNotification } from '@stamhoofd/models';
5
- import { SQL, SQLSortDefinitions, applySQLSorter, compileToSQLFilter } from '@stamhoofd/sql';
6
- import { AccessRight, CountFilteredRequest, EventNotification as EventNotificationStruct, LimitedFilteredRequest, PaginatedResponse, StamhoofdFilter, assertSort, getSortFilter } from '@stamhoofd/structures';
6
+ import type { SQLSortDefinitions} from '@stamhoofd/sql';
7
+ import { SQL, applySQLSorter, compileToSQLFilter } from '@stamhoofd/sql';
8
+ import type { CountFilteredRequest, EventNotification as EventNotificationStruct, StamhoofdFilter} from '@stamhoofd/structures';
9
+ import { AccessRight, LimitedFilteredRequest, PaginatedResponse, assertSort, getSortFilter } from '@stamhoofd/structures';
7
10
 
8
- import { SQLResultNamespacedRow } from '@simonbackx/simple-database';
11
+ import type { SQLResultNamespacedRow } from '@simonbackx/simple-database';
9
12
  import { AuthenticatedStructures } from '../../../helpers/AuthenticatedStructures.js';
10
13
  import { Context } from '../../../helpers/Context.js';
11
14
  import { eventNotificationsFilterCompilers } from '../../../sql-filters/event-notifications.js';
@@ -142,7 +145,7 @@ export class GetEventNotificationsEndpoint extends Endpoint<Params, Query, Body,
142
145
 
143
146
  for (const notification of notifications) {
144
147
  if (!await Context.auth.canAccessEventNotification(notification)) {
145
- throw Context.auth.error($t(`f18f19ca-c56b-49ad-b131-244cbebb6b1f`));
148
+ throw Context.auth.error($t(`%DT`));
146
149
  }
147
150
  }
148
151
 
@@ -1,9 +1,12 @@
1
- import { Decoder } from '@simonbackx/simple-encoding';
2
- import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
1
+ import type { Decoder } from '@simonbackx/simple-encoding';
2
+ import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
3
+ import { Endpoint, Response } from '@simonbackx/simple-endpoints';
3
4
  import { SimpleError } from '@simonbackx/simple-errors';
4
5
  import { Event } from '@stamhoofd/models';
5
- import { SQL, SQLSortDefinitions, applySQLSorter, compileToSQLFilter } from '@stamhoofd/sql';
6
- import { CountFilteredRequest, Event as EventStruct, LimitedFilteredRequest, PaginatedResponse, StamhoofdFilter, assertSort, getSortFilter } from '@stamhoofd/structures';
6
+ import type { SQLSortDefinitions} from '@stamhoofd/sql';
7
+ import { SQL, applySQLSorter, compileToSQLFilter } from '@stamhoofd/sql';
8
+ import type { CountFilteredRequest, Event as EventStruct, StamhoofdFilter} from '@stamhoofd/structures';
9
+ import { LimitedFilteredRequest, PaginatedResponse, assertSort, getSortFilter } from '@stamhoofd/structures';
7
10
 
8
11
  import { AuthenticatedStructures } from '../../../helpers/AuthenticatedStructures.js';
9
12
  import { Context } from '../../../helpers/Context.js';
@@ -1,7 +1,9 @@
1
1
  import { PatchableArray, PatchMap, patchObject } from '@simonbackx/simple-encoding';
2
- import { Endpoint, Request } from '@simonbackx/simple-endpoints';
2
+ import type { Endpoint} from '@simonbackx/simple-endpoints';
3
+ import { Request } from '@simonbackx/simple-endpoints';
3
4
  import { EmailMocker } from '@stamhoofd/email';
4
- import { EmailTemplateFactory, EventFactory, EventNotification, EventNotificationFactory, EventNotificationTypeFactory, Organization, OrganizationFactory, Platform, RecordAnswerFactory, RecordCategoryFactory, RegistrationPeriod, RegistrationPeriodFactory, Token, User, UserFactory } from '@stamhoofd/models';
5
+ import type { User} from '@stamhoofd/models';
6
+ import { EmailTemplateFactory, EventFactory, EventNotification, EventNotificationFactory, EventNotificationTypeFactory, Organization, OrganizationFactory, Platform, RecordAnswerFactory, RecordCategoryFactory, RegistrationPeriod, RegistrationPeriodFactory, Token, UserFactory } from '@stamhoofd/models';
5
7
  import { AccessRight, BaseOrganization, EmailTemplateType, Event, EventNotificationStatus, EventNotification as EventNotificationStruct, Permissions, PermissionsResourceType, RecordType, ResourcePermissions } from '@stamhoofd/structures';
6
8
  import { STExpect, TestUtils } from '@stamhoofd/test-utils';
7
9
  import { testServer } from '../../../../tests/helpers/TestServer.js';
@@ -1,5 +1,7 @@
1
- import { AutoEncoderPatchType, Decoder, PatchableArrayAutoEncoder, PatchableArrayDecoder, patchObject, StringDecoder } from '@simonbackx/simple-encoding';
2
- import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
1
+ import type { AutoEncoderPatchType, Decoder, PatchableArrayAutoEncoder} from '@simonbackx/simple-encoding';
2
+ import { PatchableArrayDecoder, patchObject, StringDecoder } from '@simonbackx/simple-encoding';
3
+ import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
4
+ import { Endpoint, Response } from '@simonbackx/simple-endpoints';
3
5
  import { Event, EventNotification, Platform, RegistrationPeriod } from '@stamhoofd/models';
4
6
  import { EmailTemplateType, EventNotificationStatus, EventNotification as EventNotificationStruct, PermissionLevel, RecordCategory } from '@stamhoofd/structures';
5
7
 
@@ -69,7 +71,7 @@ export class PatchEventNotificationsEndpoint extends Endpoint<Params, Query, Bod
69
71
  throw new SimpleError({
70
72
  code: 'invalid_field',
71
73
  message: 'Invalid event',
72
- human: $t(`4275fbbe-9921-454e-852c-9c53a9803f1f`),
74
+ human: $t(`%DU`),
73
75
  field: 'events',
74
76
  });
75
77
  }
@@ -87,7 +89,7 @@ export class PatchEventNotificationsEndpoint extends Endpoint<Params, Query, Bod
87
89
  throw new SimpleError({
88
90
  code: 'invalid_period',
89
91
  message: 'No period found for this start date',
90
- human: Context.i18n.$t('5959a6a9-064a-413c-871f-c74a145ed569'),
92
+ human: Context.i18n.$t('%8F'),
91
93
  field: 'startDate',
92
94
  });
93
95
  }
@@ -96,7 +98,7 @@ export class PatchEventNotificationsEndpoint extends Endpoint<Params, Query, Bod
96
98
  throw new SimpleError({
97
99
  code: 'invalid_period',
98
100
  message: 'Period is locked',
99
- human: Context.i18n.$t('97616151-90c3-4644-8854-e228c4f355f5'),
101
+ human: Context.i18n.$t('%AM'),
100
102
  field: 'startDate',
101
103
  });
102
104
  }
@@ -132,7 +134,7 @@ export class PatchEventNotificationsEndpoint extends Endpoint<Params, Query, Bod
132
134
  throw new SimpleError({
133
135
  code: 'not_found',
134
136
  message: 'EventNotification not found',
135
- human: Context.i18n.$t('a0c39573-d44e-4ac0-aaeb-f9062fa1b3ce'),
137
+ human: Context.i18n.$t('%AN'),
136
138
  });
137
139
  }
138
140
 
@@ -150,12 +152,12 @@ export class PatchEventNotificationsEndpoint extends Endpoint<Params, Query, Bod
150
152
  if (!await Context.auth.canAccessEventNotification(notification, requiredPermissionLevel)) {
151
153
  // Requires `OrganizationEventNotificationReviewer` access right for the organization
152
154
  if (notification.status === EventNotificationStatus.Pending) {
153
- throw Context.auth.error(Context.i18n.$t('c5dcd14a-868e-4eba-a5dd-409932e44ce9'));
155
+ throw Context.auth.error(Context.i18n.$t('%AO'));
154
156
  }
155
157
  if (notification.status === EventNotificationStatus.Accepted) {
156
- throw Context.auth.error(Context.i18n.$t('289e2f29-cdc9-4f44-92de-d7188d6563d7'));
158
+ throw Context.auth.error(Context.i18n.$t('%AP'));
157
159
  }
158
- throw Context.auth.error(Context.i18n.$t('b47ce42b-ac72-451e-b871-deb07d93b5fa'));
160
+ throw Context.auth.error(Context.i18n.$t('%AQ'));
159
161
  }
160
162
 
161
163
  const period = await RegistrationPeriod.getByID(notification.periodId);
@@ -163,7 +165,7 @@ export class PatchEventNotificationsEndpoint extends Endpoint<Params, Query, Bod
163
165
  throw new SimpleError({
164
166
  code: 'not_found',
165
167
  message: 'Period not found',
166
- human: Context.i18n.$t('16a3b696-f8da-4b2b-94b7-49c85ee1c38c'),
168
+ human: Context.i18n.$t('%AR'),
167
169
  });
168
170
  }
169
171
 
@@ -171,7 +173,7 @@ export class PatchEventNotificationsEndpoint extends Endpoint<Params, Query, Bod
171
173
  throw new SimpleError({
172
174
  code: 'invalid_period',
173
175
  message: 'Period is locked',
174
- human: Context.i18n.$t('43cc054d-cf2f-432b-9259-e7764dc929e3'),
176
+ human: Context.i18n.$t('%AS'),
175
177
  });
176
178
  }
177
179
 
@@ -234,7 +236,7 @@ export class PatchEventNotificationsEndpoint extends Endpoint<Params, Query, Bod
234
236
  throw new SimpleError({
235
237
  code: 'not_found',
236
238
  message: 'EventNotification not found',
237
- human: Context.i18n.$t('a0c39573-d44e-4ac0-aaeb-f9062fa1b3ce'),
239
+ human: Context.i18n.$t('%AN'),
238
240
  });
239
241
  }
240
242
 
@@ -259,7 +261,7 @@ export class PatchEventNotificationsEndpoint extends Endpoint<Params, Query, Bod
259
261
  throw new SimpleError({
260
262
  code: 'invalid_field',
261
263
  message: 'Invalid type',
262
- human: Context.i18n.$t('4d8be2b1-559a-4c16-a76f-67a8ba85de7f'),
264
+ human: Context.i18n.$t('%AT'),
263
265
  field: 'typeId',
264
266
  });
265
267
  }
@@ -287,7 +289,7 @@ export class PatchEventNotificationsEndpoint extends Endpoint<Params, Query, Bod
287
289
  throw new SimpleError({
288
290
  code: 'invalid_field',
289
291
  message: 'Invalid start date',
290
- human: Context.i18n.$t('daa3726b-9b63-4f36-b41b-8f25d1b89cf4'),
292
+ human: Context.i18n.$t('%AU'),
291
293
  field: 'startDate',
292
294
  });
293
295
  }
@@ -296,7 +298,7 @@ export class PatchEventNotificationsEndpoint extends Endpoint<Params, Query, Bod
296
298
  throw new SimpleError({
297
299
  code: 'invalid_field',
298
300
  message: 'Invalid end date',
299
- human: Context.i18n.$t('d326210d-ecc0-421c-b38b-d12ae0209420'),
301
+ human: Context.i18n.$t('%AV'),
300
302
  field: 'endDate',
301
303
  });
302
304
  }
@@ -1,6 +1,8 @@
1
1
  import { PatchableArray } from '@simonbackx/simple-encoding';
2
- import { Endpoint, Request } from '@simonbackx/simple-endpoints';
3
- import { EventFactory, Organization, OrganizationFactory, OrganizationRegistrationPeriodFactory, PlatformEventTypeFactory, RegistrationPeriodFactory, Token, User, UserFactory } from '@stamhoofd/models';
2
+ import type { Endpoint} from '@simonbackx/simple-endpoints';
3
+ import { Request } from '@simonbackx/simple-endpoints';
4
+ import type { Organization, User} from '@stamhoofd/models';
5
+ import { EventFactory, OrganizationFactory, OrganizationRegistrationPeriodFactory, PlatformEventTypeFactory, RegistrationPeriodFactory, Token, UserFactory } from '@stamhoofd/models';
4
6
  import { AccessRight, Event, Group, GroupSettings, GroupType, PermissionLevel, Permissions, PermissionsResourceType, ResourcePermissions, TranslatedString } from '@stamhoofd/structures';
5
7
  import { STExpect, TestUtils } from '@stamhoofd/test-utils';
6
8
  import { testServer } from '../../../../tests/helpers/TestServer.js';
@@ -1,5 +1,7 @@
1
- import { AutoEncoderPatchType, Decoder, PatchableArrayAutoEncoder, PatchableArrayDecoder, patchObject, StringDecoder } from '@simonbackx/simple-encoding';
2
- import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
1
+ import type { AutoEncoderPatchType, Decoder, PatchableArrayAutoEncoder} from '@simonbackx/simple-encoding';
2
+ import { PatchableArrayDecoder, patchObject, StringDecoder } from '@simonbackx/simple-encoding';
3
+ import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
4
+ import { Endpoint, Response } from '@simonbackx/simple-endpoints';
3
5
  import { Event, Group, OrganizationRegistrationPeriod, Platform, RegistrationPeriod, Webshop } from '@stamhoofd/models';
4
6
  import { AuditLogSource, Event as EventStruct, Group as GroupStruct, GroupType, NamedObject, PermissionLevel } from '@stamhoofd/structures';
5
7
 
@@ -39,7 +41,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
39
41
  throw new SimpleError({
40
42
  code: 'invalid_period',
41
43
  message: 'No period found for this start date: ' + Formatter.dateIso(event.startDate),
42
- human: Context.i18n.$t('5959a6a9-064a-413c-871f-c74a145ed569'),
44
+ human: Context.i18n.$t('%8F'),
43
45
  field: 'startDate',
44
46
  });
45
47
  }
@@ -53,7 +55,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
53
55
  }
54
56
 
55
57
  if (!await Context.auth.canAccessGroupsInPeriod(period.id, putGroup.organizationId)) {
56
- throw Context.auth.error($t(`0d47541d-abf2-45b5-a06c-3a85b7fa3994`));
58
+ throw Context.auth.error($t(`%1HQ`));
57
59
  }
58
60
 
59
61
  if (!group) {
@@ -109,7 +111,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
109
111
  throw new SimpleError({
110
112
  code: 'invalid_field',
111
113
  message: 'Empty groups',
112
- human: $t(`93faf169-b78d-4ad2-b13b-3b974267a632`),
114
+ human: $t(`%DV`),
113
115
  });
114
116
  }
115
117
 
@@ -117,7 +119,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
117
119
  throw new SimpleError({
118
120
  code: 'invalid_field',
119
121
  message: 'Empty default age groups',
120
- human: $t(`2712befc-5cc5-4013-b8df-ec0861a82c36`),
122
+ human: $t(`%DW`),
121
123
  });
122
124
  }
123
125
 
@@ -125,7 +127,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
125
127
  throw new SimpleError({
126
128
  code: 'invalid_field',
127
129
  message: 'Empty organization tag ids',
128
- human: $t(`30230574-2956-4e40-ba11-5523c24c0af8`),
130
+ human: $t(`%DX`),
129
131
  });
130
132
  }
131
133
 
@@ -158,7 +160,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
158
160
  throw new SimpleError({
159
161
  code: 'not_found',
160
162
  message: 'Event not found',
161
- human: $t(`c5f3d2c3-9d7a-473d-ba91-63ce104a2de5`),
163
+ human: $t(`%DY`),
162
164
  });
163
165
  }
164
166
 
@@ -168,7 +170,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
168
170
  throw new SimpleError({
169
171
  code: 'invalid_field',
170
172
  message: 'Cannot patch organizationCache',
171
- human: $t(`74e6eba6-596c-4e55-b178-b2a5fdbca581`),
173
+ human: $t(`%DZ`),
172
174
  field: 'meta.organizationCache',
173
175
  });
174
176
  }
@@ -188,7 +190,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
188
190
  throw new SimpleError({
189
191
  code: 'invalid_field',
190
192
  message: 'Empty groups',
191
- human: $t(`93faf169-b78d-4ad2-b13b-3b974267a632`),
193
+ human: $t(`%DV`),
192
194
  });
193
195
  }
194
196
 
@@ -196,7 +198,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
196
198
  throw new SimpleError({
197
199
  code: 'invalid_field',
198
200
  message: 'Empty default age groups',
199
- human: $t(`2712befc-5cc5-4013-b8df-ec0861a82c36`),
201
+ human: $t(`%DW`),
200
202
  });
201
203
  }
202
204
 
@@ -204,7 +206,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
204
206
  throw new SimpleError({
205
207
  code: 'invalid_field',
206
208
  message: 'Empty organization tag ids',
207
- human: $t(`30230574-2956-4e40-ba11-5523c24c0af8`),
209
+ human: $t(`%DX`),
208
210
  });
209
211
  }
210
212
 
@@ -300,7 +302,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
300
302
  throw new SimpleError({
301
303
  code: 'invalid_group',
302
304
  message: 'Group is not of the same organization',
303
- human: $t('1f64237b-84c4-43e7-b752-2875fd1eb075'),
305
+ human: $t('%15c'),
304
306
  });
305
307
  }
306
308
  }
@@ -317,12 +319,12 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
317
319
  throw new SimpleError({
318
320
  code: 'not_found',
319
321
  message: 'Webshop not found',
320
- human: $t(`c5f3d2c3-9d7a-473d-ba91-63ce104a2de5`),
322
+ human: $t(`%DY`),
321
323
  field: 'webshopId',
322
324
  });
323
325
  }
324
326
  if (!await Context.auth.canAccessWebshop(webshop, PermissionLevel.Read)) {
325
- throw Context.auth.error($t('2ee1d364-8747-430d-8a33-094e01df465e'));
327
+ throw Context.auth.error($t('%185'));
326
328
  }
327
329
  event.webshopId = webshop.id;
328
330
  }
@@ -375,7 +377,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
375
377
  throw new SimpleError({
376
378
  code: 'invalid_field',
377
379
  message: 'Invalid typeId',
378
- human: $t(`6b36fc82-d88c-49cc-ae94-4653ad37b3e3`),
380
+ human: $t(`%Da`),
379
381
  field: 'typeId',
380
382
  });
381
383
  }
@@ -392,7 +394,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
392
394
  throw new SimpleError({
393
395
  code: 'invalid_field',
394
396
  message: 'Empty number',
395
- human: $t(`6b72f8bd-cd5b-423f-a556-be102d3c22e9`),
397
+ human: $t(`%vQ`),
396
398
  field: 'event_required',
397
399
  });
398
400
  }
@@ -404,7 +406,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
404
406
  throw new SimpleError({
405
407
  code: 'invalid_field',
406
408
  message: 'Name is too short',
407
- human: $t(`53a66432-0bf5-4193-9eb8-dbd52d86a1f8`),
409
+ human: $t(`%Db`),
408
410
  field: 'name',
409
411
  });
410
412
  }
@@ -413,7 +415,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
413
415
  throw new SimpleError({
414
416
  code: 'invalid_dates',
415
417
  message: 'End date is before start date',
416
- human: $t(`318924c0-7a79-4cfa-b206-ffc27c4d32b7`),
418
+ human: $t(`%Dc`),
417
419
  field: 'endDate',
418
420
  });
419
421
  }
@@ -430,9 +432,9 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
430
432
  throw new SimpleError({
431
433
  code: 'minimum_days',
432
434
  message: 'An event with this type has a minimum of ' + type.minimumDays + ' days',
433
- human: $t(`04ff85c0-eb98-46b8-975b-8fd136ddc49a`, {
435
+ human: $t(`%14D`, {
434
436
  name: type.name,
435
- days: Formatter.pluralText(type.minimumDays, $t(`a6279389-a070-49c9-a085-bb312555e419`), $t(`fca0ce20-d696-4966-a50c-441f54f046c4`)),
437
+ days: Formatter.pluralText(type.minimumDays, $t(`%1N7`), $t(`%1N6`)),
436
438
  }),
437
439
  field: 'startDate',
438
440
  });
@@ -442,9 +444,9 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
442
444
  throw new SimpleError({
443
445
  code: 'maximum_days',
444
446
  message: 'An event with this type has a maximum of ' + type.maximumDays + ' days',
445
- human: $t(`a7d005aa-ceaa-4323-8fac-a02fce174023`, {
447
+ human: $t(`%14E`, {
446
448
  name: type.name,
447
- days: Formatter.pluralText(type.maximumDays, $t(`a6279389-a070-49c9-a085-bb312555e419`), $t(`fca0ce20-d696-4966-a50c-441f54f046c4`)),
449
+ days: Formatter.pluralText(type.maximumDays, $t(`%1N7`), $t(`%1N6`)),
448
450
  }),
449
451
  field: 'startDate',
450
452
  });
@@ -469,7 +471,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
469
471
  throw new SimpleError({
470
472
  code: 'type_maximum_reached',
471
473
  message: 'Maximum number of events with this type reached',
472
- human: $t(`fb7df531-0f89-4841-b685-7b2cfb5b507d`) + ' ' + type.name + ' ' + $t(`073d20dc-88f3-4145-89f5-13cc8ad90207`) + type.maximum + ')',
474
+ human: $t(`%Dd`) + ' ' + type.name + ' ' + $t(`%De`) + type.maximum + ')',
473
475
  field: 'typeId',
474
476
  });
475
477
  }
@@ -478,7 +480,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
478
480
  throw new SimpleError({
479
481
  code: 'invalid_period',
480
482
  message: 'No period found for this start date',
481
- human: $t(`7a38bf9d-4df7-4827-85dc-327ffe6cd50a`),
483
+ human: $t(`%Df`),
482
484
  field: 'startDate',
483
485
  });
484
486
  }
@@ -499,7 +501,7 @@ export class PatchEventsEndpoint extends Endpoint<Params, Query, Body, ResponseB
499
501
  const originalGroupType = existingGroup.type;
500
502
 
501
503
  if (!await Context.auth.canAccessGroup(existingGroup)) {
502
- throw Context.auth.error($t(`9cb60490-97be-4d11-beaf-4bdcf8b02d53`));
504
+ throw Context.auth.error($t(`%1N9`));
503
505
  }
504
506
 
505
507
  if (event.organizationId !== existingGroup.organizationId) {
@@ -1,10 +1,13 @@
1
- import { Decoder } from '@simonbackx/simple-encoding';
2
- import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
1
+ import type { Decoder } from '@simonbackx/simple-encoding';
2
+ import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
3
+ import { Endpoint, Response } from '@simonbackx/simple-endpoints';
3
4
  import { SimpleError } from '@simonbackx/simple-errors';
4
- import { ArchiverWriterAdapter, exportToExcel, XlsxTransformerSheet, XlsxWriter } from '@stamhoofd/excel-writer';
5
+ import type { XlsxTransformerSheet} from '@stamhoofd/excel-writer';
6
+ import { ArchiverWriterAdapter, exportToExcel, XlsxWriter } from '@stamhoofd/excel-writer';
5
7
  import { Platform, RateLimiter, sendEmailTemplate } from '@stamhoofd/models';
6
8
  import { QueueHandler } from '@stamhoofd/queues';
7
- import { EmailTemplateType, ExcelExportRequest, ExcelExportResponse, ExcelExportType, IPaginatedResponse, LimitedFilteredRequest, Replacement, Version } from '@stamhoofd/structures';
9
+ import type { ExcelExportType, IPaginatedResponse, LimitedFilteredRequest} from '@stamhoofd/structures';
10
+ import { EmailTemplateType, ExcelExportRequest, ExcelExportResponse, Replacement, Version } from '@stamhoofd/structures';
8
11
  import { sleep } from '@stamhoofd/utility';
9
12
  import { Context } from '../../../helpers/Context.js';
10
13
  import { fetchToAsyncIterator } from '../../../helpers/fetchToAsyncIterator.js';
@@ -65,7 +68,7 @@ export class ExportToExcelEndpoint extends Endpoint<Params, Query, Body, Respons
65
68
  throw new SimpleError({
66
69
  code: 'not_allowed',
67
70
  message: 'Export is pending',
68
- human: $t(`a77e6624-bd1f-4374-af5a-d25cc60ee4da`),
71
+ human: $t(`%Dg`),
69
72
  statusCode: 403,
70
73
  });
71
74
  }
@@ -1,6 +1,8 @@
1
- import { AutoEncoder, Decoder, field, StringDecoder } from '@simonbackx/simple-encoding';
2
- import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
3
- import { Readable } from 'node:stream';
1
+ import type { Decoder} from '@simonbackx/simple-encoding';
2
+ import { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';
3
+ import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
4
+ import { Endpoint, Response } from '@simonbackx/simple-endpoints';
5
+ import type { Readable } from 'node:stream';
4
6
  import { Context } from '../../../helpers/Context.js';
5
7
  import { FileCache } from '../../../helpers/FileCache.js';
6
8
  import { Formatter } from '@stamhoofd/utility';
@@ -1,5 +1,6 @@
1
1
  import { PutObjectCommand, S3Client } from '@aws-sdk/client-s3'; // ES Modules import
2
- import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
2
+ import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
3
+ import { Endpoint, Response } from '@simonbackx/simple-endpoints';
3
4
  import { SimpleError } from '@simonbackx/simple-errors';
4
5
  import { File } from '@stamhoofd/structures';
5
6
  import { Formatter } from '@stamhoofd/utility';
@@ -7,7 +8,8 @@ import formidable from 'formidable';
7
8
  import { promises as fs } from 'fs';
8
9
  import { v4 as uuidv4 } from 'uuid';
9
10
 
10
- import { AutoEncoder, BooleanDecoder, Decoder, field } from '@simonbackx/simple-encoding';
11
+ import type { Decoder} from '@simonbackx/simple-encoding';
12
+ import { AutoEncoder, BooleanDecoder, field } from '@simonbackx/simple-encoding';
11
13
  import { Context } from '../../../helpers/Context.js';
12
14
  import { limiter } from './UploadImage.js';
13
15
  import { Image } from '@stamhoofd/models';
@@ -121,7 +123,11 @@ export class UploadFile extends Endpoint<Params, Query, Body, ResponseBody> {
121
123
  prefix += '/';
122
124
  }
123
125
 
124
- prefix += (STAMHOOFD.environment ?? 'development') === 'development' ? ('development/') : ('');
126
+ const envPrefix = STAMHOOFD.environment !== 'production' ? STAMHOOFD.environment : null;
127
+
128
+ if (envPrefix && envPrefix !== (STAMHOOFD.SPACES_PREFIX ?? '')) {
129
+ prefix += envPrefix + '/';
130
+ }
125
131
 
126
132
  // Prepend user id to the file path
127
133
  if (request.query.isPrivate && user) {
@@ -156,7 +162,7 @@ export class UploadFile extends Endpoint<Params, Query, Body, ResponseBody> {
156
162
  throw new SimpleError({
157
163
  code: 'failed_to_sign',
158
164
  message: 'Failed to sign file',
159
- human: $t('509cdb4f-131a-42a6-b3b1-a63cca231e65'),
165
+ human: $t('%B6'),
160
166
  statusCode: 500,
161
167
  });
162
168
  }
@@ -1,5 +1,7 @@
1
- import { AutoEncoder, BooleanDecoder, Decoder, field, ObjectData } from '@simonbackx/simple-encoding';
2
- import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
1
+ import type { Decoder} from '@simonbackx/simple-encoding';
2
+ import { AutoEncoder, BooleanDecoder, field, ObjectData } from '@simonbackx/simple-encoding';
3
+ import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
4
+ import { Endpoint, Response } from '@simonbackx/simple-endpoints';
3
5
  import { SimpleError } from '@simonbackx/simple-errors';
4
6
  import { Image, RateLimiter } from '@stamhoofd/models';
5
7
  import { Image as ImageStruct, ResolutionRequest } from '@stamhoofd/structures';
@@ -1,6 +1,8 @@
1
1
  import { Request } from '@simonbackx/simple-endpoints';
2
- import { GroupFactory, Organization, OrganizationFactory, OrganizationRegistrationPeriodFactory, RegistrationPeriod, RegistrationPeriodFactory, Token, UserFactory } from '@stamhoofd/models';
3
- import { BundleDiscountGroupPriceSettings, GroupPrice, GroupType, LimitedFilteredRequest, StamhoofdFilter } from '@stamhoofd/structures';
2
+ import type { Organization, RegistrationPeriod} from '@stamhoofd/models';
3
+ import { GroupFactory, OrganizationFactory, OrganizationRegistrationPeriodFactory, RegistrationPeriodFactory, Token, UserFactory } from '@stamhoofd/models';
4
+ import type { StamhoofdFilter } from '@stamhoofd/structures';
5
+ import { BundleDiscountGroupPriceSettings, GroupPrice, GroupType, LimitedFilteredRequest } from '@stamhoofd/structures';
4
6
  import { STExpect, TestUtils } from '@stamhoofd/test-utils';
5
7
  import { testServer } from '../../../../tests/helpers/TestServer.js';
6
8
  import { initAdmin, initBundleDiscount, initPlatformAdmin } from '../../../../tests/init/index.js';
@@ -1,10 +1,13 @@
1
- import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
2
- import { assertSort, CountFilteredRequest, getSortFilter, Group as GroupStruct, LimitedFilteredRequest, PaginatedResponse, StamhoofdFilter } from '@stamhoofd/structures';
1
+ import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
2
+ import { Endpoint, Response } from '@simonbackx/simple-endpoints';
3
+ import type { CountFilteredRequest, Group as GroupStruct, StamhoofdFilter } from '@stamhoofd/structures';
4
+ import { assertSort, getSortFilter, LimitedFilteredRequest, PaginatedResponse } from '@stamhoofd/structures';
3
5
 
4
- import { Decoder } from '@simonbackx/simple-encoding';
6
+ import type { Decoder } from '@simonbackx/simple-encoding';
5
7
  import { SimpleError } from '@simonbackx/simple-errors';
6
8
  import { Group } from '@stamhoofd/models';
7
- import { applySQLSorter, compileToSQLFilter, SQLFilterDefinitions, SQLSortDefinitions } from '@stamhoofd/sql';
9
+ import type { SQLFilterDefinitions, SQLSortDefinitions } from '@stamhoofd/sql';
10
+ import { applySQLSorter, compileToSQLFilter } from '@stamhoofd/sql';
8
11
  import { AuthenticatedStructures } from '../../../helpers/AuthenticatedStructures.js';
9
12
  import { Context } from '../../../helpers/Context.js';
10
13
  import { groupFilterCompilers } from '../../../sql-filters/groups.js';
@@ -115,7 +118,7 @@ export class GetGroupsEndpoint extends Endpoint<Params, Query, Body, ResponseBod
115
118
  code: 'client_update_required',
116
119
  statusCode: 400,
117
120
  message: 'Er is een noodzakelijke update beschikbaar. Herlaad de pagina en wis indien nodig de cache van jouw browser.',
118
- human: $t(`adb0e7c8-aed7-43f5-bfcc-a350f03aaabe`),
121
+ human: $t(`%G8`),
119
122
  });
120
123
  }
121
124
 
@@ -1,7 +1,9 @@
1
- import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
2
- import { Member, MemberWithUsersRegistrationsAndGroups } from '@stamhoofd/models';
1
+ import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
2
+ import { Endpoint, Response } from '@simonbackx/simple-endpoints';
3
+ import type { MemberWithUsersRegistrationsAndGroups } from '@stamhoofd/models';
4
+ import { Member } from '@stamhoofd/models';
3
5
 
4
- import { MembersBlob } from '@stamhoofd/structures';
6
+ import type { MembersBlob } from '@stamhoofd/structures';
5
7
  import { AuthenticatedStructures } from '../../../helpers/AuthenticatedStructures.js';
6
8
  import { Context } from '../../../helpers/Context.js';
7
9
  type Params = { id: string };
@@ -55,7 +57,7 @@ export class GetMemberFamilyEndpoint extends Endpoint<Params, Query, Body, Respo
55
57
 
56
58
  // Check access to this member (this will automatically give access to the family)
57
59
  if (!await Context.auth.canAccessMember(member)) {
58
- throw Context.auth.error($t(`c9797487-3e24-4686-9bdc-2a7ec9cee8ed`));
60
+ throw Context.auth.error($t(`%Dh`));
59
61
  }
60
62
  validatedMembers.push(member);
61
63
  continue;
@@ -67,7 +69,7 @@ export class GetMemberFamilyEndpoint extends Endpoint<Params, Query, Body, Respo
67
69
  }
68
70
 
69
71
  if (!foundMember) {
70
- throw Context.auth.error($t(`c9797487-3e24-4686-9bdc-2a7ec9cee8ed`));
72
+ throw Context.auth.error($t(`%Dh`));
71
73
  }
72
74
 
73
75
  return new Response(
@@ -1,5 +1,6 @@
1
- import { Decoder } from '@simonbackx/simple-encoding';
2
- import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
1
+ import type { Decoder } from '@simonbackx/simple-encoding';
2
+ import type { DecodedRequest, Request} from '@simonbackx/simple-endpoints';
3
+ import { Endpoint, Response } from '@simonbackx/simple-endpoints';
3
4
  import { CountFilteredRequest, CountResponse } from '@stamhoofd/structures';
4
5
 
5
6
  import { Context } from '../../../helpers/Context.js';
@@ -1,5 +1,7 @@
1
- import { Endpoint, Request } from '@simonbackx/simple-endpoints';
2
- import { EventFactory, GroupFactory, MemberFactory, OrganizationFactory, RecordCategoryFactory, RegistrationFactory, RegistrationPeriod, RegistrationPeriodFactory, Token, UserFactory } from '@stamhoofd/models';
1
+ import type { Endpoint} from '@simonbackx/simple-endpoints';
2
+ import { Request } from '@simonbackx/simple-endpoints';
3
+ import type { RegistrationPeriod} from '@stamhoofd/models';
4
+ import { EventFactory, GroupFactory, MemberFactory, OrganizationFactory, RecordCategoryFactory, RegistrationFactory, RegistrationPeriodFactory, Token, UserFactory } from '@stamhoofd/models';
3
5
  import { AccessRight, EventMeta, GroupType, LimitedFilteredRequest, NamedObject, PermissionLevel, PermissionRoleDetailed, Permissions, PermissionsResourceType, RecordAnswer, RecordTextAnswer, RecordType, ResourcePermissions } from '@stamhoofd/structures';
4
6
  import { STExpect, TestUtils } from '@stamhoofd/test-utils';
5
7
  import { GetMembersEndpoint } from './GetMembersEndpoint.js';
@@ -1,12 +1,14 @@
1
- import { Decoder } from '@simonbackx/simple-encoding';
2
- import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
1
+ import type { Decoder } from '@simonbackx/simple-encoding';
2
+ import type { DecodedRequest, Request } from '@simonbackx/simple-endpoints';
3
+ import { Endpoint, Response } from '@simonbackx/simple-endpoints';
3
4
  import { SimpleError } from '@simonbackx/simple-errors';
4
5
  import { Group, Member, Platform } from '@stamhoofd/models';
5
6
  import { SQL, applySQLSorter, compileToSQLFilter } from '@stamhoofd/sql';
6
- import { CountFilteredRequest, Country, CountryCode, GroupType, LimitedFilteredRequest, MembersBlob, PaginatedResponse, PermissionLevel, StamhoofdFilter, assertSort, getSortFilter } from '@stamhoofd/structures';
7
+ import type { CountFilteredRequest, MembersBlob, StamhoofdFilter } from '@stamhoofd/structures';
8
+ import { GroupType, LimitedFilteredRequest, PaginatedResponse, PermissionLevel, assertSort, getSortFilter } from '@stamhoofd/structures';
9
+ import type { CountryCode } from '@stamhoofd/types/Country';
10
+ import { Country } from '@stamhoofd/types/Country';
7
11
  import { DataValidator } from '@stamhoofd/utility';
8
-
9
- import { SQLResultNamespacedRow } from '@simonbackx/simple-database';
10
12
  import parsePhoneNumber from 'libphonenumber-js/max';
11
13
  import { AuthenticatedStructures } from '../../../helpers/AuthenticatedStructures.js';
12
14
  import { Context } from '../../../helpers/Context.js';
@@ -109,7 +111,7 @@ export class GetMembersEndpoint extends Endpoint<Params, Query, Body, ResponseBo
109
111
  if (groupIds.length === 0) {
110
112
  throw Context.auth.error({
111
113
  message: 'You must filter on a group of the organization you are trying to access',
112
- human: $t(`737f9ff3-8eca-40f5-8f03-d303d53de5d1`),
114
+ human: $t(`%15d`),
113
115
  });
114
116
  }
115
117
 
@@ -202,7 +204,7 @@ export class GetMembersEndpoint extends Endpoint<Params, Query, Body, ResponseBo
202
204
  }
203
205
 
204
206
  // Is lidnummer?
205
- if (!searchFilter && (search.match(/^[0-9]{4}-[0-9]{6}-[0-9]{1,2}$/) || search.match(/^[0-9]{9,10}$/))) {
207
+ if (!searchFilter && (search.match(/^\d{4}-\d{6}-\d{1,2}$/) || search.match(/^\d{9,10}$/))) {
206
208
  searchFilter = {
207
209
  memberNumber: {
208
210
  $eq: search,
@@ -264,7 +266,7 @@ export class GetMembersEndpoint extends Endpoint<Params, Query, Body, ResponseBo
264
266
  throw new SimpleError({
265
267
  code: 'timeout',
266
268
  message: 'Query took too long',
267
- human: $t(`dce51638-6129-448b-8a15-e6d778f3a76a`),
269
+ human: $t(`%Cv`),
268
270
  });
269
271
  }
270
272
  throw error;