Tech Stack: PHP 8 + Alpine.js + MySQL

Documentação Técnica

O BP-LinkUtils não é apenas um encurtador de links. É uma plataforma SaaS (Software as a Service) construída com arquitetura MVC "Vanilla", focada em performance e segurança sem a dependência de frameworks pesados.

Esta documentação detalha as decisões técnicas tomadas durante o desenvolvimento, desde o roteamento de URLs amigáveis até a lógica de interceptação de segurança.

1. Roteamento Inteligente

Para garantir URLs limpas (ex: bp.link/minha-promo em vez de redirect.php?id=123), utilizamos o Apache Rewrite Module. O arquivo .htaccess atua como um "porteiro", direcionando tráfego de API e Views para o index.php, enquanto links curtos são enviados para o redirect.php.

.htaccess Apache Config
RewriteEngine On

# 1. Rotas do Sistema (Dashboard, Login, APIs) -> index.php
RewriteRule ^(login|register|dashboard|api/.*)$ index.php?route=$1 [L,QSA]

# 2. Links Curtos (Qualquer outra string) -> redirect.php
RewriteRule ^([a-zA-Z0-9-_]+)$ redirect.php?code=$1 [L,QSA]

Isso permite separar completamente a lógica de renderização da aplicação da lógica de processamento de redirecionamentos de alta performance.

2. The Gatekeeper (Lógica de Redirecionamento)

O arquivo redirect.php não apenas redireciona. Ele age como um Middleware de Segurança. Antes de enviar o usuário ao destino, ele verifica:

  • Se o link existe.
  • Se o prazo de validade expirou (Retorna HTTP 410 Gone).
  • Se o link possui senha (Bloqueia o fluxo).

Interceptação de Senha

Ao detectar uma senha, o script pausa a execução e renderiza uma view no lugar do redirecionamento, mantendo a URL original no navegador.

// redirect.php - Trecho Simplificado

if (!empty($link['password'])) {
    // Verifica se já está autenticado na sessão
    if (!isset($_SESSION['link_unlocked_' . $id])) {
        
        // Se enviou o POST com a senha
        if (password_verify($_POST['password'], $link['password'])) {
            $_SESSION['link_unlocked_' . $id] = true;
            header("Location: " . url($code)); // Recarrega para redirecionar
            exit;
        }

        // PAUSA TUDO e mostra o formulário
        include 'views/password_gate.php';
        exit; // Impede o header location final
    }
}

3. Motor de QR Code (JSON Storage)

Para permitir personalização avançada (cores, logotipos, estilos de pontos) sem criar dezenas de colunas no banco de dados, optamos por uma abordagem NoSQL-like dentro do MySQL.

As configurações visuais são armazenadas em uma coluna settings do tipo JSON (ou TEXT), permitindo flexibilidade total para futuras novas opções de estilo.

Estrutura de Dados

// Exemplo do que é salvo na coluna 'settings'
{
  "dotsOptions": {
    "color": "#4f46e5",
    "type": "rounded"
  },
  "backgroundOptions": {
    "color": "#ffffff"
  },
  "image": "https://minhaempresa.com/logo.png"
}

No Frontend, a biblioteca qr-code-styling lê esse objeto JSON e renderiza o Canvas em tempo real, sem necessidade de processamento de imagem no servidor (o que economiza CPU).