Postado em 8 de agosto de 2023

How to create API Rest

Atalhos

Disclaimer

What you will find here?

This project will is developed with NodeJS, TypeScript, TypeORM and PostgreSQL

Neste tutorial eu misturo muito o inglês e o português, eu estou evoluindo os estudos do inglês então há momentos que me pego pensando as coisas em inglês e depois naturalmente estou escrevendo, me desculpem por isso mas eu acho legal.

Requirements

  • Install Node
  • Install TypeScript
  • Install TypeORM
  • Install PostgreSQL
  • And install some tool for you observe the database, in my case I used TablePlus.
  • Have one form for test the API, in my case I used Postman for it.

Explanation aboute the code with chat GPT:

Para evitar passar muito tempo escrevendo eu vou ser econômico e vou pedir para o GPT explicar o que o códig está fazendo, afinal eu estou estudando e estou aprendendo tambem, embora eu saiba algumas coisas é interessante ver outro ponto de vista.

Links do que iremos construir

1 - Install TypeORM

  • Documentation https://typeorm.io/
  • After acess the documentation please move for Quick Instalation
  • Use this command with node.js – npm install typeorm -g
  • Use this commando with yarn – yarn global add typeorm

2 - Create the folder project and in folder create the project

  • After you create the folder, please into in the folder and run the commando bellow:
  • typeorm init –name tasks_api –database postgres –express

Above we initiate the project with database postgress and express installed.

The project name is tasks_api, you can midify if you want.

3 - Install postgress

I used configurations default, login is postgress and my password is postgress to with port 5433;

4 - Postgress Basic Commands

Comandos de consulta

  • Listar DB/Schemas – \l
  • Listar tabelas existentes – \dt
  • Ver estrutura de uma tabela – \d ALUNOS
  • Mudar de Banco de dados \c NOME_DO_BANCO

Criar banco de dados

  • CREATE DATABASE db_task;

Deletar banco de dados

  • DROP DATABASE db_task;

Criar uma tabela nova

  • CREATE TABLE ALUNOS ( ID_ALUNO SERIAL PRIMARY KEY, NOME VARCHAR(50), TELEFONE VARCHAR(15) );

Adicionar um registro a tabela

  • INSERT INTO ALUNOS (NOME,TELEFONE) VALUES (‘DANIEL DE MORAIS’,’123456′);

5 - Add Database in the data-source project

  • Open your project
  • Go at the archive data-source.ts and change type, host, port, username, password and database name the accord your instalations.
  • Observe, I configured the application in 08/08/2023 and my data-source is in src/data-source.ts can be different for you, it depends the versiton the your TypeORM.

6 - Dependences Install

  • Certify the stay in your project folder, before run the bellow command.
  • If you use yarn – yarn install
  • If yu use npm – npm install

7 - Configure Routes and Express

Instalando o express

  • yarn add @types/express -D
  • npm install @types/express -D

Configurando o arquivo routes.ts

  • Apague o que tiver dentro do arquivo, pois vamos reconfigurar.

Deixe desta forma

Definição deste código segundo o GPT:

  • import { Router, Request, Response } from 'express': Esta linha importa as classes Router, Request e Response do módulo ‘express’. O Router é uma classe que permite criar grupos de rotas, enquanto Request e Response são classes usadas para lidar com requisições e respostas HTTP.
  • const routes = Router(): Aqui, uma instância do objeto Router é criada e atribuída à variável routes. Isso permitirá definir e organizar as rotas para o aplicativo.
  • routes.get('/', (request: Request, response: Response) => { ... }): Este trecho define uma rota para o método HTTP GET no caminho raiz (‘/’). Quando alguém acessa a raiz do aplicativo pelo navegador ou por outra solicitação GET, a função de callback é executada. Essa função espera dois argumentos: request (representando a requisição feita) e response (representando a resposta a ser enviada de volta).
  • return response.json({ message:'Hello World!' }): Dentro da função de callback, o código responde à requisição com um JSON contendo a mensagem “Hello World!”. Isso é feito usando o método json() do objeto response para enviar uma resposta JSON formatada.
  • export default routes: Finalmente, o conjunto de rotas é exportado como um módulo para que possa ser usado em outro lugar no aplicativo. Isso permite que as rotas definidas nesse módulo sejam incorporadas no aplicativo principal.

Resumindo, esse código define uma única rota para o método GET na raiz do aplicativo Express. Quando essa rota é acessada, o servidor responde com um JSON contendo a mensagem “Hello World!”. Isso é comum para testar se o servidor está funcionando corretamente ou como um ponto de partida para construir rotas mais complexas.

