O problema
Um serviço de táxi que recebe reservas por app precisa de muito mais do que um formulário de reserva. Ele tem que encontrar um motorista livre por perto, oferecer a corrida, esperar a resposta e passar para o próximo se ninguém aceitar, tudo em segundos. Roma tem regras próprias: tarifas fixas aprovadas pela prefeitura para viagens de e para os aeroportos e o porto. O cliente precisava da cadeia completa, do despacho ao pagamento.
O que eu construí
Construí uma plataforma de reservas e despacho em tempo real com um único back-end, três apps mobile e um dashboard web de administração.
- Motor de despacho — ele procura motoristas aprovados e disponíveis que enviaram a posição nos últimos 60 segundos, dentro de um raio de busca (8 km por padrão). Classifica até 10 deles pelo tempo real de direção com o trânsito atual, segundo o Google, e então oferece a corrida a um motorista por vez, com uma janela de 20 segundos para aceitar.
- Regras tarifárias de Roma — o serviço de preços reconhece 9 locais-chave, como o aeroporto de Fiumicino e o centro histórico. Aplica as 12 tarifas fixas definidas por Roma Capitale (resolução 252/2024). As demais viagens são calculadas a partir da rota do Google, com acréscimos por bagagem e por passageiro.
- Três apps — um app para o passageiro, um para o motorista e um app de tablet no carro que mostra a rota e banners de parceiros. Todos feitos com React Native e Expo, para Android e para a web.
- Rastreamento ao vivo e chamadas — o Socket.IO envia as posições dos motoristas e o status das corridas. Passageiro e motorista podem se ligar dentro do app via WebRTC, sem ver o número de telefone um do outro.
- Pagamentos — Stripe com webhooks com verificação de assinatura, e pedidos via PayPal. As chaves de pagamento são definidas no painel de administração e armazenadas criptografadas.
- Cadastro de motoristas — os motoristas enviam a habilitação, os documentos e uma foto. Um administrador os aprova antes que possam ficar online.
- Patrocinadores e cupons — um portal de patrocinadores com três planos e cupons com rastreamento antifraude, além de corridas agendadas e avaliações.
Com o que foi feito
O back-end roda em Node.js 22 com TypeScript, Express e Socket.IO. Os dados ficam em MariaDB/MySQL, e o schema evoluiu ao longo de 24 migrações SQL versionadas. O Zod valida as entradas; os logins usam JWT e login com Google. O Google Maps cuida das rotas, dos tempos de viagem e da geocodificação. Os apps usam Expo e React Native.
Por que foi feito assim
Dois passageiros nunca podem receber o mesmo motorista. Quando um motorista aceita, o motor o reserva com um único update condicional: ocupado, mas só se ainda estiver disponível. Se nenhuma linha muda, o motorista acabou de ser pego e a corrida vai para o próximo candidato. Os candidatos são classificados pelo tempo de direção, e não pela distância em linha reta, porque em Roma o carro mais próximo muitas vezes não é o mais rápido. Se o Google não responde, a classificação volta a usar a distância.


