From 7f77d8a86ae0dd3ea9b9d1b468d53929b1f4c6a5 Mon Sep 17 00:00:00 2001 From: AYM1607 Date: Sat, 13 Apr 2019 18:23:45 -0500 Subject: [PATCH] Finished auto increment firebase function --- functions/package.json | 2 +- functions/src/generate_thumb.ts | 1 + functions/src/index.ts | 4 +- functions/src/pending_tasks_updater.ts | 91 ++++++++++++++++++++++++++ 4 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 functions/src/pending_tasks_updater.ts diff --git a/functions/package.json b/functions/package.json index 214ce6f..d50ac79 100644 --- a/functions/package.json +++ b/functions/package.json @@ -15,7 +15,7 @@ "@types/fs-extra": "^5.0.5", "@types/sharp": "^0.22.1", "firebase-admin": "~7.0.0", - "firebase-functions": "^2.2.0", + "firebase-functions": "^2.2.1", "fs-extra": "^7.0.1", "sharp": "^0.22.0" }, diff --git a/functions/src/generate_thumb.ts b/functions/src/generate_thumb.ts index 57c7768..9efec07 100644 --- a/functions/src/generate_thumb.ts +++ b/functions/src/generate_thumb.ts @@ -9,6 +9,7 @@ import { join, dirname } from 'path'; import * as sharp from 'sharp'; import * as fs from 'fs-extra'; +/// Creates a thumbnail for every image that gets uploaded to the storage bucket. export const generateThumb: functions.CloudFunction = functions.storage.object().onFinalize(async object => { // Find the bucket where the uploaded file resides. const bucket = gcs.bucket(object.bucket); diff --git a/functions/src/index.ts b/functions/src/index.ts index 9675750..a955bd4 100644 --- a/functions/src/index.ts +++ b/functions/src/index.ts @@ -1,5 +1,7 @@ import * as functions from 'firebase-functions'; import { generateThumb } from './generate_thumb'; +import { pendingTasksUpdater } from './pending_tasks_updater'; -export const generate_thumb: functions.CloudFunction = generateThumb; \ No newline at end of file +export const generate_thumb: functions.CloudFunction = generateThumb; +export const pending_tasks_updater: functions.CloudFunction> = pendingTasksUpdater; \ No newline at end of file diff --git a/functions/src/pending_tasks_updater.ts b/functions/src/pending_tasks_updater.ts new file mode 100644 index 0000000..842ace1 --- /dev/null +++ b/functions/src/pending_tasks_updater.ts @@ -0,0 +1,91 @@ +import * as functions from 'firebase-functions'; +import * as admin from 'firebase-admin'; +import { DocumentSnapshot } from 'firebase-functions/lib/providers/firestore'; +import { DocumentReference } from '@google-cloud/firestore'; + +admin.initializeApp(); + + +const incrementValue = admin.firestore.FieldValue.increment(1); +const decrementValue = admin.firestore.FieldValue.increment(-1); +const db = admin.firestore(); + +let getUserReference = async (taskSnapShot: DocumentSnapshot) => { + const querySnapshot = await db.collection('users').where('username', '==', taskSnapShot.get('ownerUsername')).get() + return querySnapshot.docs[0].ref; +} + +let getEventReference = async (taskSnapshot: DocumentSnapshot, userReference: DocumentReference) => { + const querySnapshot = await userReference.collection('events').where('name', '==', taskSnapshot.get('event')).get(); + return querySnapshot.docs[0].ref; +} + +let incrementFromPriority = ( + priority: number, + eventReference: DocumentReference, + userReference: DocumentReference, + value: FirebaseFirestore.FieldValue, +) => { + let userFieldName: string = ''; + let eventFieldName: string = ''; + + switch (priority) { + case 0: + userFieldName = 'pendingLow'; + eventFieldName = 'lowPriority'; + break; + case 1: + userFieldName = 'pendingMedium'; + eventFieldName = 'mediumPriority'; + break; + case 2: + userFieldName = 'pendingHigh'; + eventFieldName = 'highPriority'; + break; + } + + eventReference.update({ [eventFieldName]: value }); + userReference.update({ [userFieldName]: value }); +} + +export const pendingTasksUpdater: functions.CloudFunction> = functions.firestore + .document('tasks/{taskId}') + .onWrite(async (change, _) => { + const before: DocumentSnapshot = change.before; + const after: DocumentSnapshot = change.after; + let action: string; + let userDocument: DocumentReference; + let eventDocument: DocumentReference; + let eventDocumentBefore: DocumentReference | null; + + if (change.after.exists && change.before.exists) { + userDocument = await getUserReference(after); + eventDocumentBefore = await getEventReference(before, userDocument); + eventDocument = await getEventReference(after, userDocument); + action = 'update'; + } else if (!change.before.exists) { + userDocument = await getUserReference(after); + eventDocument = await getEventReference(after, userDocument); + action = 'create'; + } else { + userDocument = await getUserReference(before); + eventDocument = await getEventReference(before, userDocument); + action = 'delete'; + } + + switch (action) { + case 'create': + incrementFromPriority(after.get('priority'), eventDocument, userDocument, incrementValue); + break; + case 'delete': + incrementFromPriority(before.get('priority'), eventDocument, userDocument, decrementValue); + break; + case 'update': + incrementFromPriority(before.get('priority'), eventDocumentBefore!, userDocument, decrementValue); + incrementFromPriority(after.get('priority'), eventDocument, userDocument, incrementValue); + break; + } + + console.log('Successfully updated user and event due to task update'); + return true; + }); \ No newline at end of file