Files
2025-01-11 16:34:29 +01:00

54 KiB

Firebase example

This is a sample project for showing passkit-generator working on a Firebase Cloud Function.

Cloud Functions are Google a paid service that run your code like a unit. They take some files in input and output something (in this case the compiled Apple Wallet Pass).

Please note that this example offers just one endpoint example.

Setting up

Install the dependencies from wherever path you are with pnpm install. Installing the dependencies will link passkit-generator in the parent workspace, so to reflect any change, it will be enough to build passkit-generator and restart the example.

firebase-tools (which are suggested to get installed globally) are installed locally too. To access them, prefix firebase command with pnpm, just like done in package.json.

$ pnpm firebase <command>

Proceed creating your cloud function on firebase portal like shown in Firebase official documentation, step 1. In order to run this example, you don't need to follow the other steps.

Login with your code on firebase. You'll be redirected on a web page to complete login.

$ pnpm firebase login

You don't need to run pnpm firebase init as the project is already initialized.

Pick your project name and put it inside .firebaserc at project.default.

Remember: once you setup login, your credentials and used functions will be stored inside in your user root path. On MacOS it is ~/.config/configstore/firebase-tools.json. You might want to delete it to clear the cache of functions. Deleting it will log you out.

Setting up the storage

Go to "Storage" on the web page. You'll be provided with an URI that starts by gs://. Take the part right after the protocol and put it in the file src/startData.json, at the key FIREBASE_BUCKET_ADDR.

Create a new folder logos (like in the screenshot) and upload in there one of the model logo files (called logo.png).

Secrets and certificates

In order to show the example, you'll have to set your certificates data in the .env file, which will get deployed along with the Firebase. In production, it is suggested to have either different .env files or set these data as secrets.

Open .env file and fill the fields. Please remember your should put in there the contents and not the paths.

Running locally

To run the firebase cloud function emulator, use this command:

$ pnpm serve

You will be provided with your local function URL, you can ping (POST Request) with a body like the following one. Keep reading for the parameter reference.

{
	"passModel": "exampleBooking",
	"serialNumber": "unnannasyg1341",
	"transitType": "PKTransitTypeAir",
	"textColor": "rgb(255,255,255)",
	"backgroundColor": "rgb(10,10,10)",
	"labelColor": "rgb(255,255,255)",
	"logoFile": "logo.png",
	"header": [
		{
			"label": "When",
			"value": "10/10/2023"
		}
	],
	"primary": [
		{
			"label": "Napoli Capodichino",
			"value": "NAP"
		},
		{
			"label": "Amsterdam Schiphol",
			"value": "AMS"
		}
	]
}

Deployment

In order to deploy your function, run

$ pnpm deploy

While deploying you might/will incur into several error. While CLI doesn't provide you with very much details, it will create a file in functions/firebase-debug.log which will provide very much details on what gone wrong.

For some errors, you might want to try again to deploy without changing anything after a while: it might happen things are still getting created on the backend and not everything is yet synchronized on the backend.

During creation test, some errors came up that didn't came up later, even with a clean situation. If you incur in any problem with this example, please open an issue on passkit-generator repo.

Notes on deployed files

Within this examples, models folder are set to be deployed with your function files (see firebase.json, predeploy and postdeploy scripts). This inherently brings to a higher upload memory and higher deploy times. It might, also, bring to higher cold-startup times.

You might want to consider other options for uploading your models or, perhaps, you might want to use a Buffer Model. If you choose to use Firebase Storage, please remember that it has a free bandwith quota, after which your are going to pay for calls. It is all a trade-off.

Parameters reference

Function accept an application/json body. These are the supported parameters:

Name Type Required Description
passModel string YES Name of the model. Must be one of the examples/models folder. .pass extension is optional
serialNumber string YES Serial number of the pass. Required for generating a valid and unique pass
logoText string NO
textColor string YES The foregroundColor of pass.json
backgroundColor string YES The backgroundColor of pass.json
labelColor string YES The labelColor of pass.json
relevantDate string NO
expiryDate string NO
relevantLocationLat number NO A latitude to be set on setLocations. Must be passed along with relevandLocationLong.
relevantLocationLong number NO A longitude to be set on setLocations. Must be passed along with relevantLocationLat.
header Array<{ value: string; label: string }> NO A set of fields to be shown in the header fields of the pass
primary Array<{ value: string; label: string }> NO A set of fields to be shown in the primary fields of the pass
secondary Array<{ value: string; label: string }> NO A set of fields to be shown in the secondary fields of the pass
auxiliary Array<{ value: string; label: string }> NO A set of fields to be shown in the auxiliary fields of the pass
codeAlt string NO Barcode Alternative Text
qrText string NO Barcode message
codeType `Barcode["format"]`` NO Barcode format
transitType TransitType NO Transit Type. Required for boardingPasses
thumbnailFile string NO File path of the thumbnail file in the storage bucket. If not available, the storage won't be invoked for this file.
logoFile string NO File path of the logo file in the storage bucket. If not available, the storage won't be invoked for this file.