Class: Shrine::Plugins::Hanami::RepositoryMethods

Inherits:
Module
  • Object
show all
Defined in:
lib/shrine/plugins/hanami.rb

Instance Method Summary collapse

Constructor Details

#initialize(name, attacher_class) ⇒ RepositoryMethods

Returns a new instance of RepositoryMethods.



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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
114
115
116
117
118
# File 'lib/shrine/plugins/hanami.rb', line 51

def initialize(name, attacher_class)
  class_eval "    def self.prepended(base)\n      base.send(:include, ::Hanami::Utils::ClassAttribute)\n      base.send(:class_attribute, :_attachments)\n      base.class_eval do\n        self._attachments ||= []\n        self._attachments << { name: :\#{name}, class: \#{attacher_class} }\n      end\n    end\n  RUBY\n\n  class_eval do\n    def create(entity)\n      save_attachments(entity) { |new_entity| super(new_entity) }\n    end\n\n    def update(id, entity)\n      save_attachments(entity) { |new_entity| super(id, new_entity) }\n    end\n\n    def persist(entity)\n      save_attachments(entity) { |new_entity| super(new_entity) }\n    end\n\n    def delete(id)\n      delete_attachments(id) { super(id) }\n    end\n\n    private\n    def _attachments\n      self.class._attachments\n    end\n\n    def save_attachments(entity)\n      _attachments.each do |a|\n        entity = save_attachment(entity, a[:name], a[:class])\n      end\n      yield(entity)\n    end\n\n    def save_attachment(original_entity, name, uploader_class)\n      file = original_entity.send(name)\n\n      if file\n        attacher = uploader_class::Attacher.new(OpenStruct.new, name)\n\n        attacher.assign(file)\n        attacher.finalize\n\n        original_entity_attributes = original_entity.attributes.dup\n        original_entity_attributes.delete(name)\n\n        original_entity.class.new(original_entity_attributes.merge(:\"\#{name}_data\" => attacher.read))\n      else\n        original_entity\n      end\n    end\n\n    def delete_attachments(id)\n      entity = find(id)\n      yield\n      _attachments.each do |a|\n        entity.send(\"\#{a[:name]}_attacher\").destroy\n      end\n    end\n  end\nend\n", __FILE__, __LINE__ + 1