Finished auto increment firebase function
This commit is contained in:
parent
a8dacb06cd
commit
7f77d8a86a
4 changed files with 96 additions and 2 deletions
|
|
@ -15,7 +15,7 @@
|
||||||
"@types/fs-extra": "^5.0.5",
|
"@types/fs-extra": "^5.0.5",
|
||||||
"@types/sharp": "^0.22.1",
|
"@types/sharp": "^0.22.1",
|
||||||
"firebase-admin": "~7.0.0",
|
"firebase-admin": "~7.0.0",
|
||||||
"firebase-functions": "^2.2.0",
|
"firebase-functions": "^2.2.1",
|
||||||
"fs-extra": "^7.0.1",
|
"fs-extra": "^7.0.1",
|
||||||
"sharp": "^0.22.0"
|
"sharp": "^0.22.0"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import { join, dirname } from 'path';
|
||||||
import * as sharp from 'sharp';
|
import * as sharp from 'sharp';
|
||||||
import * as fs from 'fs-extra';
|
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.ObjectMetadata> = functions.storage.object().onFinalize(async object => {
|
export const generateThumb: functions.CloudFunction<functions.storage.ObjectMetadata> = functions.storage.object().onFinalize(async object => {
|
||||||
// Find the bucket where the uploaded file resides.
|
// Find the bucket where the uploaded file resides.
|
||||||
const bucket = gcs.bucket(object.bucket);
|
const bucket = gcs.bucket(object.bucket);
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
import * as functions from 'firebase-functions';
|
import * as functions from 'firebase-functions';
|
||||||
|
|
||||||
import { generateThumb } from './generate_thumb';
|
import { generateThumb } from './generate_thumb';
|
||||||
|
import { pendingTasksUpdater } from './pending_tasks_updater';
|
||||||
|
|
||||||
export const generate_thumb: functions.CloudFunction<functions.storage.ObjectMetadata> = generateThumb;
|
export const generate_thumb: functions.CloudFunction<functions.storage.ObjectMetadata> = generateThumb;
|
||||||
|
export const pending_tasks_updater: functions.CloudFunction<functions.Change<FirebaseFirestore.DocumentSnapshot>> = pendingTasksUpdater;
|
||||||
91
functions/src/pending_tasks_updater.ts
Normal file
91
functions/src/pending_tasks_updater.ts
Normal file
|
|
@ -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.Change<FirebaseFirestore.DocumentSnapshot>> = 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;
|
||||||
|
});
|
||||||
Loading…
Add table
Add a link
Reference in a new issue