Configurando Nestjs com Firebase Admin
Tags: nestjs, firebase, api, typescript
Published: 2021-09-02 03:37:33

#NestJs
Nestjs é um framework voltado para construção de aplicações nodejs de forma performática e escalável. Possui suporte a diferentes paradígmas de programação tais como programação orientada a objetos e funcional dando um toque de flexibilidade na hora de codar.
#Firebase
O firebase é um Backend as a Service(BaaS), uma série de serviços em nuvem que abstraem taréfas repetitivas e pesadas para desenvolvedores tais como autenticação de usuário, armazenamento de dados dentre outros.
#Lets Bora
Para iniciarmos um projeto nest usamos os seguintes comandos:
```
npm i -g @nestjs/cli //para instalar o nest cli de forma global
nest new project-name //para criar um projeto

``` 
Ele vai pergutar qual gerenciador de pacotes deseja usar, no meu caso vou usar o yarn:

```
 Which package manager would you ❤️  to use?
  npm
> yarn
  pnpm
```
Instale o firebase-admin:
```
yarn add firebase-admin
//ou
npm i firebase-admin
```
Instale o dotenv para que os dados sensiveis do firebase sejam gravados em variáveis de ambiente e assim tornar mais segura estas informações:
```
yarn add dotenv
//ou
npm i dotenv
```
No arquivo main.ts na pasta src inicialize o dotenv:
``` typescript
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as dotenv from 'dotenv';

dotenv.config();

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(process.env.PORT || 3000);
}
bootstrap();

```
Dentro da pasta src crie um arquivo chamado firebase.config.ts, com as seguintes informações:
``` typescript
import * as firebase from 'firebase-admin';

export function initializeFirebase() {
    var serviceAccount = JSON.parse(process.env.FIREBASE);
    firebase.initializeApp({
        credential: firebase.credential.cert(serviceAccount),
        databaseURL: "https://exemplo-app.firebaseio.com"
    });
}

```
<ol>
  <li> Importamos todo conteúdo de firebase-admin e nomeamos como firebase </li>
  <li> exportamos a função que irá inicializar a conexão </li>
  <li> pegamos as credênciais de uma variável de ambiente, que está em formato json e transformamos em um objeto com JSON.parse() </li>
  <li> chamamos as função firebase.initializeApp() passando as credenciais </li>
</ol>
Para obtermos as credenciais temos que ir no nosso projeto do firebase e em:
>configuração do projeto
>>contas de serviço
>>>gerar nova chave privada

Será iniciado o download de um arquivo JSON que conterá informações confidenciais do projeto usadas para fazer a integração, portanto tome cuidado onde deixa este arquivo e se possível o exclua após pegar suas informações. Ele terá as seguintes informações:
``` json
{
 "type": "service_account", 
 "project_id": "exemplo-app", 
 "private_key_id": "000000000000000000000000000000000000", 
 "private_key": "-----BEGIN PRIVATE KEY-----varias letras aleatórias-----END PRIVATE KEY-----\n", 
 "client_email": "firebase-adminsdk-xxx@exemplo-app.iam.gserviceaccount.com", 
 "client_id": "000000000000000", 
 "auth_uri": "https://accounts.google.comxxxxxx", 
 "token_uri": "https://xxxx.googleapis.com/token", 
 "auth_provider_x509_cert_url":"https://www.googleapis.com/xxx", 
 "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/xxxxgserviceaccount.com"
}

```

Crie um arquivo .env na raiz de seu projeto e dentro dele crie uma variável de ambiente chamada FIREBASE, você deve setar seu valor colocando todas as credenciais do arquivo json em apenas uma linha:
``` json
//.env
FIREBASE={"type": "service_account", "project_id": "exemplo-app", "private_key_id": "000000000000000000000000000000000000", "private_key": "-----BEGIN PRIVATE KEY-----varias letras aleatórias-----END PRIVATE KEY-----\n", "client_email": "firebase-adminsdk-xxx@exemplo-app.iam.gserviceaccount.com", "client_id": "000000000000000", "auth_uri": "https://accounts.google.comxxxxxx", "token_uri": "https://xxxx.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/xxx", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/xxxxgserviceaccount.com"}
```

Novamente no arquivo main.ts na pasta src, inicialize o firebaseConfig:
``` typescript
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as dotenv from 'dotenv';
import { initializeFirebase } from './firebase.config';

dotenv.config();
initializeFirebase();

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(process.env.PORT || 3000);
}
bootstrap();

```
Podemos testar nossa integração criando um arquivo user.repository.ts dentro da pasta "src/repositorys":
``` typescript
import { Injectable } from "@nestjs/common";
import * as firebase from 'firebase-admin';
@Injectable()
export class UserRepository {
    private _collectionRef: FirebaseFirestore.CollectionReference = firebase.firestore().collection('user');
    public async getUser(UserId: string): Promise<any> {
         return this._collectionRef.doc(UserId).get();
    }
}
```
#finalizando
Bom com esta configuração você poderá gravar dados no banco do firebase, atualizar ou apagar dados de autenticação de usuário tais como senhas e emails etc. É isso, obrigado por lerem este artigo e espero que ele tenha os ajudado! :) 
(caso não: coloque mais café na chicara e não desanime!).