aboutsummaryrefslogtreecommitdiff
path: root/app/models/resource.rb
blob: c76a9c6b6c2216da8b8138ccf8484f71eb2b47ca (plain)
1
2
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
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# SPDX-FileCopyrightText: 2020 IN COMMON Collective <collective@incommon.cc>
#
# SPDX-License-Identifier: AGPL-3.0-or-later

require_dependency 'phony_rails'

class Resource < ApplicationRecord
  # Universally Unique Identifier :uuid
  include UUIDParameter

  belongs_to :agent
  has_many :classifications
  has_many :sections, through: :classifications

  store_accessor :feature, :geometry, :properties

#  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
    format('%<lon>3.7f', lon: feature['geometry']['coordinates'][0]).to_f
  end
  def longitude=(value)
    feature['geometry']['coordinates'][0] = format('%<lon>3.7f', lon: value).to_f
  end
  # You can use, e.g.: res.latitude = 0.123
  def latitude
    format('%<lat>2.7f', lat: feature['geometry']['coordinates'][1]).to_f
  end
  def latitude=(value)
    feature['geometry']['coordinates'][1] = format('%<lat>2.7f', lat: value).to_f
  end

  # Properties

  [:name, :summary, :description, :email, :source, :address, :postal_code, :city, :phone_number, :website].each do |prop|
    # Define a reader
    define_method prop do
      properties[prop.to_s]
    end
    define_method :"#{prop}=" do |v|
      feature['properties'][prop.to_s] = v
    end
  end

  # Poor man's GeoJSON output
  def to_geojson
    out = feature.dup
    # Convert original Dewey IDs with local Section IDs
    out['properties']['categories'] = Section.where(dewey_id: out['properties']['categories']).pluck(:id)
    # Add IN COMMON Resource UUID property
    out['properties']['uuid'] = uuid
    # Add IN COMMON Agent UUID property
    out['properties']['agent_uuid'] = agent.uuid
    out
  end
end