Neste projeto, foi solicitado para "estruturar uma aplicação web fullstack, dockerizada, cujo objetivo seja possibilitar que usuários da NG consigam realizar transferências internas entre si."
A aplicação está totalmente dockerizada e orquestrada em docker-compose. Para executá-la, siga os passos abaixo:
- Primeiro, deve-se instalar as dependências:
npm install
- Em seguida, deve subir a composição dos containers (neste caso, um container será resposável pelo banco de dados e o outro pela aplicação node) com o comando:
docker-compose up -d
- O próximo passo é "attachar" o terminal do container do node com o seguinte comando:
docker exec -it ng_cash_api sh
- Já no terminal do container (que deverá estar mostrando um prompt com /app), digitar o seguinte comando para criar o banco de dados com o schema do Prisma:
npx prisma db push
- Por fim, deve-se rodar a aplicação (em modo de desenvolvimento) para ter acesso aos endpoints:
npm run dev
Com isso, já é possível interagir com a aplicação utilizando algum cliente REST como o Postman, Insomnia ou a extensão Thunder dentro do VSCode. Caso esteja utilizando o Postman ou o Thunder, há na raiz do projeto arquivos com os end-points já pré configurados ("ng-cash_postman.json" e "ng-cash_thunder.json" respectivamente.)
1. Criação do usuário (é interessante criar mais de um usuário aqui para poder fazer as transações em seguida):
Body da requisição | Método | Endpoint |
---|---|---|
{ "username": "Pessoa 1", "password": "Abc12345" } |
POST | localhost:3000/users |
Body da requisição | Método | Endpoint |
---|---|---|
{ "username": "Pessoa 1", "password": "Abc12345" } |
POST | localhost:3000/login |
Header | Body da requisição | Método | Endpoint |
---|---|---|---|
Authorization: token | { "id": 1, "accountId": 1 } |
GET | localhost:3000/account/balance |
Header | Body da requisição | Método | Endpoint |
---|---|---|---|
Authorization: token | { "id": 1 , <--- Id do usuário origem "accountId": 1, <--- Id da conta origem "username": "Guilherme", <--- Username do usuário destino "value": 10 <--- valor a ser creditado } |
PATCH | localhost:3000/transaction/cashout |
-
Nunca havia utilizado Postgres. Em razão disso, acabei optando por um ORM (aqui, cabe uma ressalva que li em diversos lugares - e mesmo na documenteção da própria ferramenta - que talvez o Prisma não seja de fato um ORM, mas enfim... ) que eu também nunca havia utilizado: o Prisma. Gostei bastante de utilizar ambos e como primeira contato, fiquei feliz com o resultado;
-
Inicialmente, pensei em utilizar a biblioteca Zod para a validação (já que utilizei num projeto da Trybe direto na camada model e gostei bastante) mas não consegui adaptá-la ao Prisma. Tentei depois usar a Joi, mas também não estava dando certo. Acabei utilizando uma validação própria, direto na camada service... Não ficou muito elegante, mas cumpriu o propósito (e como eu estava sem tempo, me contentei com isso);
-
Tive um problema particular bem sério e acabei não conseguindo concluir todos os requisitos solicitados e fiquei entre a "cruz e a espada": entregar o que eu havia feito até então dentro do prazo e com alguma funcionalidade minimamente utilizável, ou entregar atrasado mas com um pouco mais de funcionalidades. Acabei optando pela primeira opção. Entendo que provavelmente terão entregas muito melhores e mais completas do que a minha e fico um pouco chateado porque sinto que eu poderia fazer mais e melhor mas, parafrasendo John Lennon:
"a vida é o que acontece com a gente enquanto estamos fazendo outros planos"
- Print do Kanban que eu fiz no Notion para me organizar: