@zssz-soft/firebase-functions-shared 1.1.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/README.md +391 -0
- package/lib/config/app.config.d.ts +106 -0
- package/lib/config/app.config.d.ts.map +1 -0
- package/lib/config/app.config.js +55 -0
- package/lib/config/app.config.js.map +1 -0
- package/lib/config/index.d.ts +2 -0
- package/lib/config/index.d.ts.map +1 -0
- package/lib/config/index.js +18 -0
- package/lib/config/index.js.map +1 -0
- package/lib/index.d.ts +13 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +29 -0
- package/lib/index.js.map +1 -0
- package/lib/modules/bootstrap/bootstrap.d.ts +4 -0
- package/lib/modules/bootstrap/bootstrap.d.ts.map +1 -0
- package/lib/modules/bootstrap/bootstrap.js +162 -0
- package/lib/modules/bootstrap/bootstrap.js.map +1 -0
- package/lib/modules/bootstrap/bootstrap.models.d.ts +20 -0
- package/lib/modules/bootstrap/bootstrap.models.d.ts.map +1 -0
- package/lib/modules/bootstrap/bootstrap.models.js +3 -0
- package/lib/modules/bootstrap/bootstrap.models.js.map +1 -0
- package/lib/modules/bootstrap/index.d.ts +3 -0
- package/lib/modules/bootstrap/index.d.ts.map +1 -0
- package/lib/modules/bootstrap/index.js +19 -0
- package/lib/modules/bootstrap/index.js.map +1 -0
- package/lib/modules/email/email.d.ts +5 -0
- package/lib/modules/email/email.d.ts.map +1 -0
- package/lib/modules/email/email.js +105 -0
- package/lib/modules/email/email.js.map +1 -0
- package/lib/modules/email/email.models.d.ts +25 -0
- package/lib/modules/email/email.models.d.ts.map +1 -0
- package/lib/modules/email/email.models.js +3 -0
- package/lib/modules/email/email.models.js.map +1 -0
- package/lib/modules/email/email.service.d.ts +11 -0
- package/lib/modules/email/email.service.d.ts.map +1 -0
- package/lib/modules/email/email.service.js +227 -0
- package/lib/modules/email/email.service.js.map +1 -0
- package/lib/modules/email/email.validator.d.ts +2 -0
- package/lib/modules/email/email.validator.d.ts.map +1 -0
- package/lib/modules/email/email.validator.js +9 -0
- package/lib/modules/email/email.validator.js.map +1 -0
- package/lib/modules/email/index.d.ts +5 -0
- package/lib/modules/email/index.d.ts.map +1 -0
- package/lib/modules/email/index.js +21 -0
- package/lib/modules/email/index.js.map +1 -0
- package/lib/modules/security/effective-permissions.d.ts +28 -0
- package/lib/modules/security/effective-permissions.d.ts.map +1 -0
- package/lib/modules/security/effective-permissions.js +133 -0
- package/lib/modules/security/effective-permissions.js.map +1 -0
- package/lib/modules/security/effective-permissions.models.d.ts +96 -0
- package/lib/modules/security/effective-permissions.models.d.ts.map +1 -0
- package/lib/modules/security/effective-permissions.models.js +24 -0
- package/lib/modules/security/effective-permissions.models.js.map +1 -0
- package/lib/modules/security/effective-permissions.triggers.d.ts +83 -0
- package/lib/modules/security/effective-permissions.triggers.d.ts.map +1 -0
- package/lib/modules/security/effective-permissions.triggers.js +307 -0
- package/lib/modules/security/effective-permissions.triggers.js.map +1 -0
- package/lib/modules/security/index.d.ts +10 -0
- package/lib/modules/security/index.d.ts.map +1 -0
- package/lib/modules/security/index.js +28 -0
- package/lib/modules/security/index.js.map +1 -0
- package/lib/modules/storage/index.d.ts +2 -0
- package/lib/modules/storage/index.d.ts.map +1 -0
- package/lib/modules/storage/index.js +18 -0
- package/lib/modules/storage/index.js.map +1 -0
- package/lib/modules/storage/thumbnail-functions.d.ts +10 -0
- package/lib/modules/storage/thumbnail-functions.d.ts.map +1 -0
- package/lib/modules/storage/thumbnail-functions.js +482 -0
- package/lib/modules/storage/thumbnail-functions.js.map +1 -0
- package/lib/modules/user/index.d.ts +4 -0
- package/lib/modules/user/index.d.ts.map +1 -0
- package/lib/modules/user/index.js +20 -0
- package/lib/modules/user/index.js.map +1 -0
- package/lib/modules/user/user-management.d.ts +29 -0
- package/lib/modules/user/user-management.d.ts.map +1 -0
- package/lib/modules/user/user-management.js +134 -0
- package/lib/modules/user/user-management.js.map +1 -0
- package/lib/modules/user/user.d.ts +2 -0
- package/lib/modules/user/user.d.ts.map +1 -0
- package/lib/modules/user/user.js +15 -0
- package/lib/modules/user/user.js.map +1 -0
- package/lib/modules/user/user.models.d.ts +15 -0
- package/lib/modules/user/user.models.d.ts.map +1 -0
- package/lib/modules/user/user.models.js +6 -0
- package/lib/modules/user/user.models.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Effective Permissions Trigger Factories
|
|
4
|
+
*
|
|
5
|
+
* Factory functions that create Firebase Cloud Functions v2 triggers
|
|
6
|
+
* for automatically maintaining the effective permissions cache.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.createUserPermissionTriggers = createUserPermissionTriggers;
|
|
43
|
+
exports.createRolePermissionTriggers = createRolePermissionTriggers;
|
|
44
|
+
exports.createAdminPermissionEndpoints = createAdminPermissionEndpoints;
|
|
45
|
+
const admin = __importStar(require("firebase-admin"));
|
|
46
|
+
const firestore_1 = require("firebase-functions/v2/firestore");
|
|
47
|
+
const https_1 = require("firebase-functions/v2/https");
|
|
48
|
+
const effective_permissions_1 = require("./effective-permissions");
|
|
49
|
+
const effective_permissions_models_1 = require("./effective-permissions.models");
|
|
50
|
+
/**
|
|
51
|
+
* Create user lifecycle triggers
|
|
52
|
+
* Automatically maintains permission cache when users are created, updated, or deleted
|
|
53
|
+
*
|
|
54
|
+
* @param config - Configuration for the permission system
|
|
55
|
+
* @returns Object containing the three trigger functions
|
|
56
|
+
*/
|
|
57
|
+
function createUserPermissionTriggers(config = {}) {
|
|
58
|
+
const cfg = Object.assign(Object.assign({}, effective_permissions_models_1.DEFAULT_EFFECTIVE_PERMISSIONS_CONFIG), config);
|
|
59
|
+
return {
|
|
60
|
+
/**
|
|
61
|
+
* Trigger when a new user is created
|
|
62
|
+
* Calculates initial effective permissions
|
|
63
|
+
*/
|
|
64
|
+
onUserCreate: (0, firestore_1.onDocumentCreated)({
|
|
65
|
+
document: `${cfg.userCollection}/{userId}`,
|
|
66
|
+
region: cfg.region,
|
|
67
|
+
maxInstances: cfg.maxInstances,
|
|
68
|
+
}, async (event) => {
|
|
69
|
+
const userId = event.params.userId;
|
|
70
|
+
console.log(`New user created: ${userId}`);
|
|
71
|
+
await (0, effective_permissions_1.calculateEffectivePermissions)(userId, config);
|
|
72
|
+
}),
|
|
73
|
+
/**
|
|
74
|
+
* Trigger when a user document is updated
|
|
75
|
+
* Recalculates effective permissions if roles changed
|
|
76
|
+
*/
|
|
77
|
+
onUserRoleChange: (0, firestore_1.onDocumentUpdated)({
|
|
78
|
+
document: `${cfg.userCollection}/{userId}`,
|
|
79
|
+
region: cfg.region,
|
|
80
|
+
maxInstances: cfg.maxInstances,
|
|
81
|
+
}, async (event) => {
|
|
82
|
+
var _a, _b;
|
|
83
|
+
const userId = event.params.userId;
|
|
84
|
+
const before = (_a = event.data) === null || _a === void 0 ? void 0 : _a.before.data();
|
|
85
|
+
const after = (_b = event.data) === null || _b === void 0 ? void 0 : _b.after.data();
|
|
86
|
+
if (!before || !after)
|
|
87
|
+
return;
|
|
88
|
+
const roleIdsBefore = before[cfg.userRoleIdsField] || [];
|
|
89
|
+
const roleIdsAfter = after[cfg.userRoleIdsField] || [];
|
|
90
|
+
// Check if roles actually changed
|
|
91
|
+
const rolesChanged = roleIdsBefore.length !== roleIdsAfter.length ||
|
|
92
|
+
roleIdsBefore.some((id) => !roleIdsAfter.includes(id)) ||
|
|
93
|
+
roleIdsAfter.some((id) => !roleIdsBefore.includes(id));
|
|
94
|
+
if (rolesChanged) {
|
|
95
|
+
console.log(`User ${userId} ${cfg.userRoleIdsField} changed`);
|
|
96
|
+
await (0, effective_permissions_1.calculateEffectivePermissions)(userId, config);
|
|
97
|
+
}
|
|
98
|
+
}),
|
|
99
|
+
/**
|
|
100
|
+
* Trigger when a user is deleted
|
|
101
|
+
* Cleans up the permission cache
|
|
102
|
+
*/
|
|
103
|
+
onUserDelete: (0, firestore_1.onDocumentDeleted)({
|
|
104
|
+
document: `${cfg.userCollection}/{userId}`,
|
|
105
|
+
region: cfg.region,
|
|
106
|
+
maxInstances: cfg.maxInstances,
|
|
107
|
+
}, async (event) => {
|
|
108
|
+
const userId = event.params.userId;
|
|
109
|
+
console.log(`User deleted: ${userId}`);
|
|
110
|
+
await (0, effective_permissions_1.deleteEffectivePermissions)(userId, config);
|
|
111
|
+
}),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Create role permission change triggers
|
|
116
|
+
* Automatically updates all affected users when role permissions change
|
|
117
|
+
*
|
|
118
|
+
* @param config - Configuration for the permission system
|
|
119
|
+
* @returns Object containing the two trigger functions
|
|
120
|
+
*/
|
|
121
|
+
function createRolePermissionTriggers(config = {}) {
|
|
122
|
+
const cfg = Object.assign(Object.assign({}, effective_permissions_models_1.DEFAULT_EFFECTIVE_PERMISSIONS_CONFIG), config);
|
|
123
|
+
return {
|
|
124
|
+
/**
|
|
125
|
+
* Trigger when a role's permissions are updated
|
|
126
|
+
* Updates all users who have this role
|
|
127
|
+
*/
|
|
128
|
+
onRolePermissionsChange: (0, firestore_1.onDocumentUpdated)({
|
|
129
|
+
document: `${cfg.roleCollection}/{roleId}`,
|
|
130
|
+
region: cfg.region,
|
|
131
|
+
maxInstances: cfg.maxInstances,
|
|
132
|
+
}, async (event) => {
|
|
133
|
+
var _a, _b;
|
|
134
|
+
const roleId = event.params.roleId;
|
|
135
|
+
const before = (_a = event.data) === null || _a === void 0 ? void 0 : _a.before.data();
|
|
136
|
+
const after = (_b = event.data) === null || _b === void 0 ? void 0 : _b.after.data();
|
|
137
|
+
if (!before || !after)
|
|
138
|
+
return;
|
|
139
|
+
const permissionsBefore = before[cfg.rolePermissionsField] || [];
|
|
140
|
+
const permissionsAfter = after[cfg.rolePermissionsField] || [];
|
|
141
|
+
// Check if permissions actually changed
|
|
142
|
+
const permissionsChanged = permissionsBefore.length !== permissionsAfter.length ||
|
|
143
|
+
permissionsBefore.some((p) => !permissionsAfter.includes(p)) ||
|
|
144
|
+
permissionsAfter.some((p) => !permissionsBefore.includes(p));
|
|
145
|
+
if (!permissionsChanged) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
console.log(`Role ${roleId} ${cfg.rolePermissionsField} changed`);
|
|
149
|
+
// Find all users with this role
|
|
150
|
+
const db = admin.firestore();
|
|
151
|
+
const usersSnapshot = await db
|
|
152
|
+
.collection(cfg.userCollection)
|
|
153
|
+
.where(cfg.userRoleIdsField, 'array-contains', roleId)
|
|
154
|
+
.get();
|
|
155
|
+
console.log(`Found ${usersSnapshot.size} users with role ${roleId}`);
|
|
156
|
+
const userIds = usersSnapshot.docs.map((doc) => doc.id);
|
|
157
|
+
await (0, effective_permissions_1.batchUpdateEffectivePermissions)(userIds, config);
|
|
158
|
+
}),
|
|
159
|
+
/**
|
|
160
|
+
* Trigger when a role is deleted
|
|
161
|
+
* Updates all users who had this role
|
|
162
|
+
*/
|
|
163
|
+
onRoleDelete: (0, firestore_1.onDocumentDeleted)({
|
|
164
|
+
document: `${cfg.roleCollection}/{roleId}`,
|
|
165
|
+
region: cfg.region,
|
|
166
|
+
maxInstances: cfg.maxInstances,
|
|
167
|
+
}, async (event) => {
|
|
168
|
+
const roleId = event.params.roleId;
|
|
169
|
+
console.log(`Role ${roleId} deleted`);
|
|
170
|
+
// Find all users with this role
|
|
171
|
+
const db = admin.firestore();
|
|
172
|
+
const usersSnapshot = await db
|
|
173
|
+
.collection(cfg.userCollection)
|
|
174
|
+
.where(cfg.userRoleIdsField, 'array-contains', roleId)
|
|
175
|
+
.get();
|
|
176
|
+
const userIds = usersSnapshot.docs.map((doc) => doc.id);
|
|
177
|
+
await (0, effective_permissions_1.batchUpdateEffectivePermissions)(userIds, config);
|
|
178
|
+
console.log(`Updated ${usersSnapshot.size} users after role deletion`);
|
|
179
|
+
}),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Create admin HTTP endpoints for manual permission management
|
|
184
|
+
*
|
|
185
|
+
* @param config - Configuration for the permission system
|
|
186
|
+
* @param adminSecretKey - Key in functions config where admin secret is stored (e.g., 'admin.secret')
|
|
187
|
+
* @returns Object containing bootstrap and recalculate endpoints
|
|
188
|
+
*/
|
|
189
|
+
function createAdminPermissionEndpoints(config = {}, adminSecretKey = 'admin.secret') {
|
|
190
|
+
const cfg = Object.assign(Object.assign({}, effective_permissions_models_1.DEFAULT_EFFECTIVE_PERMISSIONS_CONFIG), config);
|
|
191
|
+
/**
|
|
192
|
+
* Validate admin secret from request headers
|
|
193
|
+
*/
|
|
194
|
+
function validateAdminSecret(req) {
|
|
195
|
+
var _a;
|
|
196
|
+
const providedSecret = (_a = req.headers.authorization) === null || _a === void 0 ? void 0 : _a.replace('Bearer ', '');
|
|
197
|
+
const configPath = adminSecretKey.split('.');
|
|
198
|
+
let secret = require('firebase-functions').config();
|
|
199
|
+
for (const key of configPath) {
|
|
200
|
+
secret = secret === null || secret === void 0 ? void 0 : secret[key];
|
|
201
|
+
}
|
|
202
|
+
return providedSecret === secret;
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
/**
|
|
206
|
+
* Bootstrap endpoint - initialize permissions for all existing users
|
|
207
|
+
* POST /bootstrapEffectivePermissions
|
|
208
|
+
* Requires Authorization: Bearer <admin-secret>
|
|
209
|
+
*/
|
|
210
|
+
bootstrapEffectivePermissions: (0, https_1.onRequest)({
|
|
211
|
+
region: cfg.region,
|
|
212
|
+
maxInstances: cfg.maxInstances,
|
|
213
|
+
}, async (req, res) => {
|
|
214
|
+
// CORS
|
|
215
|
+
res.set('Access-Control-Allow-Origin', '*');
|
|
216
|
+
if (req.method === 'OPTIONS') {
|
|
217
|
+
res.set('Access-Control-Allow-Methods', 'POST');
|
|
218
|
+
res.set('Access-Control-Allow-Headers', 'Authorization,Content-Type');
|
|
219
|
+
res.status(204).send('');
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
// Validate admin secret
|
|
223
|
+
if (!validateAdminSecret(req)) {
|
|
224
|
+
res.status(403).json({ error: 'Forbidden: Invalid admin secret' });
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
console.log('Starting bootstrap of effective permissions for all users...');
|
|
229
|
+
const db = admin.firestore();
|
|
230
|
+
const usersSnapshot = await db.collection(cfg.userCollection).get();
|
|
231
|
+
const totalUsers = usersSnapshot.size;
|
|
232
|
+
console.log(`Found ${totalUsers} users to bootstrap`);
|
|
233
|
+
if (totalUsers === 0) {
|
|
234
|
+
res.json({
|
|
235
|
+
success: true,
|
|
236
|
+
message: 'No users found to bootstrap',
|
|
237
|
+
usersProcessed: 0,
|
|
238
|
+
});
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
const userIds = usersSnapshot.docs.map((doc) => doc.id);
|
|
242
|
+
await (0, effective_permissions_1.batchUpdateEffectivePermissions)(userIds, config);
|
|
243
|
+
res.json({
|
|
244
|
+
success: true,
|
|
245
|
+
message: `Bootstrapped effective permissions for ${totalUsers} users`,
|
|
246
|
+
usersProcessed: totalUsers,
|
|
247
|
+
totalUsers,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
console.error('Error during bootstrap:', error);
|
|
252
|
+
res.status(500).json({
|
|
253
|
+
error: 'Bootstrap failed',
|
|
254
|
+
message: error.message,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}),
|
|
258
|
+
/**
|
|
259
|
+
* Recalculate endpoint - manually recalculate permissions for a single user
|
|
260
|
+
* POST /recalculateUserPermissions
|
|
261
|
+
* Body: { userId: string }
|
|
262
|
+
* Requires Authorization: Bearer <admin-secret>
|
|
263
|
+
*/
|
|
264
|
+
recalculateUserPermissions: (0, https_1.onRequest)({
|
|
265
|
+
region: cfg.region,
|
|
266
|
+
maxInstances: cfg.maxInstances,
|
|
267
|
+
}, async (req, res) => {
|
|
268
|
+
var _a;
|
|
269
|
+
// CORS
|
|
270
|
+
res.set('Access-Control-Allow-Origin', '*');
|
|
271
|
+
if (req.method === 'OPTIONS') {
|
|
272
|
+
res.set('Access-Control-Allow-Methods', 'POST');
|
|
273
|
+
res.set('Access-Control-Allow-Headers', 'Authorization,Content-Type');
|
|
274
|
+
res.status(204).send('');
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
// Validate admin secret
|
|
278
|
+
if (!validateAdminSecret(req)) {
|
|
279
|
+
res.status(403).json({ error: 'Forbidden: Invalid admin secret' });
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
const userId = ((_a = req.body) === null || _a === void 0 ? void 0 : _a.userId) || req.query.userId;
|
|
283
|
+
if (!userId) {
|
|
284
|
+
res.status(400).json({ error: 'Missing userId parameter' });
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
try {
|
|
288
|
+
console.log(`Manual recalculation requested for user: ${userId}`);
|
|
289
|
+
await (0, effective_permissions_1.calculateEffectivePermissions)(userId, config);
|
|
290
|
+
res.json({
|
|
291
|
+
success: true,
|
|
292
|
+
message: `Effective permissions recalculated for user ${userId}`,
|
|
293
|
+
userId,
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
console.error(`Error recalculating permissions for ${userId}:`, error);
|
|
298
|
+
res.status(500).json({
|
|
299
|
+
error: 'Recalculation failed',
|
|
300
|
+
message: error.message,
|
|
301
|
+
userId,
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
}),
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=effective-permissions.triggers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effective-permissions.triggers.js","sourceRoot":"","sources":["../../../src/modules/security/effective-permissions.triggers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Module - Effective Permissions System
|
|
3
|
+
*
|
|
4
|
+
* Provides automatic permission caching for Firebase security rules.
|
|
5
|
+
* Maintains denormalized cache based on user roles and permissions.
|
|
6
|
+
*/
|
|
7
|
+
export { EffectivePermissionsConfig, DEFAULT_EFFECTIVE_PERMISSIONS_CONFIG, EffectivePermissions, UserDocument, } from './effective-permissions.models';
|
|
8
|
+
export * from './effective-permissions';
|
|
9
|
+
export * from './effective-permissions.triggers';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/security/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,0BAA0B,EAC1B,oCAAoC,EACpC,oBAAoB,EACpB,YAAY,GACb,MAAM,gCAAgC,CAAC;AAExC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Security Module - Effective Permissions System
|
|
4
|
+
*
|
|
5
|
+
* Provides automatic permission caching for Firebase security rules.
|
|
6
|
+
* Maintains denormalized cache based on user roles and permissions.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
20
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.DEFAULT_EFFECTIVE_PERMISSIONS_CONFIG = void 0;
|
|
24
|
+
var effective_permissions_models_1 = require("./effective-permissions.models");
|
|
25
|
+
Object.defineProperty(exports, "DEFAULT_EFFECTIVE_PERMISSIONS_CONFIG", { enumerable: true, get: function () { return effective_permissions_models_1.DEFAULT_EFFECTIVE_PERMISSIONS_CONFIG; } });
|
|
26
|
+
__exportStar(require("./effective-permissions"), exports);
|
|
27
|
+
__exportStar(require("./effective-permissions.triggers"), exports);
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/security/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;AAEH,+EAKwC;AAHtC,oJAAA,oCAAoC,OAAA;AAKtC,0DAAwC;AACxC,mEAAiD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./thumbnail-functions"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/storage/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface GenerateThumbnailRequest {
|
|
2
|
+
path: string;
|
|
3
|
+
maxWidth?: number;
|
|
4
|
+
maxHeight?: number;
|
|
5
|
+
force?: boolean;
|
|
6
|
+
documentId?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const generateThumbnail: import("firebase-functions/v2/https").CallableFunction<GenerateThumbnailRequest, any, unknown>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=thumbnail-functions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thumbnail-functions.d.ts","sourceRoot":"","sources":["../../../src/modules/storage/thumbnail-functions.ts"],"names":[],"mappings":"AASA,UAAU,wBAAwB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiTD,eAAO,MAAM,iBAAiB,gGAwO7B,CAAC"}
|