Saltearse al contenido

Stack y arquitectura general

Arquitectura de alto nivel

flowchart TB
  subgraph CLIENT[Dispositivos en campo y oficina]
      PWA[App móvil PWA<br/>Angular 18+]
      WEB[App web<br/>Angular 18+]
      CASETA[Vista de caseta<br/>monitor en garita]
  end

  subgraph BACKEND[Backend dedicado por cliente]
      API[API REST<br/>.NET 9 + ASP.NET Core]
      MED[Mediator/CQRS<br/>MediatR + Pipeline Behaviors]
      WORKER[Worker async<br/>procesa eventos Samsara]
      DB[(SQL Server 2022<br/>+ AuditLog inmutable)]
  end

  subgraph EXT[Sistemas externos]
      SAMSARA[Samsara GPS API<br/>flota del cliente]
      TMS[TMS / WMS / ERP<br/>del cliente]
  end

  PWA -- HTTPS + JWT --> API
  WEB -- HTTPS + JWT --> API
  CASETA -- HTTPS + JWT --> API

  API <--> MED
  MED <--> DB

  SAMSARA -- Webhook firmado --> API
  API -- Worker procesa --> WORKER
  WORKER <--> DB

  API -- Webhooks salientes<br/>firmados HMAC --> TMS
  TMS -. API REST de consulta .-> API

  style PWA fill:#1f6feb,color:#fff
  style WEB fill:#1f6feb,color:#fff
  style CASETA fill:#1f6feb,color:#fff
  style API fill:#0a2540,color:#fff
  style DB fill:#28a745,color:#fff
  style SAMSARA fill:#ffc107,color:#212529
  style TMS fill:#79b8ff,color:#0a2540
Vista de alto nivel: dispositivos en campo → backend → integraciones

Stack tecnológico

CapaTecnologíaPor qué
Backend.NET 9 / ASP.NET CoreEstándar de la industria, soporte largo plazo, comunidad amplia.
Base de datosSQL Server 2022El cliente ya opera SQL Server en sus otros sistemas.
FrontendAngular 18+ (PWA)Funciona offline, instalable como app, sin dependencia de App Store ni Play Store.
GPSSamsara APIEl cliente ya tiene Samsara en su flota.
HostingDedicado por clienteIndependencia total: seguridad, customización, sin riesgo de interferencia.

Política de despliegue: deployment-per-customer


Patrones arquitectónicos clave

  • CQRS + MediatR — comandos y queries separados con pipeline behaviors comunes (validación, audit, logging).
  • Result pattern — sin throws para errores de negocio; los handlers retornan Result<T> que el controller traduce a HTTP status.
  • Eventos de dominio como recordsIDomainEvent con [JsonPolymorphic] + [JsonDerivedType] para deserialización segura.
  • PWA con outbox — el frontend móvil persiste operaciones en IndexedDB y las sincroniza al recuperar red, con resolución de conflictos.

Para el detalle de cada patrón y el listado completo de 36 decisiones, ver Decisiones técnicas clave y los ADRs completos.


Continúa el recorrido