Buscar en la documentación

Editar con bloqueo optimista

Quién puede editar un incidente, cómo se evita pisar los cambios de otra persona y qué ve quien edita cuando alguien más guarda primero.

Módulo incidents2 min de lecturaVer en GitHub

Editar cambia el título, la descripción, la prioridad y el vencimiento. El estado y el asignado tienen sus propios flujos. Cada incidente lleva un número de versión: quien guarda envía la versión que conocía, y si otra persona guardó entretanto, la API lo rechaza en lugar de pisar su cambio.

Diagrama5 carriles · 10 pasos · 2 salidas de error
SíNoSíNoSíNoPulsa Editar en eldetalle1Carga el incidentecon su versión2Envía PUT/incidents/{id} conversion3¿Lo ve y puedeeditarlo?4Responde 404, 403o 409¿La versión esla actual?5Responde 409VERSION_CONFLICT¿Cambió algo?6Devuelve elincidente sincambios7UPDATE con laversión en el WHERE8Avisa del cambiotras confirmar9Vuelve al detallecon "Cambiosguardados."10
Los números coinciden con el paso a paso. En pantallas pequeñas el diagrama se desliza de lado.

Paso a paso

  1. PersonaPulsa Editar en el detalle

    El botón solo aparece si la API dice que puede (actions.update). El navegador no calcula la regla.

  2. NavegadorCarga el incidente con su versión

    Mientras edita, si llega por tiempo real un cambio de otra persona, avisa "Otra persona cambió este incidente · Recargar" sin borrar el borrador. Si intenta salir con cambios sin guardar, pide confirmación.

  3. NavegadorEnvía PUT /incidents/{id} con version

    El vencimiento solo se envía si cambió; así un incidente vencido se puede seguir editando sin que la regla "no en el pasado" lo impida.

  4. API¿Lo ve y puede editarlo?

    Con incidents.update.any, mientras no esté cerrado ni cancelado. Con incidents.update.own, solo lo que creó y mientras siga en el estado inicial. Si no lo puede ver, 404, como si no existiera.

  5. API¿La versión es la actual?
  6. API¿Cambió algo?

    Compara campo por campo. Si nada cambió, devuelve el incidente tal cual, sin escribir ni dejar historial.

  7. APIDevuelve el incidente sin cambios
  8. Base de datosUPDATE con la versión en el WHERE

    UPDATE … WHERE id = ? AND lock_version = ? y la versión sube en la misma sentencia. Si otra transacción ganó en ese instante, no afecta filas y la API responde el mismo 409. En la misma transacción queda la entrada updated del historial con solo los campos que cambiaron (antes y después).

  9. Cola y avisosAvisa del cambio tras confirmar

    Caché del dashboard, incident.changed a quienes pueden verlo y notificaciones a los participantes.

  10. NavegadorVuelve al detalle con "Cambios guardados."

Ante el VERSION_CONFLICT, el formulario conserva lo escrito, muestra el aviso y un botón “Recargar” que trae la versión actual.

Qué ve la persona en cada error

CódigoHTTPCuándoMensaje en pantalla
VERSION_CONFLICT409Otra persona guardó después de que se abrió el formularioAlguien más guardó cambios en este incidente mientras lo tenías abierto. Recarga para ver la versión actual antes de seguir.
INCIDENT_EDIT_LOCKED409Quien lo creó intenta editar cuando ya no está en el estado inicialEste incidente ya lo están atendiendo, así que ya no puedes editarlo. Si necesitas cambiar algo, habla con un supervisor.
INCIDENT_FINALIZED409Está cerrado o canceladoEste incidente ya está cerrado o cancelado, así que no se puede modificar.
FORBIDDEN_ACTION403Lo ve, pero su rol no incluye editarloNo tienes permiso para hacer esta acción. Si crees que deberías tenerlo, habla con un administrador.
RESOURCE_NOT_FOUND404No existe, está eliminado o no lo puede verNo encontramos lo que buscas. Puede que se haya eliminado o que no tengas acceso.

Dónde está en el código