@startuml

actor Alice #FFBBBB
actor Bob #BBBBFF

== Advisory Lock: single user ==

Alice -> form: open page
form -> Alice: form
Alice -> Alice: edit (first change)
Alice -> dirty: action=lock
activate dirty #FFBBBB
dirty -> Alice: status=success, lock_timeout=<secs>
...
Alice -> Alice: edit (more changes)
note over Alice: Client will extend lock automatically,\nif there are changes during last timeout period
Alice -> dirty: action=extend
dirty -> Alice: status=success
...
Alice -> save: POST form
save -> dirty: lock valid?
dirty -> save: yes
save -> save: save form
save -> dirty: action=release
deactivate dirty
save -> Alice: status=succes,redirect=client

== Advisory Lock: multi user ==

Alice -> form: open page
form -> Alice: form
Alice -> Alice: edit (first change)
Alice -> dirty: action=lock
activate dirty #FFBBBB
dirty -> Alice: status=success, lock_timeout=<secs>
...
Bob -> form: open page
form -> Bob: form
...
Bob -> Bob: edit (first change)
Bob -> dirty: action=lock
dirty -> Bob: status=**conflict_allow_force**,\nmessage=Record locked by user Alice
note right: User Bob can decide between a) reload and b) overwrite.
...
alt Bob: overwrite
   Bob -> Bob: can edit and receive no more warnings
   Bob -> save: Post form
   save -> dirty: lock type 'Advisory'? yes >> always allow write.
   save -> save: save form
   save -> dirty: action=release
   deactivate dirty
   save -> Bob: status=succes,redirect=client
else Bob: reload
   Bob -> Bob: reload page
end

Alice -> save: Post form
save -> dirty: record modified. Message: Reload form.

@enduml