Skip to content

jpsaiago/desafioNGCash

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

challeNGe

💸 Transferências ágeis e seguras 💸

Captura de tela do aplicativo funcionando

Docker Typescript
React Vite WindiCSS React-Query React Router Nginx Figma
Prisma Postgres Jest Express

Esse projeto é uma plataforma fullstack para transferência de uma moeda digital sem valor real, que permite o cadastro usando usuário e senha, transferências entre usuários e inspeção do seu histórico de transações.

📖 Índice

  1. Frontend
    1. Funcionalidades do frontend
    2. Escolhas no desenvolvimento
      1. Vite
      2. Tanstack-Query vs. Redux
      3. Layout
      4. WindiCSS
      5. Framer Motion
  2. Backend
    1. Funcionalidades do backend
    2. Escolhas no desenvolvimento
      1. Prisma
      2. Zod
  3. Execução
  4. Instalação
  5. Docker
  6. Testes
  7. Observações

💻 Frontend

🕹️ Funcionalidades do frontend

  • 📱 Layout responsivo
  • 🗝️ Sessões de usuário que ficam salvas por 24h
  • 🔄 Sincronização periódica do histórico de transações
  • 🎛️ Controle quais transações são exibidas e a sua ordem
  • ⛔ Controle de erros e telas explicando o que pode ter ocorrido
  • 🍂 Animações e transições agradáveis

🧠 Escolhas no desenvolvimento do Frontend

Vite

Dado que o objetivo do desafio era criar uma aplicação fullstack com um backend em Node, optei pelo Vite no frontend em vez de algo como Next.js ou Remix, já que esses frameworks rodam em um servidor que também funciona como um "backend".

Tanstack-Query vs Redux

Como a maior parte dos estados críticos da aplicação são assíncronos e dependentes do banco de dados, optei pelo Tanstack-Query (antes conhecido como React-Query), um pacote já bem consolidado e conhecido responsável pelo gerenciamento assíncrono de estados, em vez de algo como Redux ou Zustand/Jotai. O resto dos estados locais da aplicação foram gerenciados com o hook useState nativo.

Layout

O rascunho do layout da aplicação foi feito no Figma, com uma identidade colorida e inspirada no brutalismo na web.

Layout no Figma

WindiCss

O WindiCSS foi o método escolhido para estilização da aplicação. Se trata de um fork do TailwindCSS com algumas funções a mais, como agrupamento de estados e modificadores. O próprio Tailwind, por sua vez, é uma biblioteca de estilização que aplica regras de css a partir de classes de utilidade, exigindo assim conhecimento prévio de css mas facilitando a modificação e iteração dos estilos.

Framer Motion

Para animar as trocas de rota do React Router, utilizei a biblioteca Framer Motion, que foi usada também para coordenar animações de elementos dentro da UI.

📡 Backend

🕹️ Funcionalidades do backend

  • 🔒 Autenticação de usuário com JWT
  • 📋 Validação e sanitização de inputs
  • 📨 Criação de contas e transações atômicas
  • 📜 Logger personalizado que registra requisições e erros
  • 📊 Prisma Studio configurado no ambiente Docker

🧠 Escolhas no desenvolvimento do Backend

Prisma

ORM moderna feita para o Typescript, com controle de migrações, transações atômicas nativas e o Prisma Studio que permite análise do banco de dados.

Zod

Biblioteca de validação nativa ao Typescript, extremamente útil para criar o middleware que valida o input do usuário de acordo com o schema esperado para cada rota.

📦 Instalação

Para clonar o projeto, execute o comando:

git clone https://github.com/jpsaiago/challenge-charlie.git

⚙️ Execução

As aplicações já estão configuradas, na maior parte, para serem executadas em um ambiente Node local. As exceções são:

  • Instalar as dependências de cada parte, de preferência com o pnpm para usar o lock-file já presente

  • O backend precisa da url de conexão a uma instância do postgres, que pode ser modificada no arquivo .env da pasta Backend na seguinte forma: String de conexão Postgres Por padrão, o projeto vem com a string de conexão dentro da rede do Docker, se for modificar para rodar localmente, não apague.

  • Depois de configurar essa conexão, execute o seguinte comando e forneça um nome para a migração quando solicitado:

npx prisma migrate dev

Feito tudo isso, basta executar:

pnpm(ou yarn ou npm run) dev

na raiz de cada parte da aplicação.

🚢 Docker

A única configuração de ambiente necessária é a string de conexão Postgres no .env na raiz do Backend.

Dependendo da versão do Docker/Docker Compose que estiver presente na sua máquina, o comando que deve ser executado na raiz do repositório muda.

Na V2 do compose, execute:

docker compose up

Já na V1, execute:

docker-compose up

O Compose levantará 4 containers:

  • Banco de dados na porta 5432
  • Prisma Studio na porta 5555
  • Backend na porta 8080
  • Frontend na porta 8000

🧪 Testes

Existem alguns testes no backend que podem ser executados com:

npm test

desde que seu terminal esteja aberto na pasta que possui o package.json do backend e as dependências tenham sido instaladas.

🔭 Observações

  • Dado o escopo da aplicação e para não prolongar demais o desenvolvimento do desafio, não escrevi testes para o Frontend, porém usaria o Vitest, suite de testes do Vite que usa uma API igual a do Jest.
  • Também expandiria os testes já existentes no backend, usando o Cypress para os testes E-2-E e o Jest para os testes de integração.
  • Também não configurei um ambiente de desenvolvimento com toda a aplicação rodando em conjunto, me utilizei do Nodemon, do modo de desenvolvimento do Vite e de um banco Postgres local.
  • Uma das vantagens do Prisma é o conceito das migrações e de poder dar roll-back nelas se algo acontecer de errado, porém para evitar a necessidade de executar comandos dentro do container apenas para criar o banco de dados, preparei um arquivo .sql que é usado na inicialização do banco de dados.

About

Desafio para vaga frontend jr

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages