Class: Rubino::API::Operations::Sessions::UndoOperation

Inherits:
Object
  • Object
show all
Defined in:
lib/rubino/api/operations/sessions/undo_operation.rb

Overview

POST /v1/sessions/:id/undo Removes the last user message and everything after it (no re-run). Returns the number of messages deleted.

Raises:

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(session_repository: nil, message_store: nil) ⇒ UndoOperation

Accepts an alternate session repository and message store for tests.



19
20
21
22
# File 'lib/rubino/api/operations/sessions/undo_operation.rb', line 19

def initialize(session_repository: nil, message_store: nil)
  @session_repo = session_repository || ::Rubino::Session::Repository.new
  @message_store = message_store || ::Rubino::Session::Store.new
end

Class Method Details

.call(request) ⇒ Object



14
15
16
# File 'lib/rubino/api/operations/sessions/undo_operation.rb', line 14

def self.call(request)
  new.call(request)
end

Instance Method Details

#call(request) ⇒ Object

Raises:



24
25
26
27
28
29
30
31
32
33
# File 'lib/rubino/api/operations/sessions/undo_operation.rb', line 24

def call(request)
  session_id = request.params.fetch("id")
  raise NotFoundError.new("session", session_id) unless @session_repo.find(session_id)

  last_user = @message_store.last_for_role(session_id, "user")
  raise ConflictError, "nothing to undo" unless last_user

  removed = @message_store.delete_from_inclusive(session_id, from_id: last_user.id)
  [200, { removed_messages: removed }]
end