Skip to content

Commit

Permalink
feat(api): migrate to v2 functions and triggers
Browse files Browse the repository at this point in the history
chore: replace v1 auth package with identity

refactor: replace all v1 imports with v2
  • Loading branch information
steveoh committed Feb 6, 2025
1 parent ce5d3b5 commit 532ef1c
Show file tree
Hide file tree
Showing 15 changed files with 83 additions and 64 deletions.
2 changes: 1 addition & 1 deletion functions/auth/onCreate.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { logger } from 'firebase-functions/v1';
import { logger } from 'firebase-functions/v2';
import { getFirestore } from 'firebase-admin/firestore';

const db = getFirestore();
Expand Down
2 changes: 1 addition & 1 deletion functions/database/submissions/onCancelSubmission.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { logger } from 'firebase-functions/v1';
import { logger } from 'firebase-functions/v2';
import { getFirestore } from 'firebase-admin/firestore';
import { safelyInitializeApp } from '../../firebase.js';
import { getContactsToNotify, notify } from '../../emailHelpers.js';
Expand Down
2 changes: 1 addition & 1 deletion functions/database/submissions/onCreateAddLocation.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { logger } from 'firebase-functions/v1';
import { logger } from 'firebase-functions/v2';
import { getFirestore, GeoPoint } from 'firebase-admin/firestore';
import ky from 'ky';
import { safelyInitializeApp } from '../../firebase.js';
Expand Down
2 changes: 1 addition & 1 deletion functions/database/submissions/onCreateMonument.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { logger } from 'firebase-functions/v1';
import { logger } from 'firebase-functions/v2';
import { getFirestore } from 'firebase-admin/firestore';
import { getStorage } from 'firebase-admin/storage';
import {
Expand Down
2 changes: 1 addition & 1 deletion functions/emailHelpers.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import client from '@sendgrid/client';
import { Base64Encode } from 'base64-stream';
import { logger } from 'firebase-functions/v1';
import { logger } from 'firebase-functions/v2';

export const notify = (key, template) => {
if (process.env.NODE_ENV !== 'production') {
Expand Down
2 changes: 1 addition & 1 deletion functions/https/getMyContent.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { logger } from 'firebase-functions/v1';
import { logger } from 'firebase-functions/v2';
import { getFirestore } from 'firebase-admin/firestore';
import { graphicConverter, myContentConverter } from '../converters.js';
import { safelyInitializeApp } from '../firebase.js';
Expand Down
2 changes: 1 addition & 1 deletion functions/https/getMyProfile.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { https, logger } from 'firebase-functions/v1';
import { https, logger } from 'firebase-functions/v2';
import { getFirestore } from 'firebase-admin/firestore';
import { safelyInitializeApp } from '../firebase.js';

Expand Down
2 changes: 1 addition & 1 deletion functions/https/postCancelCorner.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { https, logger } from 'firebase-functions/v1';
import { https, logger } from 'firebase-functions/v2';
import { getFirestore } from 'firebase-admin/firestore';
import { getStorage } from 'firebase-admin/storage';
import { safelyInitializeApp } from '../firebase.js';
Expand Down
2 changes: 1 addition & 1 deletion functions/https/postCorner.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { https, logger } from 'firebase-functions/v1';
import { https, logger } from 'firebase-functions/v2';
import { getFirestore, GeoPoint } from 'firebase-admin/firestore';
import { parseDms } from 'dms-conversion';
import * as schemas from '../shared/cornerSubmission/Schema.js';
Expand Down
2 changes: 1 addition & 1 deletion functions/https/postGeneratePreview.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { getFirestore } from 'firebase-admin/firestore';
import { getStorage } from 'firebase-admin/storage';
import { https, logger } from 'firebase-functions/v1';
import { https, logger } from 'firebase-functions/v2';
import {
createPdfDocument,
generatePdfDefinition,
Expand Down
2 changes: 1 addition & 1 deletion functions/https/postProfile.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { https, logger } from 'firebase-functions/v1';
import { https, logger } from 'firebase-functions/v2';
import { getFirestore } from 'firebase-admin/firestore';
import { profileSchema } from '../shared/cornerSubmission/Schema.js';
import { safelyInitializeApp } from '../firebase.js';
Expand Down
119 changes: 69 additions & 50 deletions functions/index.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
import { logger } from 'firebase-functions/v2';
import {
auth,
logger,
firestore,
runWith,
storage,
} from 'firebase-functions/v1'; // v2 does not support auth triggers as of july/23
onDocumentUpdated,
onDocumentCreated,
onDocumentDeleted,
} from 'firebase-functions/v2/firestore';
import {
onObjectFinalized,
onObjectDeleted,
} from 'firebase-functions/v2/storage';
import { beforeUserCreated } from 'firebase-functions/v2/identity';
import { https } from 'firebase-functions/v2';
import { safelyInitializeApp } from './firebase.js';
import { defineSecret } from 'firebase-functions/params';
import { safelyInitializeApp } from './firebase.js';

const cors = [
/localhost/,
/ut-dts-agrc-web-api-dev-self-service\.web\.app$/,
/ut-dts-agrc-plss-dev\.web\.app$/,
/plss\.(?:dev\.)?utah\.gov/,
];

Expand All @@ -35,27 +39,32 @@ const config = safelyInitializeApp();
const sendGridApiKey = defineSecret('SENDGRID_API_KEY');

// Firebase authentication
export const onCreateUser = auth.user().onCreate(async (user) => {
export const onCreateUser = beforeUserCreated(async (event) => {
logger.debug('[auth::user::onCreate] importing createUser');
const createUser = (await import('./auth/onCreate.js')).createUser;

const result = await createUser(user);
const result = await createUser(event.data);

logger.debug('[auth::user::onCreate]', result);

return result;
});

// Firestore triggers
export const onCancelSubmission = runWith({ secrets: [sendGridApiKey] })
.firestore.document('/submissions/{docId}')
.onUpdate(async (change, context) => {
const current = change.after.get('status.user.cancelled');
const previous = change.before.get('status.user.cancelled');
export const onCancelSubmission = onDocumentUpdated(
{
document: '/submissions/{docId}',
secrets: [sendGridApiKey],
},
async (event) => {
const after = event.data.after.data();
const current = after.status.user.cancelled;
const before = event.data.before.data();
const previous = before.status.user.cancelled;

logger.debug(
'[database::submissions::onCancel] trigger: submission document updated',
context.params.docId,
event.params.docId,
{
structuredData: true,
},
Expand Down Expand Up @@ -99,17 +108,18 @@ export const onCancelSubmission = runWith({ secrets: [sendGridApiKey] })
structuredData: true,
});

const result = await cancelSubmission(change.before);
const result = await cancelSubmission(event.data.before);

logger.debug('[database::submissions::onCancel]', result);

return result;
});
},
);

export const onCreateAddLocation = firestore
.document('/submissions/{docId}')
.onCreate(async (snap, context) => {
const record = snap.data();
export const onCreateAddLocation = onDocumentCreated(
'/submissions/{docId}',
async (event) => {
const record = event.data.data();

if (record.type === 'new') {
logger.debug(
Expand Down Expand Up @@ -143,23 +153,27 @@ export const onCreateAddLocation = firestore
);

const result = await createAddLocation(
context.params.docId,
event.params.docId,
record.blm_point_id,
);

logger.debug('[database::submissions::onCreateAddLocation]', result);

return result;
});
},
);

export const onCreateMonumentRecord = runWith({ memory: '512MB' })
.firestore.document('/submissions/{docId}')
.onCreate(async (snap, context) => {
const record = snap.data();
export const onCreateMonumentRecord = onDocumentCreated(
{
document: '/submissions/{docId}',
memory: '512MB',
},
async (event) => {
const record = event.data.data();

logger.debug(
'[database::submissions::onCreateMonumentRecord] trigger: new submission for',
context.params.docId,
event.params.docId,
record.type,
{
structuredData: true,
Expand All @@ -173,21 +187,22 @@ export const onCreateMonumentRecord = runWith({ memory: '512MB' })
await import('./database/submissions/onCreateMonument.js')
).createMonumentRecord;

const result = await createMonumentRecord(record, context.params.docId);
const result = await createMonumentRecord(record, event.params.docId);

logger.debug('[database::submissions::onCreateMonumentRecord]', result);

return result;
});
},
);

export const onCleanUpPointAttachments = firestore
.document('/submitters/{userId}/points/{docId}')
.onDelete(async (snap, context) => {
const record = snap.data();
export const onCleanUpPointAttachments = onDocumentDeleted(
'/submitters/{userId}/points/{docId}',
async (event) => {
const record = event.data.data();

logger.debug(
'[database::submitters::onCleanUpPointAttachments] trigger: point deleted',
context,
event,
record,
{
structuredData: true,
Expand Down Expand Up @@ -222,7 +237,8 @@ export const onCleanUpPointAttachments = firestore
logger.debug('[database::submissions::onCleanUpPointAttachments]', result);

return result;
});
},
);

// HTTPS triggers
export const getMyContent = https.onCall({ cors }, async (request) => {
Expand Down Expand Up @@ -289,7 +305,7 @@ export const postCorner = https.onCall({ cors }, async ({ data, auth }) => {
});

export const postGeneratePreview = https.onCall(
{ cors, memory: '512MB' },
{ cors, memory: '512MiB' },
async ({ data, auth }) => {
logger.debug('[https::postGeneratePreview] starting');

Expand Down Expand Up @@ -335,11 +351,13 @@ export const postProfile = https.onCall(async ({ data, auth }) => {
});

// Storage triggers
export const onCreateNotify = runWith({ secrets: [sendGridApiKey] })
.storage.bucket(config.storageBucket)
.object()
.onFinalize(async (object) => {
const { name, contentType, bucket: fileBucket } = object;
export const onCreateNotify = onObjectFinalized(
{
secrets: [sendGridApiKey],
bucket: config.storageBucket,
},
async (event) => {
const { name, contentType, bucket: fileBucket } = event.data;

logger.debug(
'[storage::finalize::onCreateNotify] trigger: storage object created',
Expand Down Expand Up @@ -382,13 +400,13 @@ export const onCreateNotify = runWith({ secrets: [sendGridApiKey] })
logger.debug('[storage::finalize::onCreateNotify]', result);

return result;
});
},
);

export const syncProfileImage = storage
.bucket(config.storageBucket)
.object()
.onDelete(async (object) => {
const { name } = object;
export const syncProfileImage = onObjectDeleted(
{ bucket: config.storageBucket },
async (event) => {
const { name } = event.data;

logger.debug(
'[storage::onDelete::syncProfileImage] trigger: storage object deleted',
Expand Down Expand Up @@ -421,4 +439,5 @@ export const syncProfileImage = storage
logger.debug('[storage::onDelete::syncProfileImage]', result);

return result;
});
},
);
2 changes: 1 addition & 1 deletion functions/pdfHelpers.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Base64Encode } from 'base64-stream';
import { Buffer } from 'buffer';
import { logger } from 'firebase-functions/v1';
import { logger } from 'firebase-functions/v2';
import path from 'path';
import { PDFDocument } from 'pdf-lib';
import PdfPrinter from 'pdfmake';
Expand Down
2 changes: 1 addition & 1 deletion functions/storage/onCreateNotify.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { logger } from 'firebase-functions/v1';
import { logger } from 'firebase-functions/v2';
import { getStorage } from 'firebase-admin/storage';
import { getFirestore } from 'firebase-admin/firestore';
import { safelyInitializeApp } from '../firebase.js';
Expand Down
2 changes: 1 addition & 1 deletion functions/storage/onDelete.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { https, logger } from 'firebase-functions/v1';
import { https, logger } from 'firebase-functions/v2';
import { getFirestore } from 'firebase-admin/firestore';
import { safelyInitializeApp } from '../firebase.js';

Expand Down

0 comments on commit 532ef1c

Please sign in to comment.