Skip to main content

Arquitetura do Portal

Visao geral da arquitetura do monorepo Portal — plataforma de gestao smart home/IoT.

Visao Geral (alto nível)

Packages do monorepo

PackagePapel
packages/coreAPI 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/dashboardFrontend web (React + Vite + Zustand + Tailwind). Consome a API do core via HTTP.
packages/mobileApp Flutter (iOS/Android). Consome a API via HTTP e recebe push notifications.
packages/sdkBiblioteca 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/workerRuntime de edge (HOME ou CLOUD) que carrega o SDK e executa I/O de devices, publicando estados via MQTT.
packages/worker-automationEngine de execução de automações; consome eventos MQTT e le/grava no Postgres compartilhado.
packages/cliFerramenta de linha de comando (Cliffy) para operações administrativas.

Arquitetura interna do core

Fluxo de uma requisição

  1. HTTP → rota Hono em infrastructure/web/routes/
  2. Middleware Logto válida JWT
  3. Repositorio Postgres instanciado
  4. Use case em application/use-cases/ executa a regra
  5. Eventos publicados no event-emitter; serviços disparados pelo service-registry
  6. Resposta JSON

Edges, SDK e MQTT

Tópicos MQTT relevantes:
  • portal/automation/manual_trigger — disparar automação
  • portal/automation/lifecycle — eventos CRUD de automações
  • portal/script/trigger — executar script
  • portal/events/webhook — webhook recebido
  • homeassistant/+/+/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 como User.Created, ConfigEntry.Created, State.Changed, Alexa.*, mobile_app_notification_action.
  • Service Registry (application/services/service-registry.ts): handlers nomeados como integration.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