g5_updatable 0.20.3.pre.1 → 1.0.2.pre.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +48 -20
- data/Rakefile +30 -5
- data/app/concerns/g5_updatable/first_class_properties.rb +1 -1
- data/app/controllers/g5_updatable/base_updatable_controller.rb +0 -2
- data/app/controllers/g5_updatable/feed_controller.rb +1 -1
- data/app/controllers/g5_updatable/syncs_controller.rb +2 -2
- data/{lib → app/lib}/g5_updatable/all_client_urns_fetcher.rb +2 -1
- data/{lib → app/lib}/g5_updatable/client_feed_processor.rb +4 -2
- data/{lib → app/lib}/g5_updatable/client_updater.rb +0 -0
- data/{lib → app/lib}/g5_updatable/fetcher.rb +12 -3
- data/{lib → app/lib}/g5_updatable/indifferentizer.rb +0 -0
- data/{lib → app/lib}/g5_updatable/locations_updater.rb +42 -1
- data/app/lib/g5_updatable/version.rb +5 -0
- data/app/models/g5_updatable/client.rb +11 -0
- data/app/models/g5_updatable/hour_set.rb +6 -0
- data/app/models/g5_updatable/hub_amenity.rb +15 -10
- data/app/models/g5_updatable/location.rb +22 -10
- data/app/models/g5_updatable/point_of_interest.rb +6 -0
- data/app/models/g5_updatable/special_date.rb +16 -0
- data/app/models/g5_updatable/week_day.rb +6 -0
- data/app/workers/g5_updatable/client_feed_processor_worker.rb +11 -0
- data/config/initializers/inflections.rb +16 -0
- data/config/initializers/sidekiq.rb +7 -0
- data/db/migrate/20140709222005_create_g5_updatable_clients_and_locations.rb +1 -1
- data/db/migrate/20141030211945_create_integration_setting.rb +1 -1
- data/db/migrate/20141122211945_remove_integration_setting.rb +1 -1
- data/db/migrate/20141211211945_add_name_to_clients_and_locations.rb +1 -1
- data/db/migrate/20141211711945_update_names.rb +1 -1
- data/db/migrate/20151103043916_add_latitude_and_longitude_to_location.rb +1 -1
- data/db/migrate/20151103050229_copy_lat_long_props_to_lat_long_columns.rb +1 -1
- data/db/migrate/20151106070749_add_latitude_longitude_indexes_to_location.rb +1 -1
- data/db/migrate/20161122070749_add_amenities.rb +1 -1
- data/db/migrate/20161209070749_add_client_urn_to_locations.rb +1 -1
- data/db/migrate/20170422000000_add_points_of_interest.rb +20 -0
- data/db/migrate/20170428000000_add_hour_sets.rb +44 -0
- data/db/migrate/20170507000000_add_unique_urn_indexes.rb +9 -0
- data/db/migrate/20170720000000_add_display_name_to_locations.rb +6 -0
- data/db/migrate/20170804184206_add_details_to_points_of_interest.rb +7 -0
- data/db/migrate/20180213184549_change_fields_for_week_days_and_special_dates.rb +9 -0
- data/db/migrate/20180220203057_add_indexes_to_week_days.rb +7 -0
- data/db/migrate/20180725125651_add_location_id_to_special_dates.rb +7 -0
- data/lib/g5_updatable/engine.rb +18 -0
- data/lib/g5_updatable/factories.rb +17 -1
- data/lib/g5_updatable/rspec.rb +1 -1
- data/lib/g5_updatable/rspec/factories.rb +37 -1
- data/lib/g5_updatable/version.rb +3 -1
- data/lib/tasks/g5_updatable_tasks.rake +3 -3
- data/spec/concerns/g5_updatable/belongs_to_client_spec.rb +3 -1
- data/spec/concerns/g5_updatable/belongs_to_location_spec.rb +6 -5
- data/spec/controllers/feed_controller_spec.rb +11 -12
- data/spec/controllers/locations_controller_spec.rb +29 -5
- data/spec/controllers/syncs_controller_spec.rb +27 -19
- data/spec/dummy/config/environments/test.rb +18 -3
- data/spec/dummy/db/migrate/20140630175259_create_locations.rb +1 -1
- data/spec/dummy/db/migrate/20140630175330_create_clients.rb +1 -1
- data/spec/dummy/db/migrate/20140709220627_drop_clients_and_locations.rb +1 -1
- data/spec/dummy/db/migrate/20140714225203_create_favorite_foods.rb +1 -1
- data/spec/dummy/db/migrate/20141222072623_create_restaurants.rb +1 -1
- data/spec/dummy/db/schema.rb +99 -41
- data/spec/dummy/log/development.log +311 -0
- data/spec/dummy/log/test.log +113030 -0
- data/spec/fixtures/mj-cl-1tj7razq-the-commons-at-pilot-butte.json +231 -0
- data/spec/fixtures/mj-cl-1tj7razq-the-commons-at-pilot-butte2.json +193 -0
- data/spec/lib/g5_updatable/all_client_urns_fetcher_spec.rb +3 -3
- data/spec/lib/g5_updatable/client_feed_processor_spec.rb +44 -5
- data/spec/lib/g5_updatable/client_updater_spec.rb +2 -2
- data/spec/lib/g5_updatable/fetcher_spec.rb +28 -0
- data/spec/lib/g5_updatable/locations_updater_spec.rb +69 -11
- data/spec/models/g5_updatable/client_spec.rb +38 -0
- data/spec/models/g5_updatable/hour_set_spec.rb +12 -0
- data/spec/models/g5_updatable/location_spec.rb +46 -11
- data/spec/models/g5_updatable/point_of_interest_spec.rb +20 -0
- data/spec/models/g5_updatable/special_date_spec.rb +10 -0
- data/spec/models/g5_updatable/week_day_spec.rb +9 -0
- data/spec/serializers/g5_updatable/location_serializer_spec.rb +1 -1
- data/spec/spec_helper.rb +35 -10
- data/spec/support/safe_request_helpers.rb +26 -0
- data/spec/support/shared_example_for_urn_as_parameter.rb +1 -1
- data/spec/support/shared_examples_for_first_class_properties_json.rb +1 -1
- data/spec/workers/g5_updatable/client_feed_processor_worker_spec.rb +39 -0
- metadata +121 -74
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 93beab4174e49a498235996df13b1bc146415102
|
|
4
|
+
data.tar.gz: 4a7f6ceff1db6fb48aa3182b4504f78bfed7603f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: efe5b305ac002832bcf559a2626da2dbd830d2221c52c5442bd993cd70787e7a2ad3ebea0f6691aa46e30f1585fa7e5eb1ae7c9c5389b16eee2e8dd61052eba0
|
|
7
|
+
data.tar.gz: e4b950c357105f6d4c008451ecab304fdb80cc0b8f700f2e917bd7d0635b239dffecba04adf47762c8a342d5dd8dd852e714346b58f53d6351e01fb3e110241e
|
data/README.md
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
# G5 Updatable
|
|
2
2
|
|
|
3
|
-
[](http://badge.fury.io/rb/g5_updatable)
|
|
4
|
-
[](https://travis-ci.org/G5/g5_updatable)
|
|
5
|
-
|
|
6
3
|
G5 Updatable provides a solution for automatic updates of client and location
|
|
7
4
|
data when modified or created in the G5 Hub.
|
|
8
5
|
|
|
9
6
|
## Requirements
|
|
10
7
|
|
|
11
|
-
G5 Updatable makes use of
|
|
8
|
+
G5 Updatable makes use of PostgreSQL's `json` field type, and so only supports
|
|
9
|
+
apps that also use PostgreSQL.
|
|
10
|
+
|
|
11
|
+
Compatible with rails 4.x : Use version 0.x
|
|
12
|
+
|
|
13
|
+
Compatible with rails 5.x : Use version >= 1.0.0
|
|
12
14
|
|
|
13
15
|
## Installation
|
|
14
16
|
|
|
@@ -18,12 +20,13 @@ G5 Updatable makes use of PostgrSQL's `json` field type, and so only supports im
|
|
|
18
20
|
gem 'g5_updatable'
|
|
19
21
|
```
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
1. And then execute:
|
|
22
24
|
|
|
23
25
|
```console
|
|
24
26
|
bundle
|
|
25
27
|
```
|
|
26
|
-
|
|
28
|
+
|
|
29
|
+
1. Run the generator.
|
|
27
30
|
|
|
28
31
|
```ruby
|
|
29
32
|
rails g g5_updatable:install
|
|
@@ -31,12 +34,19 @@ G5 Updatable makes use of PostgrSQL's `json` field type, and so only supports im
|
|
|
31
34
|
|
|
32
35
|
This mounts the engine at `/g5_updatable`.
|
|
33
36
|
|
|
34
|
-
|
|
37
|
+
1. And copy the engine's migrations to your application:
|
|
35
38
|
|
|
36
|
-
|
|
39
|
+
```console
|
|
37
40
|
rake g5_updatable:install:migrations
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
```
|
|
42
|
+
1. Run the schema AND data migrations:
|
|
43
|
+
|
|
44
|
+
```console
|
|
45
|
+
rake db:migrate
|
|
46
|
+
rake g5_updatable:data_migration
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
2. Optional: load all of G5-Hub's data into your database
|
|
40
50
|
|
|
41
51
|
**Important:** The entries.js and entries.json endpoint on the hub are deprecated. So, for all versions of g5_updatable before 0.17.0, this task will only load the newest 10 clients. If you would like to load all clients, please specify "~> 0.17.0" or higher in your Gemfile.
|
|
42
52
|
|
|
@@ -79,6 +89,7 @@ end
|
|
|
79
89
|
|
|
80
90
|
Also optionally expect a secondary block argument, receiving the object previous to be updated
|
|
81
91
|
... you know.. For diff reasons.
|
|
92
|
+
|
|
82
93
|
```ruby
|
|
83
94
|
G5Updatable::LocationsUpdater.on_update do |g5_updatable_location, before_update_location|
|
|
84
95
|
puts "G5Updatable::Location##{before_update_location.properties} changed to "
|
|
@@ -110,6 +121,11 @@ end
|
|
|
110
121
|
|
|
111
122
|
It provides a `#location` method that will fetch the correct location.
|
|
112
123
|
|
|
124
|
+
### Dependencies
|
|
125
|
+
|
|
126
|
+
Versions >= 0.28.0 include Sidekiq as a dependency so that feed processing can be
|
|
127
|
+
handled asynchronously instead of in the context of a web request. Note that we assume a queue of ```g5_updatable``` is present and that applications with custom queues should make sure to include one by that name, which can be prioritized per app as needed.
|
|
128
|
+
|
|
113
129
|
### Spec Helpers
|
|
114
130
|
|
|
115
131
|
The engine provides a helper files that can be included in your project to bring in some testing support. Currently this is limited to (some factory definitions)[https://github.com/G5/g5_updatable/blob/active-record-up-in-here/lib/g5_updatable/rspec/factories.rb]. In rspec you can add the following line to your `spec/spec_helper.rb`:
|
|
@@ -118,9 +134,9 @@ The engine provides a helper files that can be included in your project to bring
|
|
|
118
134
|
require 'g5_updatable/rspec'
|
|
119
135
|
```
|
|
120
136
|
|
|
121
|
-
###
|
|
137
|
+
### FactoryBot Factories
|
|
122
138
|
|
|
123
|
-
For easier testing, if your app uses `
|
|
139
|
+
For easier testing, if your app uses `FactoryBot`, you can get access to factories by `require "g5_updatable/factories"`.
|
|
124
140
|
|
|
125
141
|
## Authors
|
|
126
142
|
|
|
@@ -143,17 +159,29 @@ If you find bugs, have feature requests or questions, please
|
|
|
143
159
|
## Specs
|
|
144
160
|
|
|
145
161
|
The `database.yml` for the dummy app must be created and modified to match your
|
|
146
|
-
PostgreSQL configuration.
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
162
|
+
PostgreSQL configuration. You can copy it into place with:
|
|
163
|
+
|
|
164
|
+
```console
|
|
165
|
+
cp spec/dummy/config/database.sample.yml spec/dummy/config/database.yml
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Set up the test database for the first time:
|
|
169
|
+
|
|
170
|
+
```console
|
|
171
|
+
bundle exec rake db:test:setup
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Run specs:
|
|
175
|
+
|
|
176
|
+
```console
|
|
177
|
+
bundle exec rspec spec
|
|
151
178
|
```
|
|
152
179
|
|
|
153
|
-
|
|
180
|
+
If you add a migration, make sure you apply it to the dummy app and commit the
|
|
181
|
+
changes to spec/dummy/db/schema.rb:
|
|
154
182
|
|
|
155
|
-
```
|
|
156
|
-
|
|
183
|
+
```console
|
|
184
|
+
bundle exec rake app:db:migrate RAILS_ENV=test
|
|
157
185
|
```
|
|
158
186
|
|
|
159
187
|
## License
|
data/Rakefile
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
begin
|
|
2
4
|
require 'bundler/setup'
|
|
3
5
|
rescue LoadError
|
|
@@ -14,7 +16,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
|
|
|
14
16
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
15
17
|
end
|
|
16
18
|
|
|
17
|
-
APP_RAKEFILE = File.expand_path(
|
|
19
|
+
APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
|
|
18
20
|
load 'rails/tasks/engine.rake'
|
|
19
21
|
|
|
20
22
|
Bundler::GemHelper.install_tasks
|
|
@@ -22,9 +24,32 @@ Bundler::GemHelper.install_tasks
|
|
|
22
24
|
require 'rspec/core'
|
|
23
25
|
require 'rspec/core/rake_task'
|
|
24
26
|
|
|
25
|
-
Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
|
|
27
|
+
Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each { |f| load f }
|
|
28
|
+
|
|
29
|
+
namespace :db do
|
|
30
|
+
namespace :test do
|
|
31
|
+
desc 'Set up a new test database'
|
|
32
|
+
task :setup do
|
|
33
|
+
Rails.env = 'test'
|
|
34
|
+
Rake::Task['app:db:create'].invoke
|
|
35
|
+
Rake::Task['app:db:migrate'].invoke
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
desc 'Drop the test database'
|
|
39
|
+
task :drop do
|
|
40
|
+
Rails.env = 'test'
|
|
41
|
+
Rake::Task['app:db:drop'].invoke
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
26
45
|
|
|
27
|
-
desc
|
|
46
|
+
desc 'Set up test db and run all specs'
|
|
47
|
+
RSpec::Core::RakeTask.new(spec: 'db:test:setup')
|
|
48
|
+
task default: :spec
|
|
28
49
|
|
|
29
|
-
|
|
30
|
-
|
|
50
|
+
namespace :spec do
|
|
51
|
+
desc 'Run tests and clean up the db afterwards'
|
|
52
|
+
task clean: :spec do
|
|
53
|
+
Rake::Task['db:test:drop'].invoke
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -13,7 +13,7 @@ module G5Updatable::FirstClassProperties
|
|
|
13
13
|
protected
|
|
14
14
|
|
|
15
15
|
def define_methods_for_properties
|
|
16
|
-
return unless properties.present?
|
|
16
|
+
return unless has_attribute?(:properties) && properties.present?
|
|
17
17
|
|
|
18
18
|
properties.each do |key, value|
|
|
19
19
|
next if respond_to?(key)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
class G5Updatable::FeedController < G5Updatable::BaseUpdatableController
|
|
2
2
|
def update
|
|
3
|
-
G5Updatable::
|
|
3
|
+
G5Updatable::ClientFeedProcessorWorker.perform_async(client_uid: params[:client_uid], location_uid: params[:location_uid])
|
|
4
4
|
render json: {}, status: :ok
|
|
5
5
|
end
|
|
6
6
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
class G5Updatable::SyncsController < G5Updatable::BaseUpdatableController
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
before_action :set_client
|
|
4
4
|
|
|
5
5
|
def index
|
|
6
6
|
timestamp = @client.locations.max_updated_at
|
|
@@ -16,4 +16,4 @@ class G5Updatable::SyncsController < G5Updatable::BaseUpdatableController
|
|
|
16
16
|
def formatted_timestamp(timestamp)
|
|
17
17
|
timestamp.in_time_zone.strftime("%I:%M%P on %B %e, %Y") if timestamp
|
|
18
18
|
end
|
|
19
|
-
end
|
|
19
|
+
end
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
module G5Updatable
|
|
2
2
|
class AllClientUrnsFetcher
|
|
3
3
|
def self.fetch_uids
|
|
4
|
-
G5Updatable::Fetcher.get_with_token(url)['clients'
|
|
4
|
+
return unless urns = G5Updatable::Fetcher.get_with_token(url).try(:[], 'clients')
|
|
5
|
+
urns.collect do |urn|
|
|
5
6
|
"#{hub_url}/clients/#{urn['urn']}.json"
|
|
6
7
|
end
|
|
7
8
|
end
|
|
@@ -32,11 +32,13 @@ class G5Updatable::ClientFeedProcessor
|
|
|
32
32
|
private
|
|
33
33
|
|
|
34
34
|
def update_location
|
|
35
|
-
|
|
35
|
+
return unless update_params = location_hash
|
|
36
|
+
G5Updatable::LocationsUpdater.new(update_params).update
|
|
36
37
|
end
|
|
37
38
|
|
|
38
39
|
def update_client
|
|
39
|
-
|
|
40
|
+
return unless update_params = client_hash
|
|
41
|
+
G5Updatable::ClientUpdater.new(update_params).update
|
|
40
42
|
end
|
|
41
43
|
|
|
42
44
|
def client_hash
|
|
File without changes
|
|
@@ -3,8 +3,11 @@ module G5Updatable
|
|
|
3
3
|
extend ::G5AuthenticationClient::AuthTokenHelper
|
|
4
4
|
|
|
5
5
|
def self.get_with_token(url)
|
|
6
|
+
url = self.url_for_env(url)
|
|
6
7
|
response = do_with_username_pw_access_token do |access_token|
|
|
7
|
-
|
|
8
|
+
query = { access_token: access_token, updatable_version: G5Updatable::VERSION }
|
|
9
|
+
query[:updatable_referer] = ENV['HEROKU_APP_NAME'] unless ENV['HEROKU_APP_NAME'].blank?
|
|
10
|
+
::HTTParty.get(url, { query: query,
|
|
8
11
|
headers: { 'Content-Type' => 'application/json',
|
|
9
12
|
'Accept' => 'application/json' } })
|
|
10
13
|
end
|
|
@@ -13,10 +16,16 @@ module G5Updatable
|
|
|
13
16
|
when 200
|
|
14
17
|
JSON.parse(response.body)
|
|
15
18
|
when 404
|
|
16
|
-
|
|
19
|
+
Rails.logger.warn "Couldn't find record at URL '#{url}'"
|
|
20
|
+
return {}
|
|
17
21
|
else
|
|
18
22
|
raise "I got an unexpected response code '#{response.code}'"
|
|
19
23
|
end
|
|
20
24
|
end
|
|
25
|
+
|
|
26
|
+
def self.url_for_env(url)
|
|
27
|
+
return url.gsub(/(http|https):\/\/([a-zA-Z0-9-]*\.)+[a-zA-Z0-9]+/, ENV['HUB_URL']) if ENV['HUB_URL'].present?
|
|
28
|
+
url
|
|
29
|
+
end
|
|
21
30
|
end
|
|
22
|
-
end
|
|
31
|
+
end
|
|
File without changes
|
|
@@ -39,7 +39,10 @@ class G5Updatable::LocationsUpdater
|
|
|
39
39
|
before_update_object = location.dup
|
|
40
40
|
is_new_loc = location.new_record?
|
|
41
41
|
|
|
42
|
-
amenities
|
|
42
|
+
amenities = attributes.delete(:amenities)
|
|
43
|
+
points_of_interest = attributes.delete(:points_of_interest)
|
|
44
|
+
hour_sets = attributes.delete(:hour_sets)
|
|
45
|
+
special_dates = attributes.delete(:special_dates)
|
|
43
46
|
location.update_attributes!(
|
|
44
47
|
uid: attributes[:uid],
|
|
45
48
|
name: attributes[:name],
|
|
@@ -50,6 +53,9 @@ class G5Updatable::LocationsUpdater
|
|
|
50
53
|
updated_at: Time.now
|
|
51
54
|
)
|
|
52
55
|
create_amenities(amenities, location)
|
|
56
|
+
create_points_of_interest(points_of_interest, location)
|
|
57
|
+
create_hour_sets(hour_sets, location)
|
|
58
|
+
create_special_dates(special_dates, location)
|
|
53
59
|
self.class.on_create_callbacks.each { |cb| cb.call(location) } if is_new_loc
|
|
54
60
|
self.class.on_update_callbacks.each { |cb| cb.call(location, before_update_object) }
|
|
55
61
|
end
|
|
@@ -63,6 +69,41 @@ class G5Updatable::LocationsUpdater
|
|
|
63
69
|
location.refresh_flat_amenity_names!
|
|
64
70
|
end
|
|
65
71
|
|
|
72
|
+
def create_points_of_interest(poi_hashes, location)
|
|
73
|
+
location.points_of_interest.delete_all
|
|
74
|
+
return if poi_hashes.blank?
|
|
75
|
+
poi_hashes.each do |poi_hash|
|
|
76
|
+
location.points_of_interest.create(poi_hash.except(:id, :location_id))
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def create_hour_sets(hour_set_hashes, location)
|
|
81
|
+
location.hour_sets.destroy_all
|
|
82
|
+
return if hour_set_hashes.blank?
|
|
83
|
+
hour_set_hashes.each do |hour_set_hash|
|
|
84
|
+
attributes = hour_set_hash.dup
|
|
85
|
+
week_days = attributes.delete(:week_days)
|
|
86
|
+
special_dates = attributes.delete(:special_dates)
|
|
87
|
+
hour_set = location.hour_sets.create(attributes.except(:id, :location_id))
|
|
88
|
+
create_week_days(week_days, hour_set)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def create_week_days(week_day_hashes, hour_set)
|
|
93
|
+
return if week_day_hashes.blank?
|
|
94
|
+
week_day_hashes.each do |week_day_hash|
|
|
95
|
+
hour_set.week_days.create(week_day_hash.except(:id, :hour_set_id))
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def create_special_dates(special_date_hashes, location)
|
|
100
|
+
location.special_dates.destroy_all
|
|
101
|
+
return if special_date_hashes.blank?
|
|
102
|
+
special_date_hashes.each do |special_date_hash|
|
|
103
|
+
location.special_dates.create(special_date_hash.except(:id))
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
66
107
|
def create_or_update_amenity(amenity_hash)
|
|
67
108
|
amenity = G5Updatable::HubAmenity.where(external_id: amenity_hash[:id]).first_or_create
|
|
68
109
|
if amenity.name != amenity_hash[:name] || amenity.icon != amenity_hash[:icon]
|
|
@@ -10,5 +10,16 @@ module G5Updatable
|
|
|
10
10
|
})
|
|
11
11
|
|
|
12
12
|
validates :uid, :urn, presence: true, uniqueness: true
|
|
13
|
+
|
|
14
|
+
CENTRALIZED_CLS_URL_PROPERTY = 'centralized_cls_url'.freeze
|
|
15
|
+
CENTRALIZED_CMS_URL_PROPERTY = 'centralized_cms_url'.freeze
|
|
16
|
+
|
|
17
|
+
def centralized_cls?
|
|
18
|
+
properties[CENTRALIZED_CLS_URL_PROPERTY].present?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def centralized_cms?
|
|
22
|
+
properties[CENTRALIZED_CMS_URL_PROPERTY].present?
|
|
23
|
+
end
|
|
13
24
|
end
|
|
14
25
|
end
|
|
@@ -1,21 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module G5Updatable
|
|
2
4
|
class HubAmenity < ActiveRecord::Base
|
|
3
5
|
validates :external_id, presence: true
|
|
4
6
|
has_many :hub_amenities_locations, foreign_key: :g5_updatable_hub_amenity_id
|
|
5
7
|
|
|
6
|
-
scope :by_client_urn,
|
|
7
|
-
joins(hub_amenities_locations: { location: :client })
|
|
8
|
-
|
|
8
|
+
scope :by_client_urn, lambda { |client_urn|
|
|
9
|
+
joins(hub_amenities_locations: { location: :client })
|
|
10
|
+
.where('g5_updatable_clients.urn = :client_urn',
|
|
11
|
+
client_urn: client_urn).distinct
|
|
9
12
|
}
|
|
10
13
|
|
|
11
|
-
scope :by_client_urns,
|
|
12
|
-
joins(hub_amenities_locations: { location: :client })
|
|
13
|
-
|
|
14
|
+
scope :by_client_urns, lambda { |client_urns|
|
|
15
|
+
joins(hub_amenities_locations: { location: :client })
|
|
16
|
+
.where('g5_updatable_clients.urn IN (:client_urns)',
|
|
17
|
+
client_urns: client_urns.join(',')).distinct
|
|
14
18
|
}
|
|
15
19
|
|
|
16
|
-
scope :by_client_uid,
|
|
17
|
-
joins(hub_amenities_locations: :location)
|
|
18
|
-
|
|
20
|
+
scope :by_client_uid, lambda { |client_uid|
|
|
21
|
+
joins(hub_amenities_locations: :location)
|
|
22
|
+
.where('g5_updatable_locations.client_uid = :client_uid',
|
|
23
|
+
client_uid: client_uid).distinct
|
|
19
24
|
}
|
|
20
25
|
end
|
|
21
|
-
end
|
|
26
|
+
end
|
|
@@ -4,11 +4,17 @@ module G5Updatable
|
|
|
4
4
|
include G5Updatable::UrnAsParameter
|
|
5
5
|
include BelongsToClient
|
|
6
6
|
|
|
7
|
+
has_many :points_of_interest, foreign_key: :g5_updatable_location_id, dependent: :destroy
|
|
8
|
+
has_many :hour_sets, foreign_key: :g5_updatable_location_id, dependent: :destroy
|
|
9
|
+
has_many :week_days, through: :hour_sets, dependent: :destroy
|
|
10
|
+
has_many :special_dates, foreign_key: :g5_updatable_location_id, dependent: :destroy
|
|
7
11
|
has_many :hub_amenities_locations, foreign_key: :g5_updatable_location_id, dependent: :destroy
|
|
8
12
|
has_many :hub_amenities, through: :hub_amenities_locations
|
|
9
13
|
|
|
10
|
-
validates :uid, :urn, :client_uid,
|
|
14
|
+
validates :uid, :urn, :client_uid, presence: true
|
|
11
15
|
validates :urn, uniqueness: true
|
|
16
|
+
# Only validate if the column exists, which it doesn't on older versions of this gem
|
|
17
|
+
validates :client_urn, presence: true, if: Proc.new { |l| l.respond_to? :client_urn }
|
|
12
18
|
|
|
13
19
|
scope :by_client_uid, -> (client_uid) { where(client_uid: client_uid) }
|
|
14
20
|
scope :by_client_urn, -> (client_urn) { where(client_urn: client_urn) }
|
|
@@ -30,7 +36,11 @@ module G5Updatable
|
|
|
30
36
|
end
|
|
31
37
|
results
|
|
32
38
|
}
|
|
33
|
-
before_validation :set_client_urn, :set_client_uid
|
|
39
|
+
before_validation :set_client_urn, :set_client_uid, :set_display_name
|
|
40
|
+
|
|
41
|
+
def self.ordered_display_names_and_urns_by_client_urn(client_urn)
|
|
42
|
+
where(client_urn: client_urn).order(:display_name).select(:display_name, :urn)
|
|
43
|
+
end
|
|
34
44
|
|
|
35
45
|
def refresh_flat_amenity_names!
|
|
36
46
|
update_attributes(flat_amenity_names: self.class.amenity_names_to_tokenized_string(hub_amenities.collect(&:name)))
|
|
@@ -47,12 +57,6 @@ module G5Updatable
|
|
|
47
57
|
"#{FLAT_DELIM}#{[names_array].flatten.compact.sort.join(FLAT_DELIM)}#{FLAT_DELIM}"
|
|
48
58
|
end
|
|
49
59
|
|
|
50
|
-
def display_name
|
|
51
|
-
return nil unless properties
|
|
52
|
-
return properties['internal_branded_name'] if properties['internal_branded_name'].present?
|
|
53
|
-
name
|
|
54
|
-
end
|
|
55
|
-
|
|
56
60
|
def neighborhoods
|
|
57
61
|
[properties['neighborhood'], properties['neighborhood_2']].select(&:present?)
|
|
58
62
|
end
|
|
@@ -62,7 +66,7 @@ module G5Updatable
|
|
|
62
66
|
end
|
|
63
67
|
|
|
64
68
|
def no_deploy?
|
|
65
|
-
|
|
69
|
+
properties['no_deploy']
|
|
66
70
|
end
|
|
67
71
|
|
|
68
72
|
def pending?
|
|
@@ -83,12 +87,20 @@ module G5Updatable
|
|
|
83
87
|
!!match
|
|
84
88
|
end
|
|
85
89
|
|
|
90
|
+
# Custom setter because older version of this gem don't have this attrbute
|
|
86
91
|
def set_client_urn
|
|
87
|
-
self.
|
|
92
|
+
if self.client_uid and self.respond_to?(:client_urn)
|
|
93
|
+
self.client_urn ||= self.client_uid.split('/').last
|
|
94
|
+
end
|
|
88
95
|
end
|
|
89
96
|
|
|
90
97
|
def set_client_uid
|
|
91
98
|
self.client_uid||= self.client.try(:uid)
|
|
92
99
|
end
|
|
100
|
+
|
|
101
|
+
def set_display_name
|
|
102
|
+
branded = properties.try(:[], 'internal_branded_name')
|
|
103
|
+
self.display_name = branded.present? ? branded : name
|
|
104
|
+
end
|
|
93
105
|
end
|
|
94
106
|
end
|