9. MODEL IMPORT
module Models
class Import
include Redis::Persistence
property :state, default: "scheduled"
property :created_at
property :finished_at
property :fail_message
property :result, default: {}
def start!
update_attributes(state: "started")
end
def finish!
update_attributes(state: "finished", finished_at: Time.now)
end
def fail_with!(message)
update_attributes(state: "failed", fail_message: message)
end
end
end
10. class API < Grape::API
version 'v1', using: :header, vendor: "pluriporter"
format :json
resources :imports do
desc "Creates new import from XML data"
params do
requires :xml, type: String, desc: "XML data"
end
post do
Models::Import.create(created_at: Time.now).tap do |
import|
Workers::Import.perform_async(import.id, params[:xml])
end
end
end
11. WORKER
module Workers
class Import
include Sidekiq::Worker
def perform(import_id, xml)
require File.expand_path("../../models/import", __FILE__)
import = Models::Import.find(import_id)
import.start!
begin
# ...
end
rescue => e
import.fail_with!(e.to_s)
raise e
end
import.finish!
end