Shurl Express é uma aplicação web que permite o encurtamento de URLs. Foi desenvolvida como parte de um code challenge em um processo seletivo.
A versão do node utilizada, como especificado na Dockerfile, é 22.x
, que é a versão estável mais recente do Node.js até o lançamento deste app.
Como este foi um desafio de desenvolvimento, optou-se pela utilização do tsx. Desta forma, não é feito o build da aplicação no container.
Aqui são alguns requisitos feitos pelo recrutador, de forma simplificada:
- Usar a versão estável mais recente do Node.js
- Usar TypeScript
- Implementar autenticação baseada em tokens, com cadastro de usuário e login
- Encurtar URLs com um limite de 6 caracteres para o slug
- Contar o número de vezes que cada URL é acessada
- Implementar a exclusão lógica de URLs
- Registros devem ter uma data de atualização
- Construir endpoints para:
- Encurtar URLs (token opcional)
- Accessar URLs encurtadas
- Listar URLs encurtadas pelo usuário (token obrigatório)
- Atualizar URLs encurtadas (token obrigatório)
- Deletar URLs encurtadas (token obrigatório)
- Usar Docker Compose para construir e executar o projeto
- Implementar documentação Swagger
- Configurar pre-commit hooks
git clone https://github.com/GuilhermeCAz/shurl_express.git
cd shurl_express
2. Crie um arquivo .env
, conforme o .env.example
docker compose up --build --detach
Alternativamente, execute o seguinte comando:
npm run up
O servidor ficará acessível no endereço http://localhost:3000
.
Para interromper o servidor, execute o seguinte comando:
docker compose down
POST /register
: Registrar um usuário.POST /login
: Logar e obter um token JWT.
POST /urls
: Encurtar uma URL. RequeroriginalURL
válido no corpo da requisição.GET /urls
: Listar todas as URLs associadas ao usuário.PATCH /urls/:slug
: Atualizar a URL original de um slug. RequeroriginalURL
válido no corpo da requisição.DELETE /urls/:slug
: Deletar logicamente uma URL pelo slug.GET /:slug
: Redirecionar para a URL original.
Os seguintes comandos podem ser usados para interagir com a API. Alternativamente, você pode usar o Swagger UI, a partir do endereço http://localhost:3000/docs
.
curl -X 'POST' \
'http://localhost:3000/register' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"password": "Password123"
}'
curl -X 'POST' \
'http://localhost:3000/login' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"password": "Password123"
}'
Após o login, é possível usar o token no cabeçalho das requisições seguintes. Basta adicionar este comando à requisição:
-H 'Authorization: Bearer ${JWT}'
Este comando habilita a associação de URLs com o usuário. Dessa forma, você é autorizado a listar, editar e excluir URLs encurtadas por você.
curl -X 'POST' \
'http://localhost:3000/urls' \
-H 'accept: application/json' \
-H 'Authorization: Bearer ${JWT}' \
-H 'Content-Type: application/json' \
-d '{
"originalURL": "https://example.com"
}'
curl -X 'GET' \
'http://localhost:3000/urls' \
-H 'accept: application/json' \
-H 'Authorization: Bearer ${JWT}'
curl -X 'PATCH' \
'http://localhost:3000/urls/${slug}' \
-H 'accept: application/json' \
-H 'Authorization: Bearer ${JWT}' \
-H 'Content-Type: application/json' \
-d '{
"originalURL": "https://example.com"
}'
curl -X 'DELETE' \
'http://localhost:3000/urls/${slug}' \
-H 'accept: */*' \
-H 'Authorization: Bearer ${JWT}'
curl -X 'GET' \
'http://localhost:3000/${slug}' \
-H 'accept: */*' \
O botão try it out
do Swagger UI não funciona para esta requisição, devido à política de CORS. Use diretamente o seu navegador.