Mantener PostgreSQL y MongoDB consistentes cuando una sola accion del user (publicar un teaching path) escribe en los dos.
restriccion: No hay transaccion cross-store. Una escritura a MongoDB que falla despues del commit a PostgreSQL deja al sistema reportando un path publicado que el frontend no puede leer completo. Hacerlo en el orden inverso tiene el mismo failure mode simetrico.
Toda escritura cross-store pasa por una capa de servicio (ej. StoreTeachingPathValidationService) que hace PostgreSQL primero (transaccional), despues MongoDB. Si MongoDB falla, el servicio rollbackea la fila de PostgreSQL por el mismo use case y emite un evento para la cola de reintentos. El cache (Redis) se invalida ultimo, asi un estado parcial nunca es legible.
// Patron (simplificado):
DB::transaction(function () use ($payload) {
$row = TeachingPath::create($payload->structured()); // PostgreSQL
try {
$this->mongo->upsertDraft($row->id, $payload->flexible());
} catch (\Throwable $e) {
// throw rollbackea la transaccion PG
throw new MongoSyncFailed($row->id, $e);
}
Cache::tags('teaching_paths')->forget($row->id);
});