@stevenkellner/team-conduct-api 2.0.9 → 2.0.11
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/Firestore.d.ts +2 -2
- package/lib/src/firebase/Firestore.js +3 -3
- package/lib/src/firebase/FirestoreScheme.d.ts +1 -1
- package/lib/src/firebase/checkAuthentication.d.ts +2 -1
- package/lib/src/firebase/checkAuthentication.js +1 -1
- package/lib/src/functions/invitation/register.d.ts +7 -0
- package/lib/src/functions/invitation/register.js +2 -1
- package/lib/test/firebase/checkAuthentication.test.js +30 -29
- package/package.json +2 -2
- package/src/firebase/Firestore.ts +4 -4
- package/src/firebase/FirestoreScheme.ts +1 -1
- package/src/firebase/checkAuthentication.ts +3 -3
- package/src/functions/invitation/register.ts +3 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FirestoreCollection, FirestoreDocument } from '@stevenkellner/firebase-function';
|
|
1
|
+
import { FirestoreCollection, FirestoreDocument, UserAuthId } from '@stevenkellner/firebase-function';
|
|
2
2
|
import { FirestoreScheme } from './FirestoreScheme';
|
|
3
3
|
import { Fine, FineTemplate, Invitation, Person, User, Team } from '../types';
|
|
4
4
|
/**
|
|
@@ -81,7 +81,7 @@ export declare class Firestore {
|
|
|
81
81
|
* ```
|
|
82
82
|
*/
|
|
83
83
|
team(id: Team.Id): FirestoreDocument<Team>;
|
|
84
|
-
|
|
84
|
+
userAuth(userAuthId: UserAuthId): FirestoreDocument<User.Id>;
|
|
85
85
|
/**
|
|
86
86
|
* Gets a reference to a user document.
|
|
87
87
|
*
|
|
@@ -92,10 +92,10 @@ class Firestore {
|
|
|
92
92
|
.collection('teams')
|
|
93
93
|
.document(id.guidString);
|
|
94
94
|
}
|
|
95
|
-
|
|
95
|
+
userAuth(userAuthId) {
|
|
96
96
|
return this.base
|
|
97
|
-
.collection('
|
|
98
|
-
.document(
|
|
97
|
+
.collection('userAuthIdDict')
|
|
98
|
+
.document(userAuthId.value);
|
|
99
99
|
}
|
|
100
100
|
/**
|
|
101
101
|
* Gets a reference to a user document.
|
|
@@ -15,7 +15,7 @@ import { Fine, FineTemplate, Invitation, Person, Team, User } from '../types';
|
|
|
15
15
|
* throughout the application.
|
|
16
16
|
*/
|
|
17
17
|
export type FirestoreScheme = FirestoreDocument<never, {
|
|
18
|
-
|
|
18
|
+
userAuthIdDict: FirestoreCollection<{
|
|
19
19
|
[UserAuthId in string]: FirestoreDocument<User.Id>;
|
|
20
20
|
}>;
|
|
21
21
|
users: FirestoreCollection<{
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { UserAuthId } from '@stevenkellner/firebase-function';
|
|
1
2
|
import { Team, User, UserRole } from '../types';
|
|
2
3
|
/**
|
|
3
4
|
* Type representing expected user role requirements.
|
|
@@ -33,5 +34,5 @@ type ExpectedUserRoles = UserRole | ExpectedUserRoles[] | {
|
|
|
33
34
|
* @throws {FunctionsError} 'unauthenticated' - If rawUserId is null
|
|
34
35
|
* @throws {FunctionsError} 'permission-denied' - If any validation check fails
|
|
35
36
|
*/
|
|
36
|
-
export declare function checkAuthentication(userAuthId:
|
|
37
|
+
export declare function checkAuthentication(userAuthId: UserAuthId | null, teamId: Team.Id, roles: ExpectedUserRoles): Promise<User.Id>;
|
|
37
38
|
export {};
|
|
@@ -40,7 +40,7 @@ function hasUserRoles(userRoles, expectedRoles) {
|
|
|
40
40
|
async function checkAuthentication(userAuthId, teamId, roles) {
|
|
41
41
|
if (userAuthId === null)
|
|
42
42
|
throw new firebase_function_1.FunctionsError('unauthenticated', 'User is not authenticated');
|
|
43
|
-
const userAuthSnapshot = await Firestore_1.Firestore.shared.
|
|
43
|
+
const userAuthSnapshot = await Firestore_1.Firestore.shared.userAuth(userAuthId).snapshot();
|
|
44
44
|
if (!userAuthSnapshot.exists)
|
|
45
45
|
throw new firebase_function_1.FunctionsError('permission-denied', 'User authentication does not exist');
|
|
46
46
|
const userId = types_1.User.Id.builder.build(userAuthSnapshot.data);
|
|
@@ -5,12 +5,19 @@ export declare namespace InvitationRegisterFunction {
|
|
|
5
5
|
type Parameters = {
|
|
6
6
|
teamId: Team.Id;
|
|
7
7
|
personId: Person.Id;
|
|
8
|
+
signInType: User.SignInType;
|
|
8
9
|
};
|
|
9
10
|
}
|
|
10
11
|
export declare class InvitationRegisterFunction implements FirebaseFunction<InvitationRegisterFunction.Parameters, User> {
|
|
11
12
|
parametersBuilder: ObjectTypeBuilder<{
|
|
12
13
|
teamId: string;
|
|
13
14
|
personId: string;
|
|
15
|
+
signInType: {
|
|
16
|
+
type: "email";
|
|
17
|
+
email: string;
|
|
18
|
+
} | {
|
|
19
|
+
type: "google" | "apple";
|
|
20
|
+
};
|
|
14
21
|
}, InvitationRegisterFunction.Parameters>;
|
|
15
22
|
returnTypeBuilder: User.TypeBuilder;
|
|
16
23
|
}
|
|
@@ -6,7 +6,8 @@ const typescript_common_functionality_1 = require("@stevenkellner/typescript-com
|
|
|
6
6
|
class InvitationRegisterFunction {
|
|
7
7
|
parametersBuilder = new typescript_common_functionality_1.ObjectTypeBuilder({
|
|
8
8
|
teamId: types_1.Team.Id.builder,
|
|
9
|
-
personId: types_1.Person.Id.builder
|
|
9
|
+
personId: types_1.Person.Id.builder,
|
|
10
|
+
signInType: types_1.User.SignInType.builder
|
|
10
11
|
});
|
|
11
12
|
returnTypeBuilder = types_1.User.builder;
|
|
12
13
|
}
|
|
@@ -6,10 +6,11 @@ const checkAuthentication_1 = require("../../src/firebase/checkAuthentication");
|
|
|
6
6
|
const index_1 = require("../../src/types/index");
|
|
7
7
|
const typescript_common_functionality_1 = require("@stevenkellner/typescript-common-functionality");
|
|
8
8
|
const firebase_utils_1 = require("./firebase-utils");
|
|
9
|
+
const firebase_function_1 = require("@stevenkellner/firebase-function");
|
|
9
10
|
(0, mocha_1.describe)('checkAuthentication', () => {
|
|
10
11
|
const teamId = index_1.Team.Id.builder.build('11111111-1111-4111-1111-111111111111');
|
|
11
12
|
const personId = index_1.Person.Id.builder.build('22222222-2222-4222-2222-222222222222');
|
|
12
|
-
const userAuthId = 'auth-123';
|
|
13
|
+
const userAuthId = firebase_function_1.UserAuthId.builder.build('auth-123');
|
|
13
14
|
const userId = index_1.User.Id.builder.build('user123');
|
|
14
15
|
(0, mocha_1.describe)('checkAuthentication - basic validation', () => {
|
|
15
16
|
(0, mocha_1.it)('should throw "unauthenticated" error if rawUserId is null', async () => {
|
|
@@ -19,8 +20,8 @@ const firebase_utils_1 = require("./firebase-utils");
|
|
|
19
20
|
});
|
|
20
21
|
(0, mocha_1.it)('should throw "permission-denied" if user authentication does not exist', async () => {
|
|
21
22
|
(0, firebase_utils_1.configureFirebase)({
|
|
22
|
-
|
|
23
|
-
[userAuthId]: firebase_utils_1.Document.empty()
|
|
23
|
+
userAuthIdDict: firebase_utils_1.Collection.docs({
|
|
24
|
+
[userAuthId.value]: firebase_utils_1.Document.empty()
|
|
24
25
|
})
|
|
25
26
|
});
|
|
26
27
|
await (0, firebase_utils_1.expectThrowsFunctionsError)(async () => {
|
|
@@ -29,8 +30,8 @@ const firebase_utils_1 = require("./firebase-utils");
|
|
|
29
30
|
});
|
|
30
31
|
(0, mocha_1.it)('should throw "permission-denied" if user does not exist', async () => {
|
|
31
32
|
(0, firebase_utils_1.configureFirebase)({
|
|
32
|
-
|
|
33
|
-
[userAuthId]: firebase_utils_1.Document.data(userId.value)
|
|
33
|
+
userAuthIdDict: firebase_utils_1.Collection.docs({
|
|
34
|
+
[userAuthId.value]: firebase_utils_1.Document.data(userId.value)
|
|
34
35
|
}),
|
|
35
36
|
users: firebase_utils_1.Collection.docs({
|
|
36
37
|
[userId.value]: firebase_utils_1.Document.empty()
|
|
@@ -43,8 +44,8 @@ const firebase_utils_1 = require("./firebase-utils");
|
|
|
43
44
|
(0, mocha_1.it)('should throw "permission-denied" if user is not a member of the team', async () => {
|
|
44
45
|
const emptyTeams = new typescript_common_functionality_1.Dictionary(index_1.Team.Id.builder);
|
|
45
46
|
(0, firebase_utils_1.configureFirebase)({
|
|
46
|
-
|
|
47
|
-
[userAuthId]: firebase_utils_1.Document.data(userId.value)
|
|
47
|
+
userAuthIdDict: firebase_utils_1.Collection.docs({
|
|
48
|
+
[userAuthId.value]: firebase_utils_1.Document.data(userId.value)
|
|
48
49
|
}),
|
|
49
50
|
users: firebase_utils_1.Collection.docs({
|
|
50
51
|
[userId.value]: firebase_utils_1.Document.user(userId, emptyTeams)
|
|
@@ -62,8 +63,8 @@ const firebase_utils_1 = require("./firebase-utils");
|
|
|
62
63
|
personId: personId.guidString
|
|
63
64
|
}));
|
|
64
65
|
(0, firebase_utils_1.configureFirebase)({
|
|
65
|
-
|
|
66
|
-
[userAuthId]: firebase_utils_1.Document.data(userId.value)
|
|
66
|
+
userAuthIdDict: firebase_utils_1.Collection.docs({
|
|
67
|
+
[userAuthId.value]: firebase_utils_1.Document.data(userId.value)
|
|
67
68
|
}),
|
|
68
69
|
users: firebase_utils_1.Collection.docs({
|
|
69
70
|
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
@@ -88,8 +89,8 @@ const firebase_utils_1 = require("./firebase-utils");
|
|
|
88
89
|
personId: personId.guidString
|
|
89
90
|
}));
|
|
90
91
|
(0, firebase_utils_1.configureFirebase)({
|
|
91
|
-
|
|
92
|
-
[userAuthId]: firebase_utils_1.Document.data(userId.value)
|
|
92
|
+
userAuthIdDict: firebase_utils_1.Collection.docs({
|
|
93
|
+
[userAuthId.value]: firebase_utils_1.Document.data(userId.value)
|
|
93
94
|
}),
|
|
94
95
|
users: firebase_utils_1.Collection.docs({
|
|
95
96
|
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
@@ -116,8 +117,8 @@ const firebase_utils_1 = require("./firebase-utils");
|
|
|
116
117
|
personId: personId.guidString
|
|
117
118
|
}));
|
|
118
119
|
(0, firebase_utils_1.configureFirebase)({
|
|
119
|
-
|
|
120
|
-
[userAuthId]: firebase_utils_1.Document.data(userId.value)
|
|
120
|
+
userAuthIdDict: firebase_utils_1.Collection.docs({
|
|
121
|
+
[userAuthId.value]: firebase_utils_1.Document.data(userId.value)
|
|
121
122
|
}),
|
|
122
123
|
users: firebase_utils_1.Collection.docs({
|
|
123
124
|
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
@@ -142,8 +143,8 @@ const firebase_utils_1 = require("./firebase-utils");
|
|
|
142
143
|
personId: personId.guidString
|
|
143
144
|
}));
|
|
144
145
|
(0, firebase_utils_1.configureFirebase)({
|
|
145
|
-
|
|
146
|
-
[userAuthId]: firebase_utils_1.Document.data(userId.value)
|
|
146
|
+
userAuthIdDict: firebase_utils_1.Collection.docs({
|
|
147
|
+
[userAuthId.value]: firebase_utils_1.Document.data(userId.value)
|
|
147
148
|
}),
|
|
148
149
|
users: firebase_utils_1.Collection.docs({
|
|
149
150
|
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
@@ -167,8 +168,8 @@ const firebase_utils_1 = require("./firebase-utils");
|
|
|
167
168
|
personId: personId.guidString
|
|
168
169
|
}));
|
|
169
170
|
(0, firebase_utils_1.configureFirebase)({
|
|
170
|
-
|
|
171
|
-
[userAuthId]: firebase_utils_1.Document.data(userId.value)
|
|
171
|
+
userAuthIdDict: firebase_utils_1.Collection.docs({
|
|
172
|
+
[userAuthId.value]: firebase_utils_1.Document.data(userId.value)
|
|
172
173
|
}),
|
|
173
174
|
users: firebase_utils_1.Collection.docs({
|
|
174
175
|
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
@@ -193,8 +194,8 @@ const firebase_utils_1 = require("./firebase-utils");
|
|
|
193
194
|
personId: personId.guidString
|
|
194
195
|
}));
|
|
195
196
|
(0, firebase_utils_1.configureFirebase)({
|
|
196
|
-
|
|
197
|
-
[userAuthId]: firebase_utils_1.Document.data(userId.value)
|
|
197
|
+
userAuthIdDict: firebase_utils_1.Collection.docs({
|
|
198
|
+
[userAuthId.value]: firebase_utils_1.Document.data(userId.value)
|
|
198
199
|
}),
|
|
199
200
|
users: firebase_utils_1.Collection.docs({
|
|
200
201
|
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
@@ -218,8 +219,8 @@ const firebase_utils_1 = require("./firebase-utils");
|
|
|
218
219
|
personId: personId.guidString
|
|
219
220
|
}));
|
|
220
221
|
(0, firebase_utils_1.configureFirebase)({
|
|
221
|
-
|
|
222
|
-
[userAuthId]: firebase_utils_1.Document.data(userId.value)
|
|
222
|
+
userAuthIdDict: firebase_utils_1.Collection.docs({
|
|
223
|
+
[userAuthId.value]: firebase_utils_1.Document.data(userId.value)
|
|
223
224
|
}),
|
|
224
225
|
users: firebase_utils_1.Collection.docs({
|
|
225
226
|
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
@@ -243,8 +244,8 @@ const firebase_utils_1 = require("./firebase-utils");
|
|
|
243
244
|
personId: personId.guidString
|
|
244
245
|
}));
|
|
245
246
|
(0, firebase_utils_1.configureFirebase)({
|
|
246
|
-
|
|
247
|
-
[userAuthId]: firebase_utils_1.Document.data(userId.value)
|
|
247
|
+
userAuthIdDict: firebase_utils_1.Collection.docs({
|
|
248
|
+
[userAuthId.value]: firebase_utils_1.Document.data(userId.value)
|
|
248
249
|
}),
|
|
249
250
|
users: firebase_utils_1.Collection.docs({
|
|
250
251
|
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
@@ -269,8 +270,8 @@ const firebase_utils_1 = require("./firebase-utils");
|
|
|
269
270
|
personId: personId.guidString
|
|
270
271
|
}));
|
|
271
272
|
(0, firebase_utils_1.configureFirebase)({
|
|
272
|
-
|
|
273
|
-
[userAuthId]: firebase_utils_1.Document.data(userId.value)
|
|
273
|
+
userAuthIdDict: firebase_utils_1.Collection.docs({
|
|
274
|
+
[userAuthId.value]: firebase_utils_1.Document.data(userId.value)
|
|
274
275
|
}),
|
|
275
276
|
users: firebase_utils_1.Collection.docs({
|
|
276
277
|
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
@@ -297,8 +298,8 @@ const firebase_utils_1 = require("./firebase-utils");
|
|
|
297
298
|
personId: personId.guidString
|
|
298
299
|
}));
|
|
299
300
|
(0, firebase_utils_1.configureFirebase)({
|
|
300
|
-
|
|
301
|
-
[userAuthId]: firebase_utils_1.Document.data(userId.value)
|
|
301
|
+
userAuthIdDict: firebase_utils_1.Collection.docs({
|
|
302
|
+
[userAuthId.value]: firebase_utils_1.Document.data(userId.value)
|
|
302
303
|
}),
|
|
303
304
|
users: firebase_utils_1.Collection.docs({
|
|
304
305
|
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
|
@@ -328,8 +329,8 @@ const firebase_utils_1 = require("./firebase-utils");
|
|
|
328
329
|
personId: personId.guidString
|
|
329
330
|
}));
|
|
330
331
|
(0, firebase_utils_1.configureFirebase)({
|
|
331
|
-
|
|
332
|
-
[userAuthId]: firebase_utils_1.Document.data(userId.value)
|
|
332
|
+
userAuthIdDict: firebase_utils_1.Collection.docs({
|
|
333
|
+
[userAuthId.value]: firebase_utils_1.Document.data(userId.value)
|
|
333
334
|
}),
|
|
334
335
|
users: firebase_utils_1.Collection.docs({
|
|
335
336
|
[userId.value]: firebase_utils_1.Document.user(userId, teams)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stevenkellner/team-conduct-api",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.11",
|
|
4
4
|
"description": "Firebase API for Team Conduct",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Steven Kellner",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"release": "npm run rebuild && npm run lint && npm version patch && git push --follow-tags"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@stevenkellner/firebase-function": "^1.4.
|
|
25
|
+
"@stevenkellner/firebase-function": "^1.4.143",
|
|
26
26
|
"@stevenkellner/typescript-common-functionality": "^1.0.61"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FirestoreCollection, FirestoreDocument } from '@stevenkellner/firebase-function';
|
|
1
|
+
import { FirestoreCollection, FirestoreDocument, UserAuthId } from '@stevenkellner/firebase-function';
|
|
2
2
|
import { FirestoreScheme } from './FirestoreScheme';
|
|
3
3
|
import { Fine, FineTemplate, Invitation, Person, User, Team } from '../types';
|
|
4
4
|
import { FirebaseConfiguration } from '.';
|
|
@@ -99,10 +99,10 @@ export class Firestore {
|
|
|
99
99
|
.document(id.guidString) as FirestoreDocument<Team>;
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
public
|
|
102
|
+
public userAuth(userAuthId: UserAuthId): FirestoreDocument<User.Id> {
|
|
103
103
|
return this.base
|
|
104
|
-
.collection('
|
|
105
|
-
.document(
|
|
104
|
+
.collection('userAuthIdDict')
|
|
105
|
+
.document(userAuthId.value);
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
/**
|
|
@@ -16,7 +16,7 @@ import { Fine, FineTemplate, Invitation, Person, Team, User } from '../types';
|
|
|
16
16
|
* throughout the application.
|
|
17
17
|
*/
|
|
18
18
|
export type FirestoreScheme = FirestoreDocument<never, {
|
|
19
|
-
|
|
19
|
+
userAuthIdDict: FirestoreCollection<{
|
|
20
20
|
[UserAuthId in string]: FirestoreDocument<User.Id>
|
|
21
21
|
}>,
|
|
22
22
|
users: FirestoreCollection<{
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FunctionsError } from '@stevenkellner/firebase-function';
|
|
1
|
+
import { FunctionsError, UserAuthId } from '@stevenkellner/firebase-function';
|
|
2
2
|
import { Person, Team, User, UserRole } from '../types';
|
|
3
3
|
import { Firestore } from './Firestore';
|
|
4
4
|
|
|
@@ -57,11 +57,11 @@ function hasUserRoles(userRoles: UserRole[], expectedRoles: ExpectedUserRoles):
|
|
|
57
57
|
* @throws {FunctionsError} 'unauthenticated' - If rawUserId is null
|
|
58
58
|
* @throws {FunctionsError} 'permission-denied' - If any validation check fails
|
|
59
59
|
*/
|
|
60
|
-
export async function checkAuthentication(userAuthId:
|
|
60
|
+
export async function checkAuthentication(userAuthId: UserAuthId | null, teamId: Team.Id, roles: ExpectedUserRoles): Promise<User.Id> {
|
|
61
61
|
if (userAuthId === null)
|
|
62
62
|
throw new FunctionsError('unauthenticated', 'User is not authenticated');
|
|
63
63
|
|
|
64
|
-
const userAuthSnapshot = await Firestore.shared.
|
|
64
|
+
const userAuthSnapshot = await Firestore.shared.userAuth(userAuthId).snapshot();
|
|
65
65
|
if (!userAuthSnapshot.exists)
|
|
66
66
|
throw new FunctionsError('permission-denied', 'User authentication does not exist');
|
|
67
67
|
const userId = User.Id.builder.build(userAuthSnapshot.data);
|
|
@@ -7,6 +7,7 @@ export namespace InvitationRegisterFunction {
|
|
|
7
7
|
export type Parameters = {
|
|
8
8
|
teamId: Team.Id
|
|
9
9
|
personId: Person.Id
|
|
10
|
+
signInType: User.SignInType
|
|
10
11
|
};
|
|
11
12
|
}
|
|
12
13
|
|
|
@@ -14,7 +15,8 @@ export class InvitationRegisterFunction implements FirebaseFunction<InvitationRe
|
|
|
14
15
|
|
|
15
16
|
public parametersBuilder = new ObjectTypeBuilder<Flattable.Flatten<InvitationRegisterFunction.Parameters>, InvitationRegisterFunction.Parameters>({
|
|
16
17
|
teamId: Team.Id.builder,
|
|
17
|
-
personId: Person.Id.builder
|
|
18
|
+
personId: Person.Id.builder,
|
|
19
|
+
signInType: User.SignInType.builder
|
|
18
20
|
});
|
|
19
21
|
|
|
20
22
|
public returnTypeBuilder = User.builder;
|