Opa, boas vindas a continuação dessa saga. Na parte 2, nós criamos a API no NodeJS e a configuramos, agora iremos conectar ela ao nosso banco realtime do Firebase criado na parte 1. Sem mais delongas, bora brincar!

Primeiro, vamos se conectar ao nosso database, para isso, precisamos criar uma conta de serviço, então acesse o painel do Firebase e vá em configurações e selecione o menu Contas de Serviço:

This image has an empty alt attribute; its file name is image-14.png

Na imagem abaixo, o valor da chave databaseURL está escondido, porém, na sua tela estará mostrando normal. Copie o valor desse campo e deixe ele guardado em um TXT, vamos usar daqui a pouco, feito isso, clique em Gerar nova chave privada.

This image has an empty alt attribute; its file name is image-17-1024x633.png

Quando você clicar, será realizado um download de um arquivo .json, este arquivo possui as informações para conseguirmos acessar o Firebase pelo NodeJS. Abra esse arquivo, e copie o conteúdo dele para o arquivo src/conn/firebase-data.json do nosso projeto. A imagem abaixo ilustra os campos que devem este arquivo:

{
  "type": "service_account",
  "project_id": "",
  "private_key_id": "",
  "private_key": "",
  "client_email": "",
  "client_id": "",
  "auth_uri": "",
  "token_uri": "",
  "auth_provider_x509_cert_url": "",
  "client_x509_cert_url": ""
}

Feito isso, abra o arquivo src/conn/index.js, e insira o seguinte código:

const firebase = require('firebase-admin');

module.exports = (() => {
  let serviceAccount = require('./firebase-data.json');

  firebase.initializeApp({
    credential: firebase.credential.cert(serviceAccount),
    databaseURL: '' //preencha aqui a URL do seu projeto
  });

  return firebase;
})();

Note que há uma uma chave chamada databaseURL que está vazio, precisamos preencher ela com a URL do seu banco que você copiou anteriormente, então pegue aquela URL guardada e insira nesse campo.

Beleza, estamos conectado com o banco! Agora vamos alterar os serviços para que eles manipulem automaticamente o banco. Abra o arquivo src/services/movie.js e vamos edita-lo, adicione o seguinte código:

const connFb = require('../../conn');

exports.createMovie = async ({name, stars, year, synopsis}) => {
  try {
    connFb.database().ref(`/movies/${name}`).set({name, stars, year, synopsis});
    return {sucess: true, message: 'Movie added' };
  }
  catch(err)
  {
    console.log(err);
    throw err;
  }
};

exports.updateMovie = async ({name, stars}) => {
  try {
    connFb.database().ref(`/movies/${name}`).update({stars});
    return {sucess: true, message: 'Movie updated' };
  }
  catch(err)
  {
    console.log(err);
    throw err;
  }
};

exports.deleteMovie = async ({name}) => {
  try {
    connFb.database().ref(`/movies/${name}`).remove();
    return {sucess: true, message: 'Movie removed' };
  }
  catch(err)
  {
    console.log(err);
    throw err;
  }
};

Após nós criarmos a conexão, no service nós a importamos e a usamos. Os parâmetros que vamos usar para o objeto de um filme que será armazenado, serão: name, stars, year e synopsis.

O acesso aos dados no firebase acontece como se fosse uma URL, exemplo:

/movie/nome_filme -> Retorna/modifica/remove o objeto do filme
/movie/nome_filme/nome -> Retorna/modifica/remove a chave NOME do objeto filme

Nós iremos identificar nossos objetos pelo nome do filme, visto que é um projeto para exemplificar os conceitos, em projetos reais, normalmente se usam algum ID para ser a chave.

Enfim, abra o Postman e façam uma requisição para criar um filme, veja exemplo:

This image has an empty alt attribute; its file name is image-22.png

Agora vá até seu projeto no Firebase e acesso o Database Realtime, o filme é para estar lá:

This image has an empty alt attribute; its file name is image-23.png

Agora, teste com a rota de update e delete. Verifique no código os parâmetros que ambas recebem.

Dica:
Agora, que concluímos a comunicação do NodeJS com o Firebase, modifique o objeto, crie novas rotas e experimente a manipulação sem o auxílio de um material.

Terminamos a nossa comunicação do NodeJS com o Firebase, mas ainda há mais uma etapa! Bora pra quarta e última etapa dessa sequência de artigos, a qual iremos abrir uma ponte de um arquivo HTML simples para receber as atualizações do banco em tempo real na WEB, partiu parte 4!