diff --git a/functions/src/callable/exchange-token.ts b/functions/src/callable/exchange-token.ts index 7a36e712..903f01f4 100644 --- a/functions/src/callable/exchange-token.ts +++ b/functions/src/callable/exchange-token.ts @@ -1,8 +1,10 @@ +import {Collections, SHARED_CONFIG} from 'definitions'; import * as admin from 'firebase-admin'; import * as functions from 'firebase-functions'; import {verify} from 'jsonwebtoken'; +import {dbService} from '../consts/dbService.const'; import {ENV_CONFIG} from '../consts/env-config.const'; -import {SHARED_CONFIG, Collections} from 'definitions'; + export const exchangeToken = functions .region(SHARED_CONFIG.cloudRegion) @@ -15,13 +17,12 @@ export const exchangeToken = functions } catch (e) { throw new functions.https.HttpsError('unauthenticated', 'Token invalid'); } - const firestore = admin.firestore(); const auth = admin.auth(); const [token, user] = await Promise.all([ auth.createCustomToken(decoded.id), (data.pullUser !== false ? - firestore.collection(Collections.Users).doc(decoded.id).get() : + dbService.getDocument(Collections.Users, decoded.id) : Promise.resolve()) as any ]); diff --git a/functions/src/callable/update-email.ts b/functions/src/callable/update-email.ts index 78773a73..ea8d1ff6 100644 --- a/functions/src/callable/update-email.ts +++ b/functions/src/callable/update-email.ts @@ -1,6 +1,7 @@ import {Collections, SHARED_CONFIG} from 'definitions'; -import {auth, firestore} from 'firebase-admin'; +import {auth} from 'firebase-admin'; import * as functions from 'firebase-functions'; +import {dbService} from '../consts/dbService.const'; import {hasPermission} from '../utils/auth'; import {schemaValidation} from '../utils/schema-validation'; @@ -27,9 +28,10 @@ export const updateEmail = functions try { await auth().updateUser(id, {email}); - await firestore().collection(Collections.Users).doc(id).update({ - email - }); + await dbService.updateDocument(Collections.Users, id, {email}); + // await firestore().collection(Collections.Users).doc(id).update({ + // email + // }); } catch (e) { functions.logger.error(e); throw new functions.https.HttpsError('internal', e.toString()); diff --git a/functions/src/consts/dbService.const.ts b/functions/src/consts/dbService.const.ts new file mode 100644 index 00000000..a58ce4e6 --- /dev/null +++ b/functions/src/consts/dbService.const.ts @@ -0,0 +1,3 @@ +import {FirebaseDatabaseService} from '../services/database/firebase.service'; + +export const dbService = new FirebaseDatabaseService(); diff --git a/functions/src/rest/export-data.ts b/functions/src/rest/export-data.ts index 320a02fb..3ef627ab 100644 --- a/functions/src/rest/export-data.ts +++ b/functions/src/rest/export-data.ts @@ -8,6 +8,7 @@ import XLSX from 'xlsx'; import {CORS} from '../consts/cors-whitelist.const'; import {authenticated} from './middlewares/authenticated'; import {MODULES, SHARED_CONFIG} from 'definitions'; +import {dbService} from '../consts/dbService.const'; enum Type { csv = 'csv', @@ -20,7 +21,7 @@ const app = express(); app.use(CORS); function getModules(url: string) { - return url.split('/').filter((v, index) => index % 2); + return url.split('/').filter((v, index) => index % 2); } app.post('/**', authenticated(), (req, res) => { @@ -74,22 +75,11 @@ app.post('/**', authenticated(), (req, res) => { } } - if (sort) { - col = col.orderBy( - sort.active, - sort.direction - ) - } - - if (skip) { - col = col.offset(skip); - } - - if (limit) { - col = col.limit(limit); - } - - let docs = (await col.get()).docs.reduce((acc: any[], doc: any) => { + let docs = (await dbService.getDocuments(collectionRef || req.url, [], + {active: sort.active || undefined, direction: sort.direction || undefined}, + skip || undefined, + limit || undefined + )).docs.reduce((acc: any[], doc: any) => { if (!ids || ids.includes(doc.id)) { acc.push({ ...doc.data(), diff --git a/functions/src/rest/import-data.ts b/functions/src/rest/import-data.ts index 6d5786b9..8d055d8e 100644 --- a/functions/src/rest/import-data.ts +++ b/functions/src/rest/import-data.ts @@ -7,6 +7,7 @@ import admin from 'firebase-admin'; import * as functions from 'firebase-functions'; import {constants} from 'http2'; import {CORS} from '../consts/cors-whitelist.const'; +import {dbService} from '../consts/dbService.const'; import {safeEval} from '../utils/safe-eval'; import {authenticated} from './middlewares/authenticated'; @@ -37,7 +38,6 @@ app.post('/', authenticated(), (req, res) => { async function exec() { const validator = ajvInstance.compile(JSON.parse(parsedData.schema)); const type = parsedData.type || 'csv'; - const afs = admin.firestore(); // @ts-ignore const {permissions} = req['user']; @@ -73,17 +73,14 @@ app.post('/', authenticated(), (req, res) => { acc.errors.push({index, errors: validator.errors}); } else { const {id, ...saveData} = cur; - const col = afs - .collection(parsedData.collection); - if (rowFunction) { acc.created.push(async () => { - const sd = await rowFunction(saveData, afs, req.query); - return id ? col.doc(id).set(sd) : col.add(sd) + const sd = await rowFunction(saveData, req.query); + return id ? dbService.setDocument(parsedData.collection, id, sd) : dbService.addDocument(parsedData.collection, sd); }); } else { acc.created.push(() => - id ? col.doc(id).set(saveData) : col.add(saveData) + id ? dbService.setDocument(parsedData.collection, id, saveData) : dbService.addDocument(parsedData.collection, saveData) ); } } diff --git a/functions/src/services/database/db.service.ts b/functions/src/services/database/db.service.ts new file mode 100644 index 00000000..4b605b6b --- /dev/null +++ b/functions/src/services/database/db.service.ts @@ -0,0 +1,34 @@ +export class DbService { + static getDocument(moduleId, id): Promise { + return Promise.resolve([]); + } + + static updateDocument(moduleId, id, data): Promise { + return Promise.resolve([]); + } + + deleteDocument(moduleId, id): Promise { + return Promise.resolve([]); + } + + setDocument(moduleId, id, data, merge = false): Promise { + return Promise.resolve([]); + } + + addDocument(moduleId, data): Promise { + return Promise.resolve([]); + } + + collectionInstance(name): any { + return Promise.resolve([]); + } + + getDocuments(moduleId, data, orderBy?, offset?, limit?): any { + return Promise.resolve([]); + } + + deleteCollection(db, collectionPath, batchSize) { + return Promise.resolve([]); + } + +} diff --git a/functions/src/services/database/firebase.service.ts b/functions/src/services/database/firebase.service.ts new file mode 100644 index 00000000..d2b82e4b --- /dev/null +++ b/functions/src/services/database/firebase.service.ts @@ -0,0 +1,52 @@ +import * as admin from 'firebase-admin'; +import {deleteCollection} from '../../utils/delete-collection'; +import {DbService} from './db.service'; +export class FirebaseDatabaseService extends DbService { + + getDocument(moduleId, id): Promise { + return admin.firestore().collection(moduleId).doc(id).get(); + } + + updateDocument(moduleId, id, data): Promise { + return admin.firestore().collection(moduleId).doc(id).update(data); + } + + deleteDocument(moduleId, id): Promise { + return admin.firestore().collection(moduleId).doc(id).delete(); + } + + setDocument(moduleId, id, data, merge = false): Promise { + return admin.firestore().collection(moduleId).doc(id).set(data, {merge}); + } + + addDocument(moduleId, data): Promise { + return admin.firestore().collection(moduleId).add(data); + } + + getDocuments(moduleId, data, orderBy?, offset?, limit?) { + const coll = admin.firestore().collection(moduleId) + + data.forEach((item) => { + coll.where(item.key, item.operator, item.value); + }) + + if (orderBy && orderBy.active) { + coll.orderBy(orderBy.active, orderBy.direction) + } + + if (offset) { + coll.offset(offset); + } + + if (limit) { + coll.limit(limit); + } + + return coll.get() + + } + deleteCollection(db, collectionPath, batchSize): Promise { + return deleteCollection(db, collectionPath, batchSize) + } + +} diff --git a/functions/src/services/database/mongo.service.ts b/functions/src/services/database/mongo.service.ts new file mode 100644 index 00000000..2b61bbbd --- /dev/null +++ b/functions/src/services/database/mongo.service.ts @@ -0,0 +1,43 @@ +import {DbService} from './db.service'; +import fetch from 'node-fetch'; +export class MongoDbService extends DbService { + + getDocument(moduleId, id): Promise { + fetch(`/api/document/${moduleId}/${id}`, { + method: 'GET', + }) + } + + updateDocument(moduleId, id, data): Promise { + fetch(`/api/document/${moduleId}/?field=${id}`, { + method: 'POST', + body: JSON.stringify(data), + }) + } + + deleteDocument(moduleId, id): Promise { + fetch(`/api/document/${moduleId}/${id}`, { + method: 'DELETE', + }) + } + + setDocument(moduleId, id, data, merge = false): Promise { + fetch(`/api/document/${moduleId}/`, { + method: 'POST', + body: JSON.stringify(data), + }) + } + + addDocument(moduleId, data): Promise { + fetch(`/api/document/${moduleId}/`, { + method: 'POST', + body: JSON.stringify(data), + }) + } + + getDocuments(moduleId, data, orderBy?, offset?, limit?) { + } + deleteCollection(db, collectionPath, batchSize): Promise { + } + +} diff --git a/functions/src/services/email/email.service.ts b/functions/src/services/email/email.service.ts index 82f5e464..eadcf0b3 100644 --- a/functions/src/services/email/email.service.ts +++ b/functions/src/services/email/email.service.ts @@ -3,6 +3,7 @@ import {Collections, EMAIL_LAYOUT, EMAIL_STYLE} from 'definitions'; import {firestore} from 'firebase-admin'; import * as functions from 'firebase-functions'; import {compile} from 'handlebars'; +import {dbService} from '../../consts/dbService.const'; import {ENV_CONFIG} from '../../consts/env-config.const'; import {EmailTemplate} from './email-template.interface'; @@ -27,11 +28,7 @@ export class EmailService { addedData?: any ) { - const fs = firestore(); - - const messageSnap = await fs - .doc(`automatic-emails/${templateId}`) - .get(); + const messageSnap = await dbService.getDocument('automatic-emails', templateId) const message: EmailTemplate = messageSnap.data() as any; if (!message.active) { @@ -78,16 +75,14 @@ export class EmailService { try { - const emailDoc = firestore().collection(Collections.SentEmails).doc(); - - await emailDoc.create({ + const emailDoc = await dbService.addDocument(Collections.SentEmails, { createdOn: Date.now(), to, html, subject: message.subject, templateId, ...res === true ? {status: true} : {status: false, error: res} - }); + }) sentEmail = emailDoc.id } catch (e) { diff --git a/functions/src/triggers/document-deleted.ts b/functions/src/triggers/document-deleted.ts index 3b413932..7c27472f 100644 --- a/functions/src/triggers/document-deleted.ts +++ b/functions/src/triggers/document-deleted.ts @@ -2,7 +2,9 @@ import {Storage} from '@google-cloud/storage'; import {parseTemplate} from '@jaspero/utils'; import {ModuleDeleteCollection, MODULES, ModuleSubCollection, SHARED_CONFIG} from 'definitions'; import * as admin from 'firebase-admin'; +import {database} from 'firebase-admin'; import * as functions from 'firebase-functions'; +import {dbService} from '../consts/dbService.const'; import {deleteCollection} from '../utils/delete-collection'; export const documentDeleted = functions @@ -10,7 +12,7 @@ export const documentDeleted = functions .firestore .document('{moduleId}/{documentId}') .onDelete(async (snap, context) => { - + const firestore = admin.firestore(); const {moduleId, documentId} = context.params; const moduleDoc = MODULES.find(item => item.id === moduleId); @@ -66,7 +68,7 @@ export const documentDeleted = functions subCollections.forEach( ({name, batch}: ModuleSubCollection) => { toExec.push( - deleteCollection( + dbService.deleteCollection( firestore, `${moduleId}/${documentId}/${name}`, batch || 100 @@ -82,7 +84,7 @@ export const documentDeleted = functions if (!filter) { toExec.push( - firestore.collection(name).doc(documentId).delete() + dbService.deleteDocument(name, documentId) ); return; } @@ -91,22 +93,24 @@ export const documentDeleted = functions if (typeof filters === 'string') { toExec.push( - firestore.collection(name).doc(filters).delete() + dbService.deleteDocument(name, filters) ); return; } const method = async () => { - let col: any = firestore.collection(name); - + let col; for (const f of filters) { - col = col.where(f.key, f.operator, f.value); + col = await dbService.getDocuments(name, { + key: f.key, + operator: f.operator, + value: f.value + }); } - const {docs} = await col.get(); - + const docs = col.docs; await Promise.all( - docs.map(doc => doc.ref.delete()) + docs.map(doc => dbService.deleteDocument(name, doc.id)) ); } diff --git a/functions/src/triggers/document-write.ts b/functions/src/triggers/document-write.ts index 879ac3db..10aba2b1 100644 --- a/functions/src/triggers/document-write.ts +++ b/functions/src/triggers/document-write.ts @@ -2,6 +2,7 @@ import {random} from '@jaspero/utils'; import {relevantIndex} from 'adv-firestore-functions'; import {Collections, MODULES, SHARED_CONFIG} from 'definitions'; import * as functions from 'firebase-functions'; +import {dbService} from '../consts/dbService.const'; export const documentWrite = functions .region(SHARED_CONFIG.cloudRegion) @@ -44,7 +45,7 @@ export const documentWrite = functions `${module.metadata?.docIdPrefix || module.id.slice(0, 2)}-${random.string(module.metadata?.docIdSize || 12)}` ) - await change.after.ref.collection(Collections.History).doc(historyId).set({ + await dbService.setDocument(Collections.History, historyId, { type: change.before.exists ? (change.after.exists ? 'update' : 'delete') : 'create', createdOn: Date.now(), ...change.before.exists && {before: change.before.data()}, diff --git a/functions/src/triggers/file-created.ts b/functions/src/triggers/file-created.ts index 4a30607d..c0e0f49f 100644 --- a/functions/src/triggers/file-created.ts +++ b/functions/src/triggers/file-created.ts @@ -8,6 +8,7 @@ import {tmpdir} from 'os'; import {basename, dirname, join} from 'path'; import sharp from 'sharp'; import {promisify} from 'util'; +import {dbService} from '../consts/dbService.const'; import {unpackGenerateImageString} from '../utils/unpack-generate-image-string'; export const fileCreated = functions @@ -18,7 +19,6 @@ export const fileCreated = functions }) .storage.object() .onFinalize(async ({bucket, name, contentType, metadata, timeCreated, size}: ObjectMetadata) => { - const storageColl = firestore().collection('storage'); const fileName = basename(name); const dirName = dirname(name); const folders = {}; @@ -35,22 +35,30 @@ export const fileCreated = functions createdOn: new Date(timeCreated).getTime(), size: Number(size || 0) }; - const previousStorageDocument = await storageColl - .where('name', '==', storageDocument.name) - .where('path', '==', storageDocument.path).get().then(snapshot => { - if (snapshot.empty) { - return null; - } - return { - id: snapshot.docs[0].id, - ...snapshot.docs[0].data() - }; - }); + const previousStorageDocument = await dbService.getDocuments('storage', [ + { + key: 'name', + operator: '==', + value: storageDocument.name + }, { + key: 'path', + operator: '==', + value: storageDocument.path + } + ]).then(snapshot => { + if (snapshot.empty) { + return null; + } + return { + id: snapshot.docs[0].id, + ...snapshot.docs[0].data() + }; + }); if (previousStorageDocument) { - await storageColl.doc(previousStorageDocument.id).set(storageDocument, {merge: true}); + await dbService.setDocument('storage', previousStorageDocument.id, storageDocument, true); } else { - await storageColl.add(storageDocument); + await dbService.addDocument('storage', storageDocument); } /** @@ -83,12 +91,13 @@ export const fileCreated = functions } for (const [_, folder] of Object.entries(folders)) { - const previousFolder = await storageColl - .where('name', '==', (folder as any).name) - .where('path', '==', (folder as any).path).get(); + const previousFolder = await dbService.getDocuments('storage', [ + {key: 'name', operator: '==', value: (folder as any).name}, + {key: 'path', operator: '==', value: (folder as any).path} + ]) if (previousFolder.empty) { - await storageColl.add(folder); + await dbService.addDocument('storage', folder); } } diff --git a/functions/src/triggers/file-deleted.ts b/functions/src/triggers/file-deleted.ts index 9bfe4d22..e4f8f8c6 100644 --- a/functions/src/triggers/file-deleted.ts +++ b/functions/src/triggers/file-deleted.ts @@ -4,6 +4,7 @@ import {firestore} from 'firebase-admin'; import * as functions from 'firebase-functions'; import {ObjectMetadata} from 'firebase-functions/lib/providers/storage'; import {basename, dirname, join} from 'path'; +import {dbService} from '../consts/dbService.const'; import {unpackGenerateImageString} from '../utils/unpack-generate-image-string'; export const fileDeleted = functions @@ -17,16 +18,27 @@ export const fileDeleted = functions /** * Storage */ - const storageDocumentRef = await firestore() - .collection('storage') - .where('name', '==', fileName) - .where('path', '==', dirName).get().then(snapshot => { - if (snapshot.empty) { - return null; - } - return snapshot.docs[0].ref; - }); + + + const storageDocumentRef = await dbService.getDocument('storage', [ + { + key: 'name', + operator: '==', + value: fileName + }, + { + key: 'path', + operator: '==', + value: dirName + } + ]).then(snapshot => { + if (snapshot.empty) { + return null; + } + + return snapshot.docs[0].ref; + }); if (storageDocumentRef) { await storageDocumentRef.delete(); @@ -59,13 +71,13 @@ export const fileDeleted = functions if (filePrefix || width || height) { try { await storage.file(lookUpName(filePrefix)).delete(); - } catch (e) {} + } catch (e) { } } if (webpVersion) { try { await storage.file(webpLookUp(filePrefix)).delete(); - } catch (e) {} + } catch (e) { } } } } diff --git a/functions/src/triggers/file-metadata-updated.ts b/functions/src/triggers/file-metadata-updated.ts index 215ba445..6ddb6c0c 100644 --- a/functions/src/triggers/file-metadata-updated.ts +++ b/functions/src/triggers/file-metadata-updated.ts @@ -3,6 +3,7 @@ import {firestore} from 'firebase-admin'; import * as functions from 'firebase-functions'; import {ObjectMetadata} from 'firebase-functions/lib/providers/storage'; import {basename, dirname} from 'path'; +import {dbService} from '../consts/dbService.const'; export const fileMetadataUpdated = functions .region(SHARED_CONFIG.cloudRegion) @@ -14,22 +15,31 @@ export const fileMetadataUpdated = functions .onMetadataUpdate(async ({name, metadata}: ObjectMetadata) => { const fileName = basename(name); const filePath = dirname(name); - const storageDocument = await firestore() - .collection('storage') - .where('name', '==', fileName) - .where('path', '==', filePath).get().then(snapshot => { - if (snapshot.empty) { - return null; - } - return { - id: snapshot.docs[0].id, - ...snapshot.docs[0].data() - }; - }); + + + + const storageDocument = await dbService.getDocument('storage', [ + { + key: 'name', + operator: '==', + value: fileName + }, + { + key: 'path', + operator: '==', + value: filePath + } + ]).then(snapshot => { + if (snapshot.empty) { + return null; + } + return { + id: snapshot.docs[0].id, + ...snapshot.docs[0].data() + }; + }); if (storageDocument) { - await firestore().collection('storage').doc(storageDocument.id).set({ - metadata - }, {merge: true}); + await dbService.setDocument('storage', storageDocument.id, {metadata}, true); } }); diff --git a/functions/src/triggers/role-updated.ts b/functions/src/triggers/role-updated.ts index 55949158..f7ae3792 100644 --- a/functions/src/triggers/role-updated.ts +++ b/functions/src/triggers/role-updated.ts @@ -1,6 +1,7 @@ import {Collections, SHARED_CONFIG, compileRules} from 'definitions'; import {firestore} from 'firebase-admin'; import * as functions from 'firebase-functions'; +import {dbService} from '../consts/dbService.const'; export const roleUpdated = functions .region(SHARED_CONFIG.cloudRegion) @@ -9,7 +10,6 @@ export const roleUpdated = functions .onUpdate(async change => { const after: any = change.after.data(); const before: any = change.before.data(); - const fs = firestore(); const keys = ['get', 'list', 'create', 'update', 'delete']; const permissionsKeys = new Set(); @@ -21,29 +21,31 @@ export const roleUpdated = functions permissionsKeys.add(key); } - const diff = Array.from(permissionsKeys).some((key) => { - if (before[key] === undefined) { - return true; - } + const diff = Array.from(permissionsKeys).some((key) => { + if (before[key] === undefined) { + return true; + } - for (const k of keys) { - if (after.permissions?.[key]?.[k] !== before.permissions?.[key]?.[k]) { - return true; - } - } + for (const k of keys) { + if (after.permissions?.[key]?.[k] !== before.permissions?.[key]?.[k]) { + return true; + } + } - return false; - }); + return false; + }); if (diff) { - - const {docs} = await fs.collection(Collections.Users) - .where('role', '==', change.after.id) - .get(); + + const {docs} = await dbService.getDocuments(Collections.Users, { + key: 'role', + operator: '==', + value: change.after.id + }) await Promise.allSettled( - docs.map(doc => - doc.ref.collection('authorization').doc('permissions').set(after.permissions) + docs.map(() => + dbService.setDocument('authorization', 'permissions', after.permissions) ) ); } diff --git a/functions/src/triggers/storage-item-deleted.ts b/functions/src/triggers/storage-item-deleted.ts index b01615bc..2fc00979 100644 --- a/functions/src/triggers/storage-item-deleted.ts +++ b/functions/src/triggers/storage-item-deleted.ts @@ -2,14 +2,13 @@ import {SHARED_CONFIG} from 'definitions'; import * as admin from 'firebase-admin'; import * as functions from 'firebase-functions'; import {Storage} from '@google-cloud/storage'; +import {dbService} from '../consts/dbService.const'; export const storageItemDeleted = functions .region(SHARED_CONFIG.cloudRegion) .firestore .document('storage/{documentId}') .onDelete(async (snap) => { - - const storageColl = admin.firestore().collection('storage'); const storage = new Storage().bucket(admin.storage().bucket().name); const item = snap.data(); @@ -17,10 +16,18 @@ export const storageItemDeleted = functions const path = item.path === '.' ? item.name : `${item.path}/${item.name}`; const end = path.replace(/.$/, c => String.fromCharCode(c.charCodeAt(0) + 1)); - const {docs} = await storageColl - .where('path', '>=', path) - .where('path', '<', end) - .get(); + const {docs} = await dbService.getDocuments('storage', [ + { + field: 'path', + operator: '>=', + value: path + }, + { + field: 'path', + operator: '<', + value: end + } + ]); if (docs.length) { const results = await Promise.allSettled( @@ -32,7 +39,7 @@ export const storageItemDeleted = functions return storage.file(filePath).delete(); } - return doc.ref.delete() + return dbService.deleteDocument('storage', doc.id); }) ); diff --git a/functions/src/triggers/user-created.ts b/functions/src/triggers/user-created.ts index 3746b1fc..661a1f16 100644 --- a/functions/src/triggers/user-created.ts +++ b/functions/src/triggers/user-created.ts @@ -1,9 +1,9 @@ -import {firestore} from 'firebase-admin'; +import {Collections, EmailTemplates, SHARED_CONFIG} from 'definitions'; import * as functions from 'firebase-functions'; +import {dbService} from '../consts/dbService.const'; import {STATIC_CONFIG} from '../consts/static-config.const'; import {EmailService} from '../services/email/email.service'; import {createJwt} from '../utils/create-jwt'; -import {SHARED_CONFIG, Collections, EmailTemplates} from 'definitions'; export const userCreated = functions .region(SHARED_CONFIG.cloudRegion) @@ -15,15 +15,7 @@ export const userCreated = functions return; } - const fs = firestore(); - - const inviteRef = await fs - .collection(Collections.UserInvites) - .doc(user.email as string) - .get(); - const userRef = fs - .collection(Collections.Users) - .doc(user.uid); + const inviteRef = await dbService.getDocument(Collections.UserInvites, user.email as string); const role: { role: string; @@ -35,19 +27,14 @@ export const userCreated = functions if (role) { - const roleRef = await fs.collection(Collections.Roles).doc(role.role).get(); + const roleRef = await dbService.getDocument(Collections.Roles, role.role); await Promise.all([ - userRef - .collection('authorization') - .doc('permissions') - .set(roleRef.data()?.permissions || {}), - inviteRef - .ref - .update({ - accepted: true, - acceptedOn: Date.now() - }) + dbService.setDocument('authorization', 'permissions', roleRef.data()?.permissions || {}), + dbService.updateDocument(Collections.UserInvites, user.email, { + accepted: true, + acceptedOn: Date.now() + }) ]); if (role.sendInvite) { @@ -62,18 +49,17 @@ export const userCreated = functions } } - await userRef - .set({ - createdOn: Date.now(), - email: user.email, - active: true, - ...role ? { - role: role.role, - requireReset: role.requireReset || false, - ...role.createdBy && {invitedBy: role.createdBy} - } : { - role: '', - requireReset: false - } - }); + await dbService.setDocument(Collections.Users, user.uid, { + createdOn: Date.now(), + email: user.email, + active: true, + ...role ? { + role: role.role, + requireReset: role.requireReset || false, + ...role.createdBy && {invitedBy: role.createdBy} + } : { + role: '', + requireReset: false + } + }); }); diff --git a/functions/src/triggers/user-deleted.ts b/functions/src/triggers/user-deleted.ts index e1566734..8f2e24fb 100644 --- a/functions/src/triggers/user-deleted.ts +++ b/functions/src/triggers/user-deleted.ts @@ -1,6 +1,6 @@ -import {firestore} from 'firebase-admin'; +import {Collections, SHARED_CONFIG} from 'definitions'; import * as functions from 'firebase-functions'; -import {SHARED_CONFIG, Collections} from 'definitions'; +import {dbService} from '../consts/dbService.const'; export const userDeleted = functions .region(SHARED_CONFIG.cloudRegion) @@ -8,9 +8,6 @@ export const userDeleted = functions .user() .onDelete(async user => { try { - await firestore() - .collection(Collections.Users) - .doc(user.uid) - .delete(); - } catch (e) {} + await dbService.deleteDocument(Collections.Users, user.uid); + } catch (e) { } }); diff --git a/functions/src/triggers/user-document-updated.ts b/functions/src/triggers/user-document-updated.ts index 0ae93bf3..dede3118 100644 --- a/functions/src/triggers/user-document-updated.ts +++ b/functions/src/triggers/user-document-updated.ts @@ -1,6 +1,7 @@ import {Collections, SHARED_CONFIG} from 'definitions'; import {auth, firestore} from 'firebase-admin'; import * as functions from 'firebase-functions'; +import {dbService} from '../consts/dbService.const'; /** * Updates users custom claims when @@ -14,18 +15,17 @@ export const userDocumentUpdated = functions const after: any = change.after.data(); const before: any = change.before.data(); const ah = auth(); - const fs = firestore(); if (after.role !== before.role) { - const roleRef = await fs.collection(Collections.Roles).doc(after.role).get(); + const roleRef = await dbService.getDocument(Collections.Roles, after.role); await Promise.all([ ah.setCustomUserClaims( change.after.id, {role: after.role} ), - change.after.ref.collection('authorization').doc('permissions').set(roleRef.data()?.permissions || {}) + dbService.updateDocument('authorization', 'permissions', roleRef.data()?.permissions || {}), ]) }