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

Returns a new instance of 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

Returns:

  • (Boolean)


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

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

#carrierwave_attribute?(attr) ⇒ Boolean

Returns:

  • (Boolean)


118
119
120
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 118

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

#column?(attribute) ⇒ Boolean

Returns:

  • (Boolean)


114
115
116
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 114

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

#extract_acts_as_taggableObject



86
87
88
89
90
91
92
93
94
95
96
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 86

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



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

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

#extract_carrierwaveObject



75
76
77
78
79
80
81
82
83
84
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 75

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



98
99
100
101
102
103
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 98

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

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

#extract_paperclipObject



62
63
64
65
66
67
68
69
70
71
72
73
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 62

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



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 31

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

Returns:

  • (Boolean)


126
127
128
129
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 126

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

#has_devise?Boolean

Returns:

  • (Boolean)


131
132
133
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 131

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

#paperclip_handler?(attr) ⇒ Boolean

Returns:

  • (Boolean)


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

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
# File 'app/deserializers/forest_liana/resource_deserializer.rb', line 12

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

  @attributes
end