diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/models/agent.rb | 11 | ||||
-rw-r--r-- | app/models/classification.rb | 4 | ||||
-rw-r--r-- | app/models/resource.rb | 68 | ||||
-rw-r--r-- | app/models/schemas/resource_feature_properties.json | 12 | ||||
-rw-r--r-- | app/models/section.rb | 5 | ||||
-rw-r--r-- | app/serializers/hash_serializer.rb | 9 |
6 files changed, 88 insertions, 21 deletions
diff --git a/app/models/agent.rb b/app/models/agent.rb index 07e0b8e..6264ba3 100644 --- a/app/models/agent.rb +++ b/app/models/agent.rb @@ -2,4 +2,15 @@ class Agent < ApplicationRecord has_many :agencies has_many :members, through: :agencies, source: :user has_many :resources + has_many :taxonomies + has_many :categories, through: :taxonomies + has_many :sections, through: :categories + + def to_param + uuid + end + + def to_s + name + end end diff --git a/app/models/classification.rb b/app/models/classification.rb new file mode 100644 index 0000000..c384aa7 --- /dev/null +++ b/app/models/classification.rb @@ -0,0 +1,4 @@ +class Classification < ApplicationRecord + belongs_to :resource + belongs_to :section +end diff --git a/app/models/resource.rb b/app/models/resource.rb index cd43bf9..906933d 100644 --- a/app/models/resource.rb +++ b/app/models/resource.rb @@ -1,26 +1,56 @@ +require_dependency 'phony_rails' + class Resource < ApplicationRecord # Universally Unique Identifier :uuid include UUIDParameter belongs_to :agent - has_and_belongs_to_many :sections - - # Figure out the requested property name - def method_missing(name, *args, &block) - Rails.logger.info("method_missing: #{name} // #{feature['properties'][name.to_s]}") - if feature['properties'].key?(name.to_s) - feature['properties'][name.to_s] - else - case name.to_s - when 'lon', 'longitude' - feature['geometry']['coordinates'].first - when 'lat', 'latitude' - feature['geometry']['coordinates'].last - when 'geo_type' - feature['geometry']['type'] - else - super - end - end + has_many :classifications + has_many :sections, through: :classifications + + serialize :feature, HashSerializer + store_accessor :feature, :name, :summary, :description, :email, :source, :address, :postal_code, :city, :phone_number, :website + + validates_associated :agent + + validates :name, + presence: true, + length: { in: 3..64 } + + validates :email, + with: { format: URI::MailTo::EMAIL_REGEXP }, + allow_blank: true + + validates :source, + inclusion: { in: Agent.pluck(:name) } + + # TODO: Address,Postal Code,City validation + + phony_normalize :phone_number, default_country_code: 'BE', normalize_when_valid: true + validates :phone_number, + phony_plausible: { ignore_record_country_code: true, ignore_record_country_number: true } + + # Depends on validate_url Gem + validates :website, + url: { allow_blank: true } + + # Accessors for feature['geometry'] + def geo_type + self.feature['geometry']['type'] + end + + # You can use, e.g.: res.longitude = 0.123 + def longitude + feature['geometry']['coordinates'][0] + end + def longitude=(value) + feature['geometry']['coordinates'][0] = value + end + # You can use, e.g.: res.latitude = 0.123 + def latitude + feature['geometry']['coordinates'][1] + end + def latitude=(value) + feature['geometry']['coordinates'][1] = value end end diff --git a/app/models/schemas/resource_feature_properties.json b/app/models/schemas/resource_feature_properties.json new file mode 100644 index 0000000..84cd6ae --- /dev/null +++ b/app/models/schemas/resource_feature_properties.json @@ -0,0 +1,12 @@ +// JSON Schema for Resource#feature +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://api.incommon.cc/schema/resource_feature.json", + "title": + "type": "object", + "required": [], + "geometry": { + }, + "properties": { + } +} diff --git a/app/models/section.rb b/app/models/section.rb index 6cfeb38..7d26882 100644 --- a/app/models/section.rb +++ b/app/models/section.rb @@ -1,11 +1,12 @@ class Section < ApplicationRecord belongs_to :category has_one :taxonomy, through: :category - has_and_belongs_to_many :resources + has_many :classifications + has_many :resources, through: :classifications acts_as_list column: :rank, scope: :category validates :name, uniqueness: { scope: :category_id }, - length: 3..64 + length: { in: 3..64 } end diff --git a/app/serializers/hash_serializer.rb b/app/serializers/hash_serializer.rb new file mode 100644 index 0000000..5db639f --- /dev/null +++ b/app/serializers/hash_serializer.rb @@ -0,0 +1,9 @@ +class HashSerializer + def self.dump(hash) + hash.to_json + end + + def self.load(hash) + (hash || {}).with_indifferent_access + end +end |