master
 1class UploadPhoto
 2  attr_reader :cake, :storage
 3
 4  def initialize(cake)
 5    @cake = cake
 6    @storage = TemporaryStorage.new
 7  end
 8
 9  def run(attributes)
10    with_transaction do
11      create_photo!(attributes[:watermark]) do |photo|
12        ProcessPhotoJob.perform_later(photo, storage.store(attributes[:image]))
13      end
14    end
15  end
16
17  private
18
19  def with_transaction
20    ActiveRecord::Base.transaction do
21      yield
22    end
23  end
24
25  def create_photo!(watermark)
26    cake.photos.create!(image_processing: true, watermark: watermark).tap do |photo|
27      yield photo
28    end
29  end
30end