@stamhoofd/backend 2.39.1 → 2.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +102 -103
  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 +50 -52
  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,24 +1,24 @@
1
- import { SQLFilterDefinitions, baseSQLFilterCompilers, createSQLColumnFilterCompiler, SQL, createSQLFilterNamespace, createSQLExpressionFilterCompiler } from "@stamhoofd/sql";
1
+ import { SQLFilterDefinitions, baseSQLFilterCompilers, createSQLColumnFilterCompiler, SQL, createSQLFilterNamespace, createSQLExpressionFilterCompiler } from '@stamhoofd/sql';
2
2
 
3
3
  export const registrationFilterCompilers: SQLFilterDefinitions = {
4
4
  ...baseSQLFilterCompilers,
5
- "price": createSQLColumnFilterCompiler('price', {nullable: true}),
6
- "pricePaid": createSQLColumnFilterCompiler('pricePaid'),
7
- "canRegister": createSQLColumnFilterCompiler('canRegister'),
8
- "organizationId": createSQLColumnFilterCompiler('organizationId'),
9
- "groupId": createSQLColumnFilterCompiler('groupId'),
10
- "registeredAt": createSQLColumnFilterCompiler('registeredAt', {nullable: true}),
11
- "periodId": createSQLColumnFilterCompiler(SQL.column('registrations', 'periodId')),
5
+ price: createSQLColumnFilterCompiler('price', { nullable: true }),
6
+ pricePaid: createSQLColumnFilterCompiler('pricePaid'),
7
+ canRegister: createSQLColumnFilterCompiler('canRegister'),
8
+ organizationId: createSQLColumnFilterCompiler('organizationId'),
9
+ groupId: createSQLColumnFilterCompiler('groupId'),
10
+ registeredAt: createSQLColumnFilterCompiler('registeredAt', { nullable: true }),
11
+ periodId: createSQLColumnFilterCompiler(SQL.column('registrations', 'periodId')),
12
12
 
13
- "group": createSQLFilterNamespace({
13
+ group: createSQLFilterNamespace({
14
14
  ...baseSQLFilterCompilers,
15
15
  id: createSQLColumnFilterCompiler('groupId'),
16
16
  name: createSQLExpressionFilterCompiler(
17
- SQL.jsonValue(SQL.column('groups', 'settings'), '$.value.name')
17
+ SQL.jsonValue(SQL.column('groups', 'settings'), '$.value.name'),
18
18
  ),
19
19
  status: createSQLExpressionFilterCompiler(
20
- SQL.column('groups', 'status')
20
+ SQL.column('groups', 'status'),
21
21
  ),
22
- defaultAgeGroupId: createSQLColumnFilterCompiler(SQL.column('groups', 'defaultAgeGroupId'), {nullable: true}),
23
- })
24
- }
22
+ defaultAgeGroupId: createSQLColumnFilterCompiler(SQL.column('groups', 'defaultAgeGroupId'), { nullable: true }),
23
+ }),
24
+ };
@@ -1,58 +1,58 @@
1
- import { Event } from "@stamhoofd/models"
2
- import { SQL, SQLOrderBy, SQLOrderByDirection, SQLSortDefinitions } from "@stamhoofd/sql"
3
- import { Formatter } from "@stamhoofd/utility"
1
+ import { Event } from '@stamhoofd/models';
2
+ import { SQL, SQLOrderBy, SQLOrderByDirection, SQLSortDefinitions } from '@stamhoofd/sql';
3
+ import { Formatter } from '@stamhoofd/utility';
4
4
 
