Arquitentando projeto backend

Guilherme Gomes - Sep 16 - - Dev Community

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"
}
Enter fullscreen mode Exit fullscreen mode

💡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"
}
Enter fullscreen mode Exit fullscreen mode

💡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",
}
Enter fullscreen mode Exit fullscreen mode

💡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"
}
Enter fullscreen mode Exit fullscreen mode

💡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
]
Enter fullscreen mode Exit fullscreen mode

💡Endpoint lista todos os cliques associados a uma URL encurtada específica.

. . . . .