Skip to Content
ComeçandoArquitetura do Sistema

Arquitetura do Sistema

O Opero Global é composto por módulos interconectados que trabalham juntos para oferecer uma experiência unificada.

Visão geral

┌─────────────────────────────────────────────────────────────────┐ │ FRONTEND (Next.js) │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────────┐│ │ │Dashboard │ │ Booking │ │ Admin │ │ Help / Docs ││ │ │ (app) │ │ (portal) │ │ (super) │ │ (você está ││ │ │ │ │ │ │ │ │ aqui!) ││ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └──────────────────┘│ └───────┼──────────────┼──────────────┼────────────────────────────┘ │ │ │ ▼ ▼ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ API (NestJS + Fastify) │ │ │ │ ┌─────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ ���────────┐ │ │ │ PMS │ │Financial │ │ Payment │ │ OCP │ │ GBP │ │ │ │ Core │ │ Basic │ │ (OP) │ │ (Comms) │ │(Booking│ │ │ └────┬────┘ └────┬─────┘ └────┬─────┘ └────┬────┘ └───┬────┘ │ │ │ │ │ │ │ │ │ ┌────┴────────────┴────────────┴────────────┴───────────┴────┐ │ │ │ Camada de Autorização (CASL) │ │ │ └────────────────────────────┬────────────────────────────────┘ │ │ │ │ │ ┌────────────────────────────┴────────────────────────────────┐ │ │ │ Multi-tenancy (AsyncLocalStorage) │ │ │ └────────────────────────────┬────────────────────────────────┘ │ └───────────────────────────────┼──────────────────────────────────┘ ┌───────────────────────┼───────────────────────┐ ▼ ▼ ▼ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │ PostgreSQL │ │ Redis │ │ AWS Services │ │ (dados) │ │ (cache + │ │ (S3, KMS, SES) │ │ │ │ sessões) │ │ │ └──────────────┘ └──────────────┘ └──────────────────┘

Camadas da aplicação

Cada módulo segue a Clean Architecture com 4 camadas:

1. Domain (Domínio)

Regras de negócio puras. Não depende de nenhuma tecnologia externa.

  • Entidades (Reservation, Guest, JournalEntry)
  • Value Objects (Money, DateRange, TenantId)
  • Interfaces de repositório

2. Application (Aplicação)

Casos de uso que orquestram o domínio.

  • CreateReservation, CheckInGuest, PostJournalEntry
  • Interfaces de serviços externos

3. Infrastructure (Infraestrutura)

Implementações concretas de bancos de dados e serviços externos.

  • Repositórios Drizzle (PostgreSQL)
  • Adaptadores Stripe, Twilio, AWS SES
  • Redis para cache e sessões

4. Presentation (Apresentação)

Controllers HTTP que expõem a API.

  • Endpoints REST
  • Validação com Zod
  • Autorização com CASL

Fluxo de uma requisição

Usuário clica "Criar Reserva" [Frontend] POST /api/tenants/:tenantId/reservations [AuthGuard] Valida token JWT / sessão [TenantContext] Define tenantId via AsyncLocalStorage [PoliciesGuard] CASL verifica: ability.can('create', 'Reservation') [Controller] Valida body com Zod schema [UseCase] Executa lógica de negócio (verifica disponibilidade, calcula preço) [Repository] Persiste no PostgreSQL (filtrado por tenantId) [AuditService] Registra ação na trilha de auditoria [Response] 201 Created { reservation: {...} }

Isolamento de dados (Multi-tenancy)

Cada tenant (organização) tem seus dados completamente isolados:

  • Toda tabela do banco possui uma coluna tenant_id
  • Toda query é automaticamente filtrada pelo tenant do usuário logado
  • Não é possível acessar dados de outro tenant — nem por erro de programação
  • O isolamento é garantido em 3 camadas: autenticação, rota e serviço

Integrações externas

ServiçoUso no Opero
Stripe ConnectProcessamento de pagamentos (cartão, PIX)
Pluggy / BelvoOpen Finance — importação automática de extratos
AWS SESEnvio de emails transacionais
TwilioSMS e WhatsApp Business
AWS S3Armazenamento de documentos e imagens
AWS KMSCriptografia de dados sensíveis (LGPD)
AWS SESEmails em produção

Segurança

  • Criptografia em repouso — Dados PII criptografados com AES-256 via AWS KMS
  • LGPD/GDPR — Consentimento, anonimização, portabilidade de dados
  • Auditoria completa — Toda ação registrada (quem, o quê, quando)
  • Sessões Redis — Tokens com expiração, revogação individual ou total
  • Zod validation — Toda entrada validada antes de processar
Last updated on