Arquitentando um mini projeto



This content originally appeared on DEV Community and was authored by Guilherme Gomes

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.

image.png

  1. Vários servidores (evita problemas quando algum servidor cair).
  2. Load balancer (faz um gerenciamento das request feitas pelo usuário, escolhendo para qual servidor vai encaminhar).

Modelagem do nosso Banco de dados

image.png

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.


This content originally appeared on DEV Community and was authored by Guilherme Gomes