5
5
  export const eventSorters: SQLSortDefinitions<Event> = {
6
6
  // WARNING! TEST NEW SORTERS THOROUGHLY!
7
7
  // Try to avoid creating sorters on fields that er not 1:1 with the database, that often causes pagination issues if not thought through
8
- // An example: sorting on 'name' is not a good idea, because it is a concatenation of two fields.
8
+ // An example: sorting on 'name' is not a good idea, because it is a concatenation of two fields.
9
9
  // You might be tempted to use ORDER BY firstName, lastName, but that will not work as expected and it needs to be ORDER BY CONCAT(firstName, ' ', lastName)
10
10
  // Why? Because ORDER BY firstName, lastName produces a different order dan ORDER BY CONCAT(firstName, ' ', lastName) if there are multiple people with spaces in the first name
11
11
  // And that again causes issues with pagination because the next query will append a filter of name > 'John Doe' - causing duplicate and/or skipped results
12
12
  // What if you need mapping? simply map the sorters in the frontend: name -> firstname, lastname, age -> birthDay, etc.
13
13
 
14
- 'id': {
14
+ id: {
15
15
  getValue(a) {
16
- return a.id
16
+ return a.id;
17
17
  },
18
18
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
19
19
  return new SQLOrderBy({
20
20
  column: SQL.column('id'),
21
- direction
22
- })
23
- }
21
+ direction,
22
+ });
23
+ },
24
24
  },
25
- 'name': {
25
+ name: {
26
26
  getValue(a) {
27
- return a.name
27
+ return a.name;
28
28
  },
29
29
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
30
30
  return new SQLOrderBy({
31
31
  column: SQL.column('name'),
32
- direction
33
- })
34
- }
32
+ direction,
33
+ });
34
+ },
35
35
  },
36
- 'startDate': {
36
+ startDate: {
37
37
  getValue(a) {
38
- return Formatter.dateTimeIso(a.startDate)
38
+ return Formatter.dateTimeIso(a.startDate);
39
39
  },
40
40
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
41
41
  return new SQLOrderBy({
42
42
  column: SQL.column('startDate'),
43
- direction
44
- })
45
- }
43
+ direction,
44
+ });
45
+ },
46
46
  },
47
- 'endDate': {
47
+ endDate: {
48
48
  getValue(a) {
49
- return Formatter.dateTimeIso(a.endDate)
49
+ return Formatter.dateTimeIso(a.endDate);
50
50
  },
51
51
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
52
52
  return new SQLOrderBy({
53
53
  column: SQL.column('endDate'),
54
- direction
55
- })
56
- }
54
+ direction,
55
+ });
56
+ },
57
57
  },
58
- }
58
+ };
@@ -1,58 +1,58 @@
1
- import { MemberWithRegistrations } from "@stamhoofd/models"
2
- import { SQL, SQLOrderBy, SQLOrderByDirection, SQLSortDefinitions } from "@stamhoofd/sql"
3
- import { Formatter } from "@stamhoofd/utility"
1
+ import { MemberWithRegistrations } from '@stamhoofd/models';
2
+ import { SQL, SQLOrderBy, SQLOrderByDirection, SQLSortDefinitions } from '@stamhoofd/sql';
3
+ import { Formatter } from '@stamhoofd/utility';
4
4
 
5
5
  export const memberSorters: SQLSortDefinitions<MemberWithRegistrations> = {
6
6
  // WARNING! TEST NEW SORTERS THOROUGHLY!
7
7
  // Try to avoid creating sorters on fields that er not 1:1 with the database, that often causes pagination issues if not thought through
8
- // An example: sorting on 'name' is not a good idea, because it is a concatenation of two fields.
8
+ // An example: sorting on 'name' is not a good idea, because it is a concatenation of two fields.
9
9
  // You might be tempted to use ORDER BY firstName, lastName, but that will not work as expected and it needs to be ORDER BY CONCAT(firstName, ' ', lastName)
10
10
  // Why? Because ORDER BY firstName, lastName produces a different order dan ORDER BY CONCAT(firstName, ' ', lastName) if there are multiple people with spaces in the first name
11
11
  // And that again causes issues with pagination because the next query will append a filter of name > 'John Doe' - causing duplicate and/or skipped results
12
12
  // What if you need mapping? simply map the sorters in the frontend: name -> firstname, lastname, age -> birthDay, etc.
13
13
 
14
- 'id': {
14
+ id: {
15
15
  getValue(a) {
16
- return a.id
16
+ return a.id;
17
17
  },
18
18
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
19
19
  return new SQLOrderBy({
20
20
  column: SQL.column('id'),
21
- direction
22
- })
23
- }
21
+ direction,
22
+ });
23
+ },
24
24
  },
