Class: ForestLiana::ResourceDeserializer

Inherits:
Object
  • Object
show all
Defined in:
app/deserializers/forest_liana/resource_deserializer.rb

Instance Method Summary collapse

Constructor Details

#initialize(resource, params, with_relationships) ⇒ ResourceDeserializer



6
7
8
9
10
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 6

def initialize(resource, params, with_relationships)
  @params = params.permit! if params.respond_to?(:permit!)
  @resource = resource
  @with_relationships = with_relationships
end

Instance Method Details

#acts_as_taggable_attribute?(attr) ⇒ Boolean



141
142
143
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 141

def acts_as_taggable_attribute?(attr)
  @resource.acts_as_taggable.to_a.include?(attr)
end

#attributes_serializedObject



126
127
128
129
130
131
132
133
134
135
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 126

def attributes_serialized
  if Rails::VERSION::MAJOR >= 5
    @attributes.select do |attribute|
      @resource.type_for_attribute(attribute).class ==
        ::ActiveRecord::Type::Serialized
    end
  else
    @resource.serialized_attributes
  end
end

#carrierwave_attribute?(attr) ⇒ Boolean



137
138
139
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 137

def carrierwave_attribute?(attr)
  @resource.uploaders.include?(attr.try(:to_sym))
end

#column?(attribute) ⇒ Boolean



122
123
124
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 122

def column?(attribute)
  @resource.columns.find { |column| column.name == attribute }.present?
end

#extract_acts_as_taggableObject



94
95
96
97
98
99
100
101
102
103
104
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 94

def extract_acts_as_taggable
  return if @params['data']['attributes'].blank?
  return unless has_acts_as_taggable?

  @params['data']['attributes'].each do |key, value|
    if acts_as_taggable_attribute?(key)
      @attributes["#{key.singularize}_list"] = value
      @attributes.delete(key)
    end
  end
end

#extract_attributesObject



24
25
26
27
28
29
30
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 24

def extract_attributes
  if @params[:data][:attributes]
    @params['data']['attributes'].select { |attribute| column?(attribute) }
  else
    ActionController::Parameters.new()
  end
end

#extract_attributes_serializeObject



32
33
34
35
36
37
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 32

def extract_attributes_serialize
  attributes_serialized.each do |attribute, serializer|
    value = @params[:data][:attributes][attribute]
    @attributes[attribute] = JSON::parse(value)
  end
end

#extract_carrierwaveObject



83
84
85
86
87
88
89
90
91
92
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 83

def extract_carrierwave
  return if @params['data']['attributes'].blank?
  return unless @resource.respond_to?(:uploaders)

  @params['data']['attributes'].each do |key, value|
    if value && carrierwave_attribute?(key)
      @attributes[key] = ForestLiana::Base64StringIO.new(value)
    end
  end
end

#extract_deviseObject



106
107
108
109
110
111
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 106

def extract_devise
  return if @params['data']['attributes'].blank?
  return unless has_devise?

  @attributes['password'] = @params['data']['attributes']['password']
end

#extract_paperclipObject



70
71
72
73
74
75
76
77
78
79
80
81
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 70

def extract_paperclip
  return if @params['data']['attributes'].blank?
  return unless @resource.respond_to?(:attachment_definitions)

  paperclip_attr = @params['data']['attributes']
    .select do |attr|
      !column?(attr) &&
        paperclip_handler?(@params['data']['attributes'][attr])
    end

  @attributes.merge!(paperclip_attr) if paperclip_attr
end

#extract_relationshipsObject



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 39

def extract_relationships
  if @params['data']['relationships']
    @params['data']['relationships'].each do |name, relationship|
      data = relationship['data']
      # Rails 3 requires a :sym argument for the reflect_on_association
      # call.
      association = @resource.reflect_on_association(name.try(:to_sym))

      if [:has_one, :belongs_to].include?(association.try(:macro))
        # TODO: refactor like this?
        #if data.blank?
          #@attributes[name] = nil
        #else
          #@attributes[name] = association.klass.find(data[:id])
        #end

        # ActionController::Parameters do not inherit from Hash anymore
        # since Rails 5.
        if (data.is_a?(Hash) || data.is_a?(ActionController::Parameters)) && data[:id]
          @attributes[name] = association.klass.find(data[:id])
        elsif data.blank?
          @attributes[name] = nil
        end
      end
    end

    # Strong parameter permit all new relationships attributes.
    @attributes = @attributes.permit! if @attributes.respond_to?(:permit!)
  end
end

#has_acts_as_taggable?Boolean



145
146
147
148
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 145

def has_acts_as_taggable?
  @resource.respond_to?(:acts_as_taggable) &&
    @resource.acts_as_taggable.respond_to?(:to_a)
end

#has_devise?Boolean



150
151
152
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 150

def has_devise?
  @resource.respond_to?(:devise_modules?)
end

#paperclip_handler?(attr) ⇒ Boolean



113
114
115
116
117
118
119
120
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 113

def paperclip_handler?(attr)
  begin
    Paperclip.io_adapters.handler_for(attr)
    true
  rescue Paperclip::AdapterRegistry::NoHandlerError
    false
  end
end

#performObject



12
13
14
15
16
17
18
19
20
21
22
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 12

def perform
  @attributes = extract_attributes
  extract_attributes_serialize
  extract_relationships if @with_relationships
  extract_paperclip
  extract_carrierwave
  extract_acts_as_taggable
  extract_devise

  @attributes
end