Firebase Cloud Functions — chame uma função na sua app Android

O artigo original pode ser encontrado no Medium.

Este artigo é parte da série Firebase Cloud Functions:

  1. O que é Firebase Cloud Functions?
  2. Firebase Cloud Functions — Como começar?
  3. Firebase Cloud Functions + Cloud Messaging
  4. Firebase Cloud Functions — Limpeza e Manutenção da Realtime Database
  5. Firebase Cloud Functions — Chame uma função na sua app
  6. Firebase Cloud Functions — Pesquisa de Texto na Base de Dados

Uma das funcionalidades do Android Studio que comecei a apreciar recentemente é a Notificação. Isto porque na noite passada, eu abri o Android Studio e apareceu-me a notificação: “Google Play Services has a new update”. Achei curioso, porque sei que o Firebase está incluso neste pacote.
Fui então à página de notas de lançamento do firebase e descobri uma nova funcionalidade que achei interessante: Callable Cloud Functions✨.

Decidi então experimentar esta nova funcionalidade, escrever este artigo a descrever a minha experiência e adicioná-lo à minha série de artigos sobre Cloud Functions.

Callable Cloud Functions?

Bom, acho melhor começar por explicar o que é isto. Callable Cloud Functions é o SDK do Cloud Functions para dispositivos clientes (Android, iOS ou Web). Esta funcionalidade permite chamar uma função diretamente do dispositivo cliente. A principal vantagem é que ao chamar a função, os tokens do Firebase Auth e do Cloud Messaging são incluídos nessa chamada e passados à função.

Esta funcionalidade pode resolver um dos problemas que vimos num dos artigos desta série: “limpeza” da base de dados, onde criamos uma função para remover palavrões das mensagens que o utilizador envia para a nossa base de dados. Nesse artigo sobre limpeza e manutenção da Realtime Database, não foi mencionado, mas a mensagem pode levar algum tempo para ser alterada. E alguns utilizadores irão ver esta mensagem não alterada, o que não devia acontecer pois, preferencialmente, todos utilizadores devem ter a mesma experiência.
Vamos então procurar resolver esse problema, garantindo que a mensagem publicada na base de dados já esteja alterada e sem palavrões.

Como começar?

Bom, para começar, o primeiro passo é ter a nossa função. Eu já tinha criado a função de remover palavrões no artigo que mencionei anteriormente, por isso, vou re-utilizar essa função neste artigo.
Não vou explicar como inicializar o Cloud Functions, assumindo que você já sabe fazer isso. Mas caso não saiba, leia este artigo meu que explica isso.

Adaptando a Cloud Function existente

A função que eu tinha era chamada através de um Database Trigger, ou seja, era chamada quando ocorria uma alteração na base de dados (quando um utilizador adicionava uma nova mensagem neste caso). Eis o código da função anterior:

Vamos então tornar ela em uma Callable Cloud Function. Para começar, substituímos o Database Trigger por functions.https.onCall. Este método recebe 2 parâmetros: data e context (opcional).

exports.limpezaManutencao = functions.https.onCall((data, context) => {

Por padrão, o context irá conter os dados de autenticação do utilizador que fez o login na app Android(acessíveis através de context.auth) e o data é utilizado para enviar dados da app android para a Cloud Function.

Note que também precisaremos do Admin SDK para inserir os dados na database. Então vou adicioná-lo também à nossa função:

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

E a função ficaria assim:

Note que deixei o código anterior comentado, apenas para você poder comparar. E no fim, retorno uma mensagem de sucesso em formato JSON. É obrigatório que a nossa função retorne sempre dados nesse formato.

Repare também, que utilizando a Callable Function, já não precisamos da variável booleana verificada na nossa base de dados, pois não há risco da nossa Cloud Function cair num loop infinito. E assim poupamos espaço na database.

Quando terminar de escrever a função, não se esqueça de fazer o firebase deploy.

Chamando a função no Android

Agora que criamos a nossa função, vamos chamá-la na nossa aplicação.
Para começar, certifique-se que você tem a versão mais recente do Google Play Services (acima de 12.0.0) e adicione a dependência do Cloud Functions:

compile 'com.google.firebase:firebase-functions:12.0.0'

E então chamamos a nossa função da seguinte forma:

Lidando com erros

Imagine que ao chamar a função, você se esqueça de passar o parâmetro texto , ou passa com um outro nome por engano. Isto fará com que a função não salve nada na database, pois a variável texto estará null (undefined no Js). E você no Android ficará sem saber o que está acontecendo de errado.

Para evitar este problema, você pode verificar se o texto está vazio na Cloud Function e devolver um erro para o dispositivo Android. É só devolver um functions.https.HttpsError:

if (!text || text.length === 0) {
throw new functions.https.HttpsError('invalid-argument', 'A função deve conter o parametro "texto".');
}

E no lado do cliente (Android), é só adicionar um OnCompleteListener:

Creio que com isto, você já esteja preparado para criar outras Callable Cloud Functions para resolver vários outros problemas. Existem vários outros exemplos de casos em que estas funções podem ser úteis e provavelmente falarei de alguns desses casos nos meus próximos artigos.


Caso tenha alguma dúvida ou sugestão, pode me contactar pelo email rosariofernandes51@gmail.com ou pelo Telegram. Será um prazer conversar com você. 🙂