25
- 'firstName': {
25
+ firstName: {
26
26
  getValue(a) {
27
- return a.firstName
27
+ return a.firstName;
28
28
  },
29
29
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
30
30
  return new SQLOrderBy({
31
31
  column: SQL.column('firstName'),
32
- direction
33
- })
34
- }
32
+ direction,
33
+ });
34
+ },
35
35
  },
36
- 'lastName': {
36
+ lastName: {
37
37
  getValue(a) {
38
- return a.lastName
38
+ return a.lastName;
39
39
  },
40
40
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
41
41
  return new SQLOrderBy({
42
42
  column: SQL.column('lastName'),
43
- direction
44
- })
45
- }
43
+ direction,
44
+ });
45
+ },
46
46
  },
47
- 'birthDay': {
47
+ birthDay: {
48
48
  getValue(a) {
49
- return a.details.birthDay ? Formatter.dateIso(a.details.birthDay) : null
49
+ return a.details.birthDay ? Formatter.dateIso(a.details.birthDay) : null;
50
50
  },
51
51
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
52
52
  return new SQLOrderBy({
53
53
  column: SQL.column('birthDay'),
54
- direction
55
- })
56
- }
57
- }
58
- }
54
+ direction,
55
+ });
56
+ },
57
+ },
58
+ };
@@ -1,79 +1,79 @@
1
- import { Organization } from "@stamhoofd/models"
2
- import { SQL, SQLOrderBy, SQLOrderByDirection, SQLSortDefinitions } from "@stamhoofd/sql"
1
+ import { Organization } from '@stamhoofd/models';
2
+ import { SQL, SQLOrderBy, SQLOrderByDirection, SQLSortDefinitions } from '@stamhoofd/sql';
3
3
 
4
4
  export const organizationSorters: SQLSortDefinitions<Organization> = {
5
5
  // WARNING! TEST NEW SORTERS THOROUGHLY!
6
6
  // Try to avoid creating sorters on fields that er not 1:1 with the database, that often causes pagination issues if not thought through
7
- // An example: sorting on 'name' is not a good idea, because it is a concatenation of two fields.
7
+ // An example: sorting on 'name' is not a good idea, because it is a concatenation of two fields.
8
8
  // You might be tempted to use ORDER BY firstName, lastName, but that will not work as expected and it needs to be ORDER BY CONCAT(firstName, ' ', lastName)
9
9
  // Why? Because ORDER BY firstName, lastName produces a different order dan ORDER BY CONCAT(firstName, ' ', lastName) if there are multiple people with spaces in the first name
10
10
  // And that again causes issues with pagination because the next query will append a filter of name > 'John Doe' - causing duplicate and/or skipped results
11
11
  // What if you need mapping? simply map the sorters in the frontend: name -> firstname, lastname, age -> birthDay, etc.
12
-
13
- 'id': {
12
+
13
+ id: {
14
14
  getValue(a) {
15
- return a.id
15
+ return a.id;
16
16
  },
17
17
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
18
18
  return new SQLOrderBy({
19
19
  column: SQL.column('id'),
20
- direction
21
- })
22
- }
20
+ direction,
21
+ });
22
+ },
23
23
  },
24
- 'name': {
24
+ name: {
25
25
  getValue(a) {
26
- return a.name
26
+ return a.name;
27
27
  },
28
28
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
29
29
  return new SQLOrderBy({
30
30
  column: SQL.column('name'),
31
- direction
32
- })
33
- }
31
+ direction,
32
+ });
33
+ },
34
34
  },
35
- 'uri': {
35
+ uri: {
36
36
  getValue(a) {
37
- return a.uri
37
+ return a.uri;
38
38
  },
39
39
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
40
40
  return new SQLOrderBy({
41
41
  column: SQL.column('uri'),
42
- direction
43
- })
44
- }
42
+ direction,
43
+ });
44
+ },
45
45
  },
46
- 'type': {
46
+ type: {
47
47
  getValue(a) {
48
- return a.meta.type
48
+ return a.meta.type;
49
49
  },
50
50
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
51
51
  return new SQLOrderBy({
52
52
  column: SQL.jsonValue(SQL.column('meta'), '$.value.type'),
53
- direction
54
- })
55
- }
53
+ direction,
54
+ });
55
+ },
56
56
  },
