Puedes activar una función en respuesta a los eventos de Remote Config, incluida la publicación de una versión de configuración nueva o la reversión a una versión anterior. En esta guía, se describe cómo crear una función en segundo plano de Remote Config que ejecuta un comando diff de dos versiones de plantilla.
Activa una función de Remote Config
Para activar una función de Remote Config, primero debes importar los módulos obligatorios:
Node.js
// The Cloud Functions for Firebase SDK to set up triggers and logging.
const {onConfigUpdated} = require("firebase-functions/v2/remoteConfig");
const logger = require("firebase-functions/logger");
// The Firebase Admin SDK to obtain access tokens.
const admin = require("firebase-admin");
const app = admin.initializeApp();
const fetch = require("node-fetch");
const jsonDiff = require("json-diff");
Python
# The Cloud Functions for Firebase SDK to set up triggers and logging.
from firebase_functions import remote_config_fn
# The Firebase Admin SDK to obtain access tokens.
import firebase_admin
app = firebase_admin.initialize_app()
import deepdiff
import requests
Luego, define un controlador para el evento de actualización. El objeto del evento que se pasó a esta función contiene metadatos sobre la actualización de una plantilla, como el número de la nueva versión y la hora de la actualización. También se puede recuperar el correo electrónico del usuario que realizó la actualización, con un nombre y una imagen, si se encuentran disponibles.
Este es un ejemplo de una función de Remote Config que registra una diferencia de cada versión actualizada y la versión que reemplazó. La función examina el campo Número de versión del objeto de la plantilla y recupera la versión actual (actualizada recientemente) junto con la versión inmediatamente anterior:
Node.js
exports.showconfigdiff = onConfigUpdated(async (event) => {
try {
// Obtain the access token from the Admin SDK
const accessTokenObj = await admin.credential.applicationDefault()
.getAccessToken();
const accessToken = accessTokenObj.access_token;
// Get the version number from the event object
const remoteConfigApi = "https://firebaseremoteconfig.googleapis.com/v1/" +
`projects/${app.options.projectId}/remoteConfig`;
const currentVersion = event.data.versionNumber;
const prevVersion = currentVersion - 1;
const templatePromises = [];
templatePromises.push(fetch(
remoteConfigApi,
{
method: "POST",
body: new URLSearchParams([["versionNumber", currentVersion + ""]]),
headers: {Authorization: "Bearer " + accessToken},
},
));
templatePromises.push(fetch(
remoteConfigApi,
{
method: "POST",
body: new URLSearchParams([["versionNumber", prevVersion + ""]]),
headers: {Authorization: "Bearer " + accessToken},
},
));
// Get the templates
const responses = await Promise.all(templatePromises);
const results = responses.map((r) => r.json());
const currentTemplate = results[0];
const previousTemplate = results[1];
// Figure out the differences of the templates
const diff = jsonDiff.diffString(previousTemplate, currentTemplate);
// Log the difference
logger.log(diff);
} catch (error) {
logger.error(error);
}
});
En este ejemplo, se utilizan los módulos json-diff
y
request-promise
para crear
la diferencia y formular la solicitud a fin de obtener el objeto de plantilla.
Python
@remote_config_fn.on_config_updated()
def showconfigdiff(event: remote_config_fn.CloudEvent[remote_config_fn.ConfigUpdateData]) -> None:
"""Log the diff of the most recent Remote Config template change."""
# Obtain an access token from the Admin SDK
access_token = app.credential.get_access_token().access_token
# Get the version number from the event object
current_version = int(event.data.version_number)
# Figure out the differences between templates
remote_config_api = ("https://firebaseremoteconfig.googleapis.com/v1/"
f"projects/{app.project_id}/remoteConfig")
current_template = requests.get(remote_config_api,
params={"versionNumber": current_version},
headers={"Authorization": f"Bearer {access_token}"})
previous_template = requests.get(remote_config_api,
params={"versionNumber": current_version - 1},
headers={"Authorization": f"Bearer {access_token}"})
diff = deepdiff.DeepDiff(previous_template, current_template)
# Log the difference
print(diff.pretty())
En este ejemplo, se usa deepdiff
para
crear la diferencia y requests
para compilar y enviar la solicitud y así obtener
el objeto de plantilla.