Arquitetura do Sistema
Uma visão geral e profunda da engenharia por trás do M4TCH.AI. O backend foi desenvolvido sobre Node.js (Express), comunicando-se de forma híbrida através de REST e WebSockets (Socket.io). O banco de dados utiliza um modelo relacional focado em performance.
1. Core Stack & Segurança
Node.js + Express
Servidor modularizado rodando na porta definida via variáveis de ambiente. Utiliza middlewares como cors para políticas de acesso e morgan para logs de requisições HTTP.
Autenticação (JWT)
O acesso às rotas privadas é barrado pelo authMiddleware.js, que valida o token Bearer injetando o req.user no ciclo de vida da requisição. As senhas no banco são armazenadas utilizando hash através da biblioteca bcryptjs.
2. Modelo Relacional de Dados (MySQL)
A arquitetura do banco de dados (m4tch_db) foi desenhada para suportar milhões de interações (swipes) e mensagens sem degradar o cálculo da Inteligência Artificial.
Identidade e Autenticação
- users: Tabela raiz. Armazena credenciais (
email,password_hash), status de verificação e opush_tokenpara notificações. - verification_codes: Tabela temporária para gestão de OTP (códigos numéricos via email) e expiração.
- user_match_profiles: O coração dos dados. Utiliza a flexibilidade do formato LONGTEXT na coluna
answers_json, preservando colunas vitais indexadas nativamente (gender,lat,lng,age) para consultas hiper-rápidas.
Interação e Chat
- user_interactions: Registra todo evento de Swipe. Define se
user_from_iddeu um 'like' ou 'dislike' emuser_to_id. - matches: Criada instantaneamente apenas quando ocorre um 'like' mútuo na tabela anterior.
- messages: Histórico de conversas atrelado diretamente a um
match_id. - match_scores: Tabela de cache. Salva os eixos calculados (físico, emocional, social) pela CompatibilityEngine para não travar o banco em tempo real.
3. Microsserviços e Ferramentas
WebSockets (Socket.io)
O servidor suporta comunicação TCP bidirecional configurado no arquivo raiz (index.js). Ao logar, o usuário entra em uma sala exclusiva user_${userId}. Usado para broadcast de status, confirmações de match e chat.
Processamento de Imagem (Sharp)
Os uploads de fotos não salvam imagens cruas. A rota /upload-photos captura o arquivo em memória via multer e utiliza a biblioteca sharp para redimensionar (800x800) e converter os arquivos para WebP, economizando banda extrema da CDN.
Push Notifications (Expo)
A integração mobile é feita através do expo-server-sdk. Ao enviar uma mensagem de chat, além do WebSocket, o servidor dispara um alerta silencioso estilizado com o nome do remetente (padrão WhatsApp) direto no SO do usuário.
Transacionais via Nodemailer
O envio de chaves OTP no fluxo de Autenticação utiliza SMTP puro (configurado para servidores cPanel) com disparo de e-mails em formato HTML dinâmico, suportando templates em Inglês ou Português.