@stevenkellner/team-conduct-api 1.0.36 → 2.0.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 (218) hide show
  1. package/lib/src/firebase/FirebaseConfiguration.d.ts +45 -1
  2. package/lib/src/firebase/FirebaseConfiguration.js +44 -0
  3. package/lib/src/firebase/Firestore.d.ts +196 -0
  4. package/lib/src/firebase/Firestore.js +235 -0
  5. package/lib/src/{FirestoreScheme.d.ts → firebase/FirestoreScheme.d.ts} +15 -1
  6. package/lib/src/firebase/Messaging.d.ts +64 -0
  7. package/lib/src/firebase/checkAuthentication.d.ts +37 -0
  8. package/lib/src/{checkAuthentication.js → firebase/checkAuthentication.js} +26 -1
  9. package/lib/src/firebase/index.d.ts +4 -0
  10. package/lib/src/firebase/index.js +4 -0
  11. package/lib/src/firebase/pushNotification.d.ts +39 -0
  12. package/lib/src/firebase/pushNotification.js +88 -0
  13. package/lib/src/functions/fine/add.d.ts +10 -13
  14. package/lib/src/functions/fine/add.js +3 -30
  15. package/lib/src/functions/fine/delete.d.ts +10 -13
  16. package/lib/src/functions/fine/delete.js +3 -27
  17. package/lib/src/functions/fine/update.d.ts +10 -13
  18. package/lib/src/functions/fine/update.js +3 -28
  19. package/lib/src/functions/fineTemplate/add.d.ts +6 -9
  20. package/lib/src/functions/fineTemplate/add.js +3 -12
  21. package/lib/src/functions/fineTemplate/delete.d.ts +6 -9
  22. package/lib/src/functions/fineTemplate/delete.js +3 -12
  23. package/lib/src/functions/fineTemplate/update.d.ts +6 -9
  24. package/lib/src/functions/fineTemplate/update.js +3 -12
  25. package/lib/src/functions/invitation/getInvitation.d.ts +40 -43
  26. package/lib/src/functions/invitation/getInvitation.js +57 -88
  27. package/lib/src/functions/invitation/invite.d.ts +1 -2
  28. package/lib/src/functions/invitation/invite.js +3 -18
  29. package/lib/src/functions/invitation/register.d.ts +6 -11
  30. package/lib/src/functions/invitation/register.js +3 -39
  31. package/lib/src/functions/invitation/withdraw.d.ts +1 -2
  32. package/lib/src/functions/invitation/withdraw.js +3 -13
  33. package/lib/src/functions/notification/register.d.ts +7 -10
  34. package/lib/src/functions/notification/register.js +3 -15
  35. package/lib/src/functions/notification/subscribe.d.ts +8 -11
  36. package/lib/src/functions/notification/subscribe.js +3 -14
  37. package/lib/src/functions/paypalMe/edit.d.ts +6 -9
  38. package/lib/src/functions/paypalMe/edit.js +3 -14
  39. package/lib/src/functions/person/add.d.ts +7 -10
  40. package/lib/src/functions/person/add.js +3 -12
  41. package/lib/src/functions/person/delete.d.ts +6 -9
  42. package/lib/src/functions/person/delete.js +3 -14
  43. package/lib/src/functions/person/update.d.ts +7 -10
  44. package/lib/src/functions/person/update.js +3 -13
  45. package/lib/src/functions/team/new.d.ts +9 -12
  46. package/lib/src/functions/team/new.js +3 -22
  47. package/lib/src/functions/user/kickout.d.ts +6 -9
  48. package/lib/src/functions/user/kickout.js +3 -25
  49. package/lib/src/functions/user/login.d.ts +1 -2
  50. package/lib/src/functions/user/login.js +3 -13
  51. package/lib/src/functions/user/roleEdit.d.ts +8 -11
  52. package/lib/src/functions/user/roleEdit.js +3 -18
  53. package/lib/src/index.d.ts +0 -5
  54. package/lib/src/index.js +0 -5
  55. package/lib/src/locales/de.d.ts +10 -67
  56. package/lib/src/locales/de.js +8 -0
  57. package/lib/src/locales/en.d.ts +10 -0
  58. package/lib/src/locales/en.js +19 -2
  59. package/lib/src/types/Configuration.d.ts +33 -15
  60. package/lib/src/types/Configuration.js +24 -12
  61. package/lib/src/types/Currency.d.ts +20 -0
  62. package/lib/src/types/Currency.js +19 -0
  63. package/lib/src/types/Fine.d.ts +41 -0
  64. package/lib/src/types/Fine.js +32 -0
  65. package/lib/src/types/FineAmount.d.ts +160 -9
  66. package/lib/src/types/FineAmount.js +128 -7
  67. package/lib/src/types/FineTemplate.d.ts +41 -0
  68. package/lib/src/types/FineTemplate.js +32 -0
  69. package/lib/src/types/FineTemplateRepetition.d.ts +72 -10
  70. package/lib/src/types/FineTemplateRepetition.js +66 -12
  71. package/lib/src/types/Invitation.d.ts +48 -0
  72. package/lib/src/types/Invitation.js +39 -0
  73. package/lib/src/types/Locale.d.ts +16 -0
  74. package/lib/src/types/Locale.js +16 -0
  75. package/lib/src/types/Localization.d.ts +74 -74
  76. package/lib/src/types/Localization.js +80 -41
  77. package/lib/src/types/MoneyAmount.d.ts +67 -1
  78. package/lib/src/types/MoneyAmount.js +62 -0
  79. package/lib/src/types/NotificationProperties.d.ts +70 -9
  80. package/lib/src/types/NotificationProperties.js +49 -5
  81. package/lib/src/types/PayedState.d.ts +25 -9
  82. package/lib/src/types/PayedState.js +17 -27
  83. package/lib/src/types/Person.d.ts +45 -0
  84. package/lib/src/types/Person.js +36 -0
  85. package/lib/src/types/PersonPrivateProperties.d.ts +28 -0
  86. package/lib/src/types/PersonPrivateProperties.js +25 -0
  87. package/lib/src/types/PersonSignInProperties.d.ts +30 -0
  88. package/lib/src/types/PersonSignInProperties.js +27 -0
  89. package/lib/src/types/Pluralization.d.ts +46 -0
  90. package/lib/src/types/Pluralization.js +46 -0
  91. package/lib/src/types/Team.d.ts +38 -0
  92. package/lib/src/types/Team.js +29 -0
  93. package/lib/src/types/User.d.ts +68 -3
  94. package/lib/src/types/User.js +59 -5
  95. package/lib/src/types/UserRole.d.ts +26 -4
  96. package/lib/src/types/UserRole.js +25 -9
  97. package/lib/src/types/index.d.ts +2 -0
  98. package/lib/src/types/index.js +2 -0
  99. package/lib/test/firebase/FirebaseConfiguration.test.js +155 -0
  100. package/lib/test/firebase/Firestore.test.js +46 -0
  101. package/lib/test/firebase/checkAuthentication.test.d.ts +1 -0
  102. package/lib/test/firebase/checkAuthentication.test.js +305 -0
  103. package/lib/test/firebase/firebase-utils.d.ts +32 -0
  104. package/lib/test/firebase/firebase-utils.js +131 -0
  105. package/lib/test/firebase/pushNotification.test.d.ts +1 -0
  106. package/lib/test/firebase/pushNotification.test.js +300 -0
  107. package/lib/test/locales/localization.de.test.d.ts +1 -0
  108. package/lib/test/locales/localization.de.test.js +144 -0
  109. package/lib/test/locales/localization.en.test.d.ts +1 -0
  110. package/lib/test/locales/localization.en.test.js +144 -0
  111. package/lib/test/types/Configuration.test.d.ts +1 -0
  112. package/lib/test/types/Configuration.test.js +84 -0
  113. package/lib/test/types/Currency.test.d.ts +1 -0
  114. package/lib/test/types/Currency.test.js +41 -0
  115. package/lib/test/types/Fine.test.d.ts +1 -0
  116. package/lib/test/types/Fine.test.js +265 -0
  117. package/lib/test/types/FineAmount.test.d.ts +1 -0
  118. package/lib/test/types/FineAmount.test.js +445 -0
  119. package/lib/test/types/FineTemplate.test.d.ts +1 -0
  120. package/lib/test/types/FineTemplate.test.js +271 -0
  121. package/lib/test/types/FineTemplateRepetition.test.d.ts +1 -0
  122. package/lib/test/types/FineTemplateRepetition.test.js +361 -0
  123. package/lib/test/types/Invitation.test.d.ts +1 -0
  124. package/lib/test/types/Invitation.test.js +269 -0
  125. package/lib/test/types/Locale.test.d.ts +1 -0
  126. package/lib/test/types/Locale.test.js +46 -0
  127. package/lib/test/types/Localization.test.d.ts +1 -0
  128. package/lib/test/types/Localization.test.js +241 -0
  129. package/lib/test/types/MoneyAmount.test.d.ts +1 -0
  130. package/lib/test/types/MoneyAmount.test.js +276 -0
  131. package/lib/test/types/NotificationProperties.test.d.ts +1 -0
  132. package/lib/test/types/NotificationProperties.test.js +258 -0
  133. package/lib/test/types/PayedState.test.d.ts +1 -0
  134. package/lib/test/types/PayedState.test.js +105 -0
  135. package/lib/test/types/Person.test.d.ts +1 -0
  136. package/lib/test/types/Person.test.js +266 -0
  137. package/lib/test/types/PersonPrivateProperties.test.d.ts +1 -0
  138. package/lib/test/types/PersonPrivateProperties.test.js +155 -0
  139. package/lib/test/types/PersonSignInProperties.test.d.ts +1 -0
  140. package/lib/test/types/PersonSignInProperties.test.js +208 -0
  141. package/lib/test/types/Pluralization.test.d.ts +1 -0
  142. package/lib/test/types/Pluralization.test.js +206 -0
  143. package/lib/test/types/Team.test.d.ts +1 -0
  144. package/lib/test/types/Team.test.js +145 -0
  145. package/lib/test/types/User.test.d.ts +1 -0
  146. package/lib/test/types/User.test.js +232 -0
  147. package/lib/test/types/UserRole.test.d.ts +1 -0
  148. package/lib/test/types/UserRole.test.js +140 -0
  149. package/lib/tsconfig.tsbuildinfo +1 -1
  150. package/package.json +10 -9
  151. package/src/firebase/FirebaseConfiguration.ts +49 -1
  152. package/src/firebase/Firestore.ts +248 -0
  153. package/src/{FirestoreScheme.ts → firebase/FirestoreScheme.ts} +15 -1
  154. package/src/firebase/Messaging.ts +64 -0
  155. package/src/{checkAuthentication.ts → firebase/checkAuthentication.ts} +39 -1
  156. package/src/firebase/index.ts +5 -0
  157. package/src/firebase/pushNotification.ts +90 -0
  158. package/src/functions/fine/add.ts +10 -48
  159. package/src/functions/fine/delete.ts +9 -43
  160. package/src/functions/fine/update.ts +10 -44
  161. package/src/functions/fineTemplate/add.ts +7 -23
  162. package/src/functions/fineTemplate/delete.ts +7 -23
  163. package/src/functions/fineTemplate/update.ts +7 -24
  164. package/src/functions/index.ts +0 -1
  165. package/src/functions/invitation/getInvitation.ts +81 -118
  166. package/src/functions/invitation/invite.ts +2 -25
  167. package/src/functions/invitation/register.ts +9 -60
  168. package/src/functions/invitation/withdraw.ts +2 -16
  169. package/src/functions/notification/register.ts +7 -26
  170. package/src/functions/notification/subscribe.ts +8 -26
  171. package/src/functions/paypalMe/edit.ts +7 -25
  172. package/src/functions/person/add.ts +8 -24
  173. package/src/functions/person/delete.ts +6 -25
  174. package/src/functions/person/update.ts +8 -25
  175. package/src/functions/team/new.ts +12 -42
  176. package/src/functions/user/kickout.ts +8 -41
  177. package/src/functions/user/login.ts +2 -16
  178. package/src/functions/user/roleEdit.ts +8 -32
  179. package/src/index.ts +0 -5
  180. package/src/locales/de.ts +10 -1
  181. package/src/locales/en.ts +21 -2
  182. package/src/types/Configuration.ts +33 -23
  183. package/src/types/Currency.ts +24 -0
  184. package/src/types/Fine.ts +41 -0
  185. package/src/types/FineAmount.ts +162 -11
  186. package/src/types/FineTemplate.ts +41 -0
  187. package/src/types/FineTemplateRepetition.ts +75 -17
  188. package/src/types/Invitation.ts +48 -0
  189. package/src/types/Locale.ts +20 -0
  190. package/src/types/Localization.ts +96 -41
  191. package/src/types/MoneyAmount.ts +67 -1
  192. package/src/types/NotificationProperties.ts +67 -9
  193. package/src/types/PayedState.ts +25 -30
  194. package/src/types/Person.ts +45 -0
  195. package/src/types/PersonPrivateProperties.ts +28 -1
  196. package/src/types/PersonSignInProperties.ts +30 -0
  197. package/src/types/Pluralization.ts +46 -0
  198. package/src/types/Team.ts +38 -0
  199. package/src/types/User.ts +70 -4
  200. package/src/types/UserRole.ts +32 -16
  201. package/src/types/index.ts +2 -0
  202. package/lib/src/Firestore.d.ts +0 -24
  203. package/lib/src/Firestore.js +0 -62
  204. package/lib/src/checkAuthentication.d.ts +0 -6
  205. package/lib/src/firebaseFunctionsContext.d.ts +0 -39
  206. package/lib/src/firebaseFunctionsContext.js +0 -43
  207. package/lib/src/pushNotification.d.ts +0 -3
  208. package/lib/src/pushNotification.js +0 -35
  209. package/lib/test/localization-utils.d.ts +0 -1
  210. package/lib/test/localization-utils.js +0 -24
  211. package/lib/test/localization.de.test.js +0 -151
  212. package/lib/test/localization.en.test.js +0 -145
  213. package/src/Firestore.ts +0 -75
  214. package/src/firebaseFunctionsContext.ts +0 -48
  215. package/src/pushNotification.ts +0 -37
  216. /package/lib/src/{FirestoreScheme.js → firebase/FirestoreScheme.js} +0 -0
  217. /package/lib/test/{localization.de.test.d.ts → firebase/FirebaseConfiguration.test.d.ts} +0 -0
  218. /package/lib/test/{localization.en.test.d.ts → firebase/Firestore.test.d.ts} +0 -0
