Estenda a Configuração remota com o Cloud Functions


Você pode acionar uma função em resposta a eventos do Configuração remota, incluindo a publicação de uma nova versão de configuração ou a reversão para uma versão mais antiga. Este guia descreve como criar uma função em segundo plano do Configuração remota que realiza uma comparação de duas versões de modelo.

Para acionar uma função do Configuração remota, primeiro importe os módulos necessários:

 // 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

Em seguida, defina um manipulador para o evento de atualização. O objeto de evento passado para esta função contém metadados sobre uma atualização de modelo, como o novo número de versão e a hora da atualização. Você também pode recuperar o e-mail do usuário que fez a atualização, com nome e imagem, se disponível.

Aqui está um exemplo de função do Configuração remota que registra uma comparação entre cada versão atualizada e a versão que ela substituiu. A função examina o campo de número de versão do objeto de modelo e recupera a versão atual (recém-atualizada) junto com a versão um número abaixo:

 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 exemplo usa os módulos json-diff e request-promise para criar o diff e construir a solicitação para obter o objeto de modelo.

 @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 exemplo usa deepdiff para criar a comparação e requests para construir e enviar a solicitação para obter o objeto de modelo.