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