@zssz-soft/firebase-functions-shared 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/__tests__/mocks/firebase-admin.mock.d.ts +81 -0
- package/lib/__tests__/mocks/firebase-admin.mock.d.ts.map +1 -0
- package/lib/__tests__/mocks/firebase-admin.mock.js +111 -0
- package/lib/__tests__/mocks/firebase-admin.mock.js.map +1 -0
- package/lib/__tests__/mocks/firebase-functions.mock.d.ts +37 -0
- package/lib/__tests__/mocks/firebase-functions.mock.d.ts.map +1 -0
- package/lib/__tests__/mocks/firebase-functions.mock.js +59 -0
- package/lib/__tests__/mocks/firebase-functions.mock.js.map +1 -0
- package/lib/config/app.config.d.ts +5 -0
- package/lib/config/app.config.d.ts.map +1 -1
- package/lib/config/app.config.js.map +1 -1
- package/lib/modules/bootstrap/bootstrap.d.ts +59 -0
- package/lib/modules/bootstrap/bootstrap.d.ts.map +1 -1
- package/lib/modules/bootstrap/bootstrap.js +191 -137
- package/lib/modules/bootstrap/bootstrap.js.map +1 -1
- package/lib/modules/email/email.d.ts.map +1 -1
- package/lib/modules/email/email.js +1 -1
- package/lib/modules/email/email.js.map +1 -1
- package/lib/modules/email/email.service.js +1 -1
- package/lib/modules/email/email.service.js.map +1 -1
- package/lib/modules/security/effective-permissions.d.ts.map +1 -1
- package/lib/modules/security/effective-permissions.js +7 -6
- package/lib/modules/security/effective-permissions.js.map +1 -1
- package/lib/modules/security/effective-permissions.triggers.d.ts.map +1 -1
- package/lib/modules/security/effective-permissions.triggers.js +17 -4
- package/lib/modules/security/effective-permissions.triggers.js.map +1 -1
- package/lib/modules/storage/thumbnail-functions.d.ts.map +1 -1
- package/lib/modules/storage/thumbnail-functions.js +24 -21
- package/lib/modules/storage/thumbnail-functions.js.map +1 -1
- package/lib/modules/user/user-management.d.ts +42 -7
- package/lib/modules/user/user-management.d.ts.map +1 -1
- package/lib/modules/user/user-management.js +131 -79
- package/lib/modules/user/user-management.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firebase Admin SDK mocks for unit testing
|
|
3
|
+
*/
|
|
4
|
+
export declare const createMockDocumentSnapshot: (exists: boolean, data?: any) => {
|
|
5
|
+
exists: boolean;
|
|
6
|
+
data: () => any;
|
|
7
|
+
id: any;
|
|
8
|
+
ref: {
|
|
9
|
+
set: jest.Mock<any, any, any>;
|
|
10
|
+
update: jest.Mock<any, any, any>;
|
|
11
|
+
delete: jest.Mock<any, any, any>;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
export declare const createMockQuerySnapshot: (docs: any[]) => {
|
|
15
|
+
empty: boolean;
|
|
16
|
+
size: number;
|
|
17
|
+
docs: {
|
|
18
|
+
exists: boolean;
|
|
19
|
+
data: () => any;
|
|
20
|
+
id: any;
|
|
21
|
+
ref: {
|
|
22
|
+
set: jest.Mock<any, any, any>;
|
|
23
|
+
update: jest.Mock<any, any, any>;
|
|
24
|
+
delete: jest.Mock<any, any, any>;
|
|
25
|
+
};
|
|
26
|
+
}[];
|
|
27
|
+
};
|
|
28
|
+
export declare const createMockCollectionRef: (querySnapshot?: any) => {
|
|
29
|
+
doc: jest.Mock<any, any, any>;
|
|
30
|
+
where: jest.Mock<any, any, any>;
|
|
31
|
+
limit: jest.Mock<any, any, any>;
|
|
32
|
+
get: jest.Mock<any, any, any>;
|
|
33
|
+
};
|
|
34
|
+
export declare const createMockFirestore: () => {
|
|
35
|
+
collection: jest.Mock<any, any, any>;
|
|
36
|
+
};
|
|
37
|
+
export declare const createMockUserRecord: (uid: string, email: string, displayName?: string) => {
|
|
38
|
+
uid: string;
|
|
39
|
+
email: string;
|
|
40
|
+
displayName: string;
|
|
41
|
+
emailVerified: boolean;
|
|
42
|
+
disabled: boolean;
|
|
43
|
+
metadata: {
|
|
44
|
+
creationTime: string;
|
|
45
|
+
lastSignInTime: null;
|
|
46
|
+
};
|
|
47
|
+
providerData: never[];
|
|
48
|
+
toJSON: () => {
|
|
49
|
+
uid: string;
|
|
50
|
+
email: string;
|
|
51
|
+
displayName: string | undefined;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
export declare const createMockAuth: () => {
|
|
55
|
+
createUser: jest.Mock<any, any, any>;
|
|
56
|
+
getUser: jest.Mock<any, any, any>;
|
|
57
|
+
deleteUser: jest.Mock<any, any, any>;
|
|
58
|
+
updateUser: jest.Mock<any, any, any>;
|
|
59
|
+
};
|
|
60
|
+
export declare const createMockBucket: () => {
|
|
61
|
+
file: jest.Mock<any, any, any>;
|
|
62
|
+
name: string;
|
|
63
|
+
};
|
|
64
|
+
export declare const createMockStorage: () => {
|
|
65
|
+
bucket: jest.Mock<any, any, any>;
|
|
66
|
+
};
|
|
67
|
+
export declare const setupFirebaseAdminMocks: () => {
|
|
68
|
+
mockFirestore: {
|
|
69
|
+
collection: jest.Mock<any, any, any>;
|
|
70
|
+
};
|
|
71
|
+
mockAuth: {
|
|
72
|
+
createUser: jest.Mock<any, any, any>;
|
|
73
|
+
getUser: jest.Mock<any, any, any>;
|
|
74
|
+
deleteUser: jest.Mock<any, any, any>;
|
|
75
|
+
updateUser: jest.Mock<any, any, any>;
|
|
76
|
+
};
|
|
77
|
+
mockStorage: {
|
|
78
|
+
bucket: jest.Mock<any, any, any>;
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=firebase-admin.mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firebase-admin.mock.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/firebase-admin.mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,0BAA0B,GAAI,QAAQ,OAAO,EAAE,OAAO,GAAG;;;;;;;;;CASpE,CAAC;AAGH,eAAO,MAAM,uBAAuB,GAAI,MAAM,GAAG,EAAE;;;;;;;;;;;;;CAIjD,CAAC;AAGH,eAAO,MAAM,uBAAuB,GAAI,gBAAgB,GAAG;;;;;CAUzD,CAAC;AAGH,eAAO,MAAM,mBAAmB;;CAE9B,CAAC;AAGH,eAAO,MAAM,oBAAoB,GAAI,KAAK,MAAM,EAAE,OAAO,MAAM,EAAE,cAAc,MAAM;;;;;;;;;;;;;;;;CAYnF,CAAC;AAGH,eAAO,MAAM,cAAc;;;;;CAezB,CAAC;AAGH,eAAO,MAAM,gBAAgB;;;CAU3B,CAAC;AAGH,eAAO,MAAM,iBAAiB;;CAE5B,CAAC;AAGH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;CAqBnC,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Firebase Admin SDK mocks for unit testing
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.setupFirebaseAdminMocks = exports.createMockStorage = exports.createMockBucket = exports.createMockAuth = exports.createMockUserRecord = exports.createMockFirestore = exports.createMockCollectionRef = exports.createMockQuerySnapshot = exports.createMockDocumentSnapshot = void 0;
|
|
7
|
+
// Mock Firestore document snapshot
|
|
8
|
+
const createMockDocumentSnapshot = (exists, data) => ({
|
|
9
|
+
exists,
|
|
10
|
+
data: () => data,
|
|
11
|
+
id: (data === null || data === void 0 ? void 0 : data.id) || 'mock-doc-id',
|
|
12
|
+
ref: {
|
|
13
|
+
set: jest.fn().mockResolvedValue(undefined),
|
|
14
|
+
update: jest.fn().mockResolvedValue(undefined),
|
|
15
|
+
delete: jest.fn().mockResolvedValue(undefined),
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
exports.createMockDocumentSnapshot = createMockDocumentSnapshot;
|
|
19
|
+
// Mock Firestore query snapshot
|
|
20
|
+
const createMockQuerySnapshot = (docs) => ({
|
|
21
|
+
empty: docs.length === 0,
|
|
22
|
+
size: docs.length,
|
|
23
|
+
docs: docs.map((doc, index) => (0, exports.createMockDocumentSnapshot)(true, Object.assign({ id: `doc-${index}` }, doc))),
|
|
24
|
+
});
|
|
25
|
+
exports.createMockQuerySnapshot = createMockQuerySnapshot;
|
|
26
|
+
// Mock Firestore collection reference
|
|
27
|
+
const createMockCollectionRef = (querySnapshot) => ({
|
|
28
|
+
doc: jest.fn().mockReturnValue({
|
|
29
|
+
get: jest.fn().mockResolvedValue((0, exports.createMockDocumentSnapshot)(false)),
|
|
30
|
+
set: jest.fn().mockResolvedValue(undefined),
|
|
31
|
+
update: jest.fn().mockResolvedValue(undefined),
|
|
32
|
+
delete: jest.fn().mockResolvedValue(undefined),
|
|
33
|
+
}),
|
|
34
|
+
where: jest.fn().mockReturnThis(),
|
|
35
|
+
limit: jest.fn().mockReturnThis(),
|
|
36
|
+
get: jest.fn().mockResolvedValue(querySnapshot || (0, exports.createMockQuerySnapshot)([])),
|
|
37
|
+
});
|
|
38
|
+
exports.createMockCollectionRef = createMockCollectionRef;
|
|
39
|
+
// Mock Firestore instance
|
|
40
|
+
const createMockFirestore = () => ({
|
|
41
|
+
collection: jest.fn().mockReturnValue((0, exports.createMockCollectionRef)()),
|
|
42
|
+
});
|
|
43
|
+
exports.createMockFirestore = createMockFirestore;
|
|
44
|
+
// Mock Auth user record
|
|
45
|
+
const createMockUserRecord = (uid, email, displayName) => ({
|
|
46
|
+
uid,
|
|
47
|
+
email,
|
|
48
|
+
displayName: displayName || email.split('@')[0],
|
|
49
|
+
emailVerified: false,
|
|
50
|
+
disabled: false,
|
|
51
|
+
metadata: {
|
|
52
|
+
creationTime: new Date().toISOString(),
|
|
53
|
+
lastSignInTime: null,
|
|
54
|
+
},
|
|
55
|
+
providerData: [],
|
|
56
|
+
toJSON: () => ({ uid, email, displayName }),
|
|
57
|
+
});
|
|
58
|
+
exports.createMockUserRecord = createMockUserRecord;
|
|
59
|
+
// Mock Auth instance
|
|
60
|
+
const createMockAuth = () => ({
|
|
61
|
+
createUser: jest
|
|
62
|
+
.fn()
|
|
63
|
+
.mockImplementation(({ email, displayName }) => Promise.resolve((0, exports.createMockUserRecord)(`uid-${Date.now()}`, email, displayName))),
|
|
64
|
+
getUser: jest
|
|
65
|
+
.fn()
|
|
66
|
+
.mockImplementation((uid) => Promise.resolve((0, exports.createMockUserRecord)(uid, `${uid}@test.com`))),
|
|
67
|
+
deleteUser: jest.fn().mockResolvedValue(undefined),
|
|
68
|
+
updateUser: jest
|
|
69
|
+
.fn()
|
|
70
|
+
.mockImplementation((uid, data) => Promise.resolve((0, exports.createMockUserRecord)(uid, data.email || `${uid}@test.com`, data.displayName))),
|
|
71
|
+
});
|
|
72
|
+
exports.createMockAuth = createMockAuth;
|
|
73
|
+
// Mock Storage bucket
|
|
74
|
+
const createMockBucket = () => ({
|
|
75
|
+
file: jest.fn().mockReturnValue({
|
|
76
|
+
exists: jest.fn().mockResolvedValue([false]),
|
|
77
|
+
getMetadata: jest.fn().mockResolvedValue([{ contentType: 'image/jpeg', metadata: {} }]),
|
|
78
|
+
setMetadata: jest.fn().mockResolvedValue(undefined),
|
|
79
|
+
download: jest.fn().mockResolvedValue([Buffer.from('mock-file-content')]),
|
|
80
|
+
save: jest.fn().mockResolvedValue(undefined),
|
|
81
|
+
delete: jest.fn().mockResolvedValue(undefined),
|
|
82
|
+
}),
|
|
83
|
+
name: 'mock-bucket',
|
|
84
|
+
});
|
|
85
|
+
exports.createMockBucket = createMockBucket;
|
|
86
|
+
// Mock Storage instance
|
|
87
|
+
const createMockStorage = () => ({
|
|
88
|
+
bucket: jest.fn().mockReturnValue((0, exports.createMockBucket)()),
|
|
89
|
+
});
|
|
90
|
+
exports.createMockStorage = createMockStorage;
|
|
91
|
+
// Setup all Firebase Admin mocks
|
|
92
|
+
const setupFirebaseAdminMocks = () => {
|
|
93
|
+
const mockFirestore = (0, exports.createMockFirestore)();
|
|
94
|
+
const mockAuth = (0, exports.createMockAuth)();
|
|
95
|
+
const mockStorage = (0, exports.createMockStorage)();
|
|
96
|
+
jest.mock('firebase-admin/firestore', () => ({
|
|
97
|
+
getFirestore: jest.fn().mockReturnValue(mockFirestore),
|
|
98
|
+
FieldValue: {
|
|
99
|
+
serverTimestamp: jest.fn().mockReturnValue(new Date().toISOString()),
|
|
100
|
+
},
|
|
101
|
+
}));
|
|
102
|
+
jest.mock('firebase-admin/auth', () => ({
|
|
103
|
+
getAuth: jest.fn().mockReturnValue(mockAuth),
|
|
104
|
+
}));
|
|
105
|
+
jest.mock('firebase-admin/storage', () => ({
|
|
106
|
+
getStorage: jest.fn().mockReturnValue(mockStorage),
|
|
107
|
+
}));
|
|
108
|
+
return { mockFirestore, mockAuth, mockStorage };
|
|
109
|
+
};
|
|
110
|
+
exports.setupFirebaseAdminMocks = setupFirebaseAdminMocks;
|
|
111
|
+
//# sourceMappingURL=firebase-admin.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firebase-admin.mock.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/firebase-admin.mock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firebase Functions mocks for unit testing
|
|
3
|
+
*/
|
|
4
|
+
export declare const mockLogger: {
|
|
5
|
+
info: jest.Mock<any, any, any>;
|
|
6
|
+
warn: jest.Mock<any, any, any>;
|
|
7
|
+
error: jest.Mock<any, any, any>;
|
|
8
|
+
debug: jest.Mock<any, any, any>;
|
|
9
|
+
log: jest.Mock<any, any, any>;
|
|
10
|
+
};
|
|
11
|
+
export declare class MockHttpsError extends Error {
|
|
12
|
+
code: string;
|
|
13
|
+
details?: any | undefined;
|
|
14
|
+
constructor(code: string, message: string, details?: any | undefined);
|
|
15
|
+
}
|
|
16
|
+
export declare const createMockCallableRequest: <T>(data: T, auth?: {
|
|
17
|
+
uid: string;
|
|
18
|
+
token?: any;
|
|
19
|
+
}) => {
|
|
20
|
+
data: T;
|
|
21
|
+
auth: {
|
|
22
|
+
uid: string;
|
|
23
|
+
token: any;
|
|
24
|
+
} | undefined;
|
|
25
|
+
rawRequest: {};
|
|
26
|
+
};
|
|
27
|
+
export declare const setupFirebaseFunctionsMocks: () => {
|
|
28
|
+
mockLogger: {
|
|
29
|
+
info: jest.Mock<any, any, any>;
|
|
30
|
+
warn: jest.Mock<any, any, any>;
|
|
31
|
+
error: jest.Mock<any, any, any>;
|
|
32
|
+
debug: jest.Mock<any, any, any>;
|
|
33
|
+
log: jest.Mock<any, any, any>;
|
|
34
|
+
};
|
|
35
|
+
MockHttpsError: typeof MockHttpsError;
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=firebase-functions.mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firebase-functions.mock.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/firebase-functions.mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,UAAU;;;;;;CAMtB,CAAC;AAGF,qBAAa,cAAe,SAAQ,KAAK;IAE9B,IAAI,EAAE,MAAM;IAEZ,OAAO,CAAC,EAAE,GAAG;gBAFb,IAAI,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACR,OAAO,CAAC,EAAE,GAAG,YAAA;CAKvB;AAGD,eAAO,MAAM,yBAAyB,GAAI,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,GAAG,CAAA;CAAE;;;;;;;CAIvF,CAAC;AAGH,eAAO,MAAM,2BAA2B;;;;;;;;;CA4BvC,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Firebase Functions mocks for unit testing
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.setupFirebaseFunctionsMocks = exports.createMockCallableRequest = exports.MockHttpsError = exports.mockLogger = void 0;
|
|
7
|
+
// Mock logger
|
|
8
|
+
exports.mockLogger = {
|
|
9
|
+
info: jest.fn(),
|
|
10
|
+
warn: jest.fn(),
|
|
11
|
+
error: jest.fn(),
|
|
12
|
+
debug: jest.fn(),
|
|
13
|
+
log: jest.fn(),
|
|
14
|
+
};
|
|
15
|
+
// Mock HttpsError
|
|
16
|
+
class MockHttpsError extends Error {
|
|
17
|
+
constructor(code, message, details) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.code = code;
|
|
20
|
+
this.details = details;
|
|
21
|
+
this.name = 'HttpsError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.MockHttpsError = MockHttpsError;
|
|
25
|
+
// Mock callable request
|
|
26
|
+
const createMockCallableRequest = (data, auth) => ({
|
|
27
|
+
data,
|
|
28
|
+
auth: auth ? { uid: auth.uid, token: auth.token || {} } : undefined,
|
|
29
|
+
rawRequest: {},
|
|
30
|
+
});
|
|
31
|
+
exports.createMockCallableRequest = createMockCallableRequest;
|
|
32
|
+
// Setup Firebase Functions mocks
|
|
33
|
+
const setupFirebaseFunctionsMocks = () => {
|
|
34
|
+
jest.mock('firebase-functions', () => ({
|
|
35
|
+
logger: exports.mockLogger,
|
|
36
|
+
}));
|
|
37
|
+
jest.mock('firebase-functions/logger', () => exports.mockLogger);
|
|
38
|
+
jest.mock('firebase-functions/https', () => ({
|
|
39
|
+
HttpsError: MockHttpsError,
|
|
40
|
+
onCall: jest.fn().mockImplementation((options, handler) => {
|
|
41
|
+
if (typeof options === 'function') {
|
|
42
|
+
return options;
|
|
43
|
+
}
|
|
44
|
+
return handler;
|
|
45
|
+
}),
|
|
46
|
+
}));
|
|
47
|
+
jest.mock('firebase-functions/v2/https', () => ({
|
|
48
|
+
HttpsError: MockHttpsError,
|
|
49
|
+
onCall: jest.fn().mockImplementation((options, handler) => {
|
|
50
|
+
if (typeof options === 'function') {
|
|
51
|
+
return options;
|
|
52
|
+
}
|
|
53
|
+
return handler;
|
|
54
|
+
}),
|
|
55
|
+
}));
|
|
56
|
+
return { mockLogger: exports.mockLogger, MockHttpsError };
|
|
57
|
+
};
|
|
58
|
+
exports.setupFirebaseFunctionsMocks = setupFirebaseFunctionsMocks;
|
|
59
|
+
//# sourceMappingURL=firebase-functions.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firebase-functions.mock.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/firebase-functions.mock.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,cAAc;AACD,QAAA,UAAU,GAAG;IACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;IACf,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;IACf,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;IAChB,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;IAChB,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;CACf,CAAC;AAEF,kBAAkB;AAClB,MAAa,cAAe,SAAQ,KAAK;IACvC,YACS,IAAY,EACnB,OAAe,EACR,OAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,SAAI,GAAJ,IAAI,CAAQ;QAEZ,YAAO,GAAP,OAAO,CAAM;QAGpB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AATD,wCASC;AAED,wBAAwB;AACjB,MAAM,yBAAyB,GAAG,CAAI,IAAO,EAAE,IAAmC,EAAE,EAAE,CAAC,CAAC;IAC7F,IAAI;IACJ,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;IACnE,UAAU,EAAE,EAAE;CACf,CAAC,CAAC;AAJU,QAAA,yBAAyB,6BAInC;AAEH,iCAAiC;AAC1B,MAAM,2BAA2B,GAAG,GAAG,EAAE;IAC9C,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;QACrC,MAAM,EAAE,kBAAU;KACnB,CAAC,CAAC,CAAC;IAEJ,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,kBAAU,CAAC,CAAC;IAEzD,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3C,UAAU,EAAE,cAAc;QAC1B,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YACxD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;gBAClC,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;KACH,CAAC,CAAC,CAAC;IAEJ,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9C,UAAU,EAAE,cAAc;QAC1B,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YACxD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;gBAClC,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;KACH,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,UAAU,EAAV,kBAAU,EAAE,cAAc,EAAE,CAAC;AACxC,CAAC,CAAC;AA5BW,QAAA,2BAA2B,+BA4BtC"}
|
|
@@ -52,6 +52,11 @@ export interface AppConfig {
|
|
|
52
52
|
* Maximum number of Cloud Function instances
|
|
53
53
|
*/
|
|
54
54
|
maxInstances?: number;
|
|
55
|
+
/**
|
|
56
|
+
* Enable App Check enforcement for callable functions
|
|
57
|
+
* When true, only requests with valid App Check tokens will be accepted
|
|
58
|
+
*/
|
|
59
|
+
enforceAppCheck?: boolean;
|
|
55
60
|
}
|
|
56
61
|
/**
|
|
57
62
|
* Email Configuration
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.config.d.ts","sourceRoot":"","sources":["../../src/config/app.config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"app.config.d.ts","sourceRoot":"","sources":["../../src/config/app.config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAExD;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAKrC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CA2B5C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.config.js","sourceRoot":"","sources":["../../src/config/app.config.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;
|
|
1
|
+
{"version":3,"file":"app.config.js","sourceRoot":"","sources":["../../src/config/app.config.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAoHH,4CAEC;AAMD,8BAKC;AAKD,wCA2BC;AAnDD,IAAI,aAAa,GAAqB,IAAI,CAAC;AAE3C;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,MAAiB;IAChD,aAAa,GAAG,MAAM,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,SAAgB,SAAS;IACvB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc;IAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAEpC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC;IAE7F,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,OAAO,CAAC;IAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC;IAEzF,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,IAAI;QACJ,IAAI;QACJ,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,63 @@
|
|
|
1
|
+
import { Firestore } from 'firebase-admin/firestore';
|
|
2
|
+
import { AppConfig } from '../../config';
|
|
3
|
+
import { Role } from '../user';
|
|
1
4
|
import { BootstrapStatusResult, SystemBootstrapData, SystemBootstrapResult } from './bootstrap.models';
|
|
5
|
+
export declare const PERMISSION_ADMIN = "ADMIN";
|
|
6
|
+
export declare const PERMISSION_USER = "USER";
|
|
7
|
+
export declare const PERMISSION_CREATE_THUMBNAIL = "createThumbnail";
|
|
8
|
+
/**
|
|
9
|
+
* Get Firestore instance based on config
|
|
10
|
+
*/
|
|
11
|
+
export declare function getFirestoreInstance(config: AppConfig): Firestore;
|
|
12
|
+
/**
|
|
13
|
+
* Create bootstrap roles array based on config
|
|
14
|
+
*/
|
|
15
|
+
export declare function createBootstrapRoles(config: AppConfig): Role[];
|
|
16
|
+
/**
|
|
17
|
+
* Validate bootstrap request data
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateBootstrapData(data: SystemBootstrapData): void;
|
|
20
|
+
/**
|
|
21
|
+
* Get password to use for admin user
|
|
22
|
+
*/
|
|
23
|
+
export declare function getAdminPassword(providedPassword: string | undefined, defaultPassword: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Check if system is already bootstrapped
|
|
26
|
+
*/
|
|
27
|
+
export declare function isSystemBootstrapped(firestore: Firestore): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Create roles in Firestore if they don't exist
|
|
30
|
+
*/
|
|
31
|
+
export declare function createRolesIfNotExist(firestore: Firestore, roles: Role[]): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Create admin user document in Firestore
|
|
34
|
+
*/
|
|
35
|
+
export declare function createAdminUserDocument(uid: string, email: string, displayName: string, roleIds: string[]): {
|
|
36
|
+
id: string;
|
|
37
|
+
email: string;
|
|
38
|
+
displayName: string;
|
|
39
|
+
firstName: string;
|
|
40
|
+
lastName: string;
|
|
41
|
+
meta: {
|
|
42
|
+
createdAt: Date;
|
|
43
|
+
updatedAt: Date;
|
|
44
|
+
createdBy: string;
|
|
45
|
+
};
|
|
46
|
+
status: string;
|
|
47
|
+
roleIds: string[];
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Core bootstrap logic - exported for testing
|
|
51
|
+
*/
|
|
52
|
+
export declare function executeSystemBootstrap(data: SystemBootstrapData, config: AppConfig): Promise<SystemBootstrapResult>;
|
|
53
|
+
/**
|
|
54
|
+
* Core check bootstrap status logic - exported for testing
|
|
55
|
+
*/
|
|
56
|
+
export declare function executeCheckBootstrapStatus(config: AppConfig): Promise<BootstrapStatusResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Handle bootstrap status check errors
|
|
59
|
+
*/
|
|
60
|
+
export declare function handleBootstrapStatusError(error: any, config: AppConfig): never;
|
|
2
61
|
export declare const systemBootstrap: import("firebase-functions/https").CallableFunction<SystemBootstrapData, Promise<SystemBootstrapResult>, unknown>;
|
|
3
62
|
export declare const checkBootstrapStatus: import("firebase-functions/https").CallableFunction<any, Promise<BootstrapStatusResult>, unknown>;
|
|
4
63
|
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/modules/bootstrap/bootstrap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/modules/bootstrap/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAInE,OAAO,EAAE,SAAS,EAAa,MAAM,cAAc,CAAC;AACpD,OAAO,EAAkB,IAAI,EAAsC,MAAM,SAAS,CAAC;AACnF,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAG5B,eAAO,MAAM,gBAAgB,UAAU,CAAC;AACxC,eAAO,MAAM,eAAe,SAAS,CAAC;AACtC,eAAO,MAAM,2BAA2B,oBAAoB,CAAC;AAE7D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAEjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,CA4B9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAIrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,eAAe,EAAE,MAAM,GACtB,MAAM,CAER;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ9F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EAAE;;;;;;;;;;;;;EAgBlB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,qBAAqB,CAAC,CAiDhC;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,qBAAqB,CAAC,CAgBhC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,GAAG,KAAK,CAa/E;AAYD,eAAO,MAAM,eAAe,mHAiB3B,CAAC;AAEF,eAAO,MAAM,oBAAoB,mGAWhC,CAAC"}
|