8 - Configurando e rodando a aplicação

Vá no arquivo index.ts e deixe dessa forma:

Definição deste código segundo o GPT:

  • import * as express from "express": Isso importa o módulo express, que é um framework para construir aplicativos web em Node.js.
  • import * as bodyParser from "body-parser": Aqui, o módulo body-parser está sendo importado. O body-parser é um middleware que permite que o aplicativo processe dados enviados no corpo das solicitações HTTP, como JSON, formulários etc.
  • import routes from "./routes": Este trecho importa um conjunto de rotas definidas em um módulo chamado routes a partir do arquivo "./routes".
  • const app = express(): Uma instância do aplicativo Express é criada e atribuída à variável app. Esta instância é a base para a configuração das rotas e middleware do aplicativo.
  • app.use(bodyParser.json()): Aqui, o middleware bodyParser.json() é aplicado ao aplicativo. Isso permite que o aplicativo processe automaticamente o corpo das solicitações como JSON, convertendo os dados JSON recebidos em um objeto JavaScript que pode ser acessado nas rotas.
  • app.use(routes): Aqui, o conjunto de rotas importado do módulo routes é aplicado ao aplicativo como um middleware. Isso incorpora as rotas definidas no arquivo de rotas ao fluxo de manipulação de solicitações do aplicativo.
  • app.listen(3333): O aplicativo Express começa a ouvir em uma porta específica (neste caso, a porta 3333). Isso significa que o servidor estará aguardando por solicitações HTTP nessa porta. Quando uma solicitação é recebida, o aplicativo irá processá-la de acordo com as rotas e middlewares configurados.

Resumindo, esse código configura um servidor Express que usa o middleware body-parser para processar dados JSON nas solicitações e define as rotas importadas do módulo routes. Quando o servidor está em execução, ele estará ouvindo na porta 3333, esperando por solicitações HTTP.

9 - Rodando o projeto

Agora você vai rodar o projeto de acordo com o que você estiver utilizando:

  • yarn start
  • npm start

Você deve ver o projeto rodando desta forma no formato json

10 - Adicionando Nodemon

Vamos adicionar o Nodemon para atualizar em tempo real as mudanças que fomos fazendo em nosso projeto sem a necessidade de restartar o projeto toda vez que modificarmos.

Resumo

Nodemon é uma ferramenta valiosa para desenvolvedores Node.js, permitindo um processo de desenvolvimento mais eficiente, eliminando a necessidade de reinicializar manualmente o servidor sempre que houver uma alteração no código.

Biblioteca

https://www.npmjs.com/package/nodemon

Comandos

  • yarn add nodemon -D
  • npm install –save-dev nodemon

Configurando

Após a instalação vamos criar na raiz do projeto um arquivo chamado nodemon.json e dentro dele vou deixar estas configurações:

Agora precisamos ir no package.json para adicionar o atalho chamando o nodemon na parte de scripts e deixe assim:

Observações

Em outros projetos utilizei um automatizador de tarefas chamado gulp.js, também existe o grunt.js e vendo a configuração do nodemon me parece ser bem mais tranquilo de utilizar pois não necessitei instalar extensões para poder funcionar tendo em vistas as utilizadas aí acima, já existiam na instalação padrão do Nodemon, no caso do gulp você têm que adicionar cada extensão que você quer utilizar e depois configurá-las no arquivo gulp, o que também é interessante pois o poder de personalização é altíssimo.

Pronto

Agora após fazer alguma modificação você dá um refresh no navegador e a alteração deve aparecer.

11 - Criando as entidades (entities)

O que é uma entidade?

As entidades são classes que representam tabelas de bancos de dados no TypeORM, e elas desempenham um papel crucial ao definir a estrutura dos dados manipulados pelo seu aplicativo backend.

Configurando

Por padrão o typeORM já cria por default uma entidade, vamos deletar e criar um novo arquivo no meu caso vou colocar o nome Event.ts

Explicação segundo o GPT

Em resumo, você criou uma entidade chamada “Events” com várias colunas para armazenar informações sobre eventos. Essa entidade será usada pelo TypeORM para criar uma tabela correspondente no banco de dados. O código está bem estruturado e define propriedades importantes, como chaves primárias, colunas de data e colunas com valores padrão. Isso permitirá que você crie, leia, atualize e exclua registros de eventos no banco de dados de forma eficiente usando o TypeORM.

