Sistema de encurtamento de URLs com backend em TypeScript + Fastify e frontend em React + Vite.
- TypeScript - Linguagem principal
- Fastify - Framework web performático
- Drizzle ORM - ORM TypeScript-first
- PostgreSQL - Banco de dados relacional
- Zod - Validação de schemas
- Vitest - Framework de testes
- Swagger/OpenAPI - Documentação da API
- Cloudflare R2 - Storage para arquivos CSV (compatível com S3)
- React 18 - Biblioteca UI
- TypeScript - Tipagem estática
- Vite - Build tool moderna
- React Router DOM - Roteamento SPA
- CSS Modules - Estilos com escopo
- Vitest + Testing Library - Testes
- Docker & Docker Compose - Containerização
- PostgreSQL - Database
- Nginx - Servidor web para frontend em produção
- Node.js 18.x ou superior
- Docker e Docker Compose
- PostgreSQL (se rodar localmente sem Docker)
git clone <repository-url>
cd Brev.lycp backend/.env.example backend/.envEdite o arquivo backend/.env:
PORT=3000
LOG_LEVEL=info
FRONTEND_URL=http://localhost:5173
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/brevly
# Cloudflare R2 Configuration (opcional)
CLOUDFLARE_ACCOUNT_ID=your_account_id
CLOUDFLARE_ACCESS_KEY_ID=your_access_key
CLOUDFLARE_SECRET_ACCESS_KEY=your_secret_key
CLOUDFLARE_BUCKET=your_bucket_name
CLOUDFLARE_PUBLIC_URL=https://your-public-url.r2.devcp frontend/.env.example frontend/.envEdite o arquivo frontend/.env:
VITE_FRONTEND_URL=http://localhost:5173
VITE_BACKEND_URL=http://localhost:3000docker-compose up --buildIsso irá:
- Criar e iniciar o container PostgreSQL
- Executar as migrations do banco de dados
- Iniciar o backend na porta 3000
- Iniciar o frontend na porta 5173
Acesse:
- Frontend: http://localhost:5173
- Backend API: http://localhost:3000
- API Docs (Swagger): http://localhost:3000/docs
- Health Check: http://localhost:3000/health
Para parar os containers:
docker-compose down# Backend
cd backend
npm install
# Frontend
cd ../frontend
npm installCertifique-se de que o PostgreSQL está rodando e crie o banco de dados:
CREATE DATABASE brevly;cd backend
npm run db:migratecd backend
npm run devO backend estará disponível em http://localhost:3000
cd frontend
npm run devO frontend estará disponível em http://localhost:5173
npm run dev # Inicia servidor em modo desenvolvimento
npm run build # Compila o projeto
npm start # Inicia servidor de produção
npm run db:generate # Gera migrations do Drizzle
npm run db:migrate # Executa migrations no banco
npm run db:studio # Abre Drizzle Studio (GUI do banco)
npm test # Executa testes
npm run test:watch # Executa testes em modo watch
npm run test:coverage # Gera relatório de cobertura de testesnpm run dev # Inicia dev server
npm run build # Build para produção
npm run preview # Preview do build de produção
npm test # Executa testes
npm run test:watch # Executa testes em modo watch
npm run test:coverage # Gera relatório de cobertura de testescd backend
# Rodar todos os testes
npm test
# Modo watch
npm run test:watch
# Com cobertura
npm run test:coveragecd frontend
# Rodar todos os testes
npm test
# Modo watch
npm run test:watch
# Com cobertura
npm run test:coverage- Deve ser possível criar um link
- Não deve ser possível criar um link com URL encurtada mal formatada
- Não deve ser possível criar um link com URL encurtada já existente
- Deve ser possível deletar um link
- Deve ser possível obter a URL original por meio de uma URL encurtada
- Deve ser possível listar todas as URL’s cadastradas
- Deve ser possível incrementar a quantidade de acessos de um link
- Deve ser possível exportar os links criados em um CSV
- Deve ser possível acessar o CSV por meio de uma CDN (Amazon S3, Cloudflare R2, etc)
- Deve ser gerado um nome aleatório e único para o arquivo
- Deve ser possível realizar a listagem de forma performática
- O CSV deve ter campos como, URL original, URL encurtada, contagem de acessos e data de criação.
- Deve ser possível criar um link - [x] Não deve ser possível criar um link com encurtamento mal formatado - [x] Não deve ser possível criar um link com encurtamento já existente
- Deve ser possível deletar um link
- Deve ser possível obter a URL original por meio do encurtamento
- Deve ser possível listar todas as URL’s cadastradas
- Deve ser possível incrementar a quantidade de acessos de um link
- Deve ser possível baixar um CSV com o relatório dos links criados
Além disso, também temos algumas regras importantes específicas para o front-end:
- É obrigatória a criação de uma aplicação React no formato SPA utilizando o Vite como
bundler; - [] Siga o mais fielmente possível o layout do Figma;
- Trabalhe com elementos que tragam uma boa experiência ao usuário (
empty state, ícones de carregamento, bloqueio de ações a depender do estado da aplicação); - Foco na responsividade: essa aplicação deve ter um bom uso tanto em desktops quanto em celulares.