Arquitetura do Portal
Visao geral da arquitetura do monorepo Portal — plataforma de gestao smart home/IoT.Visao Geral (alto nível)
Packages do monorepo
| Package | Papel |
|---|---|
packages/core | API REST (Hono + Deno). Clean Architecture com domain / application / infrastructure. Concentra autenticação, billing, config-flows, automações, integrações Alexa, registro de devices/entities. |
packages/dashboard | Frontend web (React + Vite + Zustand + Tailwind). Consome a API do core via HTTP. |
packages/mobile | App Flutter (iOS/Android). Consome a API via HTTP e recebe push notifications. |
packages/sdk | Biblioteca compartilhada de integrações (Tuya, KNX, Zigbee, LG ThinQ, Spotify, Discord, Broadlink, Roku, Shelly, TTLock, etc.) + runtime de edge (edge-bootstrap-client, shared-mqtt-client, offline-queue). |
packages/worker | Runtime de edge (HOME ou CLOUD) que carrega o SDK e executa I/O de devices, publicando estados via MQTT. |
packages/worker-automation | Engine de execução de automações; consome eventos MQTT e le/grava no Postgres compartilhado. |
packages/cli | Ferramenta de linha de comando (Cliffy) para operações administrativas. |
Arquitetura interna do core
Fluxo de uma requisição
HTTP→ rota Hono eminfrastructure/web/routes/- Middleware Logto válida JWT
- Repositorio Postgres instanciado
- Use case em
application/use-cases/executa a regra - Eventos publicados no
event-emitter; serviços disparados peloservice-registry - Resposta JSON
Edges, SDK e MQTT
Tópicos MQTT relevantes:portal/automation/manual_trigger— disparar automaçãoportal/automation/lifecycle— eventos CRUD de automaçõesportal/script/trigger— executar scriptportal/events/webhook— webhook recebidohomeassistant/+/+/state— atualizações de estado de devices
Padroes transversais
- Clean Architecture + DDD: domain isolado de framework; repositorios são interfaces no domain e implementacoes em infrastructure.
- Event Bus tipado (
core/shared/event-emitter.ts): eventos comoUser.Created,ConfigEntry.Created,State.Changed,Alexa.*,mobile_app_notification_action. - Service Registry (
application/services/service-registry.ts): handlers nomeados comointegration.domain.service(ex.:tuya.light.turn_on,script.script.press). - SDK-first para integrações: novas integrações moram em
packages/sdk/src/integrations/{domain}/e rodam em um edge — apenas casos especiais (MQTT, Discord, IRRF) ficam no core.
Referências no código
- Schema do banco:
packages/core/src/infrastructure/config/schema.drizzle.ts - Registro de rotas:
packages/core/src/infrastructure/web/app.ts - Factory de entidades Alexa:
packages/core/src/infrastructure/adapters/components/alexa/entity-factory.ts - Workspace Deno:
deno.json(raiz) - Stack local:
docker-compose.yml