Observações

Esta parte realmente vai variar muito dependendo de quantas tabelas você vai criar e colunas isso realmente vai se adequar ao seu projeto no meu caso eu vou criar um card de eventos.

Você deve realmente ter o cuidado de chamar corretamente o que está utilizando (importar) e se atentar na estrutura o resto é consultar a documentação e extrair o que o typeORM possibilita.

12 - Estabelecendo conexão com o banco de dados

Para fazer isso basta a gente chamar o createConnection do typeorm na página index na pasta migrations e será através disto que as tabelas já serão geradas automaticamentes no banco de dados de acordo com as entidades que configuramos.

Você deverá ter as seguintes configurações para este momento:

  • Banco de dados criado
  • Arquivo ormconfig.json configurado na raiz do projeto se não tiver este arquivo crie ele, sem ele não vai funcionar, vou deixar abaixo a minha configuração deste arquivo:

  • Continuando, as configurações de conexão devem estar iguais as que você configurou em seu banco, existem varios softwares de gestao de DB estou utilizando o TablePlus
  • Após ter revisado só configurar o createConnection, veja meu arquivo index.ts na pasta migations:

Após isto rode o projeto e você deve receber uma das duas mensagens ou a de erro ou a de sucesso.

13 - O primeiro grande problema

O que é o problema?

  • Acabei esbarrando em um problema que o meu VS code retorna que o createConnection é depreciado e pede para fazer algumas mudanças, porém quando a gente não passa os parâmetros dentro do createConnection por default ele vai procurar estas configurações de conexão dentro do ormconfig.json.
  • Outro ponto é que não tinha instalado o reflext-metadata por favor instale pois precisamos dele para reconhecer as configurações do ormconfig.json
  • se usar yarn o comando é yarn add typeorm reflect-metadata
  • se usar npm o comando é npm install typeorm reflect-metadata

Apesar de ter feito isso o problema ainda não foi resolvi, estou vendo uma solução e voltarei assim que resolver =/

Resolvi

Após quebrar um pouco a cabeça e revisar todo o fluxo do que acontece, vi que o problema estava no arquivo ormconfig.json

  • Eu chamei o path errado de entidades por isso quando o createConnection chamava as configurações dentro do ormconfig.json ele não encontrava a entidade para poder analisá-la e criar no Banco de dados de acordo com o que tinha dentro do arquivo Events.ts
  • Após corrigir eu consegui rodar o comando novamente e as entidades foram criadas no Banco de dados.
  • Certifique-se de deixar o path correto como você chamou, segue meu print abaixo:

  • Pronto após isto as tabelas foram criadas, como uso o TablePlus vou deixar o print das tabelas criadas aqui:

14 - Criando o controller

O que é um controler em uma aplicação? Definição do ChatGPT:

Em resumo, os controllers no contexto do TypeORM (ou em qualquer aplicação usando padrões MVC) agem como o ponto de entrada para a lógica de negócios e ajudam a separar as preocupações de roteamento, manipulação de dados e apresentação. Eles contribuem para a modularidade e a manutenção mais fácil da aplicação, permitindo que cada componente se concentre em uma tarefa específica.

Criando o arquivo

Após entender o que é um controller vá na pasta controller e crie um arquivo com o nome que você desejar no meu caso vai ser EventsController.ts e dentro dele vou deixar esta configuração:

Explicação sobre o código acima do ChatGPT:

Esse código é um trecho de um arquivo em TypeScript que define um controlador para lidar com uma requisição GET relacionada a eventos (provavelmente em uma aplicação web ou API) usando o TypeORM e o framework Express.

Aqui está uma explicação passo a passo do que o código faz:

  1. Importações:

  • O código importa a função getRepository da biblioteca typeorm. Essa função é usada para obter um repositório associado a uma entidade.
  • Ele também importa a classe Events do arquivo “../entity/Event”. Isso sugere que a classe Events representa a entidade de eventos da aplicação.
  • As interfaces Request e Response são importadas do “express”, que são usadas para tipar os objetos de requisição e resposta HTTP.
  1. Função getEvents:

  • A função getEvents é definida como uma função assíncrona que recebe dois parâmetros: um objeto request (representando a requisição HTTP) e um objeto response (representando a resposta HTTP).
  • O código utiliza a função getRepository(Events).find() para buscar todos os registros da entidade Events no banco de dados usando o TypeORM.
  • A lista de eventos retornada pela consulta é armazenada na variável events.
  • A função response.json(events) é chamada para enviar uma resposta JSON contendo a lista de eventos ao cliente que fez a requisição.

Portanto, esse código define um controlador para uma rota GET que, quando acessada, consulta o banco de dados usando o TypeORM para recuperar todos os eventos da entidade Events e, em seguida, responde com esses eventos em formato JSON. Isso é útil para fornecer uma API que retorna os detalhes dos eventos armazenados na aplicação.

15 - Adicionando a rota

Acesse o arquivo routes.ts para inserirmos a rota que vai buscar os eventos, veja como ficou meu arquivo com as novas inserções:

16 - Now we will go test the route.

After you edit your routes.ts open your form for test the API, in my case I used Postman.

  • I create a new collection and after I create the new request
  • And after I put the url in this request, this request form is GET type
  • Now you have send request and you can recieve status 200
  • Above is the configuration of my Postman and the complete request, observe with attention:

17 - Criando mais Controllers e Rotas

Agora vou dar seguimento para criar todos os controllers do CRUD e as rotas e em seguida já coloco como ficaram os arquivos e também como ficaram as rotas no Postman.

Arquivo entity/Events.ts

Arquivo controller/EventsController.ts – Aqui serão várias imagens

E agora as rotas:

Perceba que tem um erro em uma rota que é a de upload de imagem, esta parte vamos fazer no proximo passo, mais pode deixar a rota pronta.

 

E por fim meu postaman

18 - Upload de imagem do nosso CRUD

A minha decisão

Inicialmente eu não iria fazer upload de imagem pois queria fazer um CRUD mais simples, mas decidi fazer bem feito e é isso que eu quero entregar não estando contente com apenas isto eu resolvi trazer para vocês as duas formas que estudando percebi que são as mais utilizadas:

  • Upload de imagens armazenando a imagem externamente, esta forma é bastante utilizada para escalar algumas aplicação, utilizando a AWS ou alguma outra.
  • Upload de imagens armazenando no banco de dados dentro da aplicação, o que deixa mais pesado e custoso porém para aplicações menores vale a pena.

Vou trazer as duas formas para vocês:

  • Armazenando externamente na AWS
  • Armazenando internamente utilizando a biblioteca Multer que por sinal é muito utilizada em aplicações até grandes.

Perguntas que fiz ao Chat GPT, enfim decida o que você vai querer utilizar:

O que é Multer?

Multer é um middleware para manipulação de dados de formulário em aplicações web, especialmente aquelas construídas utilizando a plataforma Node.js. Ele é comumente usado para lidar com o upload de arquivos, como imagens, vídeos, documentos e outros tipos de dados binários, em uma aplicação web.

Porquê utilizar a AWS para armazenar imagens e não através do Multer?

Enquanto o Multer é uma ferramenta valiosa para lidar com o upload de arquivos em aplicações Node.js e pode ser uma escolha apropriada para projetos menores, serviços de armazenamento em nuvem como a AWS oferecem vantagens significativas em termos de escalabilidade, desempenho, redundância e gerenciamento de custos, tornando-os uma opção atraente para armazenar imagens e outros dados em aplicações mais complexas e escaláveis.

Meu projeto de API terá 3 branchs

  • Branch main nela eu vou estar com o projeto que resolvi fazer deploy, ela vai estar com multer para fazer upload de imagens
  • Branch upload-image-with-multer, esta branch vai ter a configuração da aplicação até o ponto que deixei o upload de imagens funcionando com o multer, não terá a aplicação completa, mas você poderá testar em localhost.
  • Branch upload-image-with-AWS, esta branch vai ter a configuração da aplicação até o ponto que deixei o upload de imagens funcionando com a AWS, não terá a aplicação completa, mas você poderá testar em localhost.

19 - Fazendo upload de imagens com Multer

Instalando o Multer

Documentação https://www.npmjs.com/package/multer

  • yarn add multer
  • npm install –save multer

Modificações realizadas

  • Crie este diretório public\upload\users aí são  pastas uma dentro da outra aonde ficará armazenado os arquivos upados, na raiz do projeto
  • Criar dentro do arquivo do controller a configuração do multer no meu caso o nome do path é src\controller\EventsController.ts
  • Fazer a rota no postman
  • Abaixo tem explicando como tudo ficou, confira e adapte ao seu projeto:

A estrutura ficou assim com a pasta public criada:

O controller em controller\EventsController.ts ficou assim:

 

Explicação sobre este controller segundo o Chat GPT:

A explicação não pode ser muito resumida porquê realmente você precisa entender o que acontece aí então vai ter que ler se quiser realmente entender:

Esse trecho de código é um controlador de uma aplicação que lida com o upload de imagens para um evento. Vou explicar passo a passo o que acontece no código:

Um objeto storage é criado utilizando o multer.disckStorage() . Esse objeto configura o destino e o nome dos arquivos que serão armazenados no servidor.

  • A função destination define o diretório para onde os arquivos serão salvos.
  • A função filename determina o nome do arquivo que será salvo. No caso, ele é composto pelo timestamp atual e o nome do arquivo original sem espaços.

Um middleware upload é criado usando o multer(). Ele utiliza o objeto storage definido anteriormente e adiciona uma função fileFilter para filtrar os tipos de arquivo permitidos (apenas imagens PNG, JPG e JPEG) e o tamanho do arquivo está limitado a 200kbps em limits.

O controlador uploadImageEvent é definido, que lida com o processo de upload da imagem do evento.

  • O ID do evento é obtido a partir dos parâmetros da requisição.
  • O middleware upload.single(‘image’) é chamado para processar o upload do arquivo. Se houver um erro, uma resposta de erro é enviada.
  • Se não houver erro e um arquivo for enviado, o nome do arquivo é extraído.
  • O controlador tenta encontrar o evento no banco de dados com base no ID fornecido.
  • Se o evento não existir, uma resposta de erro é enviada.
  • Caso contrário, o banco de dados é atualizado com o nome do arquivo da imagem.
  • Uma resposta de sucesso é retornada, incluindo a mensagem “Upload successful” e o caminho do arquivo no servidor.

Se algum erro ocorrer durante o processo, uma resposta de erro genérica é enviada com status 500.

Resumindo, este controlador lida com o upload de imagens de eventos. Ele configura como as imagens são armazenadas, filtra os tipos de arquivo permitidos, processa o upload, atualiza o banco de dados com o nome da imagem e retorna mensagens de sucesso ou erro conforme necessário.

 

A minha rota no postman ficou assim:

Observação sobre a rota de Upload de imagem no Postman:

  • No header desta rota você deve configurar o Content-Type como multipart/form-data;
  • No Body a key image este nome é o mesmo nome que foi colocado no controller, veja a explicação do controller que você vai entender, e o tipo tem que ser tipo file para você poder fazer o upload, bem sobre o postman é isso.

20 - Fazendo upload de imagens configurando um Bucket no Amazon S3

Em desenvolvimento, como queria publicar o projeto deixei esta parte para depois.

21 - Fazendo deploy no Heroku

Bom é a primeira vez que faço então vou descrever aqui como foi:

  • Crie a conta no heroku 
  • Baixe o heroku CLI
  • Após logar você consegue ver a documentação na barra de navegação
  • Após acessar e cadastrar o seu cartão =/
  • Crie um novo projeto, eu fiz associação com o repositório do github é bem simples e você não deve ter problemas, após isto, você vai clicar para fazer deploy, no meu caso deu um problema aonde tinham o pachage-lock.jon e o yarn.lock, uma vez errei o comando e ao invés de rodar com yarn rodei com npm o que deu este problema, se acontecer com você escolha qual vai ficar e exclua o outro, deve resolver o erro.

Vamos lá, será necessário algumas modificações no projeto para funcionar em produção:

Modificando a porta

  • Precisaremos modificar o arquivo index.ts pois a porta aonde o APP vai rodar deve ser disponibilizada pelo Heroku, o meu arquivo ficou assim:
  • Com esta modificação o Heroku agora pode escolher a porta e quanto o projeto estiver local vai rodar na porta 3333
  • Após fazer isso eu commitei o projeto e fui no heroku fazer novamente o deploy para subir as modificações.

Criando o Banco de Dados no Heroku

  • Agora vamos criar um novo banco de dados no heroku e  passar essas configurações no nosso arquivo ormconfig.json
  • Necessário falar que como estou configurando com o Heroku a criação do banco é paga e vai me custar em torno de 12 dólares/mês
  • Caso faça com Heroku vá no menu clique em elements depois em addons e depois procure Heroku Postgres, no meu caso estou usando postgress ou escolha o banco que você desejar.
  • Após criar e aceitar o pagamento vá no menu depois dashboar clique no seu projeto vá em settings e depois em reavl config vars, pronto você vai ver a variavel de ambiente para o seu DB, precisaremos dela para configurá-la no arquivo ormconfig.json.
  • Após isso vá em resources, é antes de settings, você vai ver o DB, clique nele.
  • Quando acessar o banco clique em settings e as informações de conexão estarão lá.

