@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.
- package/lib/src/firebase/FirebaseConfiguration.d.ts +45 -1
- package/lib/src/firebase/FirebaseConfiguration.js +44 -0
- package/lib/src/firebase/Firestore.d.ts +196 -0
- package/lib/src/firebase/Firestore.js +235 -0
- package/lib/src/{FirestoreScheme.d.ts → firebase/FirestoreScheme.d.ts} +15 -1
- package/lib/src/firebase/Messaging.d.ts +64 -0
- package/lib/src/firebase/checkAuthentication.d.ts +37 -0
- package/lib/src/{checkAuthentication.js → firebase/checkAuthentication.js} +26 -1
- package/lib/src/firebase/index.d.ts +4 -0
- package/lib/src/firebase/index.js +4 -0
- package/lib/src/firebase/pushNotification.d.ts +39 -0
- package/lib/src/firebase/pushNotification.js +88 -0
- package/lib/src/functions/fine/add.d.ts +10 -13
- package/lib/src/functions/fine/add.js +3 -30
- package/lib/src/functions/fine/delete.d.ts +10 -13
- package/lib/src/functions/fine/delete.js +3 -27
- package/lib/src/functions/fine/update.d.ts +10 -13
- package/lib/src/functions/fine/update.js +3 -28
- package/lib/src/functions/fineTemplate/add.d.ts +6 -9
- package/lib/src/functions/fineTemplate/add.js +3 -12
- package/lib/src/functions/fineTemplate/delete.d.ts +6 -9
- package/lib/src/functions/fineTemplate/delete.js +3 -12
- package/lib/src/functions/fineTemplate/update.d.ts +6 -9
- package/lib/src/functions/fineTemplate/update.js +3 -12
- package/lib/src/functions/invitation/getInvitation.d.ts +40 -43
- package/lib/src/functions/invitation/getInvitation.js +57 -88
- package/lib/src/functions/invitation/invite.d.ts +1 -2
- package/lib/src/functions/invitation/invite.js +3 -18
- package/lib/src/functions/invitation/register.d.ts +6 -11
- package/lib/src/functions/invitation/register.js +3 -39
- package/lib/src/functions/invitation/withdraw.d.ts +1 -2
- package/lib/src/functions/invitation/withdraw.js +3 -13
- package/lib/src/functions/notification/register.d.ts +7 -10
- package/lib/src/functions/notification/register.js +3 -15
- package/lib/src/functions/notification/subscribe.d.ts +8 -11
- package/lib/src/functions/notification/subscribe.js +3 -14
- package/lib/src/functions/paypalMe/edit.d.ts +6 -9
- package/lib/src/functions/paypalMe/edit.js +3 -14
- package/lib/src/functions/person/add.d.ts +7 -10
- package/lib/src/functions/person/add.js +3 -12
- package/lib/src/functions/person/delete.d.ts +6 -9
- package/lib/src/functions/person/delete.js +3 -14
- package/lib/src/functions/person/update.d.ts +7 -10
- package/lib/src/functions/person/update.js +3 -13
- package/lib/src/functions/team/new.d.ts +9 -12
- package/lib/src/functions/team/new.js +3 -22
- package/lib/src/functions/user/kickout.d.ts +6 -9
- package/lib/src/functions/user/kickout.js +3 -25
- package/lib/src/functions/user/login.d.ts +1 -2
- package/lib/src/functions/user/login.js +3 -13
- package/lib/src/functions/user/roleEdit.d.ts +8 -11
- package/lib/src/functions/user/roleEdit.js +3 -18
- package/lib/src/index.d.ts +0 -5
- package/lib/src/index.js +0 -5
- package/lib/src/locales/de.d.ts +10 -67
- package/lib/src/locales/de.js +8 -0
- package/lib/src/locales/en.d.ts +10 -0
- package/lib/src/locales/en.js +19 -2
- package/lib/src/types/Configuration.d.ts +33 -15
- package/lib/src/types/Configuration.js +24 -12
- package/lib/src/types/Currency.d.ts +20 -0
- package/lib/src/types/Currency.js +19 -0
- package/lib/src/types/Fine.d.ts +41 -0
- package/lib/src/types/Fine.js +32 -0
- package/lib/src/types/FineAmount.d.ts +160 -9
- package/lib/src/types/FineAmount.js +128 -7
- package/lib/src/types/FineTemplate.d.ts +41 -0
- package/lib/src/types/FineTemplate.js +32 -0
- package/lib/src/types/FineTemplateRepetition.d.ts +72 -10
- package/lib/src/types/FineTemplateRepetition.js +66 -12
- package/lib/src/types/Invitation.d.ts +48 -0
- package/lib/src/types/Invitation.js +39 -0
- package/lib/src/types/Locale.d.ts +16 -0
- package/lib/src/types/Locale.js +16 -0
- package/lib/src/types/Localization.d.ts +74 -74
- package/lib/src/types/Localization.js +80 -41
- package/lib/src/types/MoneyAmount.d.ts +67 -1
- package/lib/src/types/MoneyAmount.js +62 -0
- package/lib/src/types/NotificationProperties.d.ts +70 -9
- package/lib/src/types/NotificationProperties.js +49 -5
- package/lib/src/types/PayedState.d.ts +25 -9
- package/lib/src/types/PayedState.js +17 -27
- package/lib/src/types/Person.d.ts +45 -0
- package/lib/src/types/Person.js +36 -0
- package/lib/src/types/PersonPrivateProperties.d.ts +28 -0
- package/lib/src/types/PersonPrivateProperties.js +25 -0
- package/lib/src/types/PersonSignInProperties.d.ts +30 -0
- package/lib/src/types/PersonSignInProperties.js +27 -0
- package/lib/src/types/Pluralization.d.ts +46 -0
- package/lib/src/types/Pluralization.js +46 -0
- package/lib/src/types/Team.d.ts +38 -0
- package/lib/src/types/Team.js +29 -0
- package/lib/src/types/User.d.ts +68 -3
- package/lib/src/types/User.js +59 -5
- package/lib/src/types/UserRole.d.ts +26 -4
- package/lib/src/types/UserRole.js +25 -9
- package/lib/src/types/index.d.ts +2 -0
- package/lib/src/types/index.js +2 -0
- package/lib/test/firebase/FirebaseConfiguration.test.js +155 -0
- package/lib/test/firebase/Firestore.test.js +46 -0
- package/lib/test/firebase/checkAuthentication.test.d.ts +1 -0
- package/lib/test/firebase/checkAuthentication.test.js +305 -0
- package/lib/test/firebase/firebase-utils.d.ts +32 -0
- package/lib/test/firebase/firebase-utils.js +131 -0
- package/lib/test/firebase/pushNotification.test.d.ts +1 -0
- package/lib/test/firebase/pushNotification.test.js +300 -0
- package/lib/test/locales/localization.de.test.d.ts +1 -0
- package/lib/test/locales/localization.de.test.js +144 -0
- package/lib/test/locales/localization.en.test.d.ts +1 -0
- package/lib/test/locales/localization.en.test.js +144 -0
- package/lib/test/types/Configuration.test.d.ts +1 -0
- package/lib/test/types/Configuration.test.js +84 -0
- package/lib/test/types/Currency.test.d.ts +1 -0
- package/lib/test/types/Currency.test.js +41 -0
- package/lib/test/types/Fine.test.d.ts +1 -0
- package/lib/test/types/Fine.test.js +265 -0
- package/lib/test/types/FineAmount.test.d.ts +1 -0
- package/lib/test/types/FineAmount.test.js +445 -0
- package/lib/test/types/FineTemplate.test.d.ts +1 -0
- package/lib/test/types/FineTemplate.test.js +271 -0
- package/lib/test/types/FineTemplateRepetition.test.d.ts +1 -0
- package/lib/test/types/FineTemplateRepetition.test.js +361 -0
- package/lib/test/types/Invitation.test.d.ts +1 -0
- package/lib/test/types/Invitation.test.js +269 -0
- package/lib/test/types/Locale.test.d.ts +1 -0
- package/lib/test/types/Locale.test.js +46 -0
- package/lib/test/types/Localization.test.d.ts +1 -0
- package/lib/test/types/Localization.test.js +241 -0
- package/lib/test/types/MoneyAmount.test.d.ts +1 -0
- package/lib/test/types/MoneyAmount.test.js +276 -0
- package/lib/test/types/NotificationProperties.test.d.ts +1 -0
- package/lib/test/types/NotificationProperties.test.js +258 -0
- package/lib/test/types/PayedState.test.d.ts +1 -0
- package/lib/test/types/PayedState.test.js +105 -0
- package/lib/test/types/Person.test.d.ts +1 -0
- package/lib/test/types/Person.test.js +266 -0
- package/lib/test/types/PersonPrivateProperties.test.d.ts +1 -0
- package/lib/test/types/PersonPrivateProperties.test.js +155 -0
- package/lib/test/types/PersonSignInProperties.test.d.ts +1 -0
- package/lib/test/types/PersonSignInProperties.test.js +208 -0
- package/lib/test/types/Pluralization.test.d.ts +1 -0
- package/lib/test/types/Pluralization.test.js +206 -0
- package/lib/test/types/Team.test.d.ts +1 -0
- package/lib/test/types/Team.test.js +145 -0
- package/lib/test/types/User.test.d.ts +1 -0
- package/lib/test/types/User.test.js +232 -0
- package/lib/test/types/UserRole.test.d.ts +1 -0
- package/lib/test/types/UserRole.test.js +140 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -9
- package/src/firebase/FirebaseConfiguration.ts +49 -1
- package/src/firebase/Firestore.ts +248 -0
- package/src/{FirestoreScheme.ts → firebase/FirestoreScheme.ts} +15 -1
- package/src/firebase/Messaging.ts +64 -0
- package/src/{checkAuthentication.ts → firebase/checkAuthentication.ts} +39 -1
- package/src/firebase/index.ts +5 -0
- package/src/firebase/pushNotification.ts +90 -0
- package/src/functions/fine/add.ts +10 -48
- package/src/functions/fine/delete.ts +9 -43
- package/src/functions/fine/update.ts +10 -44
- package/src/functions/fineTemplate/add.ts +7 -23
- package/src/functions/fineTemplate/delete.ts +7 -23
- package/src/functions/fineTemplate/update.ts +7 -24
- package/src/functions/index.ts +0 -1
- package/src/functions/invitation/getInvitation.ts +81 -118
- package/src/functions/invitation/invite.ts +2 -25
- package/src/functions/invitation/register.ts +9 -60
- package/src/functions/invitation/withdraw.ts +2 -16
- package/src/functions/notification/register.ts +7 -26
- package/src/functions/notification/subscribe.ts +8 -26
- package/src/functions/paypalMe/edit.ts +7 -25
- package/src/functions/person/add.ts +8 -24
- package/src/functions/person/delete.ts +6 -25
- package/src/functions/person/update.ts +8 -25
- package/src/functions/team/new.ts +12 -42
- package/src/functions/user/kickout.ts +8 -41
- package/src/functions/user/login.ts +2 -16
- package/src/functions/user/roleEdit.ts +8 -32
- package/src/index.ts +0 -5
- package/src/locales/de.ts +10 -1
- package/src/locales/en.ts +21 -2
- package/src/types/Configuration.ts +33 -23
- package/src/types/Currency.ts +24 -0
- package/src/types/Fine.ts +41 -0
- package/src/types/FineAmount.ts +162 -11
- package/src/types/FineTemplate.ts +41 -0
- package/src/types/FineTemplateRepetition.ts +75 -17
- package/src/types/Invitation.ts +48 -0
- package/src/types/Locale.ts +20 -0
- package/src/types/Localization.ts +96 -41
- package/src/types/MoneyAmount.ts +67 -1
- package/src/types/NotificationProperties.ts +67 -9
- package/src/types/PayedState.ts +25 -30
- package/src/types/Person.ts +45 -0
- package/src/types/PersonPrivateProperties.ts +28 -1
- package/src/types/PersonSignInProperties.ts +30 -0
- package/src/types/Pluralization.ts +46 -0
- package/src/types/Team.ts +38 -0
- package/src/types/User.ts +70 -4
- package/src/types/UserRole.ts +32 -16
- package/src/types/index.ts +2 -0
- package/lib/src/Firestore.d.ts +0 -24
- package/lib/src/Firestore.js +0 -62
- package/lib/src/checkAuthentication.d.ts +0 -6
- package/lib/src/firebaseFunctionsContext.d.ts +0 -39
- package/lib/src/firebaseFunctionsContext.js +0 -43
- package/lib/src/pushNotification.d.ts +0 -3
- package/lib/src/pushNotification.js +0 -35
- package/lib/test/localization-utils.d.ts +0 -1
- package/lib/test/localization-utils.js +0 -24
- package/lib/test/localization.de.test.js +0 -151
- package/lib/test/localization.en.test.js +0 -145
- package/src/Firestore.ts +0 -75
- package/src/firebaseFunctionsContext.ts +0 -48
- package/src/pushNotification.ts +0 -37
- /package/lib/src/{FirestoreScheme.js → firebase/FirestoreScheme.js} +0 -0
- /package/lib/test/{localization.de.test.d.ts → firebase/FirebaseConfiguration.test.d.ts} +0 -0
- /package/lib/test/{localization.en.test.d.ts → firebase/Firestore.test.d.ts} +0 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const mocha_1 = require("mocha");
|
|
4
|
+
const core_1 = require("@assertive-ts/core");
|
|
5
|
+
const checkAuthentication_1 = require("../../src/firebase/checkAuthentication");
|
|
6
|
+
const index_1 = require("../../src/types/index");
|
|
7
|
+
const typescript_common_functionality_1 = require("@stevenkellner/typescript-common-functionality");
|
|
8
|
+
const firebase_utils_1 = require("./firebase-utils");
|
|
9
|
+
(0, mocha_1.describe)('checkAuthentication', () => {
|
|
10
|
+
const teamId = index_1.Team.Id.builder.build('11111111-1111-4111-1111-111111111111');
|
|
11
|
+
const personId = index_1.Person.Id.builder.build('22222222-2222-4222-2222-222222222222');
|
|
12
|
+
const userId = index_1.User.Id.builder.build('user123');
|
|
13
|
+
(0, mocha_1.describe)('checkAuthentication - basic validation', () => {
|
|
14
|
+
(0, mocha_1.it)('should throw "unauthenticated" error if rawUserId is null', async () => {
|
|
15
|
+
await (0, firebase_utils_1.expectThrowsFunctionsError)(async () => {
|
|
16
|
+
await (0, checkAuthentication_1.checkAuthentication)(null, teamId, 'team-manager');
|
|
17
|
+
}, 'unauthenticated', 'User is not authenticated');
|
|
18
|
+
});
|
|
19
|
+
(0, mocha_1.it)('should throw "permission-denied" if user does not exist', async () => {
|
|
20
|
+
(0, firebase_utils_1.configureFirebase)({
|
|
21
|
+
users: firebase_utils_1.Collection.docs({
|
|
22
|
+
[userId.value]: firebase_utils_1.Document.empty()
|
|
23
|
+
})
|
|
24
|
+
});
|
|
25
|
+
await (0, firebase_utils_1.expectThrowsFunctionsError)(async () => {
|
|
26
|
+
await (0, checkAuthentication_1.checkAuthentication)(userId.value, teamId, 'team-manager');
|
|
27
|
+
}, 'permission-denied', 'User does not exist');
|
|
28
|
+
});
|
|
29
|
+
(0, mocha_1.it)('should throw "permission-denied" if user is not a member of the team', async () => {
|
|
30
|
+
const emptyTeams = new typescript_common_functionality_1.Dictionary(index_1.Team.Id.builder);
|
|
31
|
+
(0, firebase_utils_1.configureFirebase)({
|
|
32
|
+
users: firebase_utils_1.Collection.docs({
|
|
33
|
+
[userId.value]: firebase_utils_1.Document.user(userId, emptyTeams)
|
|
34
|
+
})
|
|
35
|
+
});
|
|
36
|
+
await (0, firebase_utils_1.expectThrowsFunctionsError)(async () => {
|
|
37
|
+
await (0, checkAuthentication_1.checkAuthentication)(userId.value, teamId, 'team-manager');
|
|
38
|
+
}, 'permission-denied', 'User is not a member of the team');
|
|
39
|
+
});
|
|
40
|
+
(0, mocha_1.it)('should throw "permission-denied" if person does not exist', async () => {
|
|
41
|
+
const teams = new typescript_common_functionality_1.Dictionary(index_1.Team.Id.builder);
|
|
42
|
+
teams.set(teamId, index_1.User.TeamProperties.builder.build({
|
|
43
|
+
teamId: teamId.guidString,
|
|
44
|
+
teamName: 'Test Team',
|
|
45
|
+
personId: personId.guidString
|
|
46
|
+
}));
|
|
47
|
+
(0, firebase_utils_1.configureFirebase)({
|
|
48
|
+
users: firebase_utils_1.Collection.docs({
|
|
49
|
+
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
50
|
+
}),
|
|
51
|
+
teams: firebase_utils_1.Collection.docs({
|
|
52
|
+
[teamId.guidString]: firebase_utils_1.Document.colls({
|
|
53
|
+
persons: firebase_utils_1.Collection.docs({
|
|
54
|
+
[personId.guidString]: firebase_utils_1.Document.empty()
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
})
|
|
58
|
+
});
|
|
59
|
+
await (0, firebase_utils_1.expectThrowsFunctionsError)(async () => {
|
|
60
|
+
await (0, checkAuthentication_1.checkAuthentication)(userId.value, teamId, 'team-manager');
|
|
61
|
+
}, 'permission-denied', 'Person does not exist');
|
|
62
|
+
});
|
|
63
|
+
(0, mocha_1.it)('should throw "permission-denied" if person is not signed in', async () => {
|
|
64
|
+
const teams = new typescript_common_functionality_1.Dictionary(index_1.Team.Id.builder);
|
|
65
|
+
teams.set(teamId, index_1.User.TeamProperties.builder.build({
|
|
66
|
+
teamId: teamId.guidString,
|
|
67
|
+
teamName: 'Test Team',
|
|
68
|
+
personId: personId.guidString
|
|
69
|
+
}));
|
|
70
|
+
(0, firebase_utils_1.configureFirebase)({
|
|
71
|
+
users: firebase_utils_1.Collection.docs({
|
|
72
|
+
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
73
|
+
}),
|
|
74
|
+
teams: firebase_utils_1.Collection.docs({
|
|
75
|
+
[teamId.guidString]: firebase_utils_1.Document.colls({
|
|
76
|
+
persons: firebase_utils_1.Collection.docs({
|
|
77
|
+
[personId.guidString]: firebase_utils_1.Document.personNotSignedIn(personId)
|
|
78
|
+
})
|
|
79
|
+
})
|
|
80
|
+
})
|
|
81
|
+
});
|
|
82
|
+
await (0, firebase_utils_1.expectThrowsFunctionsError)(async () => {
|
|
83
|
+
await (0, checkAuthentication_1.checkAuthentication)(userId.value, teamId, 'team-manager');
|
|
84
|
+
}, 'permission-denied', 'Person is not signed in');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
(0, mocha_1.describe)('checkAuthentication - role validation', () => {
|
|
88
|
+
(0, mocha_1.it)('should throw "permission-denied" if user does not have required single role', async () => {
|
|
89
|
+
const teams = new typescript_common_functionality_1.Dictionary(index_1.Team.Id.builder);
|
|
90
|
+
teams.set(teamId, index_1.User.TeamProperties.builder.build({
|
|
91
|
+
teamId: teamId.guidString,
|
|
92
|
+
teamName: 'Test Team',
|
|
93
|
+
personId: personId.guidString
|
|
94
|
+
}));
|
|
95
|
+
(0, firebase_utils_1.configureFirebase)({
|
|
96
|
+
users: firebase_utils_1.Collection.docs({
|
|
97
|
+
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
98
|
+
}),
|
|
99
|
+
teams: firebase_utils_1.Collection.docs({
|
|
100
|
+
[teamId.guidString]: firebase_utils_1.Document.colls({
|
|
101
|
+
persons: firebase_utils_1.Collection.docs({
|
|
102
|
+
[personId.guidString]: firebase_utils_1.Document.person(personId, userId, ['person-manager'])
|
|
103
|
+
})
|
|
104
|
+
})
|
|
105
|
+
})
|
|
106
|
+
});
|
|
107
|
+
await (0, firebase_utils_1.expectThrowsFunctionsError)(async () => {
|
|
108
|
+
await (0, checkAuthentication_1.checkAuthentication)(userId.value, teamId, 'team-manager');
|
|
109
|
+
}, 'permission-denied', 'User does not have the required roles');
|
|
110
|
+
});
|
|
111
|
+
(0, mocha_1.it)('should return userId if user has required single role', async () => {
|
|
112
|
+
const teams = new typescript_common_functionality_1.Dictionary(index_1.Team.Id.builder);
|
|
113
|
+
teams.set(teamId, index_1.User.TeamProperties.builder.build({
|
|
114
|
+
teamId: teamId.guidString,
|
|
115
|
+
teamName: 'Test Team',
|
|
116
|
+
personId: personId.guidString
|
|
117
|
+
}));
|
|
118
|
+
(0, firebase_utils_1.configureFirebase)({
|
|
119
|
+
users: firebase_utils_1.Collection.docs({
|
|
120
|
+
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
121
|
+
}),
|
|
122
|
+
teams: firebase_utils_1.Collection.docs({
|
|
123
|
+
[teamId.guidString]: firebase_utils_1.Document.colls({
|
|
124
|
+
persons: firebase_utils_1.Collection.docs({
|
|
125
|
+
[personId.guidString]: firebase_utils_1.Document.person(personId, userId, ['team-manager', 'person-manager'])
|
|
126
|
+
})
|
|
127
|
+
})
|
|
128
|
+
})
|
|
129
|
+
});
|
|
130
|
+
const result = await (0, checkAuthentication_1.checkAuthentication)(userId.value, teamId, 'team-manager');
|
|
131
|
+
(0, core_1.expect)(result).toBeEqual(userId);
|
|
132
|
+
});
|
|
133
|
+
(0, mocha_1.it)('should throw "permission-denied" if user does not have all required roles (AND logic)', async () => {
|
|
134
|
+
const teams = new typescript_common_functionality_1.Dictionary(index_1.Team.Id.builder);
|
|
135
|
+
teams.set(teamId, index_1.User.TeamProperties.builder.build({
|
|
136
|
+
teamId: teamId.guidString,
|
|
137
|
+
teamName: 'Test Team',
|
|
138
|
+
personId: personId.guidString
|
|
139
|
+
}));
|
|
140
|
+
(0, firebase_utils_1.configureFirebase)({
|
|
141
|
+
users: firebase_utils_1.Collection.docs({
|
|
142
|
+
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
143
|
+
}),
|
|
144
|
+
teams: firebase_utils_1.Collection.docs({
|
|
145
|
+
[teamId.guidString]: firebase_utils_1.Document.colls({
|
|
146
|
+
persons: firebase_utils_1.Collection.docs({
|
|
147
|
+
[personId.guidString]: firebase_utils_1.Document.person(personId, userId, ['person-manager'])
|
|
148
|
+
})
|
|
149
|
+
})
|
|
150
|
+
})
|
|
151
|
+
});
|
|
152
|
+
await (0, firebase_utils_1.expectThrowsFunctionsError)(async () => {
|
|
153
|
+
await (0, checkAuthentication_1.checkAuthentication)(userId.value, teamId, ['person-manager', 'team-manager']);
|
|
154
|
+
}, 'permission-denied', 'User does not have the required roles');
|
|
155
|
+
});
|
|
156
|
+
(0, mocha_1.it)('should return userId if user has all required roles (AND logic)', async () => {
|
|
157
|
+
const teams = new typescript_common_functionality_1.Dictionary(index_1.Team.Id.builder);
|
|
158
|
+
teams.set(teamId, index_1.User.TeamProperties.builder.build({
|
|
159
|
+
teamId: teamId.guidString,
|
|
160
|
+
teamName: 'Test Team',
|
|
161
|
+
personId: personId.guidString
|
|
162
|
+
}));
|
|
163
|
+
(0, firebase_utils_1.configureFirebase)({
|
|
164
|
+
users: firebase_utils_1.Collection.docs({
|
|
165
|
+
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
166
|
+
}),
|
|
167
|
+
teams: firebase_utils_1.Collection.docs({
|
|
168
|
+
[teamId.guidString]: firebase_utils_1.Document.colls({
|
|
169
|
+
persons: firebase_utils_1.Collection.docs({
|
|
170
|
+
[personId.guidString]: firebase_utils_1.Document.person(personId, userId, ['person-manager', 'team-manager', 'fine-manager'])
|
|
171
|
+
})
|
|
172
|
+
})
|
|
173
|
+
})
|
|
174
|
+
});
|
|
175
|
+
const result = await (0, checkAuthentication_1.checkAuthentication)(userId.value, teamId, ['person-manager', 'team-manager']);
|
|
176
|
+
(0, core_1.expect)(result).toBeEqual(userId);
|
|
177
|
+
});
|
|
178
|
+
(0, mocha_1.it)('should return userId if user has at least one required role (OR logic)', async () => {
|
|
179
|
+
const teams = new typescript_common_functionality_1.Dictionary(index_1.Team.Id.builder);
|
|
180
|
+
teams.set(teamId, index_1.User.TeamProperties.builder.build({
|
|
181
|
+
teamId: teamId.guidString,
|
|
182
|
+
teamName: 'Test Team',
|
|
183
|
+
personId: personId.guidString
|
|
184
|
+
}));
|
|
185
|
+
(0, firebase_utils_1.configureFirebase)({
|
|
186
|
+
users: firebase_utils_1.Collection.docs({
|
|
187
|
+
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
188
|
+
}),
|
|
189
|
+
teams: firebase_utils_1.Collection.docs({
|
|
190
|
+
[teamId.guidString]: firebase_utils_1.Document.colls({
|
|
191
|
+
persons: firebase_utils_1.Collection.docs({
|
|
192
|
+
[personId.guidString]: firebase_utils_1.Document.person(personId, userId, ['person-manager'])
|
|
193
|
+
})
|
|
194
|
+
})
|
|
195
|
+
})
|
|
196
|
+
});
|
|
197
|
+
const result = await (0, checkAuthentication_1.checkAuthentication)(userId.value, teamId, { anyOf: ['person-manager', 'team-manager'] });
|
|
198
|
+
(0, core_1.expect)(result).toBeEqual(userId);
|
|
199
|
+
});
|
|
200
|
+
(0, mocha_1.it)('should throw "permission-denied" if user does not have any required role (OR logic)', async () => {
|
|
201
|
+
const teams = new typescript_common_functionality_1.Dictionary(index_1.Team.Id.builder);
|
|
202
|
+
teams.set(teamId, index_1.User.TeamProperties.builder.build({
|
|
203
|
+
teamId: teamId.guidString,
|
|
204
|
+
teamName: 'Test Team',
|
|
205
|
+
personId: personId.guidString
|
|
206
|
+
}));
|
|
207
|
+
(0, firebase_utils_1.configureFirebase)({
|
|
208
|
+
users: firebase_utils_1.Collection.docs({
|
|
209
|
+
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
210
|
+
}),
|
|
211
|
+
teams: firebase_utils_1.Collection.docs({
|
|
212
|
+
[teamId.guidString]: firebase_utils_1.Document.colls({
|
|
213
|
+
persons: firebase_utils_1.Collection.docs({
|
|
214
|
+
[personId.guidString]: firebase_utils_1.Document.person(personId, userId, ['fine-manager'])
|
|
215
|
+
})
|
|
216
|
+
})
|
|
217
|
+
})
|
|
218
|
+
});
|
|
219
|
+
await (0, firebase_utils_1.expectThrowsFunctionsError)(async () => {
|
|
220
|
+
await (0, checkAuthentication_1.checkAuthentication)(userId.value, teamId, { anyOf: ['person-manager', 'team-manager'] });
|
|
221
|
+
}, 'permission-denied', 'User does not have the required roles');
|
|
222
|
+
});
|
|
223
|
+
(0, mocha_1.it)('should handle complex nested role requirements (AND with OR)', async () => {
|
|
224
|
+
const teams = new typescript_common_functionality_1.Dictionary(index_1.Team.Id.builder);
|
|
225
|
+
teams.set(teamId, index_1.User.TeamProperties.builder.build({
|
|
226
|
+
teamId: teamId.guidString,
|
|
227
|
+
teamName: 'Test Team',
|
|
228
|
+
personId: personId.guidString
|
|
229
|
+
}));
|
|
230
|
+
(0, firebase_utils_1.configureFirebase)({
|
|
231
|
+
users: firebase_utils_1.Collection.docs({
|
|
232
|
+
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
233
|
+
}),
|
|
234
|
+
teams: firebase_utils_1.Collection.docs({
|
|
235
|
+
[teamId.guidString]: firebase_utils_1.Document.colls({
|
|
236
|
+
persons: firebase_utils_1.Collection.docs({
|
|
237
|
+
[personId.guidString]: firebase_utils_1.Document.person(personId, userId, ['person-manager', 'fine-manager'])
|
|
238
|
+
})
|
|
239
|
+
})
|
|
240
|
+
})
|
|
241
|
+
});
|
|
242
|
+
const result = await (0, checkAuthentication_1.checkAuthentication)(userId.value, teamId, [
|
|
243
|
+
'person-manager',
|
|
244
|
+
{ anyOf: ['fine-manager', 'team-manager'] }
|
|
245
|
+
]);
|
|
246
|
+
(0, core_1.expect)(result).toBeEqual(userId);
|
|
247
|
+
});
|
|
248
|
+
(0, mocha_1.it)('should throw for complex nested requirements when not satisfied', async () => {
|
|
249
|
+
const teams = new typescript_common_functionality_1.Dictionary(index_1.Team.Id.builder);
|
|
250
|
+
teams.set(teamId, index_1.User.TeamProperties.builder.build({
|
|
251
|
+
teamId: teamId.guidString,
|
|
252
|
+
teamName: 'Test Team',
|
|
253
|
+
personId: personId.guidString
|
|
254
|
+
}));
|
|
255
|
+
(0, firebase_utils_1.configureFirebase)({
|
|
256
|
+
users: firebase_utils_1.Collection.docs({
|
|
257
|
+
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
258
|
+
}),
|
|
259
|
+
teams: firebase_utils_1.Collection.docs({
|
|
260
|
+
[teamId.guidString]: firebase_utils_1.Document.colls({
|
|
261
|
+
persons: firebase_utils_1.Collection.docs({
|
|
262
|
+
[personId.guidString]: firebase_utils_1.Document.person(personId, userId, ['person-manager'])
|
|
263
|
+
})
|
|
264
|
+
})
|
|
265
|
+
})
|
|
266
|
+
});
|
|
267
|
+
await (0, firebase_utils_1.expectThrowsFunctionsError)(async () => {
|
|
268
|
+
await (0, checkAuthentication_1.checkAuthentication)(userId.value, teamId, [
|
|
269
|
+
'person-manager',
|
|
270
|
+
{ anyOf: ['fine-manager', 'team-manager'] }
|
|
271
|
+
]);
|
|
272
|
+
}, 'permission-denied', 'User does not have the required roles');
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
(0, mocha_1.describe)('checkAuthentication - comprehensive success scenarios', () => {
|
|
276
|
+
(0, mocha_1.it)('should return userId for fully authenticated user with all permissions', async () => {
|
|
277
|
+
const teams = new typescript_common_functionality_1.Dictionary(index_1.Team.Id.builder);
|
|
278
|
+
teams.set(teamId, index_1.User.TeamProperties.builder.build({
|
|
279
|
+
teamId: teamId.guidString,
|
|
280
|
+
teamName: 'Test Team',
|
|
281
|
+
personId: personId.guidString
|
|
282
|
+
}));
|
|
283
|
+
(0, firebase_utils_1.configureFirebase)({
|
|
284
|
+
users: firebase_utils_1.Collection.docs({
|
|
285
|
+
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
286
|
+
}),
|
|
287
|
+
teams: firebase_utils_1.Collection.docs({
|
|
288
|
+
[teamId.guidString]: firebase_utils_1.Document.colls({
|
|
289
|
+
persons: firebase_utils_1.Collection.docs({
|
|
290
|
+
[personId.guidString]: firebase_utils_1.Document.person(personId, userId, [
|
|
291
|
+
'person-manager',
|
|
292
|
+
'team-manager',
|
|
293
|
+
'fine-manager',
|
|
294
|
+
'fine-can-add',
|
|
295
|
+
'fineTemplate-manager'
|
|
296
|
+
])
|
|
297
|
+
})
|
|
298
|
+
})
|
|
299
|
+
})
|
|
300
|
+
});
|
|
301
|
+
const result = await (0, checkAuthentication_1.checkAuthentication)(userId.value, teamId, 'fine-can-add');
|
|
302
|
+
(0, core_1.expect)(result).toBeEqual(userId);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { User, Team, Person, NotificationProperties, UserRole } from '../../src/types/index';
|
|
2
|
+
import { Dictionary } from '@stevenkellner/typescript-common-functionality';
|
|
3
|
+
import type { FunctionsErrorCode } from '@stevenkellner/firebase-function';
|
|
4
|
+
import { FunctionsError } from '@stevenkellner/firebase-function';
|
|
5
|
+
import { Messaging } from '../../src';
|
|
6
|
+
export declare class Collection {
|
|
7
|
+
readonly documents: Record<string, Document>;
|
|
8
|
+
private constructor();
|
|
9
|
+
document(key: string): Document;
|
|
10
|
+
static docs(documents: Record<string, Document>): Collection;
|
|
11
|
+
}
|
|
12
|
+
export declare class Document {
|
|
13
|
+
readonly collections: Record<string, Collection>;
|
|
14
|
+
data: any;
|
|
15
|
+
private constructor();
|
|
16
|
+
collection(key: string): Collection;
|
|
17
|
+
snapshot(): {
|
|
18
|
+
exists: boolean;
|
|
19
|
+
data: any;
|
|
20
|
+
};
|
|
21
|
+
set(values: any): void;
|
|
22
|
+
static colls(collections: Record<string, Collection>): Document;
|
|
23
|
+
static data(data: any): Document;
|
|
24
|
+
static empty(): Document;
|
|
25
|
+
static collsAndData(collections: Record<string, Collection>, data: any): Document;
|
|
26
|
+
static user(id: User.Id, teams: Dictionary<Team.Id, User.TeamProperties>): Document;
|
|
27
|
+
static personNotSignedIn(id: Person.Id): Document;
|
|
28
|
+
static person(id: Person.Id, userId: User.Id, roles: UserRole[]): Document;
|
|
29
|
+
static personWithSubscriptions(id: Person.Id, subscriptions: NotificationProperties.Subscription[], tokens?: Dictionary<NotificationProperties.TokenId, string>): Document;
|
|
30
|
+
}
|
|
31
|
+
export declare function expectThrowsFunctionsError(fn: () => Promise<any>, expectedCode: FunctionsErrorCode, message?: string | null): Promise<FunctionsError>;
|
|
32
|
+
export declare function configureFirebase(collections: Record<string, Collection>, messaging?: Messaging): void;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Document = exports.Collection = void 0;
|
|
4
|
+
exports.expectThrowsFunctionsError = expectThrowsFunctionsError;
|
|
5
|
+
exports.configureFirebase = configureFirebase;
|
|
6
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
7
|
+
const core_1 = require("@assertive-ts/core");
|
|
8
|
+
const index_1 = require("../../src/types/index");
|
|
9
|
+
const typescript_common_functionality_1 = require("@stevenkellner/typescript-common-functionality");
|
|
10
|
+
const firebase_function_1 = require("@stevenkellner/firebase-function");
|
|
11
|
+
const src_1 = require("../../src");
|
|
12
|
+
class Collection {
|
|
13
|
+
documents;
|
|
14
|
+
constructor(documents) {
|
|
15
|
+
this.documents = documents;
|
|
16
|
+
}
|
|
17
|
+
document(key) {
|
|
18
|
+
const documentData = this.documents[key];
|
|
19
|
+
if (!documentData)
|
|
20
|
+
throw new Error(`Unexpected document key: ${key}`);
|
|
21
|
+
return documentData;
|
|
22
|
+
}
|
|
23
|
+
static docs(documents) {
|
|
24
|
+
return new Collection(documents);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.Collection = Collection;
|
|
28
|
+
class Document {
|
|
29
|
+
collections;
|
|
30
|
+
data;
|
|
31
|
+
constructor(collections, data) {
|
|
32
|
+
this.collections = collections;
|
|
33
|
+
this.data = data;
|
|
34
|
+
}
|
|
35
|
+
collection(key) {
|
|
36
|
+
const collectionData = this.collections[key];
|
|
37
|
+
if (!collectionData)
|
|
38
|
+
throw new Error(`Unexpected collection key: ${key}`);
|
|
39
|
+
return collectionData;
|
|
40
|
+
}
|
|
41
|
+
snapshot() {
|
|
42
|
+
return {
|
|
43
|
+
exists: this.data !== undefined,
|
|
44
|
+
data: this.data
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
set(values) {
|
|
48
|
+
this.data = typescript_common_functionality_1.Flattable.flatten(values);
|
|
49
|
+
}
|
|
50
|
+
static colls(collections) {
|
|
51
|
+
return new Document(collections, undefined);
|
|
52
|
+
}
|
|
53
|
+
static data(data) {
|
|
54
|
+
return new Document({}, data);
|
|
55
|
+
}
|
|
56
|
+
static empty() {
|
|
57
|
+
return new Document({}, undefined);
|
|
58
|
+
}
|
|
59
|
+
static collsAndData(collections, data) {
|
|
60
|
+
return new Document(collections, data);
|
|
61
|
+
}
|
|
62
|
+
static user(id, teams) {
|
|
63
|
+
return Document.data(index_1.User.builder.build({
|
|
64
|
+
id: id.value,
|
|
65
|
+
teams: teams.flatten
|
|
66
|
+
}).flatten);
|
|
67
|
+
}
|
|
68
|
+
static personNotSignedIn(id) {
|
|
69
|
+
return Document.data(index_1.Person.builder.build({
|
|
70
|
+
id: id.guidString,
|
|
71
|
+
properties: index_1.PersonPrivateProperties.builder.build({
|
|
72
|
+
firstName: 'Test',
|
|
73
|
+
lastName: 'User'
|
|
74
|
+
}).flatten,
|
|
75
|
+
fineIds: [],
|
|
76
|
+
signInProperties: null
|
|
77
|
+
}).flatten);
|
|
78
|
+
}
|
|
79
|
+
static person(id, userId, roles) {
|
|
80
|
+
return Document.data(index_1.Person.builder.build({
|
|
81
|
+
id: id.guidString,
|
|
82
|
+
properties: index_1.PersonPrivateProperties.builder.build({
|
|
83
|
+
firstName: 'Test',
|
|
84
|
+
lastName: 'User'
|
|
85
|
+
}).flatten,
|
|
86
|
+
fineIds: [],
|
|
87
|
+
signInProperties: index_1.PersonSignInProperties.builder.build({
|
|
88
|
+
signInDate: typescript_common_functionality_1.UtcDate.now.flatten,
|
|
89
|
+
userId: userId.value,
|
|
90
|
+
notificationProperties: new index_1.NotificationProperties().flatten,
|
|
91
|
+
roles: roles
|
|
92
|
+
}).flatten
|
|
93
|
+
}).flatten);
|
|
94
|
+
}
|
|
95
|
+
static personWithSubscriptions(id, subscriptions, tokens) {
|
|
96
|
+
return Document.data(index_1.Person.builder.build({
|
|
97
|
+
id: id.guidString,
|
|
98
|
+
properties: index_1.PersonPrivateProperties.builder.build({
|
|
99
|
+
firstName: 'Test',
|
|
100
|
+
lastName: 'User'
|
|
101
|
+
}).flatten,
|
|
102
|
+
fineIds: [],
|
|
103
|
+
signInProperties: index_1.PersonSignInProperties.builder.build({
|
|
104
|
+
signInDate: typescript_common_functionality_1.UtcDate.now.flatten,
|
|
105
|
+
userId: 'user-123',
|
|
106
|
+
notificationProperties: new index_1.NotificationProperties(tokens, subscriptions).flatten,
|
|
107
|
+
roles: []
|
|
108
|
+
}).flatten
|
|
109
|
+
}).flatten);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.Document = Document;
|
|
113
|
+
async function expectThrowsFunctionsError(fn, expectedCode, message = null) {
|
|
114
|
+
try {
|
|
115
|
+
await fn();
|
|
116
|
+
throw new Error('Expected function to throw a FunctionsError');
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
(0, core_1.expect)(error).toBeInstanceOf(firebase_function_1.FunctionsError);
|
|
120
|
+
(0, core_1.expect)(error.code).toBeEqual(expectedCode);
|
|
121
|
+
if (message !== null)
|
|
122
|
+
(0, core_1.expect)(error.message).toBeEqual(message);
|
|
123
|
+
return error;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function configureFirebase(collections, messaging) {
|
|
127
|
+
src_1.FirebaseConfiguration.shared.reconfigure({
|
|
128
|
+
baseFirestoreDocument: Document.colls(collections),
|
|
129
|
+
messaging: messaging
|
|
130
|
+
});
|
|
131
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|