@@ -0,0 +1,37 @@
1
+ import { Team, User, UserRole } from '../types';
2
+ /**
3
+ * Type representing expected user role requirements.
4
+ *
5
+ * Can be:
6
+ * - A single `UserRole` (user must have this role)
7
+ * - An array of `ExpectedUserRoles` (user must satisfy ALL requirements - logical AND)
8
+ * - An object with `anyOf` property (user must satisfy AT LEAST ONE requirement - logical OR)
9
+ *
10
+ * Examples:
11
+ * - `'admin'` - User must be admin
12
+ * - `['member', 'treasurer']` - User must be both member AND treasurer
13
+ * - `{ anyOf: ['admin', 'treasurer'] }` - User must be admin OR treasurer
14
+ */
15
+ type ExpectedUserRoles = UserRole | ExpectedUserRoles[] | {
16
+ anyOf: ExpectedUserRoles[];
17
+ };
18
+ /**
19
+ * Validates that a user is authenticated and has the required roles for a specific team.
20
+ *
21
+ * Performs comprehensive authentication checks:
22
+ * 1. Verifies the user is authenticated (rawUserId is not null)
23
+ * 2. Checks that the user exists in the database
24
+ * 3. Confirms the user is a member of the specified team
25
+ * 4. Validates that the person associated with the user exists
26
+ * 5. Ensures the person is signed in (has signInProperties)
27
+ * 6. Verifies the person has the required roles
28
+ *
29
+ * @param rawUserId - The raw user ID string from authentication context (null if not authenticated)
30
+ * @param teamId - The ID of the team to check membership and roles for
31
+ * @param roles - The expected role requirements (supports AND/OR logic via ExpectedUserRoles)
32
+ * @returns The validated User.Id if all checks pass
33
+ * @throws {FunctionsError} 'unauthenticated' - If rawUserId is null
34
+ * @throws {FunctionsError} 'permission-denied' - If any validation check fails
35
+ */
36
+ export declare function checkAuthentication(rawUserId: string | null, teamId: Team.Id, roles: ExpectedUserRoles): Promise<User.Id>;
37
+ export {};
@@ -2,8 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.checkAuthentication = checkAuthentication;
4
4
  const firebase_function_1 = require("@stevenkellner/firebase-function");
