Amplíe la configuración remota con funciones en la nube


Puede activar una función en respuesta a eventos de Remote Config, incluida la publicación de una nueva versión de configuración o la reversión a una versión anterior. Esta guía describe cómo crear una función en segundo plano de Remote Config que realiza una diferencia entre dos versiones de plantilla.

Para activar una función de Remote Config, primero importe los módulos necesarios:

 // 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");
 # 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 defina un controlador para el evento de actualización. El objeto de evento pasado a esta función contiene metadatos sobre una actualización de plantilla, como el número de nueva versión y la hora de la actualización. También puede recuperar el correo electrónico del usuario que realizó la actualización, con el nombre y una imagen si está disponible.

A continuación se muestra 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 del número de versión del objeto de plantilla y recupera la versión actual (recién actualizada) junto con la versión un número inferior:

 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);
 
}
});

Este ejemplo utiliza los módulos json-diff y request-promise para crear la diferencia y generar la solicitud para obtener el objeto de plantilla.

 @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())

Este ejemplo utiliza deepdiff para crear la diferencia y requests crear y enviar la solicitud para obtener el objeto de plantilla.