lib/payload_processor.rb
class PayloadProcessor
attr_accessor :project, :payload
def initialize(project_status_updater: nil)
@status_updater = project_status_updater
end
def process_payload(project: nil, payload: nil)
self.project = project
self.payload = payload
add_statuses
update_building_status
payload_log
end
private
def payload_log
success = payload.status_is_parseable? || payload.build_status_is_parseable?
status = success ? "successful" : "failed"
PayloadLogEntry.new(
status: status,
error_type: "#{payload.error_type}",
error_text: "#{payload.error_text}",
backtrace: "#{payload.backtrace}"
)
end
def add_statuses
if payload.status_is_parseable?
project.online = true
add_statuses_from_payload
project.parsed_url = payload.parsed_url if payload.parsed_url.present?
else
project.online = false
end
end
def update_building_status
project.building = payload.build_status_is_parseable? && payload.building?
end
def add_statuses_from_payload
payload.each_status do |status|
next if project.has_status?(status)
if status.valid?
@status_updater.update_project(project, status)
else
project.payload_log_entries.build(error_type: "Status Invalid", error_text: error_text(status))
end
end
end
def error_text(status)
<<-ERROR
Payload returned an invalid status: #{status.inspect}
Errors: #{status.errors.full_messages.to_sentence}
Payload: #{payload.inspect}
ERROR
end
end