5
- const types_1 = require("./types");
5
+ const types_1 = require("../types");
6
6
  const Firestore_1 = require("./Firestore");
7
+ /**
8
+ * Checks if the user has the required roles according to the expected role requirements.
9
+ *
10
+ * @param userRoles - Array of roles the user currently has
11
+ * @param expectedRoles - The role requirements to check against (supports AND/OR logic)
12
+ * @returns `true` if the user satisfies the role requirements, `false` otherwise
13
+ */
7
14
  function hasUserRoles(userRoles, expectedRoles) {
8
15
  if (Array.isArray(expectedRoles))
9
16
  return expectedRoles.every(expectedRole => hasUserRoles(userRoles, expectedRole));
@@ -12,6 +19,24 @@ function hasUserRoles(userRoles, expectedRoles) {
12
19
  else
13
20
  return userRoles.includes(expectedRoles);
14
21
  }
22
+ /**
23
+ * Validates that a user is authenticated and has the required roles for a specific team.
24
+ *
25
+ * Performs comprehensive authentication checks:
26
+ * 1. Verifies the user is authenticated (rawUserId is not null)
27
+ * 2. Checks that the user exists in the database
28
+ * 3. Confirms the user is a member of the specified team
29
+ * 4. Validates that the person associated with the user exists
30
+ * 5. Ensures the person is signed in (has signInProperties)
31
+ * 6. Verifies the person has the required roles
32
+ *
33
+ * @param rawUserId - The raw user ID string from authentication context (null if not authenticated)
34
+ * @param teamId - The ID of the team to check membership and roles for
35
+ * @param roles - The expected role requirements (supports AND/OR logic via ExpectedUserRoles)
36
+ * @returns The validated User.Id if all checks pass
37
+ * @throws {FunctionsError} 'unauthenticated' - If rawUserId is null
38
+ * @throws {FunctionsError} 'permission-denied' - If any validation check fails
39
+ */
15
40
  async function checkAuthentication(rawUserId, teamId, roles) {
16
41
  if (rawUserId === null)
17
42
  throw new firebase_function_1.FunctionsError('unauthenticated', 'User is not authenticated');
@@ -1,2 +1,6 @@
1
1
  export * from './FirebaseConfiguration';
2
2
  export * from './Messaging';
3
+ export * from './checkAuthentication';
4
+ export * from './Firestore';
5
+ export * from './FirestoreScheme';
6
+ export * from './pushNotification';
@@ -16,3 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./FirebaseConfiguration"), exports);
18
18
  __exportStar(require("./Messaging"), exports);
19
+ __exportStar(require("./checkAuthentication"), exports);
20
+ __exportStar(require("./Firestore"), exports);
21
+ __exportStar(require("./FirestoreScheme"), exports);
22
+ __exportStar(require("./pushNotification"), exports);
@@ -0,0 +1,39 @@
1
+ import { NotificationProperties, Person, Team } from '../types';
2
+ import { Notification } from '.';
3
+ /**
4
+ * Sends a push notification to a person if they are subscribed to the topic.
5
+ *
6
+ * Retrieves the person's notification properties, checks their subscription status,
7
+ * sends the notification to all their registered device tokens, and updates their
8
+ * token list to remove any failed tokens.
9
+ *
10
+ * @param teamId - The unique identifier of the team
11
+ * @param personId - The unique identifier of the person
12
+ * @param topic - The notification subscription topic (e.g., 'new-fine', 'fine-reminder', 'fine-state-change')
13
+ * @param notification - The notification content to send
14
+ *
15
+ * @returns A promise that resolves when the notification is sent and person data is updated
16
+ *
17
+ * @remarks
18
+ * The function will silently return without sending if:
19
+ * - The person does not exist in the database
20
+ * - The person is not signed in (signInProperties is null)
21
+ * - The person is not subscribed to the specified topic
22
+ *
23
+ * After sending, the person's token list is automatically updated to remove
24
+ * any tokens that are invalid or unregistered, maintaining clean notification data.
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * await pushNotification(
29
+ * teamId,
30
+ * personId,
31
+ * 'new-fine',
32
+ * {
33
+ * title: 'New Fine',
34
+ * body: 'You have received a new fine'
35
+ * }
36
+ * );
37
+ * ```
38
+ */
39
+ export declare function pushNotification(teamId: Team.Id, personId: Person.Id, topic: NotificationProperties.Subscription, notification: Notification): Promise<void>;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pushNotification = pushNotification;
4
+ const typescript_common_functionality_1 = require("@stevenkellner/typescript-common-functionality");
5
+ const Firestore_1 = require("./Firestore");
6
+ const types_1 = require("../types");
7
+ const _1 = require(".");
8
+ /**
9
+ * Filters successful tokens from a Firebase Cloud Messaging batch response.
10
+ *
11
+ * Removes tokens that failed due to invalid or unregistered registration tokens,
12
+ * keeping only the tokens that successfully received the notification.
13
+ *
14
+ * @param response - The batch response from Firebase Cloud Messaging
15
+ * @param tokens - The array of device tokens that were sent the notification
16
+ * @returns A dictionary mapping token IDs to their corresponding device tokens for successful deliveries
17
+ *
18
+ * @remarks
19
+ * Filters out tokens with the following error codes:
20
+ * - `messaging/invalid-registration-token`: The token format is invalid
21
+ * - `messaging/registration-token-not-registered`: The token is no longer registered
22
+ *
23
+ * @private
24
+ */
25
+ function successfulTokens(response, tokens) {
26
+ const successfulTokens = response.responses
27
+ .map((response, index) => ({
28
+ failed: response.error?.code === 'messaging/invalid-registration-token' || response.error?.code === 'messaging/registration-token-not-registered',
29
+ token: tokens[index]
30
+ }))
31
+ .filter(response => !response.failed)
32
+ .map(response => response.token);
33
+ const tokenDict = new typescript_common_functionality_1.Dictionary(types_1.NotificationProperties.TokenId.builder);
34
+ for (const token of successfulTokens)
35
+ tokenDict.set(types_1.NotificationProperties.TokenId.create(token), token);
36
+ return tokenDict;
37
+ }
38
+ /**
39
+ * Sends a push notification to a person if they are subscribed to the topic.
40
+ *
41
+ * Retrieves the person's notification properties, checks their subscription status,
42
+ * sends the notification to all their registered device tokens, and updates their
43
+ * token list to remove any failed tokens.
44
+ *
45
+ * @param teamId - The unique identifier of the team
46
+ * @param personId - The unique identifier of the person
47
+ * @param topic - The notification subscription topic (e.g., 'new-fine', 'fine-reminder', 'fine-state-change')
48
+ * @param notification - The notification content to send
49
+ *
50
+ * @returns A promise that resolves when the notification is sent and person data is updated
51
+ *
52
+ * @remarks
53
+ * The function will silently return without sending if:
54
+ * - The person does not exist in the database
55
+ * - The person is not signed in (signInProperties is null)
56
+ * - The person is not subscribed to the specified topic
57
+ *
58
+ * After sending, the person's token list is automatically updated to remove
59
+ * any tokens that are invalid or unregistered, maintaining clean notification data.
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * await pushNotification(
64
+ * teamId,
65
+ * personId,
66
+ * 'new-fine',
67
+ * {
68
+ * title: 'New Fine',
69
+ * body: 'You have received a new fine'
70
+ * }
71
+ * );
72
+ * ```
73
+ */
74
+ async function pushNotification(teamId, personId, topic, notification) {
75
+ const personSnapshot = await Firestore_1.Firestore.shared.person(teamId, personId).snapshot();
76
+ if (!personSnapshot.exists)
77
+ return;
78
+ const person = types_1.Person.builder.build(personSnapshot.data);
79
+ if (person.signInProperties === null || !person.signInProperties.notificationProperties.subscriptions.includes(topic))
80
+ return;
81
+ const tokens = person.signInProperties.notificationProperties.tokens.values;
82
+ const response = await _1.FirebaseConfiguration.shared.messaging.sendEachForMulticast({
83
+ tokens: tokens,
84
+ notification: notification
85
+ });
86
+ person.signInProperties.notificationProperties.tokens = successfulTokens(response, tokens);
87
+ await Firestore_1.Firestore.shared.person(teamId, personId).set(person);
88
+ }
@@ -1,15 +1,13 @@
1
1
  import { FirebaseFunction } from '@stevenkellner/firebase-function';
2
2
  import { ObjectTypeBuilder, ValueTypeBuilder } from '@stevenkellner/typescript-common-functionality';
3
3
  import { Configuration, Fine, Person, Team } from '../../types';
4
- export declare namespace FineAddFunction {
5
- type Parameters = {
6
- teamId: Team.Id;
7
- personId: Person.Id;
8
- fine: Fine;
9
- configuration: Configuration;
10
- };
11
- }
12
- export declare class FineAddFunction extends FirebaseFunction<FineAddFunction.Parameters, void> {
4
+ export type FineAddFunctionParameters = {
5
+ teamId: Team.Id;
6
+ personId: Person.Id;
7
+ fine: Fine;
8
+ configuration: Configuration;
9
+ };
10
+ export declare abstract class FineAddFunctionBase extends FirebaseFunction<FineAddFunctionParameters, void> {
13
11
  parametersBuilder: ObjectTypeBuilder<{
14
12
  teamId: string;
15
13
  personId: string;
@@ -28,10 +26,9 @@ export declare class FineAddFunction extends FirebaseFunction<FineAddFunction.Pa
28
26
  };
29
27
  };
30
28
  configuration: {
31
- currency: Configuration.Currency;
32
- locale: Configuration.Locale;
29
+ currency: import("../../types").Currency;
30
+ locale: import("../../types").Locale;
33
31
  };
34
- }, FineAddFunction.Parameters>;
32
+ }, FineAddFunctionParameters>;
35
33
  returnTypeBuilder: ValueTypeBuilder<void>;
36
- execute(parameters: FineAddFunction.Parameters): Promise<void>;
37
34
  }