Modificando as configurações do ormconfig.json

  • Mude a extensão do arquivo ormconfig.json para ormconfig.js e deixe ele assim como está o meu:

  • Observe que eu estou passando todos os perâmetros pela URL, mais não é recomendado manter as configurações neste arquivo, por isso vamos proteger nossos dados.
  • Observe tambem que a lógica é um ternário se existir a variavel de ambiente ele executa as configurações do Heroku, senão ele executa as configurações locais.

22 - Protegendo nossos dados com .env

Separei esta parte aqui porquê simplesmente é a parte mais importante e que merece atenção neste tutorial.

O que é .env?

O dotenv é uma biblioteca do Node.js que permite carregar variáveis de ambiente a partir de um arquivo chamado .env .Isso ajuda a manter informações sensíveis, como senhas e chaves de API, fora do código-fonte do seu aplicativo. Você define as variáveis de ambiente no arquivo .env e, em seguida, pode acessá-las facilmente em seu código usando process.env.NOME_DA_VARIAVEL Isso simplifica a configuração e protege suas informações confidenciais. Lembre-se de não compartilhar o arquivo .env publicamente.

Instalando o .env:

  • yarn add dotenv
  • npm install dotenv
  • Após instalar crie um arquivo .env na raiz do projeto

Configurando o dotenv nos arquivos do servidor – No meu caso no src\index.ts:

Configurando as variáveis

Agora vou criar o .env na raiz do projeto e fazer a configuração da variável de ambiente para o localhost e para o servidor online, é só você repetir o projeto mais no meu print só vai ter a config local =)

  • O que você vai atribuir a sua DATABSE_URL é a URL do seu Heroku, aqui coloquei a local pra você apenas ver como é, há e o nome DATABASE_URL é visto neste caminho a seguir -> Vá no menu depois dashboar clique no seu projeto vá em settings e depois em reavl config vars, pronto você vai ver a variavel de ambiente para o seu DB.

Adicionando um console.log no ormconfig.js para ver se pegou a variável de ambiente:

Observações:

  • Após adicionar o console.log rodei o projeto e vej que carregou tudo perfeitamente sem erro.
  • Agora vou commitar e fazer um novo deploy no heroku

23 - Debugando se tudo está funcionando

  • Verificar se seu banco de dados quando você rodou no projeto se ele recebeu a URL de ambiente e mostrou ela no console.log, se ela mostrou, você deve ter commitado e feito deploy novamente como eu instrui.
  • Verificar se seu deploy está sem erros
  • Acessar seu projeto pela URL
  • Para verificar o banco de dados a primeira coisa vai ser acessar ele pelo heroku e ver se tem arquivos nele e alguma conexão no momento:

  • No meu caso hitou, agora é você tentar fazer alguma requisição para alguma rota configurada e ver se funcionou, no meu caso eu tentei, reconfigurei a URL no postman porém deu Erro e não funcionou não recebi a resposta correta.

24 - O segundo grande erro

Bem como falei acima agora tenho que debugar o porquê do erro que estou recebendo ao tentar consultar algo na API, vou debugar e volto assim que conseguir.

  • Bom resolvido após comer 3 pães de alho e perder umas 3horas fora do pc indo na cozinha e voltando para ver se saia algo consegui
  • Vocês não vão acreditar, quando fui testar a rota no postman criei uma variavel de ambiente global com a utl https://api-app-ticketflix-ac4eb696ed94.herokuapp.com/ e eu estava passando o resto da rota /events ou seja a url estava ficando com // no final 🤡
  • deixei somente events e funcionou, é meu amigo vida de programador tem dessas coisas, sexta feira 17:00 e o cara com um B.O. desse.
  • Enfim resolvemos e a API está pronta e funcionando perfeitamente já testei todas as rotas e está funcionando perfeitamente.

25 - Configurando Kaffeine

O que é Kaffeine?

Kaffeine é uma ferramenta útil para manter a disponibilidade de seus aplicativos online, mesmo quando não há tráfego ativo, garantindo que eles estejam sempre prontos para atender solicitações, quando se insere a URL da aplicação o Kaffeine fica hitando na aplicação para não deixar elaa hibernar.

Link

https://kaffeine.herokuapp.com/

Configurando

  • Basta adicionar a url do seu app aí e embaixo adicionar qual horário você quer que o Kaffeine para de hitar, bem simples.