Pular para o conteúdo

Lucas Freitas

Desenvolvedor Full Stack — Backend (PHP / Laravel)

PHP, Laravel e Vue.js em plataformas SaaS multi-tenant de e-commerce. Filas, testes automatizados, observabilidade e segurança de aplicações.

stack
PHP, Laravel, Vue.js, RabbitMQ, Redis, Docker
atuação
filas e jobs, testes automatizados, observabilidade, segurança de aplicações
escala
milhares de lojistas · ~20 mil assinaturas recorrentes
local
Itapema, SC — remoto

Trabalho

  1. LWSA — Tray, Bling e Bagy atual

    E-commerce SaaS multi-tenant, milhares de lojistas.

    Ownership técnico de 4 módulos em produção: promoção em lote, integração com IA, feedbacks por plataforma e o novo menu. Migração de legado, filas com RabbitMQ, observabilidade em New Relic, Graylog, Grafana e Elastic APM. Análise caixa-branca e correção de vulnerabilidades — OWASP Top 10, IDOR, Broken Access Control.

  2. Petiko

    E-commerce por assinatura, cerca de 20 mil assinaturas ativas.

    Core de assinaturas e checkout, por onde passava a maior parte da receita. Integrei 3 gateways de pagamento — Pagar.me, E-Rede e MaxiPago — e 3 ERPs: Magento 2, Bling e Omie.

  3. Domestilar

    Sistema de gestão interna.

    Atendimento ao cliente, dashboards em Python e desktop em Java.

Decisões

A suíte rodava duas vezes

Dois projetos centrais do painel do lojista, com cerca de 10% de cobertura. Cada release era aposta, e o pipeline levava o dobro do tempo necessário.

A segunda execução completa da suíte existia só para juntar o relatório de cobertura. Em vez de acelerar os testes, fiz cada job paralelizado persistir seu relatório parcial e uni-los no fim.

50 minutos a menos por execução de pipeline, e cobertura de 10% para 92% nos dois projetos.

A suíte rodava duas vezes

antes

Os jobs já rodavam em paralelo. A suíte inteira rodava de novo, do zero, só para juntar o relatório de cobertura.

depois

Cada job paralelo grava seu relatório parcial. No fim, só o merge.

Requests estourando timeout

Fluxos que rodavam inteiros dentro do request, num ambiente multi-tenant. Quanto mais dados o lojista tinha, mais perto do limite — e alguns já falhavam em produção.

Aumentar o timeout empurraria o problema para frente. Tirei o processamento do request e mandei para fila, com RabbitMQ e Jobs do Laravel: o request responde na hora e o trabalho acontece fora dele, com retry próprio.

Timeouts eliminados nos fluxos migrados. O custo assumido: a resposta deixou de ser imediata, e quem chama precisa acompanhar o estado.

Requests estourando timeout

antes

A promoção em lote processava todos os produtos dentro do request. Com muitos produtos, estourava o tempo e o lojista recebia erro.

depois

O request responde na hora e enfileira o trabalho. Um worker do RabbitMQ processa fora dele, e a tela mostra que ainda está processando.

Três falhas no mesmo checkout

O checkout de um e-commerce por assinatura. Análise caixa-branca apontou três falhas abertas ao mesmo tempo: account takeover, confirmação de pagamento aceita sem validação no servidor, e stored XSS.

Ordenei pelo alcance que cada uma dava a um atacante, não pela facilidade de corrigir. A conta primeiro, porque dela sai todo o resto. Depois o pagamento, movendo a confirmação para o servidor em vez de confiar no retorno do cliente. O XSS por último: alcança quem abre a página.

As três fechadas. A confirmação de pagamento passou a acontecer onde o cliente não alcança.

Três falhas no mesmo checkout

antes

Três pontos do fluxo aceitavam entrada de fora: a sessão da conta, a confirmação de pagamento e o campo refletido na página.

depois

Fechados na ordem do alcance que davam: primeiro a conta, depois o pagamento, por último o XSS.

Código

O que eu escrevo fora do trabalho.

  • pure-php-rest-api

    Container de injeção PSR-11 com autowiring por Reflection, roteador próprio, service layer e repositories. Sem framework, para entender o que o framework faz.

    PHP 8.3, PHPUnit, Docker

  • mercurius-js

    Worker de webhooks com backoff exponencial, limite de tentativas e dead-letter queue. O mesmo problema de entrega assíncrona que resolvo com RabbitMQ no trabalho.

    TypeScript, BullMQ, Redis

  • laravel-multitenancy

    Um banco por tenant, criado e migrado na criação do usuário. Isolamento por banco, não por coluna de tenant_id.

    Laravel 11, TALL Stack

  • project-amaterasu

    Agente de segurança ofensiva com RAG local. Base de conhecimento indexada em ChromaDB e ferramentas atrás de um gate de escopo fail-closed: fora do alvo declarado, nada executa. As fases retomam do último estado salvo.

    Python, ChromaDB, MCP, Docker repositório privado

  • quest-leveling

    Aplicação de produtividade gamificada. Domínio separado em serviços e DTOs, frontend em Vue 3 com Inertia, e classificação de tarefas por LLM atrás de uma interface própria — o provedor é trocável.

    Laravel 11, Vue 3, Inertia, PostgreSQL repositório privado