@@ -1,13 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FineAddFunction = void 0;
3
+ exports.FineAddFunctionBase = void 0;
4
4
  const firebase_function_1 = require("@stevenkellner/firebase-function");
5
5
  const typescript_common_functionality_1 = require("@stevenkellner/typescript-common-functionality");
6
6
  const types_1 = require("../../types");
7
- const checkAuthentication_1 = require("../../checkAuthentication");
8
- const Firestore_1 = require("../../Firestore");
9
- const pushNotification_1 = require("../../pushNotification");
10
- class FineAddFunction extends firebase_function_1.FirebaseFunction {
7
+ class FineAddFunctionBase extends firebase_function_1.FirebaseFunction {
11
8
  parametersBuilder = new typescript_common_functionality_1.ObjectTypeBuilder({
12
9
  teamId: types_1.Team.Id.builder,
13
10
  personId: types_1.Person.Id.builder,
@@ -15,29 +12,5 @@ class FineAddFunction extends firebase_function_1.FirebaseFunction {
15
12
  configuration: types_1.Configuration.builder
16
13
  });
17
14
  returnTypeBuilder = new typescript_common_functionality_1.ValueTypeBuilder();
18
- async execute(parameters) {
19
- await (0, checkAuthentication_1.checkAuthentication)(this.userId, parameters.teamId, {
20
- anyOf: ['fine-manager', 'fine-can-add']
21
- });
22
- const fineSnapshot = await Firestore_1.Firestore.shared.fine(parameters.teamId, parameters.fine.id).snapshot();
23
- if (fineSnapshot.exists)
24
- throw new firebase_function_1.FunctionsError('already-exists', 'Fine already exists');
25
- const personSnapshot = await Firestore_1.Firestore.shared.person(parameters.teamId, parameters.personId).snapshot();
26
- if (!personSnapshot.exists)
27
- throw new firebase_function_1.FunctionsError('not-found', 'Person not found');
28
- const person = types_1.Person.builder.build(personSnapshot.data);
29
- await Firestore_1.Firestore.shared.fine(parameters.teamId, parameters.fine.id).set(parameters.fine);
30
- person.fineIds.push(parameters.fine.id);
31
- await Firestore_1.Firestore.shared.person(parameters.teamId, parameters.personId).set(person);
32
- types_1.Localization.locale = parameters.configuration.locale;
33
- await (0, pushNotification_1.pushNotification)(parameters.teamId, parameters.personId, 'new-fine', {
34
- title: types_1.Localization.shared.notification.fine.new.title.value({
35
- reason: parameters.fine.reason
36
- }),
37
- body: types_1.Localization.shared.notification.fine.new.body.value({
38
- amount: parameters.fine.amount.formatted(parameters.configuration)
39
- })
40
- });
41
- }
42
15
  }
43
- exports.FineAddFunction = FineAddFunction;
16
+ exports.FineAddFunctionBase = FineAddFunctionBase;
@@ -1,24 +1,21 @@
1
1
  import { FirebaseFunction } from '@stevenkellner/firebase-function';
2
2
  import { Configuration, Fine, Person, Team } from '../../types';
3
3
  import { ObjectTypeBuilder, ValueTypeBuilder } from '@stevenkellner/typescript-common-functionality';
4
- export declare namespace FineDeleteFunction {
5
- type Parameters = {
6
- teamId: Team.Id;
7
- personId: Person.Id;
8
- id: Fine.Id;
9
- configuration: Configuration;
10
- };
11
- }
12
- export declare class FineDeleteFunction extends FirebaseFunction<FineDeleteFunction.Parameters, void> {
4
+ export type FineDeleteFunctionParameters = {
5
+ teamId: Team.Id;
6
+ personId: Person.Id;
7
+ id: Fine.Id;
8
+ configuration: Configuration;
9
+ };
10
+ export declare abstract class FineDeleteFunctionBase extends FirebaseFunction<FineDeleteFunctionParameters, void> {
13
11
  parametersBuilder: ObjectTypeBuilder<{
14
12
  teamId: string;
15
13
  personId: string;
16
14
  id: string;
17
15
  configuration: {
18
- currency: Configuration.Currency;
19
- locale: Configuration.Locale;
16
+ currency: import("../../types").Currency;
17
+ locale: import("../../types").Locale;
20
18
  };
21
- }, FineDeleteFunction.Parameters>;
19
+ }, FineDeleteFunctionParameters>;
22
20
  returnTypeBuilder: ValueTypeBuilder<void>;
23
- execute(parameters: FineDeleteFunction.Parameters): Promise<void>;
24
21
  }
@@ -1,13 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FineDeleteFunction = void 0;
3
+ exports.FineDeleteFunctionBase = void 0;
4
4
  const firebase_function_1 = require("@stevenkellner/firebase-function");
5
5
  const types_1 = require("../../types");
6
6
  const typescript_common_functionality_1 = require("@stevenkellner/typescript-common-functionality");
7
- const checkAuthentication_1 = require("../../checkAuthentication");
8
- const Firestore_1 = require("../../Firestore");
9
- const pushNotification_1 = require("../../pushNotification");
10
- class FineDeleteFunction extends firebase_function_1.FirebaseFunction {
7
+ class FineDeleteFunctionBase extends firebase_function_1.FirebaseFunction {
11
8
  parametersBuilder = new typescript_common_functionality_1.ObjectTypeBuilder({
12
9
  teamId: types_1.Team.Id.builder,
13
10
  personId: types_1.Person.Id.builder,
@@ -15,26 +12,5 @@ class FineDeleteFunction extends firebase_function_1.FirebaseFunction {
15
12
  configuration: types_1.Configuration.builder
16
13
  });
17
14
  returnTypeBuilder = new typescript_common_functionality_1.ValueTypeBuilder();
18
- async execute(parameters) {
19
- await (0, checkAuthentication_1.checkAuthentication)(this.userId, parameters.teamId, 'fine-manager');
20
- const fineSnapshot = await Firestore_1.Firestore.shared.fine(parameters.teamId, parameters.id).snapshot();
21
- if (!fineSnapshot.exists)
22
- throw new firebase_function_1.FunctionsError('not-found', 'Fine not found');
23
- const personSnapshot = await Firestore_1.Firestore.shared.person(parameters.teamId, parameters.personId).snapshot();
24
- if (!personSnapshot.exists)
25
- throw new firebase_function_1.FunctionsError('not-found', 'Person not found');
26
- const person = types_1.Person.builder.build(personSnapshot.data);
27
- await Firestore_1.Firestore.shared.fine(parameters.teamId, parameters.id).remove();
28
- person.fineIds = person.fineIds.filter(id => id.guidString !== parameters.id.guidString);
29
- await Firestore_1.Firestore.shared.person(parameters.teamId, parameters.personId).set(person);
30
- types_1.Localization.locale = parameters.configuration.locale;
31
- await (0, pushNotification_1.pushNotification)(parameters.teamId, parameters.personId, 'fine-state-change', {
32
- title: types_1.Localization.shared.notification.fine.stateChange.title.value(),
33
- body: types_1.Localization.shared.notification.fine.stateChange.bodyDeleted.value({
34
- amount: types_1.FineAmount.builder.build(fineSnapshot.data.amount).formatted(parameters.configuration),
35
- reason: fineSnapshot.data.reason
36
- })
37
- });
38
- }
39
15
  }
40
- exports.FineDeleteFunction = FineDeleteFunction;
16
+ exports.FineDeleteFunctionBase = FineDeleteFunctionBase;
@@ -2,15 +2,13 @@ import { Configuration } from '../../types/Configuration';
2
2
  import { FirebaseFunction } from '@stevenkellner/firebase-function';
3
3
  import { Fine, Person, Team } from '../../types';
4
4
  import { ObjectTypeBuilder, ValueTypeBuilder } from '@stevenkellner/typescript-common-functionality';
5
- export declare namespace FineUpdateFunction {
6
- type Parameters = {
7
- teamId: Team.Id;
8
- personId: Person.Id;
9
- fine: Fine;
10
- configuration: Configuration;
11
- };
12
- }
13
- export declare class FineUpdateFunction extends FirebaseFunction<FineUpdateFunction.Parameters, void> {
5
+ export type FineUpdateFunctionParameters = {
6
+ teamId: Team.Id;
7
+ personId: Person.Id;
8
+ fine: Fine;
9
+ configuration: Configuration;
10
+ };
11
+ export declare abstract class FineUpdateFunctionBase extends FirebaseFunction<FineUpdateFunctionParameters, void> {
14
12
  parametersBuilder: ObjectTypeBuilder<{
15
13
  teamId: string;
16
14
  personId: string;
@@ -29,10 +27,9 @@ export declare class FineUpdateFunction extends FirebaseFunction<FineUpdateFunct
29
27
  };
30
28
  };
31
29
  configuration: {
32
- currency: Configuration.Currency;
33
- locale: Configuration.Locale;
30
+ currency: import("../../types").Currency;
31
+ locale: import("../../types").Locale;
34
32
  };
35
- }, FineUpdateFunction.Parameters>;
33
+ }, FineUpdateFunctionParameters>;
36
34
  returnTypeBuilder: ValueTypeBuilder<void>;
37
- execute(parameters: FineUpdateFunction.Parameters): Promise<void>;
38
35
  }
@@ -1,14 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FineUpdateFunction = void 0;
3
+ exports.FineUpdateFunctionBase = void 0;
4
4
  const Configuration_1 = require("../../types/Configuration");
5
5
  const firebase_function_1 = require("@stevenkellner/firebase-function");
6
- const pushNotification_1 = require("../../pushNotification");
7
6
  const types_1 = require("../../types");
8
7
  const typescript_common_functionality_1 = require("@stevenkellner/typescript-common-functionality");
9
- const checkAuthentication_1 = require("../../checkAuthentication");
10
- const Firestore_1 = require("../../Firestore");
11
- class FineUpdateFunction extends firebase_function_1.FirebaseFunction {
8
+ class FineUpdateFunctionBase extends firebase_function_1.FirebaseFunction {
12
9
  parametersBuilder = new typescript_common_functionality_1.ObjectTypeBuilder({
13
10
  teamId: types_1.Team.Id.builder,
14
11
  personId: types_1.Person.Id.builder,
@@ -16,27 +13,5 @@ class FineUpdateFunction extends firebase_function_1.FirebaseFunction {
16
13
  configuration: Configuration_1.Configuration.builder
17
14
  });
18
15
  returnTypeBuilder = new typescript_common_functionality_1.ValueTypeBuilder();
19
- async execute(parameters) {
20
- await (0, checkAuthentication_1.checkAuthentication)(this.userId, parameters.teamId, 'fine-manager');
21
- const fineSnapshot = await Firestore_1.Firestore.shared.fine(parameters.teamId, parameters.fine.id).snapshot();
22
- if (!fineSnapshot.exists)
23
- throw new firebase_function_1.FunctionsError('not-found', 'Fine not found');
24
- await Firestore_1.Firestore.shared.fine(parameters.teamId, parameters.fine.id).set(parameters.fine);
25
- types_1.Localization.locale = parameters.configuration.locale;
26
- if (parameters.fine.payedState !== fineSnapshot.data.payedState) {
27
- let bodyLocalization;
28
- if (parameters.fine.payedState === 'payed')
29
- bodyLocalization = types_1.Localization.shared.notification.fine.stateChange.bodyPayed;
30
- else
31
- bodyLocalization = types_1.Localization.shared.notification.fine.stateChange.bodyUnpayed;
32
- await (0, pushNotification_1.pushNotification)(parameters.teamId, parameters.personId, 'fine-state-change', {
33
- title: types_1.Localization.shared.notification.fine.stateChange.title.value(),
34
- body: bodyLocalization.value({
35
- reason: parameters.fine.reason,
36
- amount: parameters.fine.amount.formatted(parameters.configuration)
37
- })
38
- });
39
- }
40
- }
41
16
  }
42
- exports.FineUpdateFunction = FineUpdateFunction;
17
+ exports.FineUpdateFunctionBase = FineUpdateFunctionBase;
@@ -1,13 +1,11 @@
1
1
  import { FirebaseFunction } from '@stevenkellner/firebase-function';
2
2
  import { FineTemplate, Team } from '../../types';
3
3
  import { ObjectTypeBuilder, ValueTypeBuilder } from '@stevenkellner/typescript-common-functionality';
4
- export declare namespace FineTemplateAddFunction {
5
- type Parameters = {
6
- teamId: Team.Id;
7
- fineTemplate: FineTemplate;
8
- };
9
- }
10
- export declare class FineTemplateAddFunction extends FirebaseFunction<FineTemplateAddFunction.Parameters, void> {
4
+ export type FineTemplateAddFunctionParameters = {
5
+ teamId: Team.Id;
6
+ fineTemplate: FineTemplate;
7
+ };
8
+ export declare abstract class FineTemplateAddFunctionBase extends FirebaseFunction<FineTemplateAddFunctionParameters, void> {
11
9
  parametersBuilder: ObjectTypeBuilder<{
12
10
  teamId: string;
13
11
  fineTemplate: {
@@ -26,7 +24,6 @@ export declare class FineTemplateAddFunction extends FirebaseFunction<FineTempla
26
24
  maxCount: number | null;
27
25
  } | null;
28
26
  };
29
- }, FineTemplateAddFunction.Parameters>;
27
+ }, FineTemplateAddFunctionParameters>;
30
28
  returnTypeBuilder: ValueTypeBuilder<void>;
31
- execute(parameters: FineTemplateAddFunction.Parameters): Promise<void>;
32
29
  }
@@ -1,23 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FineTemplateAddFunction = void 0;
3
+ exports.FineTemplateAddFunctionBase = void 0;
4
4
  const firebase_function_1 = require("@stevenkellner/firebase-function");
5
5
  const types_1 = require("../../types");
6
6
  const typescript_common_functionality_1 = require("@stevenkellner/typescript-common-functionality");
7
- const checkAuthentication_1 = require("../../checkAuthentication");
8
- const Firestore_1 = require("../../Firestore");
9
- class FineTemplateAddFunction extends firebase_function_1.FirebaseFunction {
7
+ class FineTemplateAddFunctionBase extends firebase_function_1.FirebaseFunction {
10
8
  parametersBuilder = new typescript_common_functionality_1.ObjectTypeBuilder({
11
9
  teamId: types_1.Team.Id.builder,
12
10
  fineTemplate: types_1.FineTemplate.builder
13
11
  });
14
12
  returnTypeBuilder = new typescript_common_functionality_1.ValueTypeBuilder();
15
- async execute(parameters) {
16
- await (0, checkAuthentication_1.checkAuthentication)(this.userId, parameters.teamId, 'fineTemplate-manager');
17
- const fineTemplateSnapshot = await Firestore_1.Firestore.shared.fineTemplate(parameters.teamId, parameters.fineTemplate.id).snapshot();
18
- if (fineTemplateSnapshot.exists)
19
- throw new firebase_function_1.FunctionsError('already-exists', 'FineTemplate already exists');
20
- await Firestore_1.Firestore.shared.fineTemplate(parameters.teamId, parameters.fineTemplate.id).set(parameters.fineTemplate);
21
- }
22
13
  }
23
- exports.FineTemplateAddFunction = FineTemplateAddFunction;
14
+ exports.FineTemplateAddFunctionBase = FineTemplateAddFunctionBase;
@@ -1,17 +1,14 @@
1
1
  import { FirebaseFunction } from '@stevenkellner/firebase-function';
2
2
  import { FineTemplate, Team } from '../../types';
3
3
  import { ObjectTypeBuilder, ValueTypeBuilder } from '@stevenkellner/typescript-common-functionality';
4
- export declare namespace FineTemplateDeleteFunction {
5
- type Parameters = {
6
- teamId: Team.Id;
7
- id: FineTemplate.Id;
8
- };
9
- }
10
- export declare class FineTemplateDeleteFunction extends FirebaseFunction<FineTemplateDeleteFunction.Parameters, void> {
4
+ export type FineTemplateDeleteFunctionParameters = {
5
+ teamId: Team.Id;
6
+ id: FineTemplate.Id;
7
+ };
8
+ export declare abstract class FineTemplateDeleteFunctionBase extends FirebaseFunction<FineTemplateDeleteFunctionParameters, void> {
11
9
  parametersBuilder: ObjectTypeBuilder<{
12
10
  teamId: string;
13
11
  id: string;
14
- }, FineTemplateDeleteFunction.Parameters>;
12
+ }, FineTemplateDeleteFunctionParameters>;
15
13
  returnTypeBuilder: ValueTypeBuilder<void>;
16
- execute(parameters: FineTemplateDeleteFunction.Parameters): Promise<void>;
17
14
  }
@@ -1,23 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FineTemplateDeleteFunction = void 0;
3
+ exports.FineTemplateDeleteFunctionBase = void 0;
4
4
  const firebase_function_1 = require("@stevenkellner/firebase-function");
5
5
  const types_1 = require("../../types");
6
6
  const typescript_common_functionality_1 = require("@stevenkellner/typescript-common-functionality");
7
- const checkAuthentication_1 = require("../../checkAuthentication");
8
- const Firestore_1 = require("../../Firestore");
9
- class FineTemplateDeleteFunction extends firebase_function_1.FirebaseFunction {
7
+ class FineTemplateDeleteFunctionBase extends firebase_function_1.FirebaseFunction {
10
8
  parametersBuilder = new typescript_common_functionality_1.ObjectTypeBuilder({
11
9
  teamId: types_1.Team.Id.builder,
12
10
  id: types_1.FineTemplate.Id.builder
13
11
  });
14
12
  returnTypeBuilder = new typescript_common_functionality_1.ValueTypeBuilder();
15
- async execute(parameters) {
16
- await (0, checkAuthentication_1.checkAuthentication)(this.userId, parameters.teamId, 'fineTemplate-manager');
17
- const fineTemplateSnapshot = await Firestore_1.Firestore.shared.fineTemplate(parameters.teamId, parameters.id).snapshot();
18
- if (!fineTemplateSnapshot.exists)
19
- throw new firebase_function_1.FunctionsError('not-found', 'FineTemplate not found');
20
- await Firestore_1.Firestore.shared.fineTemplate(parameters.teamId, parameters.id).remove();
21
- }
22
13
  }
23
- exports.FineTemplateDeleteFunction = FineTemplateDeleteFunction;
14
+ exports.FineTemplateDeleteFunctionBase = FineTemplateDeleteFunctionBase;
@@ -1,13 +1,11 @@
1
1
  import { FirebaseFunction } from '@stevenkellner/firebase-function';
2
2
  import { FineTemplate, Team } from '../../types';
3
3
  import { ObjectTypeBuilder, ValueTypeBuilder } from '@stevenkellner/typescript-common-functionality';
4
- export declare namespace FineTemplateUpdateFunction {
5
- type Parameters = {
6
- teamId: Team.Id;
7
- fineTemplate: FineTemplate;
8
- };
9
- }
10
- export declare class FineTemplateUpdateFunction extends FirebaseFunction<FineTemplateUpdateFunction.Parameters, void> {
4
+ export type FineTemplateUpdateFunctionParameters = {
5
+ teamId: Team.Id;
6
+ fineTemplate: FineTemplate;
7
+ };
8
+ export declare abstract class FineTemplateUpdateFunctionBase extends FirebaseFunction<FineTemplateUpdateFunctionParameters, void> {
11
9
  parametersBuilder: ObjectTypeBuilder<{
12
10
  teamId: string;
13
11
  fineTemplate: {
@@ -26,7 +24,6 @@ export declare class FineTemplateUpdateFunction extends FirebaseFunction<FineTem
26
24
  maxCount: number | null;
27
25
  } | null;
28
26
  };
29
- }, FineTemplateUpdateFunction.Parameters>;
27
+ }, FineTemplateUpdateFunctionParameters>;
30
28
  returnTypeBuilder: ValueTypeBuilder<void>;
31
- execute(parameters: FineTemplateUpdateFunction.Parameters): Promise<void>;
32
29
  }
@@ -1,23 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FineTemplateUpdateFunction = void 0;
3
+ exports.FineTemplateUpdateFunctionBase = void 0;
4
4
  const firebase_function_1 = require("@stevenkellner/firebase-function");
5
5
  const types_1 = require("../../types");
6
6
  const typescript_common_functionality_1 = require("@stevenkellner/typescript-common-functionality");
7
- const checkAuthentication_1 = require("../../checkAuthentication");
8
- const Firestore_1 = require("../../Firestore");
9
- class FineTemplateUpdateFunction extends firebase_function_1.FirebaseFunction {
7
+ class FineTemplateUpdateFunctionBase extends firebase_function_1.FirebaseFunction {
10
8
  parametersBuilder = new typescript_common_functionality_1.ObjectTypeBuilder({
11
9
  teamId: types_1.Team.Id.builder,
12
10
  fineTemplate: types_1.FineTemplate.builder
13
11
  });
14
12
  returnTypeBuilder = new typescript_common_functionality_1.ValueTypeBuilder();
15
- async execute(parameters) {
16
- await (0, checkAuthentication_1.checkAuthentication)(this.userId, parameters.teamId, 'fineTemplate-manager');
17
- const fineTemplateSnapshot = await Firestore_1.Firestore.shared.fineTemplate(parameters.teamId, parameters.fineTemplate.id).snapshot();
18
- if (!fineTemplateSnapshot.exists)
19
- throw new firebase_function_1.FunctionsError('not-found', 'FineTemplate not found');
20
- await Firestore_1.Firestore.shared.fineTemplate(parameters.teamId, parameters.fineTemplate.id).set(parameters.fineTemplate);
21
- }
22
13
  }
23
- exports.FineTemplateUpdateFunction = FineTemplateUpdateFunction;
14
+ exports.FineTemplateUpdateFunctionBase = FineTemplateUpdateFunctionBase;