@stamhoofd/backend 2.39.1 → 2.40.1

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 (198) hide show
  1. package/eslint.config.mjs +5 -0
  2. package/index.ts +81 -74
  3. package/jest.config.cjs +10 -0
  4. package/migrations.ts +16 -14
  5. package/package.json +11 -11
  6. package/src/crons/clear-excel-cache.test.ts +48 -50
  7. package/src/crons/clear-excel-cache.ts +18 -18
  8. package/src/crons/setup-steps.ts +2 -2
  9. package/src/crons.ts +325 -306
  10. package/src/decoders/StringArrayDecoder.ts +7 -7
  11. package/src/decoders/StringNullableDecoder.ts +1 -2
  12. package/src/email-recipient-loaders/members.ts +22 -22
  13. package/src/endpoints/admin/memberships/ChargeMembershipsEndpoint.ts +8 -9
  14. package/src/endpoints/admin/memberships/GetChargeMembershipsSummaryEndpoint.ts +39 -40
  15. package/src/endpoints/admin/organizations/GetOrganizationsCountEndpoint.ts +8 -8
  16. package/src/endpoints/admin/organizations/GetOrganizationsEndpoint.ts +44 -45
  17. package/src/endpoints/admin/organizations/PatchOrganizationsEndpoint.ts +58 -57
  18. package/src/endpoints/auth/CreateAdminEndpoint.ts +48 -45
  19. package/src/endpoints/auth/CreateTokenEndpoint.test.ts +31 -31
  20. package/src/endpoints/auth/CreateTokenEndpoint.ts +146 -147
  21. package/src/endpoints/auth/DeleteTokenEndpoint.ts +7 -7
  22. package/src/endpoints/auth/DeleteUserEndpoint.ts +15 -15
  23. package/src/endpoints/auth/ForgotPasswordEndpoint.ts +17 -18
  24. package/src/endpoints/auth/GetOtherUserEndpoint.ts +9 -10
  25. package/src/endpoints/auth/GetUserEndpoint.test.ts +32 -35
  26. package/src/endpoints/auth/GetUserEndpoint.ts +5 -6
  27. package/src/endpoints/auth/PatchApiUserEndpoint.ts +35 -33
  28. package/src/endpoints/auth/PatchUserEndpoint.ts +55 -52
  29. package/src/endpoints/auth/PollEmailVerificationEndpoint.ts +9 -9
  30. package/src/endpoints/auth/RetryEmailVerificationEndpoint.ts +8 -8
  31. package/src/endpoints/auth/SignupEndpoint.ts +37 -36
  32. package/src/endpoints/auth/VerifyEmailEndpoint.ts +29 -28
  33. package/src/endpoints/global/addresses/SearchRegionsEndpoint.ts +33 -33
  34. package/src/endpoints/global/addresses/ValidateAddressEndpoint.ts +7 -7
  35. package/src/endpoints/global/caddy/CheckDomainCertEndpoint.ts +37 -37
  36. package/src/endpoints/global/email/CreateEmailEndpoint.ts +30 -30
  37. package/src/endpoints/global/email/GetEmailAddressEndpoint.ts +13 -13
  38. package/src/endpoints/global/email/GetEmailEndpoint.ts +13 -13
  39. package/src/endpoints/global/email/ManageEmailAddressEndpoint.ts +16 -16
  40. package/src/endpoints/global/email/PatchEmailEndpoint.ts +25 -25
  41. package/src/endpoints/global/events/GetEventsEndpoint.ts +43 -44
  42. package/src/endpoints/global/events/PatchEventsEndpoint.ts +127 -172
  43. package/src/endpoints/global/files/ExportToExcelEndpoint.ts +49 -50
  44. package/src/endpoints/global/files/GetFileCache.ts +13 -13
  45. package/src/endpoints/global/files/UploadFile.ts +51 -54
  46. package/src/endpoints/global/files/UploadImage.ts +53 -53
  47. package/src/endpoints/global/groups/GetGroupsEndpoint.ts +25 -25
  48. package/src/endpoints/global/members/GetMemberFamilyEndpoint.ts +24 -23
  49. package/src/endpoints/global/members/GetMembersCountEndpoint.ts +8 -8
  50. package/src/endpoints/global/members/GetMembersEndpoint.ts +105 -102
  51. package/src/endpoints/global/members/PatchOrganizationMembersEndpoint.ts +240 -239
  52. package/src/endpoints/global/organizations/CheckRegisterCodeEndpoint.ts +12 -14
  53. package/src/endpoints/global/organizations/CreateOrganizationEndpoint.test.ts +32 -33
  54. package/src/endpoints/global/organizations/CreateOrganizationEndpoint.ts +48 -57
  55. package/src/endpoints/global/organizations/GetOrganizationFromDomainEndpoint.test.ts +21 -22
  56. package/src/endpoints/global/organizations/GetOrganizationFromDomainEndpoint.ts +28 -28
  57. package/src/endpoints/global/organizations/GetOrganizationFromUriEndpoint.ts +18 -18
  58. package/src/endpoints/global/organizations/SearchOrganizationEndpoint.test.ts +20 -20
  59. package/src/endpoints/global/organizations/SearchOrganizationEndpoint.ts +17 -17
  60. package/src/endpoints/global/payments/StripeWebhookEndpoint.ts +81 -75
  61. package/src/endpoints/global/platform/GetPlatformAdminsEndpoint.ts +14 -14
  62. package/src/endpoints/global/platform/GetPlatformEnpoint.ts +11 -11
  63. package/src/endpoints/global/platform/PatchPlatformEnpoint.ts +71 -68
  64. package/src/endpoints/global/registration/GetPaymentRegistrations.ts +27 -27
  65. package/src/endpoints/global/registration/GetUserBillingStatusEndpoint.ts +30 -30
  66. package/src/endpoints/global/registration/GetUserDetailedBillingStatusEndpoint.ts +34 -34
  67. package/src/endpoints/global/registration/GetUserDocumentsEndpoint.ts +26 -26
  68. package/src/endpoints/global/registration/GetUserMembersEndpoint.ts +12 -12
  69. package/src/endpoints/global/registration/PatchUserMembersEndpoint.ts +90 -90
  70. package/src/endpoints/global/registration/RegisterMembersEndpoint.test.ts +118 -121
  71. package/src/endpoints/global/registration/RegisterMembersEndpoint.ts +362 -350
  72. package/src/endpoints/global/registration-periods/GetRegistrationPeriodsEndpoint.ts +8 -9
  73. package/src/endpoints/global/registration-periods/PatchRegistrationPeriodsEndpoint.ts +21 -21
  74. package/src/endpoints/global/webshops/GetWebshopFromDomainEndpoint.ts +65 -65
  75. package/src/endpoints/organization/dashboard/billing/GetOrganizationBillingStatusEndpoint.ts +9 -9
  76. package/src/endpoints/organization/dashboard/billing/GetOrganizationDetailedBillingStatusEndpoint.ts +14 -14
  77. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplateXML.ts +17 -17
  78. package/src/endpoints/organization/dashboard/documents/GetDocumentTemplatesEndpoint.ts +21 -21
  79. package/src/endpoints/organization/dashboard/documents/GetDocumentsEndpoint.ts +15 -15
  80. package/src/endpoints/organization/dashboard/documents/PatchDocumentEndpoint.ts +52 -52
  81. package/src/endpoints/organization/dashboard/documents/PatchDocumentTemplateEndpoint.ts +37 -37
  82. package/src/endpoints/organization/dashboard/email/CheckEmailBouncesEndpoint.ts +14 -14
  83. package/src/endpoints/organization/dashboard/email/EmailEndpoint.ts +113 -112
  84. package/src/endpoints/organization/dashboard/email-templates/GetEmailTemplatesEndpoint.ts +29 -29
  85. package/src/endpoints/organization/dashboard/email-templates/PatchEmailTemplatesEndpoint.ts +48 -47
  86. package/src/endpoints/organization/dashboard/mollie/CheckMollieEndpoint.ts +22 -21
  87. package/src/endpoints/organization/dashboard/mollie/ConnectMollieEndpoint.ts +13 -14
  88. package/src/endpoints/organization/dashboard/mollie/DisconnectMollieEndpoint.ts +12 -13
  89. package/src/endpoints/organization/dashboard/mollie/GetMollieDashboardEndpoint.ts +24 -24
  90. package/src/endpoints/organization/dashboard/nolt/CreateNoltTokenEndpoint.ts +10 -12
  91. package/src/endpoints/organization/dashboard/organization/GetOrganizationArchivedGroups.ts +14 -14
  92. package/src/endpoints/organization/dashboard/organization/GetOrganizationDeletedGroups.ts +13 -13
  93. package/src/endpoints/organization/dashboard/organization/GetOrganizationSSOEndpoint.ts +12 -12
  94. package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.test.ts +120 -124
  95. package/src/endpoints/organization/dashboard/organization/PatchOrganizationEndpoint.ts +172 -173
  96. package/src/endpoints/organization/dashboard/organization/SetOrganizationDomainEndpoint.ts +88 -89
  97. package/src/endpoints/organization/dashboard/organization/SetOrganizationSSOEndpoint.ts +12 -12
  98. package/src/endpoints/organization/dashboard/payments/GetMemberBalanceEndpoint.ts +17 -17
  99. package/src/endpoints/organization/dashboard/payments/GetPaymentsCountEndpoint.ts +8 -8
  100. package/src/endpoints/organization/dashboard/payments/GetPaymentsEndpoint.ts +66 -67
  101. package/src/endpoints/organization/dashboard/payments/PatchBalanceItemsEndpoint.ts +47 -47
  102. package/src/endpoints/organization/dashboard/payments/PatchPaymentsEndpoint.ts +93 -91
  103. package/src/endpoints/organization/dashboard/registration-periods/GetOrganizationRegistrationPeriodsEndpoint.ts +16 -17
  104. package/src/endpoints/organization/dashboard/registration-periods/PatchOrganizationRegistrationPeriodsEndpoint.ts +170 -167
  105. package/src/endpoints/organization/dashboard/registration-periods/SetupStepReviewEndpoint.ts +25 -24
  106. package/src/endpoints/organization/dashboard/stripe/ConnectStripeEndpoint.ts +22 -23
  107. package/src/endpoints/organization/dashboard/stripe/DeleteStripeAccountEndpoint.ts +22 -22
  108. package/src/endpoints/organization/dashboard/stripe/GetStripeAccountLinkEndpoint.ts +17 -18
  109. package/src/endpoints/organization/dashboard/stripe/GetStripeAccountsEndpoint.ts +8 -9
  110. package/src/endpoints/organization/dashboard/stripe/GetStripeLoginLinkEndpoint.ts +17 -18
  111. package/src/endpoints/organization/dashboard/stripe/UpdateStripeAccountEndpoint.ts +14 -15
  112. package/src/endpoints/organization/dashboard/users/CreateApiUserEndpoint.ts +19 -19
  113. package/src/endpoints/organization/dashboard/users/DeleteUserEndpoint.ts +19 -19
  114. package/src/endpoints/organization/dashboard/users/GetApiUsersEndpoint.ts +14 -14
  115. package/src/endpoints/organization/dashboard/users/GetOrganizationAdminsEndpoint.ts +12 -12
  116. package/src/endpoints/organization/dashboard/webshops/CreateWebshopEndpoint.ts +103 -100
  117. package/src/endpoints/organization/dashboard/webshops/DeleteWebshopEndpoint.ts +11 -12
  118. package/src/endpoints/organization/dashboard/webshops/GetDiscountCodesEndpoint.ts +15 -15
  119. package/src/endpoints/organization/dashboard/webshops/GetWebshopOrdersEndpoint.ts +14 -14
  120. package/src/endpoints/organization/dashboard/webshops/GetWebshopTicketsEndpoint.ts +14 -14
  121. package/src/endpoints/organization/dashboard/webshops/GetWebshopUriAvailabilityEndpoint.ts +23 -23
  122. package/src/endpoints/organization/dashboard/webshops/PatchDiscountCodesEndpoint.ts +54 -52
  123. package/src/endpoints/organization/dashboard/webshops/PatchWebshopEndpoint.ts +84 -81
  124. package/src/endpoints/organization/dashboard/webshops/PatchWebshopOrdersEndpoint.ts +120 -111
  125. package/src/endpoints/organization/dashboard/webshops/PatchWebshopTicketsEndpoint.ts +24 -24
  126. package/src/endpoints/organization/dashboard/webshops/VerifyWebshopDomainEndpoint.ts +18 -18
  127. package/src/endpoints/organization/shared/ExchangePaymentEndpoint.ts +141 -130
  128. package/src/endpoints/organization/shared/GetDocumentHtml.ts +25 -25
  129. package/src/endpoints/organization/shared/GetPaymentEndpoint.ts +18 -18
  130. package/src/endpoints/organization/shared/auth/GetOrganizationEndpoint.test.ts +36 -37
  131. package/src/endpoints/organization/shared/auth/GetOrganizationEndpoint.ts +9 -9
  132. package/src/endpoints/organization/shared/auth/OpenIDConnectCallbackEndpoint.ts +11 -11
  133. package/src/endpoints/organization/shared/auth/OpenIDConnectStartEndpoint.ts +28 -27
  134. package/src/endpoints/organization/webshops/CheckWebshopDiscountCodesEndpoint.ts +20 -20
  135. package/src/endpoints/organization/webshops/GetOrderByPaymentEndpoint.ts +22 -22
  136. package/src/endpoints/organization/webshops/GetOrderEndpoint.ts +14 -14
  137. package/src/endpoints/organization/webshops/GetTicketsEndpoint.ts +57 -56
  138. package/src/endpoints/organization/webshops/GetWebshopEndpoint.test.ts +65 -66
  139. package/src/endpoints/organization/webshops/GetWebshopEndpoint.ts +18 -17
  140. package/src/endpoints/organization/webshops/PlaceOrderEndpoint.test.ts +124 -128
  141. package/src/endpoints/organization/webshops/PlaceOrderEndpoint.ts +154 -145
  142. package/src/excel-loaders/members.ts +275 -273
  143. package/src/excel-loaders/payments.ts +155 -156
  144. package/src/helpers/AddressValidator.test.ts +32 -32
  145. package/src/helpers/AddressValidator.ts +128 -122
  146. package/src/helpers/AdminPermissionChecker.ts +339 -236
  147. package/src/helpers/AuthenticatedStructures.ts +233 -134
  148. package/src/helpers/BuckarooHelper.ts +134 -134
  149. package/src/helpers/CheckSettlements.ts +94 -88
  150. package/src/helpers/Context.ts +87 -86
  151. package/src/helpers/CookieHelper.ts +23 -22
  152. package/src/helpers/EmailResumer.ts +10 -10
  153. package/src/helpers/FileCache.ts +62 -62
  154. package/src/helpers/ForwardHandler.test.ts +122 -124
  155. package/src/helpers/ForwardHandler.ts +76 -70
  156. package/src/helpers/MemberUserSyncer.ts +101 -96
  157. package/src/helpers/MembershipCharger.ts +69 -69
  158. package/src/helpers/MembershipHelper.ts +11 -12
  159. package/src/helpers/OpenIDConnectHelper.ts +85 -82
  160. package/src/helpers/PeriodHelper.ts +65 -70
  161. package/src/helpers/StripeHelper.ts +146 -137
  162. package/src/helpers/StripePayoutChecker.ts +51 -52
  163. package/src/helpers/ViesHelper.ts +46 -44
  164. package/src/helpers/fetchToAsyncIterator.ts +14 -14
  165. package/src/helpers/xlsxAddressTransformerColumnFactory.ts +58 -60
  166. package/src/middleware/ContextMiddleware.ts +5 -5
  167. package/src/migrations/1646578856-validate-addresses.ts +6 -9
  168. package/src/seeds/0000000000-example.ts +3 -5
  169. package/src/seeds/1715028563-user-permissions.ts +16 -18
  170. package/src/seeds/1722256498-group-update-occupancy.ts +12 -12
  171. package/src/seeds/1722344162-sync-member-users.ts +14 -15
  172. package/src/seeds/1722344162-update-membership.ts +6 -6
  173. package/src/seeds/1726055544-balance-item-paid.ts +4 -4
  174. package/src/seeds/1726055545-balance-item-pending.ts +4 -4
  175. package/src/seeds/1726494419-update-cached-outstanding-balance.ts +16 -16
  176. package/src/seeds/1726494420-update-cached-outstanding-balance-from-items.ts +12 -12
  177. package/src/seeds/1726572303-schedule-stock-updates.ts +12 -12
  178. package/src/seeds/1726847064-setup-steps.ts +16 -0
  179. package/src/sql-filters/balance-item-payments.ts +7 -7
  180. package/src/sql-filters/events.ts +14 -14
  181. package/src/sql-filters/members.ts +96 -96
  182. package/src/sql-filters/organizations.ts +139 -75
  183. package/src/sql-filters/payments.ts +28 -28
  184. package/src/sql-filters/registrations.ts +14 -14
  185. package/src/sql-sorters/events.ts +25 -25
  186. package/src/sql-sorters/members.ts +26 -26
  187. package/src/sql-sorters/organizations.ts +36 -36
  188. package/src/sql-sorters/payments.ts +26 -26
  189. package/tests/e2e/stock.test.ts +616 -621
  190. package/tests/e2e/tickets.test.ts +255 -260
  191. package/tests/helpers/StripeMocker.ts +177 -179
  192. package/tests/helpers/TestServer.ts +9 -9
  193. package/tests/jest.global.setup.ts +14 -13
  194. package/tests/jest.setup.ts +33 -32
  195. package/.eslintrc.js +0 -61
  196. package/jest.config.js +0 -11
  197. package/src/helpers/SetupStepsUpdater.ts +0 -359
  198. package/src/seeds/1724076679-setup-steps.ts +0 -16
