aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorhellekin <hellekin@cepheide.org>2020-10-09 10:24:06 +0200
committerhellekin <hellekin@cepheide.org>2020-10-09 10:24:06 +0200
commitf48ce2f4c934fde3862cdad593eececc7a567d61 (patch)
treed2c874f8ebf4686d07052fa333032c04ef49e861 /app
parent31850c6ca118b7828dbaa3ad1a87dab4287718f5 (diff)
downloadincommon-map-f48ce2f4c934fde3862cdad593eececc7a567d61.tar.gz
Add Classifications and Resource validations
- Turn `has_and_belongs_to_many` into `has_many :through`: now, resources and sections are related through Classifications. - Refactor usage of jsonb column to use ActiveRecord validations - Attention! store_accessor: NOTE: If you are using structured database data types (eg. PostgreSQL hstore/json, or MySQL 5.7+ json) there is no need for the serialization provided by .store. Simply use .store_accessor instead to generate the accessor methods. Be aware that these columns use a string keyed hash and do not allow access using a symbol. NOTE: The default validations with the exception of uniqueness will work. For example, if you want to check for uniqueness with hstore you will need to use a custom validation to handle it. https://api.rubyonrails.org/classes/ActiveRecord/Store.html
Diffstat (limited to 'app')
-rw-r--r--app/models/agent.rb11
-rw-r--r--app/models/classification.rb4
-rw-r--r--app/models/resource.rb68
-rw-r--r--app/models/schemas/resource_feature_properties.json12
-rw-r--r--app/models/section.rb5
-rw-r--r--app/serializers/hash_serializer.rb9
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