BACK-END SÊNIOR EventBus vs Import Direto
Como Parei de Acoplar Meus Módulos e Saí de 0 para 149 Testes + JWT + RBAC Real com Argon2id
Se seu módulo Produto importa Estoque que importa Financeiro que importa Produto, você não tem arquitetura. Você tem um miojo.
Esse é o artigo que me coloca no filtro de Back-end Sênior na DIO. Não tem hello world. Tem o erro que me custou 3 noites sem dormir no OpenOps.
PARTE 1 - O CRIME: Import Direto
Meu OpenOps começou assim (e todo mundo começa):
# produto.py from estoque import atualizar_estoque # estoque.py from financeiro import recalcular_cmv from produto import Produto # BUM - circular import hell
Resultado? Teste precisa de banco real, um módulo não inicia sem o outro, você muda Estoque e quebra Financeiro sem saber por quê. É acoplamento circular. Na cozinha era quando o confeiteiro dependia do açougueiro que dependia do garde manger. Um atrasa, todos param.
Parei de importar. Comecei a emitir eventos.
# event_bus.py - núcleo desacoplado bus.emit("stock.changed", product_id=123, qty=-2) bus.emit("stock.low", product_id=123, current=3) # estoque.py - só emite class EstoqueService: def dar_baixa(self, produto_id, qtd): # ... lógica ... self.bus.emit("stock.changed", product_id=produto_id, qty=-qtd) # compras.py - só escuta @bus.on("stock.low") def comprar_automatico(event): if event.current < event.minimo: criar_pedido_compra(event.product_id)
Benefício real que ninguém fala: como testar sem banco
def test_estoque_emite_evento(): fake_bus = FakeEventBus() service = EstoqueService(bus=fake_bus) service.dar_baixa(123, 2) assert fake_bus.emitiu("stock.changed", product_id=123) # 0 banco, 0 Docker, teste em 0.02s
Foi assim que fui de 0 para 149 testes no OpenOps. Não testando banco. Testando eventos.

"Mas import direto é mais rápido e simples. EventBus não é overengineering para um projeto pequeno?" Minha resposta: É mais rápido até o dia que você precisa testar ou escalar. Qual foi a última vez que um import direto te salvou em produção? Me conta nos comentários. Quero ver quem defende o miojo.
O SEGUNDO CHUTE: JWT + RBAC com Argon2id
Depois que desacopei, tomei 3 chutes da OWASP. Chute 1: Senha em texto puro no banco. Chute 2: bcrypt com custo baixo. Chute 3: JWT sem expiração e sem papéis.
De:
user.password = "123456" # nunca faça isso
Para o que a OWASP recomenda hoje (2024+):
# Argon2id - vencedor do Password Hashing Competition # Resistente a GPU/ASIC, com controle de memória, tempo e paralelismo hasher = PasswordHasher( time_cost=3, memory_cost=65536, # 64MB parallelism=4 ) hash = hasher.hash("minha_senha_forte")
JWT + RBAC Real - não é só @login_required:
# Middleware que eu queria ter lido antes def require_role(*roles): def decorator(func): @wraps(func) async def wrapper(request): token = decode_jwt(request.headers["Authorization"]) if token["role"] not in roles: raise HTTPException(403, "Papel insuficiente") return await func(request) return wrapper return decorator @app.get("/admin/relatorios") @require_role("admin") # viewer, operator, admin async def relatorios_sensiveis(): ...
No OpenOps: viewer só lê, operator opera, admin faz tudo. Tudo com JWT de curta duração + refresh token.

"bcrypt já basta, Argon2id é exagero e mais lento. Você está criando problema onde não tem." Minha resposta: bcrypt basta hoje. Argon2id te protege amanhã contra hardware de R$50k que quebra bcrypt em horas. Segurança que paga R$15k+ é sobre antecipar, não reagir. Você usaria bcrypt ou Argon2id em um sistema financeiro real? Quero ver o debate.
O que isso me ensinou sobre ser Sênior
Sênior não é quem sabe mais sintaxe. É quem evita o erro que o júnior nem sabe que existe: Import direto parece produtivo, mas cria dívida de teste. Senha com bcrypt parece segura, mas não é state-of-art.
Meu stack hoje no OpenOps: Python, FastAPI, EventBus, JWT com Argon2id, RBAC real, PostgreSQL, 149 testes desacoplados.
Código: github.com/josewagnerbljr-sys/openops
Se você discorda que EventBus vale o esforço ou que Argon2id é overengineering, comenta aqui embaixo.
GitHub: github.com/josewagnerbljr-sys/openops | LinkedIn: linkedin.com/in/blancoconsultoria | Instagram: @chef_j.blanco