@@ -1,22 +1,22 @@
1
- import { DecodedRequest, Endpoint, Request, Response } from "@simonbackx/simple-endpoints";
2
- import { SimpleError } from "@simonbackx/simple-errors";
3
- import { DocumentTemplate, Token } from "@stamhoofd/models";
4
- import { DocumentTemplatePrivate } from "@stamhoofd/structures";
1
+ import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
2
+ import { SimpleError } from '@simonbackx/simple-errors';
3
+ import { DocumentTemplate, Token } from '@stamhoofd/models';
4
+ import { DocumentTemplatePrivate } from '@stamhoofd/structures';
5
5
 
6
- import { Context } from "../../../../helpers/Context";
6
+ import { Context } from '../../../../helpers/Context';
7
7
 
8
8
  type Params = Record<string, never>;
9
9
  type Query = undefined;
10
- type Body = undefined
11
- type ResponseBody = DocumentTemplatePrivate[]
10
+ type Body = undefined;
11
+ type ResponseBody = DocumentTemplatePrivate[];
12
12
 
13
13
  export class GetDocumentTemplatesEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
14
14
  protected doesMatch(request: Request): [true, Params] | [false] {
15
- if (request.method != "GET") {
15
+ if (request.method !== 'GET') {
16
16
  return [false];
17
17
  }
18
18
 
19
- const params = Endpoint.parseParameters(request.url, "/organization/document-templates", {});
19
+ const params = Endpoint.parseParameters(request.url, '/organization/document-templates', {});
20
20
 
21
21
  if (params) {
22
22
  return [true, params as Params];
@@ -26,25 +26,25 @@ export class GetDocumentTemplatesEndpoint extends Endpoint<Params, Query, Body,
26
26
 
27
27
  async handle(_: DecodedRequest<Params, Query, Body>) {
28
28
  const organization = await Context.setOrganizationScope();
29
- await Context.authenticate()
29
+ await Context.authenticate();
30
30
 
31
31
  if (!await Context.auth.canManageDocuments(organization.id)) {
32
- throw Context.auth.error()
32
+ throw Context.auth.error();
33
33
  }
34
34
 
35
35
  const templates = await DocumentTemplate.where(
36
- {
37
- organizationId: organization.id
38
- },
39
- {
36
+ {
37
+ organizationId: organization.id,
38
+ },
39
+ {
40
40
  sort: [{
41
- column: "createdAt",
42
- direction: "ASC"
43
- }]
44
- }
45
- )
41
+ column: 'createdAt',
42
+ direction: 'ASC',
43
+ }],
44
+ },
45
+ );
46
46
  return new Response(
47
- templates.map(t => t.getPrivateStructure())
47
+ templates.map(t => t.getPrivateStructure()),
48
48
  );
49
49
  }
