Class: Pi::Browser::Taskbar::Rails::ApiController

Inherits:
ApplicationController show all
Defined in:
lib/pi/browser/taskbar/rails/engine.rb

Constant Summary collapse

MAX_BODY_BYTES =
128 * 1024

Instance Method Summary collapse

Instance Method Details

#cancel_taskObject



133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/pi/browser/taskbar/rails/engine.rb', line 133

def cancel_task
  response = Pi::Browser::Taskbar::Rails.broker_client.cancel(params[:id])
  case response["result"]
  when "accepted"
    render_snapshot(response.fetch("snapshot"), :accepted)
  when "cancelled"
    render_snapshot(response.fetch("snapshot"), :ok)
  when "not_found"
    render_error(:not_found, "task_not_found", "Task was not found", response["snapshot"])
  when "not_cancellable"
    render_error(:conflict, "task_not_cancellable", "Task can no longer be stopped", response["snapshot"])
  when "unavailable"
    render_error(:service_unavailable, "unavailable", "Pi is not ready", response["snapshot"])
  else
    render_unavailable
  end
rescue Broker::Unavailable
  render_unavailable
end

#reset_sessionObject



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/pi/browser/taskbar/rails/engine.rb', line 115

def reset_session
  response = Pi::Browser::Taskbar::Rails.broker_client.reset
  case response["result"]
  when "accepted"
    render_snapshot(response.fetch("snapshot"), :accepted)
  when "reset_while_busy"
    render_error(:conflict, "reset_while_busy", "A fresh session cannot start while Pi is busy", response["snapshot"])
  when "session_reset_rejected"
    render_error(:conflict, "session_reset_rejected", "Pi kept the current session", response["snapshot"])
  when "unavailable"
    render_error(:service_unavailable, "unavailable", "Pi is not ready", response["snapshot"])
  else
    render_unavailable
  end
rescue Broker::Unavailable
  render_unavailable
end

#stateObject



81
82
83
84
85
86
# File 'lib/pi/browser/taskbar/rails/engine.rb', line 81

def state
  response = Pi::Browser::Taskbar::Rails.broker_client.snapshot
  render_snapshot(response.fetch("snapshot"), :ok)
rescue Broker::Unavailable
  render_unavailable
end

#tasksObject



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/pi/browser/taskbar/rails/engine.rb', line 88

def tasks
  body = request.raw_post
  return render_error(:payload_too_large, "oversized_payload", "Request body exceeds 128 KiB") if body.bytesize > MAX_BODY_BYTES
  task = JSON.parse(body)
  raise JSON::ParserError, "object required" unless task.is_a?(Hash)
  validated = Task.parse(task)
  response = Pi::Browser::Taskbar::Rails.broker_client.submit("prompt" => validated.prompt, "context" => validated.context)
  case response["result"]
  when "accepted"
    render_snapshot(response.fetch("snapshot"), :accepted)
  when "busy"
    render_error(:conflict, "busy", "Another Pi task is active", response["snapshot"])
  when "unavailable"
    render_error(:service_unavailable, "unavailable", "Pi is not ready", response["snapshot"])
  when "invalid"
    render_error(:unprocessable_entity, "invalid_task", "Task request is invalid")
  else
    render_unavailable
  end
rescue JSON::ParserError
  render_error(:bad_request, "malformed_json", "Request body must be valid JSON")
rescue Task::Invalid
  render_error(:unprocessable_entity, "invalid_task", "Task request is invalid")
rescue Broker::Unavailable
  render_unavailable
end