Este projeto é um encurtador de URLs construído com NestJS e Prisma. Ele permite que os usuários encurtem URLs, rastreiem cliques e gerenciem URLs através de uma API REST.
- Registro e autenticação de usuários
- Encurtamento de URLs com um máximo de 6 caracteres
- Rastreamento de cliques para URLs encurtadas
- Gerenciamento de URLs específico do usuário (listar, editar, excluir)
- Exclusão lógica de registros
- Rastreamento de timestamps para atualizações de registros
Para executar este projeto, você precisará adicionar as seguintes variáveis de ambiente ao arquivo .env
NODE_ENV=development
PORT=8080
JWT_SECRET=your_jwt_secret
HOST_URL=http://localhost:8080
DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/url_shortener_db?schema=public"
DB_USER=johndoe
DB_PASS=randompassword
DB_NAME=url_shortener_db
- Clone o repositório:
git clone https://github.com/ScriptCamilo/url-shortener.git
cd url-shortener
- Caso queira rodar o projeto totalmente Dockerizado:
Você pode rodar o seguinte comando para subir todos os containers e rodar em ambiente docker, lembrando que é necessário ter criado o arquivo .env primeiro e configurado todas as variáveis de ambiente. Utilizando esse comando não é necessário fazer os próximos passos, caso queira rodar localmente sem dockerizar a aplicação NestJS basta pular esse passo. Caso rode a aplicação Dockerizado e depois tente rodar localmente, ou vice-versa, é possível que seja necessário deletar antes as pastas node_modules ou dist.
npm run docker:up
- Faça a instalação das dependências:
npm install
- Configure o banco de dados PostgreSQL:
docker compose up -d --build postgres
- Inicialize o prisma:
npx prisma migrate dev
npx prisma generate
- Inicie a aplicação NestJS:
npm run start:dev
- Acesse a documentação da API com o Swagger:
Estará disponível em http://localhost:8080/api localmente
Para rodar os testes, rode o seguinte comando
npm test
O projeto está rodando em uma VPS com EasyPanel e pode ser acessada pelos seguintes links:
- https://url-shortener-camilo-backend.ochjkq.easypanel.host
- https://url-shortener-camilo-backend.ochjkq.easypanel.host/api
- https://url-shortener-client-flame.vercel.app (Em produção)
Este projeto foi estruturado e pensado para garantir escalabilidade, organização e facilidade de manutenção. Abaixo estão as principais decisões técnicas tomadas ao longo do desenvolvimento:
Optei por uma estrutura de pastas um pouco mais simples, dividindo os "modules" da aplicação NestJS dentro de uma pasta com seus respectivos services e controllers. Tentei manter algo limpo e simples, mas para melhorar poderíamos criar uma estrutura inspirada na Clean Architecture, utilizando pastas como domain, shared, infrastructure e application.
Escolhi o Prisma como ORM (Object-Relational Mapping) pela sua simplicidade e excelente suporte ao TypeScript. O NestJS possui integração nativa com o Prisma, o que facilita a configuração e permite criar consultas e relações de forma intuitiva e eficiente. Isso agiliza o desenvolvimento e reduz a complexidade na manipulação dos dados.
Optei por utilizar Jest para os testes do projeto, já que ele é nativamente suportado pelo NestJS. A integração é fácil e direta, o que torna o processo de criação de testes conveniente. Para um projeto simples como este, o Jest oferece a cobertura necessária para garantir a confiabilidade do código sem a complexidade de setups adicionais.
A dockerização do projeto foi uma escolha estratégica para simplificar o processo de deploy e garantir que o ambiente de desenvolvimento seja o mais consistente possível. Com o Docker, qualquer pessoa pode rodar o projeto sem se preocupar com o versionamento de dependências ou a configuração de serviços externos. Isso melhora a portabilidade e diminui os riscos de problemas de compatibilidade em diferentes máquinas.
Uma forma de melhorar ainda mais a performance da aplicação seria utilizar uma estratégia de cache e umas das melhores opções é o Redis, por várias razões técnicas. Entre elas porque o Redis é extremamente rápido, armazenando dados na memória RAM, o que permite tempos de leitura e escrita muito baixos. Porém, pela facilidade de integração com o NestJS optei por utilizar o cache-manager nesse primeiro momento.
Uma das melhorias fundamentais seria a utilização de monitoramento como o Sentry, que oferece monitoramento de erros em tempo real, permitindo identificar e corrigir problemas rapidamente. Ele fornece informações detalhadas sobre os erros, como stack traces e contexto do usuário, facilitando a resolução de problemas.