50
50
  }
@@ -1,14 +1,14 @@
1
- import { DecodedRequest, Endpoint, Request, Response } from "@simonbackx/simple-endpoints";
2
- import { SimpleError } from "@simonbackx/simple-errors";
3
- import { Document, DocumentTemplate } from "@stamhoofd/models";
4
- import { Document as DocumentStruct } from "@stamhoofd/structures";
1
+ import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
2
+ import { SimpleError } from '@simonbackx/simple-errors';
3
+ import { Document, DocumentTemplate } from '@stamhoofd/models';
4
+ import { Document as DocumentStruct } from '@stamhoofd/structures';
5
5
 
6
- import { Context } from "../../../../helpers/Context";
6
+ import { Context } from '../../../../helpers/Context';
7
7
 
8
8
  type Params = { id: string };
9
9
  type Query = undefined;
10
- type Body = undefined
11
- type ResponseBody = DocumentStruct[]
10
+ type Body = undefined;
11
+ type ResponseBody = DocumentStruct[];
12
12
 
13
13
  /**
14
14
  * One endpoint to create, patch and delete groups. Usefull because on organization setup, we need to create multiple groups at once. Also, sometimes we need to link values and update multiple groups at once
@@ -16,11 +16,11 @@ type ResponseBody = DocumentStruct[]
16
16
 
17
17
  export class GetDocumentsEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
18
18
  protected doesMatch(request: Request): [true, Params] | [false] {
19
- if (request.method != "GET") {
19
+ if (request.method !== 'GET') {
20
20
  return [false];
21
21
  }
22
22
 
23
- const params = Endpoint.parseParameters(request.url, "/organization/document-templates/@id/documents", { id: String});
23
+ const params = Endpoint.parseParameters(request.url, '/organization/document-templates/@id/documents', { id: String });
24
24
 
25
25
  if (params) {
26
26
  return [true, params as Params];
@@ -30,21 +30,21 @@ export class GetDocumentsEndpoint extends Endpoint<Params, Query, Body, Response
30
30
 
31
31
  async handle(request: DecodedRequest<Params, Query, Body>) {
32
32
  const organization = await Context.setOrganizationScope();
33
- await Context.authenticate()
33
+ await Context.authenticate();
34
34
 
35
35
  if (!await Context.auth.canManageDocuments(organization.id)) {
36
- throw Context.auth.error()
37
- }
36
+ throw Context.auth.error();
37
+ }
38
38
 
39
- const template = await DocumentTemplate.getByID(request.params.id)
39
+ const template = await DocumentTemplate.getByID(request.params.id);
40
40
  if (!template || !await Context.auth.canAccessDocumentTemplate(template)) {
41
- throw Context.auth.notFoundOrNoAccess("Onbekend document")
41
+ throw Context.auth.notFoundOrNoAccess('Onbekend document');
42
42
  }
43
43
 
44
44
  const documents = await Document.where({ templateId: template.id });
45
45
 
46
46
  return new Response(
47
- documents.map(t => t.getStructure())
47
+ documents.map(t => t.getStructure()),
48
48
  );
49
49
  }
50
50
  }
@@ -1,25 +1,25 @@
1
1
  import { AutoEncoderPatchType, Decoder, PatchableArrayAutoEncoder, PatchableArrayDecoder, StringDecoder } from '@simonbackx/simple-encoding';
2
- import { DecodedRequest, Endpoint, Request, Response } from "@simonbackx/simple-endpoints";
3
- import { SimpleError } from "@simonbackx/simple-errors";
2
+ import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
3
+ import { SimpleError } from '@simonbackx/simple-errors';
4
4
  import { Document, DocumentTemplate, Group, Member, Registration, Token } from '@stamhoofd/models';
5
- import { Document as DocumentStruct, DocumentStatus, DocumentTemplatePrivate, PermissionLevel } from "@stamhoofd/structures";
5
+ import { Document as DocumentStruct, DocumentStatus, DocumentTemplatePrivate, PermissionLevel } from '@stamhoofd/structures';
6
6
 
7
7
  import { Context } from '../../../../helpers/Context';
8
8
 
9
9
  type Params = Record<string, never>;
10
10
  type Query = undefined;
11
- type Body = PatchableArrayAutoEncoder<DocumentStruct>
12
- type ResponseBody = DocumentStruct[]
11
+ type Body = PatchableArrayAutoEncoder<DocumentStruct>;
12
+ type ResponseBody = DocumentStruct[];
13
13
 
14
14
  export class PatchDocumentEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
15
- bodyDecoder = new PatchableArrayDecoder(DocumentStruct as Decoder<DocumentStruct>, DocumentStruct.patchType() as Decoder<AutoEncoderPatchType<DocumentStruct>>, StringDecoder)
15
+ bodyDecoder = new PatchableArrayDecoder(DocumentStruct as Decoder<DocumentStruct>, DocumentStruct.patchType() as Decoder<AutoEncoderPatchType<DocumentStruct>>, StringDecoder);
16
16
 
17
17
  protected doesMatch(request: Request): [true, Params] | [false] {
18
- if (request.method != "PATCH") {
18
+ if (request.method !== 'PATCH') {
19
19
  return [false];
20
20
  }
21
21
 
22
- const params = Endpoint.parseParameters(request.url, "/organization/documents", {});
22
+ const params = Endpoint.parseParameters(request.url, '/organization/documents', {});
23
23
 
24
24
  if (params) {
25
25
  return [true, params as Params];
@@ -29,101 +29,101 @@ export class PatchDocumentEndpoint extends Endpoint<Params, Query, Body, Respons
29
29
 
30
30
  async handle(request: DecodedRequest<Params, Query, Body>) {
31
31
  const organization = await Context.setOrganizationScope();
32
- await Context.authenticate()
32
+ await Context.authenticate();
33
33
 
34
- if (!await Context.auth.canManageDocuments(organization.id ,PermissionLevel.Write)) {
35
- throw Context.auth.error()
34
+ if (!await Context.auth.canManageDocuments(organization.id, PermissionLevel.Write)) {
35
+ throw Context.auth.error();
36
36
  }
37
37
 
38
- const updatedDocuments: DocumentStruct[] = []
38
+ const updatedDocuments: DocumentStruct[] = [];
39
39
 
40
40
  for (const patch of request.body.getPatches()) {
41
- const document = await Document.getByID(patch.id)
41
+ const document = await Document.getByID(patch.id);
42
42
  if (!document || !(await Context.auth.canAccessDocument(document, PermissionLevel.Write))) {
43
- throw Context.auth.notFoundOrNoAccess("Onbekend document")
43
+ throw Context.auth.notFoundOrNoAccess('Onbekend document');
44
44
  }
45
-
45
+
46
46
  if (patch.data) {
47
- document.data.patchOrPut(patch.data)
48
- }
47
+ document.data.patchOrPut(patch.data);
48
+ }
49
49
 
50
50
  if (patch.status && (document.status !== DocumentStatus.MissingData || patch.status === DocumentStatus.Deleted)) {
51
- document.status = patch.status
51
+ document.status = patch.status;
52
52
  }
53
53
 
54
54
  if (document.status === DocumentStatus.Draft || document.status === DocumentStatus.Published) {
55
- const template = await DocumentTemplate.getByID(document.templateId)
55
+ const template = await DocumentTemplate.getByID(document.templateId);
56
56
  if (!template) {
57
57
  throw new SimpleError({
58
- code: "not_found",
59
- message: "Document not found",
60
- human: "Document niet gevonden"
61
- })
58
+ code: 'not_found',
59
+ message: 'Document not found',
60
+ human: 'Document niet gevonden',
61
+ });
62
62
  }
63
63
 
64
- document.status = template.status
64
+ document.status = template.status;
65
65
  }
66
-
66
+
67
67
  await document.updateData();
68
68
  await document.save();
69
69
 
70
70
  // Return in response
71
- updatedDocuments.push(document.getStructure())
71
+ updatedDocuments.push(document.getStructure());
72
72
  }
73
73
 
74
- for (const {put} of request.body.getPuts()) {
74
+ for (const { put } of request.body.getPuts()) {
75
75
  // Create a new document
76
- const template = await DocumentTemplate.getByID(put.templateId)
76
+ const template = await DocumentTemplate.getByID(put.templateId);
77
77
  if (!template || !await Context.auth.canAccessDocumentTemplate(template, PermissionLevel.Write)) {
78
78
  throw new SimpleError({
79
- code: "not_found",
80
- message: "Document template not found",
81
- human: "Document template niet gevonden"
82
- })
79
+ code: 'not_found',
80
+ message: 'Document template not found',
81
+ human: 'Document template niet gevonden',
82
+ });
83
83
  }
84
84
  const document = new Document();
85
- document.organizationId = organization.id
86
- document.templateId = template.id
87
- document.status = put.status
88
- document.data = put.data
85
+ document.organizationId = organization.id;
86
+ document.templateId = template.id;
87
+ document.status = put.status;
88
+ document.data = put.data;
89
89
 
90
90
  if (document.status === DocumentStatus.Draft || document.status === DocumentStatus.Published) {
91
- document.status = template.status
91
+ document.status = template.status;
92
92
  }
93
93
 
94
94
  if (put.registrationId) {
95
- const registration = await Registration.getByID(put.registrationId)
95
+ const registration = await Registration.getByID(put.registrationId);
96
96
  if (!registration) {
97
97
  throw new SimpleError({
98
- code: "not_found",
99
- message: "Registration not found",
100
- human: "Inschrijving niet gevonden"
101
- })
98
+ code: 'not_found',
99
+ message: 'Registration not found',
100
+ human: 'Inschrijving niet gevonden',
101
+ });
102
102
  }
103
- document.registrationId = put.registrationId
104
- put.memberId = registration.memberId
103
+ document.registrationId = put.registrationId;
104
+ put.memberId = registration.memberId;
105
105
  }
106
106
  if (put.memberId) {
107
- const member = await Member.getWithRegistrations(put.memberId)
107
+ const member = await Member.getWithRegistrations(put.memberId);
108
108
  if (!member || !await Context.auth.canAccessMember(member, PermissionLevel.Read)) {
109
109
  throw new SimpleError({
110
- code: "not_found",
111
- message: "Member not found",
112
- human: "Lid niet gevonden"
113
- })
110
+ code: 'not_found',
111
+ message: 'Member not found',
112
+ human: 'Lid niet gevonden',
113
+ });
114
114
  }
115
- document.memberId = put.memberId
115
+ document.memberId = put.memberId;
116
116
  }
117
117
 
118
118
  await document.updateData();
119
119
  await document.save();
120
120
 
121
121
  // Return in response
122
- updatedDocuments.push(document.getStructure())
122
+ updatedDocuments.push(document.getStructure());
123
123
  }
124
124
 
125
125
  return new Response(
126
- updatedDocuments
126
+ updatedDocuments,
127
127
  );
128
128
  }
129
129
  }
@@ -1,29 +1,29 @@
1
1
  import { AutoEncoderPatchType, Decoder, PatchableArrayAutoEncoder, PatchableArrayDecoder, StringDecoder } from '@simonbackx/simple-encoding';
2
- import { DecodedRequest, Endpoint, Request, Response } from "@simonbackx/simple-endpoints";
3
- import { SimpleError } from "@simonbackx/simple-errors";
2
+ import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
3
+ import { SimpleError } from '@simonbackx/simple-errors';
4
4
  import { DocumentTemplate, Token } from '@stamhoofd/models';
5
- import { DocumentTemplatePrivate, PermissionLevel } from "@stamhoofd/structures";
5
+ import { DocumentTemplatePrivate, PermissionLevel } from '@stamhoofd/structures';
6
6
 
7
7
  import { Context } from '../../../../helpers/Context';
8
8
 
9
9
  type Params = Record<string, never>;
10
10
  type Query = undefined;
11
- type Body = PatchableArrayAutoEncoder<DocumentTemplatePrivate>
12
- type ResponseBody = DocumentTemplatePrivate[]
11
+ type Body = PatchableArrayAutoEncoder<DocumentTemplatePrivate>;
12
+ type ResponseBody = DocumentTemplatePrivate[];
13
13
 
14
14
  /**
15
15
  * One endpoint to create, patch and delete groups. Usefull because on organization setup, we need to create multiple groups at once. Also, sometimes we need to link values and update multiple groups at once
16
16
  */
