Skip to content
leoco/dev
← Volver a proyectos
Backend (microservicio de reservas, autor principal)·2026·Repo público

Coworking Platform

Motor de reservas escrito en Rust con arquitectura hexagonal (Ports & Adapters) explícita: el dominio define traits como ReservationRepository y AuthVerifier, implementados por adaptadores concretos e inyectados con Arc<dyn Trait>, lo que permite testear la lógica de negocio sin tocar la base de datos real. El solapamiento de reservas se resuelve con una constraint EXCLUDE USING gist sobre un rango temporal (TSTZRANGE) con índice GiST, garantizando atomicidad sin condiciones de carrera posibles en la capa de aplicación. Cada transición de estado de una reserva queda auditada con actor y motivo en una tabla de historial.

STACK TÉCNICO
RustAxumSQLxPythonFastAPIPostgreSQL
DESAFÍOS

Solapamiento de reservas sin condiciones de carrera

Dos usuarios podían intentar reservar el mismo espacio en el mismo rango horario simultáneamente. Solución: constraint EXCLUDE USING gist sobre (space_id, time_range) resuelto atómicamente por Postgres en O(log n), en vez de validarlo en la capa de aplicación.

Autenticación descentralizada entre servicios

Cada microservicio necesita verificar identidad sin acoplarse al servicio de auth para cada request. Solución: JWT compartido con issuer/audience explícitos verificado localmente en cada servicio, con una única llamada HTTP al auth-service solo quando hace falta confirmar existencia del usuario.

SOLUCIONES

Hexagonal en Rust con DI manual

domain/application/infrastructure/api como crates conceptualmente separados dentro del servicio: los casos de uso dependen de traits (ports), nunca de implementaciones concretas, inyectadas vía Arc<dyn Trait> en el ReservationService. Permite mockear el repositorio en tests sin levantar Postgres.

Auditoría de estados como event sourcing parcial

Cada creación, confirmación o cancelación de una reserva escribe una fila en reservation_status_history con from/to status, actor y motivo, dando trazabilidad completa sin necesidad de un event store completo.

¿Te interesa este proyecto o tienes una idea similar?