57
- 'city': {
57
+ city: {
58
58
  getValue(a) {
59
- return a.address.city
59
+ return a.address.city;
60
60
  },
61
61
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
62
62
  return new SQLOrderBy({
63
63
  column: SQL.jsonValue(SQL.column('address'), '$.value.city'),
64
- direction
65
- })
66
- }
64
+ direction,
65
+ });
66
+ },
67
67
  },
68
- 'country': {
68
+ country: {
69
69
  getValue(a) {
70
- return a.address.country
70
+ return a.address.country;
71
71
  },
72
72
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
73
73
  return new SQLOrderBy({
74
74
  column: SQL.jsonValue(SQL.column('address'), '$.value.country'),
75
- direction
76
- })
77
- }
78
- }
79
- }
75
+ direction,
76
+ });
77
+ },
78
+ },
79
+ };
@@ -1,58 +1,58 @@
1
- import { Payment } from "@stamhoofd/models"
2
- import { SQL, SQLOrderBy, SQLOrderByDirection, SQLSortDefinitions } from "@stamhoofd/sql"
3
- import { Formatter } from "@stamhoofd/utility"
1
+ import { Payment } from '@stamhoofd/models';
2
+ import { SQL, SQLOrderBy, SQLOrderByDirection, SQLSortDefinitions } from '@stamhoofd/sql';
3
+ import { Formatter } from '@stamhoofd/utility';
4
4
 
5
5
  export const paymentSorters: SQLSortDefinitions<Payment> = {
6
6
  // WARNING! TEST NEW SORTERS THOROUGHLY!
7
7
  // Try to avoid creating sorters on fields that er not 1:1 with the database, that often causes pagination issues if not thought through
8
- // An example: sorting on 'name' is not a good idea, because it is a concatenation of two fields.
8
+ // An example: sorting on 'name' is not a good idea, because it is a concatenation of two fields.
9
9
  // You might be tempted to use ORDER BY firstName, lastName, but that will not work as expected and it needs to be ORDER BY CONCAT(firstName, ' ', lastName)
10
10
  // Why? Because ORDER BY firstName, lastName produces a different order dan ORDER BY CONCAT(firstName, ' ', lastName) if there are multiple people with spaces in the first name
11
11
  // And that again causes issues with pagination because the next query will append a filter of name > 'John Doe' - causing duplicate and/or skipped results
12
12
  // What if you need mapping? simply map the sorters in the frontend: name -> firstname, lastname, age -> birthDay, etc.
13
13
 
14
- 'id': {
14
+ id: {
15
15
  getValue(a) {
16
- return a.id
16
+ return a.id;
17
17
  },
18
18
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
19
19
  return new SQLOrderBy({
20
20
  column: SQL.column('id'),
21
- direction
22
- })
23
- }
21
+ direction,
22
+ });
23
+ },
24
24
  },
25
- 'createdAt': {
25
+ createdAt: {
26
26
  getValue(a) {
27
- return Formatter.dateTimeIso(a.createdAt, 'UTC')
27
+ return Formatter.dateTimeIso(a.createdAt, 'UTC');
28
28
  },
29
29
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
30
30
  return new SQLOrderBy({
31
31
  column: SQL.column('createdAt'),
32
- direction
33
- })
34
- }
32
+ direction,
33
+ });
34
+ },
35
35
  },
36
- 'paidAt': {
36
+ paidAt: {
37
37
  getValue(a) {
38
- return a.paidAt !== null ? Formatter.dateTimeIso(a.paidAt, 'UTC') : null
38
+ return a.paidAt !== null ? Formatter.dateTimeIso(a.paidAt, 'UTC') : null;
39
39
  },
40
40
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
41
41
  return new SQLOrderBy({
42
42
  column: SQL.column('paidAt'),
43
- direction
44
- })
45
- }
43
+ direction,
44
+ });
45
+ },
46
46
  },
47
- 'price': {
47
+ price: {
48
48
  getValue(a) {
49
- return a.price
49
+ return a.price;
50
50
  },
51
51
  toSQL: (direction: SQLOrderByDirection): SQLOrderBy => {
52
52
  return new SQLOrderBy({
53
53
  column: SQL.column('price'),
54
- direction
55
- })
56
- }
57
- }
58
- }
54
+ direction,
55
+ });
56
+ },
57
+ },
58
+ };