17
17
 
18
18
  export class PatchDocumentTemplateEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
19
- bodyDecoder = new PatchableArrayDecoder(DocumentTemplatePrivate as Decoder<DocumentTemplatePrivate>, DocumentTemplatePrivate.patchType() as Decoder<AutoEncoderPatchType<DocumentTemplatePrivate>>, StringDecoder)
19
+ bodyDecoder = new PatchableArrayDecoder(DocumentTemplatePrivate as Decoder<DocumentTemplatePrivate>, DocumentTemplatePrivate.patchType() as Decoder<AutoEncoderPatchType<DocumentTemplatePrivate>>, StringDecoder);
20
20
 
21
21
  protected doesMatch(request: Request): [true, Params] | [false] {
22
- if (request.method != "PATCH") {
22
+ if (request.method !== 'PATCH') {
23
23
  return [false];
24
24
  }
25
25
 
26
- const params = Endpoint.parseParameters(request.url, "/organization/document-templates", {});
26
+ const params = Endpoint.parseParameters(request.url, '/organization/document-templates', {});
27
27
 
28
28
  if (params) {
29
29
  return [true, params as Params];
@@ -33,82 +33,82 @@ export class PatchDocumentTemplateEndpoint extends Endpoint<Params, Query, Body,
33
33
 
34
34
  async handle(request: DecodedRequest<Params, Query, Body>) {
35
35
  const organization = await Context.setOrganizationScope();
36
- await Context.authenticate()
36
+ await Context.authenticate();
37
37
 
38
38
  if (!await Context.auth.canManageDocuments(organization.id, PermissionLevel.Write)) {
39
- throw Context.auth.error()
39
+ throw Context.auth.error();
40
40
  }
41
41
 
42
- const updatedTemplates: DocumentTemplatePrivate[] = []
42
+ const updatedTemplates: DocumentTemplatePrivate[] = [];
43
43
 
44
- for (const {put} of request.body.getPuts()) {
44
+ for (const { put } of request.body.getPuts()) {
45
45
  // Creating new templates
46
- const template = new DocumentTemplate()
47
- template.privateSettings = put.privateSettings
48
- template.settings = put.settings
49
- template.status = put.status
50
- template.html = put.html
51
- template.updatesEnabled = put.updatesEnabled
52
- template.organizationId = organization.id
46
+ const template = new DocumentTemplate();
47
+ template.privateSettings = put.privateSettings;
48
+ template.settings = put.settings;
49
+ template.status = put.status;
50
+ template.html = put.html;
51
+ template.updatesEnabled = put.updatesEnabled;
52
+ template.organizationId = organization.id;
53
53
  await template.save();
54
54
 
55
55
  // todo: Generate documents (maybe in background)
56
- template.buildAll().catch(console.error)
56
+ template.buildAll().catch(console.error);
57
57
 
58
58
  // Return in response
59
- updatedTemplates.push(template.getPrivateStructure())
59
+ updatedTemplates.push(template.getPrivateStructure());
60
60
  }
61
61
 
62
62
  for (const patch of request.body.getPatches()) {
63
- const template = await DocumentTemplate.getByID(patch.id)
63
+ const template = await DocumentTemplate.getByID(patch.id);
64
64
  if (!template || !await Context.auth.canAccessDocumentTemplate(template, PermissionLevel.Full)) {
65
- throw Context.auth.notFoundOrNoAccess("Onbekende template")
65
+ throw Context.auth.notFoundOrNoAccess('Onbekende template');
66
66
  }
67
67
 
68
68
  if (patch.privateSettings) {
69
- template.privateSettings.patchOrPut(patch.privateSettings)
69
+ template.privateSettings.patchOrPut(patch.privateSettings);
70
70
  }
71
71
 
72
72
  if (patch.settings) {
73
- template.settings.patchOrPut(patch.settings)
73
+ template.settings.patchOrPut(patch.settings);
74
74
  }
75
75
 
76
76
  if (patch.status) {
77
- template.status = patch.status
77
+ template.status = patch.status;
78
78
  }
79
79
 
80
80
  if (patch.updatesEnabled !== undefined) {
81
- template.updatesEnabled = patch.updatesEnabled
81
+ template.updatesEnabled = patch.updatesEnabled;
82
82
  }
83
83
 
84
84
  if (patch.html) {
85
- template.html = patch.html
85
+ template.html = patch.html;
86
86
  }
87
87
 
88
88
  await template.save();
89
89
 
90
90
  // Update documents
91
- await template.buildAll()
91
+ await template.buildAll();
92
92
 
93
93
  // Return in response
94
- updatedTemplates.push(template.getPrivateStructure())
94
+ updatedTemplates.push(template.getPrivateStructure());
95
95
  }
96
96
 
97
97
  for (const id of request.body.getDeletes()) {
98
- const template = await DocumentTemplate.getByID(id)
98
+ const template = await DocumentTemplate.getByID(id);
99
99
  if (!template || !await Context.auth.canAccessDocumentTemplate(template, PermissionLevel.Full)) {
100
100
  throw new SimpleError({
101
- code: "not_found",
102
- message: "Template not found",
103
- human: "Template niet gevonden"
104
- })
101
+ code: 'not_found',
102
+ message: 'Template not found',
103
+ human: 'Template niet gevonden',
104
+ });
105
105
  }
106
106
 
107
- await template.delete()
107
+ await template.delete();
108
108
  }
109
109
 
110
110
  return new Response(
111
- updatedTemplates
111
+ updatedTemplates,
112
112
  );
113
113
  }
114
114
  }
@@ -1,5 +1,5 @@
1
1
  import { ArrayDecoder, StringDecoder } from '@simonbackx/simple-encoding';
2
- import { DecodedRequest, Endpoint, Request, Response } from "@simonbackx/simple-endpoints";
2
+ import { DecodedRequest, Endpoint, Request, Response } from '@simonbackx/simple-endpoints';
3
3
  import { SimpleError } from '@simonbackx/simple-errors';
4
4
  import { EmailAddress } from '@stamhoofd/email';
5
5
  import { EmailInformation } from '@stamhoofd/structures';
@@ -8,18 +8,18 @@ import { Context } from '../../../../helpers/Context';
8
8
 
9
9
  type Params = Record<string, never>;
10
10
  type Query = undefined;
11
- type Body = string[]
11
+ type Body = string[];
12
12
  type ResponseBody = EmailInformation[];
13
13
 
14
14
  export class CheckEmailBouncesEndpoint extends Endpoint<Params, Query, Body, ResponseBody> {
15
- bodyDecoder = new ArrayDecoder(StringDecoder)
15
+ bodyDecoder = new ArrayDecoder(StringDecoder);
16
16
 
17
17
  protected doesMatch(request: Request): [true, Params] | [false] {
18
- if (request.method != "POST") {
18
+ if (request.method !== 'POST') {
19
19
  return [false];
20
20
  }
21
21
 
22
- const params = Endpoint.parseParameters(request.url, "/email/check-bounces", {});
22
+ const params = Endpoint.parseParameters(request.url, '/email/check-bounces', {});
23
23
 
24
24
  if (params) {
25
25
  return [true, params as Params];
@@ -29,22 +29,22 @@ export class CheckEmailBouncesEndpoint extends Endpoint<Params, Query, Body, Res
29
29
 
30
30
  async handle(request: DecodedRequest<Params, Query, Body>) {
31
31
  const organization = await Context.setOrganizationScope();
32
- await Context.authenticate()
32
+ await Context.authenticate();
33
33
 
34
34
  if (!await Context.auth.canAccessEmailBounces(organization.id)) {
35
- throw Context.auth.error()
36
- }
35
+ throw Context.auth.error();
36
+ }
37
37
 
38
38
  if (request.body.length > 10000) {
39
39
  throw new SimpleError({
40
- code: "too_many_recipients",
41
- message: "Too many recipients",
42
- human: "Je kan maar maximaal 10.000 adressen tergelijk controleren.",
43
- field: "recipients"
44
- })
40
+ code: 'too_many_recipients',
41
+ message: 'Too many recipients',
42
+ human: 'Je kan maar maximaal 10.000 adressen tergelijk controleren.',
43
+ field: 'recipients',
44
+ });
45
45
  }
46
46
 
47
- const emails = await EmailAddress.getByEmails(request.body, organization.id)
47
+ const emails = await EmailAddress.getByEmails(request.body, organization.id);
48
48
  return new Response(emails.map(e => EmailInformation.create(e)));
49
49
  }
50
50
  }