supplejack_api 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 +7 -0
- data/README.md +80 -0
- data/Rakefile +42 -0
- data/app/assets/javascripts/supplejack_api/application.js +26 -0
- data/app/assets/stylesheets/supplejack_api/application.css +30 -0
- data/app/controllers/supplejack_api/admin/base_controller.rb +24 -0
- data/app/controllers/supplejack_api/admin/sessions_controller.rb +25 -0
- data/app/controllers/supplejack_api/admin/site_activities_controller.rb +21 -0
- data/app/controllers/supplejack_api/admin/users_controller.rb +55 -0
- data/app/controllers/supplejack_api/application_controller.rb +70 -0
- data/app/controllers/supplejack_api/concepts_controller.rb +52 -0
- data/app/controllers/supplejack_api/concerns/ignore_metrics.rb +14 -0
- data/app/controllers/supplejack_api/concerns/records_controller_metrics.rb +26 -0
- data/app/controllers/supplejack_api/concerns/set_items_controller_metrics.rb +20 -0
- data/app/controllers/supplejack_api/concerns/user_sets_controller_metrics.rb +26 -0
- data/app/controllers/supplejack_api/harvester/concepts_controller.rb +41 -0
- data/app/controllers/supplejack_api/harvester/fragments_controller.rb +30 -0
- data/app/controllers/supplejack_api/harvester/records_controller.rb +68 -0
- data/app/controllers/supplejack_api/metrics_api_controller.rb +44 -0
- data/app/controllers/supplejack_api/partners_controller.rb +39 -0
- data/app/controllers/supplejack_api/records_controller.rb +71 -0
- data/app/controllers/supplejack_api/schema_controller.rb +19 -0
- data/app/controllers/supplejack_api/set_items_controller.rb +38 -0
- data/app/controllers/supplejack_api/sources_controller.rb +67 -0
- data/app/controllers/supplejack_api/status_controller.rb +67 -0
- data/app/controllers/supplejack_api/user_sets_controller.rb +97 -0
- data/app/controllers/supplejack_api/users_controller.rb +49 -0
- data/app/helpers/supplejack_api/application_helper.rb +39 -0
- data/app/helpers/supplejack_api/facets_helper.rb +30 -0
- data/app/mailers/supplejack_api/request_limit_mailer.rb +43 -0
- data/app/models/supplejack_api/api_concept/concept_fragment.rb +31 -0
- data/app/models/supplejack_api/api_record/record_fragment.rb +15 -0
- data/app/models/supplejack_api/concept.rb +46 -0
- data/app/models/supplejack_api/concept_search.rb +86 -0
- data/app/models/supplejack_api/concerns/queryable_by_date.rb +31 -0
- data/app/models/supplejack_api/concerns/record.rb +108 -0
- data/app/models/supplejack_api/concerns/record_fragmentable.rb +24 -0
- data/app/models/supplejack_api/concerns/searchable.rb +430 -0
- data/app/models/supplejack_api/concerns/user_set.rb +219 -0
- data/app/models/supplejack_api/daily_metrics.rb +20 -0
- data/app/models/supplejack_api/faceted_metrics.rb +55 -0
- data/app/models/supplejack_api/fragment.rb +82 -0
- data/app/models/supplejack_api/interaction_models/record.rb +60 -0
- data/app/models/supplejack_api/interaction_models/set.rb +13 -0
- data/app/models/supplejack_api/interaction_updaters/all_usage_metric.rb +41 -0
- data/app/models/supplejack_api/interaction_updaters/set_metrics.rb +32 -0
- data/app/models/supplejack_api/interaction_updaters/usage_metrics.rb +73 -0
- data/app/models/supplejack_api/partner.rb +24 -0
- data/app/models/supplejack_api/preview_record.rb +30 -0
- data/app/models/supplejack_api/record.rb +18 -0
- data/app/models/supplejack_api/record_search.rb +12 -0
- data/app/models/supplejack_api/schema_definition.rb +147 -0
- data/app/models/supplejack_api/search.rb +14 -0
- data/app/models/supplejack_api/set_item.rb +57 -0
- data/app/models/supplejack_api/site_activity.rb +59 -0
- data/app/models/supplejack_api/source.rb +28 -0
- data/app/models/supplejack_api/source_activity.rb +36 -0
- data/app/models/supplejack_api/source_authority.rb +42 -0
- data/app/models/supplejack_api/supplejack_schema.rb +37 -0
- data/app/models/supplejack_api/support/concept/searchable.rb +79 -0
- data/app/models/supplejack_api/support/concept/storable.rb +59 -0
- data/app/models/supplejack_api/support/fragment_helpers.rb +96 -0
- data/app/models/supplejack_api/support/harvestable.rb +105 -0
- data/app/models/supplejack_api/support/searchable.rb +115 -0
- data/app/models/supplejack_api/support/status_logger.rb +23 -0
- data/app/models/supplejack_api/support/storable.rb +49 -0
- data/app/models/supplejack_api/support/validation_logger.rb +23 -0
- data/app/models/supplejack_api/usage_metrics.rb +25 -0
- data/app/models/supplejack_api/user.rb +211 -0
- data/app/models/supplejack_api/user_activity.rb +65 -0
- data/app/models/supplejack_api/user_set.rb +17 -0
- data/app/serializers/supplejack_api/application_serializer.rb +12 -0
- data/app/serializers/supplejack_api/concept_record_serializer.rb +23 -0
- data/app/serializers/supplejack_api/concept_search_serializer.rb +12 -0
- data/app/serializers/supplejack_api/concept_serializer.rb +100 -0
- data/app/serializers/supplejack_api/concerns/record_serializable.rb +119 -0
- data/app/serializers/supplejack_api/concerns/search_serializable.rb +24 -0
- data/app/serializers/supplejack_api/record_search_serializer.rb +64 -0
- data/app/serializers/supplejack_api/record_serializer.rb +13 -0
- data/app/serializers/supplejack_api/search_serializer.rb +13 -0
- data/app/serializers/supplejack_api/source_authority_serializer.rb +23 -0
- data/app/serializers/supplejack_api/user_serializer.rb +13 -0
- data/app/serializers/supplejack_api/user_set_record_serializer.rb +14 -0
- data/app/serializers/supplejack_api/user_set_serializer.rb +77 -0
- data/app/services/metrics_api/v3/api.rb +30 -0
- data/app/services/metrics_api/v3/endpoints/facets.rb +23 -0
- data/app/services/metrics_api/v3/endpoints/global.rb +26 -0
- data/app/services/metrics_api/v3/endpoints/helpers.rb +14 -0
- data/app/services/metrics_api/v3/endpoints/root.rb +97 -0
- data/app/services/metrics_api/v3/presenters/daily_metric.rb +23 -0
- data/app/services/metrics_api/v3/presenters/extended_metadata.rb +41 -0
- data/app/services/metrics_api/v3/presenters/record.rb +26 -0
- data/app/services/metrics_api/v3/presenters/view.rb +28 -0
- data/app/views/layouts/supplejack_api/_head.html.erb +17 -0
- data/app/views/layouts/supplejack_api/_top_nav.html.erb +33 -0
- data/app/views/layouts/supplejack_api/application.html.erb +33 -0
- data/app/views/supplejack_api/admin/sessions/new.html.erb +25 -0
- data/app/views/supplejack_api/admin/shared/_links.erb +34 -0
- data/app/views/supplejack_api/admin/site_activities/index.csv.erb +22 -0
- data/app/views/supplejack_api/admin/site_activities/index.html.erb +54 -0
- data/app/views/supplejack_api/admin/users/edit.html.erb +16 -0
- data/app/views/supplejack_api/admin/users/index.csv.erb +22 -0
- data/app/views/supplejack_api/admin/users/index.html.erb +57 -0
- data/app/views/supplejack_api/admin/users/show.html.erb +33 -0
- data/app/views/supplejack_api/request_limit_mailer/at100percent.text.erb +13 -0
- data/app/views/supplejack_api/request_limit_mailer/at100percent_admin.text.erb +1 -0
- data/app/views/supplejack_api/request_limit_mailer/at90percent.text.erb +13 -0
- data/app/views/supplejack_api/request_limit_mailer/at90percent_admin.text.erb +1 -0
- data/app/workers/supplejack_api/daily_metrics_worker.rb +112 -0
- data/app/workers/supplejack_api/interaction_metrics_worker.rb +45 -0
- data/config/cucumber.yml +16 -0
- data/config/initializers/force_eagerload.rb +11 -0
- data/config/initializers/interaction_updaters.rb +7 -0
- data/config/routes.rb +81 -0
- data/db/binding_records.development.json +7 -0
- data/db/binding_records.staging.json +7 -0
- data/db/concepts.json +33 -0
- data/db/concepts_data.json +569745 -0
- data/db/source_authorities.json +119 -0
- data/lib/generators/supplejack_api/install_generator.rb +124 -0
- data/lib/mongoid/paperclip.rb +53 -0
- data/lib/mongoid/string.rb +20 -0
- data/lib/sunspot/mongoid.rb +51 -0
- data/lib/sunspot/resque_session_proxy.rb +72 -0
- data/lib/sunspot/sunspot_spellcheck.rb +98 -0
- data/lib/supplejack_api.rb +13 -0
- data/lib/supplejack_api/admin/sortable.rb +40 -0
- data/lib/supplejack_api/engine.rb +46 -0
- data/lib/supplejack_api/harvester_constraint.rb +28 -0
- data/lib/supplejack_api/stylesheets.rb +36 -0
- data/lib/supplejack_api/utils.rb +75 -0
- data/lib/supplejack_api/version.rb +11 -0
- data/lib/tasks/resque.rake +22 -0
- data/lib/url_validator.rb +38 -0
- data/spec/controllers/supplejack_api/admin/base_controller_spec.rb +55 -0
- data/spec/controllers/supplejack_api/admin/site_activities_controller_spec.rb +43 -0
- data/spec/controllers/supplejack_api/admin/users_controller_spec.rb +79 -0
- data/spec/controllers/supplejack_api/application_controller_spec.rb +133 -0
- data/spec/controllers/supplejack_api/concepts_controller_spec.rb +83 -0
- data/spec/controllers/supplejack_api/concerns/records_controller_metrics_spec.rb +60 -0
- data/spec/controllers/supplejack_api/harvester/concepts_controller_spec.rb +57 -0
- data/spec/controllers/supplejack_api/harvester/records_controller_spec.rb +138 -0
- data/spec/controllers/supplejack_api/metrics_api_controller_spec.rb +71 -0
- data/spec/controllers/supplejack_api/partners_controller_spec.rb +77 -0
- data/spec/controllers/supplejack_api/records_controller_spec.rb +143 -0
- data/spec/controllers/supplejack_api/set_items_controller_spec.rb +78 -0
- data/spec/controllers/supplejack_api/sources_controller_spec.rb +161 -0
- data/spec/controllers/supplejack_api/status_controller_spec.rb +120 -0
- data/spec/controllers/supplejack_api/user_sets_controller_spec.rb +233 -0
- data/spec/controllers/supplejack_api/users_controller_spec.rb +61 -0
- data/spec/dummy/README.rdoc +268 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +23 -0
- data/spec/dummy/app/assets/stylesheets/application.css +22 -0
- data/spec/dummy/app/controllers/application_controller.rb +10 -0
- data/spec/dummy/app/helpers/application_helper.rb +9 -0
- data/spec/dummy/app/supplejack_api/concept_schema.rb +83 -0
- data/spec/dummy/app/supplejack_api/record_schema.rb +64 -0
- data/spec/dummy/app/supplejack_api/record_schema.txt +66 -0
- data/spec/dummy/app/views/layouts/application.html.erb +23 -0
- data/spec/dummy/app/workers/supplejack_api/clear_index_buffer.rb +32 -0
- data/spec/dummy/app/workers/supplejack_api/flush_old_records_worker.rb +17 -0
- data/spec/dummy/app/workers/supplejack_api/index_buffer.rb +49 -0
- data/spec/dummy/app/workers/supplejack_api/index_source_worker.rb +39 -0
- data/spec/dummy/app/workers/supplejack_api/index_worker.rb +82 -0
- data/spec/dummy/app/workers/supplejack_api/store_user_activity_worker.rb +24 -0
- data/spec/dummy/config.ru +11 -0
- data/spec/dummy/config/application.rb +76 -0
- data/spec/dummy/config/application.yml +31 -0
- data/spec/dummy/config/application.yml.example +36 -0
- data/spec/dummy/config/boot.rb +17 -0
- data/spec/dummy/config/environment.rb +12 -0
- data/spec/dummy/config/environments/development.rb +42 -0
- data/spec/dummy/config/environments/production.rb +76 -0
- data/spec/dummy/config/environments/test.rb +46 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +14 -0
- data/spec/dummy/config/initializers/devise.rb +214 -0
- data/spec/dummy/config/initializers/inflections.rb +22 -0
- data/spec/dummy/config/initializers/kaminari_config.rb +17 -0
- data/spec/dummy/config/initializers/mime_types.rb +12 -0
- data/spec/dummy/config/initializers/mongoid.rb +9 -0
- data/spec/dummy/config/initializers/quiet_logger.rb +23 -0
- data/spec/dummy/config/initializers/resque.rb +18 -0
- data/spec/dummy/config/initializers/secret_token.rb +14 -0
- data/spec/dummy/config/initializers/session_store.rb +15 -0
- data/spec/dummy/config/initializers/simple_form.rb +149 -0
- data/spec/dummy/config/initializers/simple_form_foundation.rb +33 -0
- data/spec/dummy/config/initializers/state_machine.rb +8 -0
- data/spec/dummy/config/initializers/sunspot.rb +32 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +17 -0
- data/spec/dummy/config/locales/devise.en.yml +63 -0
- data/spec/dummy/config/locales/en.yml +66 -0
- data/spec/dummy/config/locales/simple_form.en.yml +33 -0
- data/spec/dummy/config/mongoid.travis.yml +34 -0
- data/spec/dummy/config/mongoid.yml +36 -0
- data/spec/dummy/config/resque-pool.yml +18 -0
- data/spec/dummy/config/resque_schedule.yml +12 -0
- data/spec/dummy/config/routes.rb +11 -0
- data/spec/dummy/config/secrets.yml +8 -0
- data/spec/dummy/config/sunspot.yml +38 -0
- data/spec/dummy/db/concepts.json +37 -0
- data/spec/dummy/db/source_authorities.json +116 -0
- data/spec/dummy/public/404.html +35 -0
- data/spec/dummy/public/422.html +35 -0
- data/spec/dummy/public/500.html +34 -0
- data/spec/dummy/public/favicon.ico +8 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/dummy/solr/collection1/conf/elevate.xml +36 -0
- data/spec/dummy/solr/collection1/conf/mapping-FoldToASCII.txt +3813 -0
- data/spec/dummy/solr/collection1/conf/schema.xml +292 -0
- data/spec/dummy/solr/collection1/conf/solrconfig.xml +1780 -0
- data/spec/dummy/solr/collection1/conf/spellings.txt +2 -0
- data/spec/dummy/solr/collection1/conf/stopwords.txt +58 -0
- data/spec/dummy/solr/collection1/conf/synonyms.txt +31 -0
- data/spec/factories/concepts.rb +16 -0
- data/spec/factories/daily_metrics.rb +10 -0
- data/spec/factories/faceted_metrics.rb +25 -0
- data/spec/factories/fragment.rb +14 -0
- data/spec/factories/partners.rb +14 -0
- data/spec/factories/record_interaction.rb +17 -0
- data/spec/factories/records.rb +47 -0
- data/spec/factories/set_interaction.rb +15 -0
- data/spec/factories/source_authorities.rb +19 -0
- data/spec/factories/sources.rb +16 -0
- data/spec/factories/usage_metrics.rb +20 -0
- data/spec/factories/user_activities.rb +14 -0
- data/spec/factories/user_sets.rb +27 -0
- data/spec/factories/users.rb +23 -0
- data/spec/helpers/application_helper_spec.rb +35 -0
- data/spec/models/concept_spec.rb +163 -0
- data/spec/models/fragment_spec.rb +15 -0
- data/spec/models/site_activity_spec.rb +103 -0
- data/spec/models/source_activity_spec.rb +56 -0
- data/spec/models/source_authority_spec.rb +42 -0
- data/spec/models/supplejack_api/api_concept/concept_fragment_spec.rb +189 -0
- data/spec/models/supplejack_api/api_record/record_fragment_spec.rb +189 -0
- data/spec/models/supplejack_api/concept_spec.rb +0 -0
- data/spec/models/supplejack_api/interaction_updaters/all_usage_metric_spec.rb +41 -0
- data/spec/models/supplejack_api/interaction_updaters/set_metrics_spec.rb +32 -0
- data/spec/models/supplejack_api/interaction_updaters/usage_metrics_spec.rb +44 -0
- data/spec/models/supplejack_api/partner_spec.rb +20 -0
- data/spec/models/supplejack_api/record_search_spec.rb +429 -0
- data/spec/models/supplejack_api/record_spec.rb +280 -0
- data/spec/models/supplejack_api/schema_definition_spec.rb +272 -0
- data/spec/models/supplejack_api/search_spec.rb +243 -0
- data/spec/models/supplejack_api/set_item_spec.rb +123 -0
- data/spec/models/supplejack_api/source_spec.rb +22 -0
- data/spec/models/supplejack_api/support/fragment_helpers_spec.rb +216 -0
- data/spec/models/supplejack_api/support/harvestable_spec.rb +177 -0
- data/spec/models/supplejack_api/support/searchable_spec.rb +85 -0
- data/spec/models/supplejack_api/support/storable_spec.rb +18 -0
- data/spec/models/supplejack_api/user_activity_spec.rb +88 -0
- data/spec/models/supplejack_api/user_set_spec.rb +559 -0
- data/spec/models/supplejack_api/user_spec.rb +348 -0
- data/spec/routing/concepts_routing_spec.rb +22 -0
- data/spec/routing/harvester_constraint_spec.rb +66 -0
- data/spec/routing/harvester_routing_spec.rb +51 -0
- data/spec/routing/partner_routing_spec.rb +34 -0
- data/spec/routing/records_routing_spec.rb +26 -0
- data/spec/routing/sets_routing_spec.rb +44 -0
- data/spec/routing/source_routing_spec.rb +38 -0
- data/spec/routing/users_routing_spec.rb +18 -0
- data/spec/serializers/concept_record_serializer_spec.rb +30 -0
- data/spec/serializers/supplejack_api/application_serializer_spec.rb +14 -0
- data/spec/serializers/supplejack_api/concept_search_serializer_spec.rb +34 -0
- data/spec/serializers/supplejack_api/concept_serializer_spec.rb +92 -0
- data/spec/serializers/supplejack_api/record_search_serializer_spec.rb +34 -0
- data/spec/serializers/supplejack_api/record_serializer_spec.rb +271 -0
- data/spec/serializers/supplejack_api/search_serializer_spec.rb +90 -0
- data/spec/serializers/supplejack_api/user_serializer_spec.rb +22 -0
- data/spec/serializers/supplejack_api/user_set_serializer_spec.rb +96 -0
- data/spec/services/metrics_api/v3/api_spec.rb +23 -0
- data/spec/services/metrics_api/v3/endpoints/facets_spec.rb +25 -0
- data/spec/services/metrics_api/v3/endpoints/global_spec.rb +22 -0
- data/spec/services/metrics_api/v3/endpoints/root_spec.rb +49 -0
- data/spec/services/metrics_api/v3/presenters/extended_metadata_spec.rb +49 -0
- data/spec/spec_helper.rb +70 -0
- data/spec/support/api/schemas/metrics/daily_metrics_metadata.json +24 -0
- data/spec/support/api/schemas/metrics/extended_metrics.json +26 -0
- data/spec/support/api/schemas/metrics/extended_response.json +6 -0
- data/spec/support/api/schemas/metrics/facets_response.json +6 -0
- data/spec/support/api/schemas/metrics/record_metadata.json +33 -0
- data/spec/support/api/schemas/metrics/top_level_response.json +6 -0
- data/spec/support/api/schemas/metrics/view_metadata.json +33 -0
- data/spec/support/api_schema_matcher.rb +14 -0
- data/spec/support/devise.rb +10 -0
- data/spec/workers/supplejack_api/daily_metrics_worker_spec.rb +140 -0
- data/spec/workers/supplejack_api/flush_old_records_worker_spec.rb +20 -0
- data/spec/workers/supplejack_api/index_worker_spec.rb +52 -0
- data/spec/workers/supplejack_api/source_index_worker_spec.rb +61 -0
- metadata +1231 -0
@@ -0,0 +1,219 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module SupplejackApi::Concerns::UserSet
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
store_in collection: 'user_sets', session: 'strong'
|
7
|
+
|
8
|
+
belongs_to :user, class_name: 'SupplejackApi::User'
|
9
|
+
belongs_to :record, class_name: 'SupplejackApi::Record', inverse_of: nil
|
10
|
+
|
11
|
+
embeds_many :set_items, class_name: 'SupplejackApi::SetItem' do
|
12
|
+
def find_by_record_id(record_id)
|
13
|
+
where(record_id: record_id).first
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
field :name, type: String
|
18
|
+
field :description, type: String
|
19
|
+
field :privacy, type: String, default: 'public'
|
20
|
+
field :url, type: String
|
21
|
+
field :priority, type: Integer, default: 0
|
22
|
+
field :count, type: Integer, default: 0
|
23
|
+
field :count_updated_at, type: DateTime
|
24
|
+
field :tags, type: Array, default: []
|
25
|
+
field :approved, type: Boolean, default: false
|
26
|
+
field :featured, type: Boolean, default: false
|
27
|
+
field :featured_at, type: DateTime
|
28
|
+
|
29
|
+
scope :excluding_favorites, -> { where(:name.ne => 'Favorites') }
|
30
|
+
scope :publicly_viewable, -> { where(privacy: 'public') }
|
31
|
+
|
32
|
+
index 'set_items.record_id' => 1
|
33
|
+
index featured: 1
|
34
|
+
|
35
|
+
attr_accessible :name, :description, :privacy, :priority, :tags, :tag_list, :records, :approved
|
36
|
+
|
37
|
+
validates :name, presence: true
|
38
|
+
validates :privacy, inclusion: { in: %w(public hidden private) }
|
39
|
+
|
40
|
+
before_validation :set_default_privacy
|
41
|
+
before_save :calculate_count
|
42
|
+
before_save :strip_html_tags
|
43
|
+
before_save :update_record
|
44
|
+
after_save :reindex_items
|
45
|
+
before_destroy :delete_record
|
46
|
+
|
47
|
+
# Force-capitalize only the first word of the set name
|
48
|
+
#
|
49
|
+
def name=(name)
|
50
|
+
write_attribute(:name, Utils.capitalize_first_word(name))
|
51
|
+
end
|
52
|
+
|
53
|
+
# Find a set based on the MongoDB ObjectID or the set url.
|
54
|
+
#
|
55
|
+
def self.custom_find(id)
|
56
|
+
user_set = if id.to_s.length == 24
|
57
|
+
find(id) rescue nil
|
58
|
+
else
|
59
|
+
where(url: id).first
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.public_sets(options = {})
|
64
|
+
options.reverse_merge!(page: 1, per_page: 100)
|
65
|
+
page = options[:page].to_i
|
66
|
+
page = page.zero? ? 1 : page
|
67
|
+
where(privacy: 'public', :name.ne => 'Favourites').desc(:created_at).page(page)
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.public_sets_count
|
71
|
+
where(privacy: 'public', :name.ne => 'Favourites').count
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.featured_sets(num = 16)
|
75
|
+
sets = where(privacy: 'public', featured: true).desc(:featured_at).limit(num).to_a
|
76
|
+
sets.delete_if { |s| s.records(1).try(:empty?) }
|
77
|
+
sets
|
78
|
+
end
|
79
|
+
|
80
|
+
# Accept a hash of attributes with the user_set attributes, a array
|
81
|
+
# of hashes with the set_items information and a optional "featured"
|
82
|
+
# attribute which only the administrator is allowed to modify
|
83
|
+
#
|
84
|
+
def update_attributes_and_embedded(new_attributes = {}, user = nil)
|
85
|
+
new_attributes = new_attributes.try(:symbolize_keys) || {}
|
86
|
+
|
87
|
+
if set_items = new_attributes.delete(:records)
|
88
|
+
if set_items.is_a? Array
|
89
|
+
begin
|
90
|
+
new_set_items = []
|
91
|
+
set_items.each do |set_item_hash|
|
92
|
+
set_item = self.set_items.find_or_initialize_by(record_id: set_item_hash['record_id'])
|
93
|
+
set_item.position = set_item_hash['position']
|
94
|
+
new_set_items << set_item if set_item.valid?
|
95
|
+
end
|
96
|
+
self.set_items = new_set_items
|
97
|
+
rescue StandardError => e
|
98
|
+
raise WrongRecordsFormat
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
if new_attributes.key?(:featured)
|
104
|
+
featured_value = new_attributes.delete(:featured)
|
105
|
+
if user.try(:can_change_featured_sets?)
|
106
|
+
self.featured = featured_value
|
107
|
+
self.featured_at = Time.now if featured_changed?
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
self.attributes = new_attributes
|
112
|
+
save
|
113
|
+
end
|
114
|
+
|
115
|
+
def calculate_count
|
116
|
+
self.count = records.size
|
117
|
+
end
|
118
|
+
|
119
|
+
def set_default_privacy
|
120
|
+
self.privacy = 'public' if self[:privacy].blank?
|
121
|
+
end
|
122
|
+
|
123
|
+
def record_status
|
124
|
+
privacy == 'public' && approved ? 'active' : 'suppressed'
|
125
|
+
end
|
126
|
+
|
127
|
+
# Remove HTML tags from the name, description and tags
|
128
|
+
#
|
129
|
+
def strip_html_tags
|
130
|
+
[:name, :description].each do |attr|
|
131
|
+
send("#{attr}=", strip_tags(self[attr])) if self[attr].present?
|
132
|
+
end
|
133
|
+
|
134
|
+
self.tags = self[:tags].map { |t| strip_tags(t) } if tags.try(:any?)
|
135
|
+
end
|
136
|
+
|
137
|
+
def update_record
|
138
|
+
if set_items.empty?
|
139
|
+
suppress_record
|
140
|
+
return nil
|
141
|
+
end
|
142
|
+
|
143
|
+
self.record = SupplejackApi::Record.new if record.nil?
|
144
|
+
|
145
|
+
record.status = record_status
|
146
|
+
record.internal_identifier = "user_set_#{id}"
|
147
|
+
|
148
|
+
primary_fragment = record.primary_fragment
|
149
|
+
|
150
|
+
record.save!
|
151
|
+
end
|
152
|
+
|
153
|
+
def delete_record
|
154
|
+
if record
|
155
|
+
record.status = 'deleted'
|
156
|
+
record.save!
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def suppress_record
|
161
|
+
if record
|
162
|
+
record.status = 'suppressed'
|
163
|
+
record.save!
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def record_ids
|
168
|
+
set_items.asc(:position).map(&:record_id)
|
169
|
+
end
|
170
|
+
|
171
|
+
# Return a array of actual Record objects
|
172
|
+
#
|
173
|
+
def records(amount = nil)
|
174
|
+
@records ||= begin
|
175
|
+
ids_to_fetch = record_ids || []
|
176
|
+
records = SupplejackApi::Record.find_multiple(ids_to_fetch)
|
177
|
+
records = records[0..amount.to_i - 1] if amount
|
178
|
+
records
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def tags=(list)
|
183
|
+
self[:tags] = *list
|
184
|
+
end
|
185
|
+
|
186
|
+
def tag_list=(tags_string)
|
187
|
+
tags_string = tags_string.to_s.gsub(/[^A-Za-z0-9\p{Word} ,_-]/, '')
|
188
|
+
self.tags = tags_string.to_s.split(',').map(&:strip).reject(&:blank?)
|
189
|
+
end
|
190
|
+
|
191
|
+
def tag_list
|
192
|
+
tags.join(', ') if tags.present?
|
193
|
+
end
|
194
|
+
|
195
|
+
# Return a array of SetItem objects with the actual Record object attached through
|
196
|
+
# the "record" virtual attribute.
|
197
|
+
#
|
198
|
+
# The set items are sorted by position.
|
199
|
+
#
|
200
|
+
def items_with_records(amount = nil)
|
201
|
+
records = self.records(amount)
|
202
|
+
|
203
|
+
items_with_records = set_items.map do |set_item|
|
204
|
+
set_item.record = records.detect { |r| r.record_id == set_item.record_id }
|
205
|
+
set_item
|
206
|
+
end
|
207
|
+
|
208
|
+
items_with_records.reject { |i| i.record.nil? }.sort_by(&:position)
|
209
|
+
end
|
210
|
+
|
211
|
+
def reindex_items
|
212
|
+
set_items.each do |i|
|
213
|
+
SupplejackApi::Record.custom_find(i.record_id).index rescue nil
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
class WrongRecordsFormat < RuntimeError; end
|
218
|
+
end
|
219
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# The majority of the Supplejack API code is Crown copyright (C) 2014, New Zealand Government,
|
3
|
+
# and is licensed under the GNU General Public License, version 3.
|
4
|
+
# One component is a third party component. See https://github.com/DigitalNZ/supplejack_api for details.
|
5
|
+
#
|
6
|
+
# Supplejack was created by DigitalNZ at the National Library of NZ and
|
7
|
+
# the Department of Internal Affairs. http://digitalnz.org/supplejack
|
8
|
+
|
9
|
+
module SupplejackApi
|
10
|
+
class DailyMetrics
|
11
|
+
include Mongoid::Document
|
12
|
+
include Mongoid::Timestamps
|
13
|
+
include SupplejackApi::Concerns::QueryableByDate
|
14
|
+
|
15
|
+
store_in collection: 'daily_metrics'
|
16
|
+
|
17
|
+
field :total_public_sets, type: Integer
|
18
|
+
field :date, type: Date
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# The majority of the Supplejack API code is Crown copyright (C) 2014, New Zealand Government,
|
3
|
+
# and is licensed under the GNU General Public License, version 3.
|
4
|
+
# One component is a third party component. See https://github.com/DigitalNZ/supplejack_api for details.
|
5
|
+
#
|
6
|
+
# Supplejack was created by DigitalNZ at the National Library of NZ and
|
7
|
+
# the Department of Internal Affairs. http://digitalnz.org/supplejack
|
8
|
+
|
9
|
+
module SupplejackApi
|
10
|
+
class FacetedMetrics
|
11
|
+
include Mongoid::Document
|
12
|
+
include Mongoid::Timestamps
|
13
|
+
include SupplejackApi::Concerns::QueryableByDate
|
14
|
+
|
15
|
+
before_save :replace_periods
|
16
|
+
after_save :replace_unicode_periods
|
17
|
+
after_find :replace_unicode_periods
|
18
|
+
|
19
|
+
store_in collection: 'faceted_metrics'
|
20
|
+
|
21
|
+
field :date, type: Date
|
22
|
+
field :name, type: String
|
23
|
+
field :total_active_records, type: Integer
|
24
|
+
field :total_new_records, type: Integer
|
25
|
+
field :category_counts, type: Hash
|
26
|
+
field :copyright_counts, type: Hash
|
27
|
+
|
28
|
+
# MongoDB does not allow you to store hashes that have keys with peroids in the name
|
29
|
+
# Some of the copyrights contain version numbers which prevents them from being stored
|
30
|
+
# as keys directly. This replaces periods with the unicode equivalent
|
31
|
+
def replace_periods
|
32
|
+
self.category_counts = Hash[category_counts. map(&key_replacer('.', "\u2024"))] if category_counts
|
33
|
+
self.copyright_counts = Hash[copyright_counts.map(&key_replacer('.', "\u2024"))] if copyright_counts
|
34
|
+
end
|
35
|
+
|
36
|
+
# MongoDB does not allow you to store hashes that have keys with peroids in the name
|
37
|
+
# Some of the copyrights contain version numbers which prevents them from being stored
|
38
|
+
# as keys directly. This replaces unicode periods with normal periods so this quirk
|
39
|
+
# doesn't affect the application code
|
40
|
+
def replace_unicode_periods
|
41
|
+
self.category_counts = Hash[category_counts. map(&key_replacer("\u2024", '.'))] if category_counts
|
42
|
+
self.copyright_counts = Hash[copyright_counts.map(&key_replacer("\u2024", '.'))] if copyright_counts
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def key_replacer(target, replacement)
|
48
|
+
lambda do |kv|
|
49
|
+
key, value = kv
|
50
|
+
|
51
|
+
[key.gsub(target, replacement), value]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# The majority of the Supplejack API code is Crown copyright (C) 2014, New Zealand Government,
|
3
|
+
# and is licensed under the GNU General Public License, version 3.
|
4
|
+
# One component is a third party component. See https://github.com/DigitalNZ/supplejack_api for details.
|
5
|
+
#
|
6
|
+
# Supplejack was created by DigitalNZ at the National Library of NZ and
|
7
|
+
# the Department of Internal Affairs. http://digitalnz.org/supplejack
|
8
|
+
|
9
|
+
module SupplejackApi
|
10
|
+
class Fragment
|
11
|
+
include Mongoid::Document
|
12
|
+
include Mongoid::Timestamps
|
13
|
+
include Mongoid::Attributes::Dynamic
|
14
|
+
|
15
|
+
default_scope -> { asc(:priority) }
|
16
|
+
|
17
|
+
field :source_id, type: String
|
18
|
+
field :priority, type: Integer, default: 1
|
19
|
+
field :job_id, type: String
|
20
|
+
|
21
|
+
MONGOID_TYPE_NAMES = {
|
22
|
+
string: String,
|
23
|
+
integer: Integer,
|
24
|
+
datetime: DateTime,
|
25
|
+
boolean: Boolean
|
26
|
+
}.freeze
|
27
|
+
|
28
|
+
def self.schema_class
|
29
|
+
raise NotImplementedError, 'All subclasses of SupplejackApi::Fragment must define a #schema_class method.'
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.build_mongoid_schema
|
33
|
+
# Build fields
|
34
|
+
schema_class.fields.each do |name, field|
|
35
|
+
next if field.store == false
|
36
|
+
type = field.multi_value.presence ? Array : MONGOID_TYPE_NAMES[field.type]
|
37
|
+
self.field name, type: type
|
38
|
+
end
|
39
|
+
|
40
|
+
# Build indexes
|
41
|
+
if schema_class.mongo_indexes.present?
|
42
|
+
schema_class.mongo_indexes.each do |_name, index|
|
43
|
+
index_options = !!index.index_options ? index.index_options : {}
|
44
|
+
self.index index.fields.first, index_options
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def primary?
|
50
|
+
priority.zero?
|
51
|
+
end
|
52
|
+
|
53
|
+
def clear_attributes
|
54
|
+
mutable_fields = self.class.mutable_fields.dup
|
55
|
+
mutable_fields.delete('priority') if primary?
|
56
|
+
raw_attributes.each do |name, _value|
|
57
|
+
self[name] = nil if mutable_fields.key?(name)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def update_from_harvest(attributes = {})
|
62
|
+
attributes = attributes.try(:symbolize_keys) || {}
|
63
|
+
|
64
|
+
self.source_id = Array(attributes[:source_id]).first if attributes[:source_id].present?
|
65
|
+
|
66
|
+
attributes.each do |field, value|
|
67
|
+
if self.class.mutable_fields[field.to_s] == Array
|
68
|
+
self[field] ||= []
|
69
|
+
values = *value
|
70
|
+
existing_values = *self[field]
|
71
|
+
values = existing_values += values
|
72
|
+
send("#{field}=", values.uniq)
|
73
|
+
elsif self.class.mutable_fields[field.to_s]
|
74
|
+
value = value.first if value.is_a?(Array)
|
75
|
+
send("#{field}=", value)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
self.updated_at = Time.now
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# The majority of the Supplejack API code is Crown copyright (C) 2014, New Zealand Government,
|
3
|
+
# and is licensed under the GNU General Public License, version 3.
|
4
|
+
# One component is a third party component. See https://github.com/DigitalNZ/supplejack_api for details.
|
5
|
+
#
|
6
|
+
# Supplejack was created by DigitalNZ at the National Library of NZ and
|
7
|
+
# the Department of Internal Affairs. http://digitalnz.org/supplejack
|
8
|
+
|
9
|
+
module SupplejackApi
|
10
|
+
module InteractionModels
|
11
|
+
class Record
|
12
|
+
include Mongoid::Document
|
13
|
+
include Mongoid::Timestamps
|
14
|
+
|
15
|
+
store_in collection: 'record_interactions'
|
16
|
+
|
17
|
+
field :request_type, type: String
|
18
|
+
field :log_values, type: Array
|
19
|
+
|
20
|
+
@field = :display_collection
|
21
|
+
|
22
|
+
def self.create_search(object)
|
23
|
+
results = object.results.map(&@field).flatten
|
24
|
+
create(request_type: 'search', log_values: results) unless results.empty?
|
25
|
+
rescue
|
26
|
+
Rails.logger.warn "[RecordInteraction] Field #{field} does not exist"
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.create_find(object)
|
30
|
+
return if object.nil?
|
31
|
+
result = object.send(@field)
|
32
|
+
result = [result] unless result.is_a? Array
|
33
|
+
create(request_type: 'get', log_values: result) unless result.empty?
|
34
|
+
rescue
|
35
|
+
Rails.logger.warn "[RecordInteraction] Field #{field} does not exist"
|
36
|
+
end
|
37
|
+
|
38
|
+
# Creates one Interaction Model that contains set items in a set
|
39
|
+
#
|
40
|
+
# @param object [SupplejackApi::UserSet]
|
41
|
+
def self.create_user_set(object)
|
42
|
+
results = []
|
43
|
+
unless object.set_items.empty?
|
44
|
+
object.set_items.each do |item|
|
45
|
+
next if item.record.nil?
|
46
|
+
record = SupplejackApi::Record.custom_find(item.record_id)
|
47
|
+
if record
|
48
|
+
result = record.send(@field)
|
49
|
+
results << result if result
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
create(request_type: 'user_set', log_values: results.flatten) unless results.empty?
|
55
|
+
rescue
|
56
|
+
Rails.logger.warn "[RecordInteraction] Field #{field} does not exist"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module SupplejackApi
|
3
|
+
module InteractionModels
|
4
|
+
class Set
|
5
|
+
include Mongoid::Document
|
6
|
+
include Mongoid::Timestamps
|
7
|
+
|
8
|
+
# Potential values are :creation and :view
|
9
|
+
field :interaction_type, type: Symbol
|
10
|
+
field :facet, type: String
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|