Module: RestfulObjects::ObjectProperties

Defined in:
lib/restful_objects/domain_model/mixins/object_properties.rb

Instance Method Summary collapse

Instance Method Details

#clear_property(property) ⇒ Object



83
84
85
86
87
88
89
90
# File 'lib/restful_objects/domain_model/mixins/object_properties.rb', line 83

def clear_property(property)
  raise "property not exists" if not rs_model.types[self.class.name].properties.include?(property)
  raise "read-only property" if rs_model.types[self.class.name].properties[property].read_only

  send("#{property}=".to_sym, nil)
  on_after_update if respond_to?(:on_after_update)
  get_property_as_json(property)
end

#get_property_as_json(property) ⇒ Object



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
61
62
63
64
65
66
67
68
69
70
# File 'lib/restful_objects/domain_model/mixins/object_properties.rb', line 33

def get_property_as_json(property)
  property = property.to_s if property.is_a?(Symbol)
  raise "Property not exists" if not rs_model.types[self.class.name].properties.include?(property)

  representation = {
    property =>
      { 'value' => get_property_value(property),
        'links' => [
          link_to(:self, "/objects/#{self.class.name}/#{object_id}/properties/#{property}", :object_property),
          link_to(:up, "/objects/#{self.class.name}/#{object_id}", :object) ],
        'extensions' => rs_model.types[self.class.name].properties[property].
      }
  }

  if not rs_model.types[self.class.name].properties[property].read_only then
    representation[property]['links'].concat [
      link_to(:modify, "/objects/#{self.class.name}/#{object_id}/properties/#{property}", :object_property,
        { property: property, method: 'PUT', arguments: { 'value' => nil } }),
      link_to(:clear, "/objects/#{self.class.name}/#{object_id}/properties/#{property}", :object_property,
        { property: property, method: 'DELETE'} ) ]

    if self.respond_to?("#{property}_choices")
      choices = self.send("#{property}_choices")
      raise "value returned by #{property}_choices method should be an Array" unless choices.is_a?(Array)
      if property_description(property).is_reference
        choices_json = choices.map { |object| object.get_property_rel_representation(property) }
      else
        choices_json = choices.map { |value| decode_value(value, property_type(property)) }
      end
      representation[property]['choices'] = choices_json
    end
  else
    representation[property]['disabledReason'] =
      rs_model.types[self.class.name].properties[property].disabled_reason
  end

  representation.to_json
end

#get_property_value(property) ⇒ Object



100
101
102
# File 'lib/restful_objects/domain_model/mixins/object_properties.rb', line 100

def get_property_value(property)
  encode_value(send(property.to_sym), property_type(property), property)
end

#properties_membersObject



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/restful_objects/domain_model/mixins/object_properties.rb', line 3

def properties_members
  members = {}
  rs_type.properties.each do |name, property|
    members[name] = {
      'memberType' => 'property',
      'value' => get_property_value(name),
      'links' => [
        link_to(:details, "/objects/#{self.class.name}/#{object_id}/properties/#{name}", :object_property, property: name)
      ],
      'extensions' => property.
    }

    if property.read_only
      members[name]['disabledReason'] = property.disabled_reason
    else
      if self.respond_to?("#{name}_choices")
        choices = self.send("#{name}_choices")
        raise "value returned by #{name}_choices method should be an Array" unless choices.is_a?(Array)
        if property_description(name).is_reference
          choices_json = choices.map { |object| object.get_property_rel_representation(name) }
        else
          choices_json = choices.map { |value| decode_value(value, property_type(name)) }
        end
        members[name]['choices'] = choices_json
      end
    end
  end
  members
end

#property_description(property) ⇒ Object



92
93
94
# File 'lib/restful_objects/domain_model/mixins/object_properties.rb', line 92

def property_description(property)
  rs_model.types[self.class.name].properties[property]
end

#property_type(property) ⇒ Object



96
97
98
# File 'lib/restful_objects/domain_model/mixins/object_properties.rb', line 96

def property_type(property)
  rs_model.types[self.class.name].properties[property].return_type
end

#put_property_as_json(property, json) ⇒ Object



72
73
74
75
76
77
78
79
80
81
# File 'lib/restful_objects/domain_model/mixins/object_properties.rb', line 72

def put_property_as_json(property, json)
  property = property.to_s if property.is_a?(Symbol)
  raise 'property not exists' unless rs_model.types[self.class.name].properties.include?(property)
  raise 'read-only property' if rs_model.types[self.class.name].properties[property].read_only

  value = JSON.parse(json)['value']
  set_property_value(property, value)
  on_after_update if respond_to?(:on_after_update)
  get_property_as_json(property)
end

#set_property_value(property, value) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/restful_objects/domain_model/mixins/object_properties.rb', line 104

def set_property_value(property, value)
  if property_description(property).is_reference
    unless value.nil?
      href_value = value['href']
      match = Regexp.new(".*/objects/(?<domain-type>\\w*)/(?<object-id>\\d*)").match(href_value)
      raise "invalid property reference format: '#{href_value}'" if not match
      domain_type = match['domain-type']
      id = match['object-id'].to_i
      raise "value does not exists" if not rs_model.objects.include?(id)
      raise "domain-type does not exists" if not rs_model.types.include?(domain_type)
      send "#{property}=".to_sym, rs_model.objects[id]
    else
      send "#{property}=".to_sym, nil
    end
  else
    send "#{property}=".to_sym, decode_value(value, property_type(property))
  end
end