Objetivo
Desenvolver um encurtador de URL eficiente e gratuito, adequado para empresas de todos os tamanhos. O encurtador oferece vantagens como a exclusão automática de links maliciosos e de spam, além de fornecer estatísticas detalhadas sobre o desempenho dos links criados, o que permite um acompanhamento completo das interações e acessos.
Vantagens de utilizar
- Facilita o compartilhamento.
- Melhora a experiência do usuário.
- Acompanhamento de métricas -> Um encurtador de links pode registrar métricas de acesso. Como números de cliques, localização geo do usuário, dispositivo utilizado, etc.
- Estética e Organização.
- Prevenção contra quebras de link.
- Uso de nomes Personalizados.
- Redirecionamento Controlado -> URLs encurtadas podem ser redirecionadas a diferentes destinos conforme necessário. Podemos alterar o destino da URL encurtada sem alterar a URL original.
Arquitetando nosso projeto
Requerimentos
- Dada uma URL longa gere uma URL curta única.
- A url gerada não pode ser adivinhada.
- Quando usuário acessa a url curta ele redireciona para a longa.
Escopo
- Não precisamos nos preocupar com cadastro ou autenticação de usuário.
- Considere usar um UUID para identificar um usuário.
- Vários servidores (evita problemas quando algum servidor cair).
- Load balancer (faz um gerenciamento das request feitas pelo usuário, escolhendo para qual servidor vai encaminhar).
Modelagem do nosso Banco de dados
URL → Representa a URL original e a URL encurtada, incluindo suas informações, data de criação, data de expiração(opcional) e número de cliques.
Click → Registra cada clique em uma URL encurtada, data do clique, incluindo endereço IP e o agente de usuário(software que o cliente está usando) para fins de análise.
A relação entre as tabelas urls
e vé de um para muitos
-
urls
(1) -- (N)clicks
1 URL pode ter N Cliques.
Cada registro na tabela clicks
deve referenciar um registro na tabela urls
usando o url_id
.
Endpoints
**POST /urls*
Request body: {
"original_url": "http://gguifedev.com"
}
Status code: 201
Reponse Body: {
"hash": "x743Y44"
}
💡Endpoint registra url original e retorna um hash → Código que identifica a url encurtada.
*GET /:hash
Status code: 200
{
"original_url": "http://gguifedev.com"
}
💡Redirect / Endpoint para redirecionar URLs encurtadas para seus destinos originais.
*POST /clicks
Request body: {
"url_id": "aaaaaaaa-bbbb-1ccc-8ddd-eeeeeeeeeeee",
"ip_address": "192.168.1.1",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
}
Status code: 201
{
"id": 1234567890, // BIGINT
"url_id": "aaaaaaaa-bbbb-1ccc-8ddd-eeeeeeeeeeee",
"clicked_at": "2024-09-10T12:34:56Z",
"ip_address": "192.168.1.1",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
}
💡Endpoint usado para registrar um novo clique em uma URL encurtada.
*GET /clicks/:id
{
"id": 1234567890,
"url_id": "aaaaaaaa-bbbb-1ccc-8ddd-eeeeeeeeeeee",
"clicked_at": "2024-09-10T12:34:56Z",
"ip_address": "192.168.1.1",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
💡Endpoint que permite obter informações sobre um clique específico.
*GET /urls/clicks
[
{
"id": 1234567890,
"url_id": "aaaaaaaa-bbbb-1ccc-8ddd-eeeeeeeeeeee",
"clicked_at": "2024-09-10T12:34:56Z",
"ip_address": "192.168.1.1",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
},
// ... mais cliques
]
💡Endpoint lista todos os cliques associados a uma URL encurtada específica.