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.
Files changed (291) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +80 -0
  3. data/Rakefile +42 -0
  4. data/app/assets/javascripts/supplejack_api/application.js +26 -0
  5. data/app/assets/stylesheets/supplejack_api/application.css +30 -0
  6. data/app/controllers/supplejack_api/admin/base_controller.rb +24 -0
  7. data/app/controllers/supplejack_api/admin/sessions_controller.rb +25 -0
  8. data/app/controllers/supplejack_api/admin/site_activities_controller.rb +21 -0
  9. data/app/controllers/supplejack_api/admin/users_controller.rb +55 -0
  10. data/app/controllers/supplejack_api/application_controller.rb +70 -0
  11. data/app/controllers/supplejack_api/concepts_controller.rb +52 -0
  12. data/app/controllers/supplejack_api/concerns/ignore_metrics.rb +14 -0
  13. data/app/controllers/supplejack_api/concerns/records_controller_metrics.rb +26 -0
  14. data/app/controllers/supplejack_api/concerns/set_items_controller_metrics.rb +20 -0
  15. data/app/controllers/supplejack_api/concerns/user_sets_controller_metrics.rb +26 -0
  16. data/app/controllers/supplejack_api/harvester/concepts_controller.rb +41 -0
  17. data/app/controllers/supplejack_api/harvester/fragments_controller.rb +30 -0
  18. data/app/controllers/supplejack_api/harvester/records_controller.rb +68 -0
  19. data/app/controllers/supplejack_api/metrics_api_controller.rb +44 -0
  20. data/app/controllers/supplejack_api/partners_controller.rb +39 -0
  21. data/app/controllers/supplejack_api/records_controller.rb +71 -0
  22. data/app/controllers/supplejack_api/schema_controller.rb +19 -0
  23. data/app/controllers/supplejack_api/set_items_controller.rb +38 -0
  24. data/app/controllers/supplejack_api/sources_controller.rb +67 -0
  25. data/app/controllers/supplejack_api/status_controller.rb +67 -0
  26. data/app/controllers/supplejack_api/user_sets_controller.rb +97 -0
  27. data/app/controllers/supplejack_api/users_controller.rb +49 -0
  28. data/app/helpers/supplejack_api/application_helper.rb +39 -0
  29. data/app/helpers/supplejack_api/facets_helper.rb +30 -0
  30. data/app/mailers/supplejack_api/request_limit_mailer.rb +43 -0
  31. data/app/models/supplejack_api/api_concept/concept_fragment.rb +31 -0
  32. data/app/models/supplejack_api/api_record/record_fragment.rb +15 -0
  33. data/app/models/supplejack_api/concept.rb +46 -0
  34. data/app/models/supplejack_api/concept_search.rb +86 -0
  35. data/app/models/supplejack_api/concerns/queryable_by_date.rb +31 -0
  36. data/app/models/supplejack_api/concerns/record.rb +108 -0
  37. data/app/models/supplejack_api/concerns/record_fragmentable.rb +24 -0
  38. data/app/models/supplejack_api/concerns/searchable.rb +430 -0
  39. data/app/models/supplejack_api/concerns/user_set.rb +219 -0
  40. data/app/models/supplejack_api/daily_metrics.rb +20 -0
  41. data/app/models/supplejack_api/faceted_metrics.rb +55 -0
  42. data/app/models/supplejack_api/fragment.rb +82 -0
  43. data/app/models/supplejack_api/interaction_models/record.rb +60 -0
  44. data/app/models/supplejack_api/interaction_models/set.rb +13 -0
  45. data/app/models/supplejack_api/interaction_updaters/all_usage_metric.rb +41 -0
  46. data/app/models/supplejack_api/interaction_updaters/set_metrics.rb +32 -0
  47. data/app/models/supplejack_api/interaction_updaters/usage_metrics.rb +73 -0
  48. data/app/models/supplejack_api/partner.rb +24 -0
  49. data/app/models/supplejack_api/preview_record.rb +30 -0
  50. data/app/models/supplejack_api/record.rb +18 -0
  51. data/app/models/supplejack_api/record_search.rb +12 -0
  52. data/app/models/supplejack_api/schema_definition.rb +147 -0
  53. data/app/models/supplejack_api/search.rb +14 -0
  54. data/app/models/supplejack_api/set_item.rb +57 -0
  55. data/app/models/supplejack_api/site_activity.rb +59 -0
  56. data/app/models/supplejack_api/source.rb +28 -0
  57. data/app/models/supplejack_api/source_activity.rb +36 -0
  58. data/app/models/supplejack_api/source_authority.rb +42 -0
  59. data/app/models/supplejack_api/supplejack_schema.rb +37 -0
  60. data/app/models/supplejack_api/support/concept/searchable.rb +79 -0
  61. data/app/models/supplejack_api/support/concept/storable.rb +59 -0
  62. data/app/models/supplejack_api/support/fragment_helpers.rb +96 -0
  63. data/app/models/supplejack_api/support/harvestable.rb +105 -0
  64. data/app/models/supplejack_api/support/searchable.rb +115 -0
  65. data/app/models/supplejack_api/support/status_logger.rb +23 -0
  66. data/app/models/supplejack_api/support/storable.rb +49 -0
  67. data/app/models/supplejack_api/support/validation_logger.rb +23 -0
  68. data/app/models/supplejack_api/usage_metrics.rb +25 -0
  69. data/app/models/supplejack_api/user.rb +211 -0
  70. data/app/models/supplejack_api/user_activity.rb +65 -0
  71. data/app/models/supplejack_api/user_set.rb +17 -0
  72. data/app/serializers/supplejack_api/application_serializer.rb +12 -0
  73. data/app/serializers/supplejack_api/concept_record_serializer.rb +23 -0
  74. data/app/serializers/supplejack_api/concept_search_serializer.rb +12 -0
  75. data/app/serializers/supplejack_api/concept_serializer.rb +100 -0
  76. data/app/serializers/supplejack_api/concerns/record_serializable.rb +119 -0
  77. data/app/serializers/supplejack_api/concerns/search_serializable.rb +24 -0
  78. data/app/serializers/supplejack_api/record_search_serializer.rb +64 -0
  79. data/app/serializers/supplejack_api/record_serializer.rb +13 -0
  80. data/app/serializers/supplejack_api/search_serializer.rb +13 -0
  81. data/app/serializers/supplejack_api/source_authority_serializer.rb +23 -0
  82. data/app/serializers/supplejack_api/user_serializer.rb +13 -0
  83. data/app/serializers/supplejack_api/user_set_record_serializer.rb +14 -0
  84. data/app/serializers/supplejack_api/user_set_serializer.rb +77 -0
  85. data/app/services/metrics_api/v3/api.rb +30 -0
  86. data/app/services/metrics_api/v3/endpoints/facets.rb +23 -0
  87. data/app/services/metrics_api/v3/endpoints/global.rb +26 -0
  88. data/app/services/metrics_api/v3/endpoints/helpers.rb +14 -0
  89. data/app/services/metrics_api/v3/endpoints/root.rb +97 -0
  90. data/app/services/metrics_api/v3/presenters/daily_metric.rb +23 -0
  91. data/app/services/metrics_api/v3/presenters/extended_metadata.rb +41 -0
  92. data/app/services/metrics_api/v3/presenters/record.rb +26 -0
  93. data/app/services/metrics_api/v3/presenters/view.rb +28 -0
  94. data/app/views/layouts/supplejack_api/_head.html.erb +17 -0
  95. data/app/views/layouts/supplejack_api/_top_nav.html.erb +33 -0
  96. data/app/views/layouts/supplejack_api/application.html.erb +33 -0
  97. data/app/views/supplejack_api/admin/sessions/new.html.erb +25 -0
  98. data/app/views/supplejack_api/admin/shared/_links.erb +34 -0
  99. data/app/views/supplejack_api/admin/site_activities/index.csv.erb +22 -0
  100. data/app/views/supplejack_api/admin/site_activities/index.html.erb +54 -0
  101. data/app/views/supplejack_api/admin/users/edit.html.erb +16 -0
  102. data/app/views/supplejack_api/admin/users/index.csv.erb +22 -0
  103. data/app/views/supplejack_api/admin/users/index.html.erb +57 -0
  104. data/app/views/supplejack_api/admin/users/show.html.erb +33 -0
  105. data/app/views/supplejack_api/request_limit_mailer/at100percent.text.erb +13 -0
  106. data/app/views/supplejack_api/request_limit_mailer/at100percent_admin.text.erb +1 -0
  107. data/app/views/supplejack_api/request_limit_mailer/at90percent.text.erb +13 -0
  108. data/app/views/supplejack_api/request_limit_mailer/at90percent_admin.text.erb +1 -0
  109. data/app/workers/supplejack_api/daily_metrics_worker.rb +112 -0
  110. data/app/workers/supplejack_api/interaction_metrics_worker.rb +45 -0
  111. data/config/cucumber.yml +16 -0
  112. data/config/initializers/force_eagerload.rb +11 -0
  113. data/config/initializers/interaction_updaters.rb +7 -0
  114. data/config/routes.rb +81 -0
  115. data/db/binding_records.development.json +7 -0
  116. data/db/binding_records.staging.json +7 -0
  117. data/db/concepts.json +33 -0
  118. data/db/concepts_data.json +569745 -0
  119. data/db/source_authorities.json +119 -0
  120. data/lib/generators/supplejack_api/install_generator.rb +124 -0
  121. data/lib/mongoid/paperclip.rb +53 -0
  122. data/lib/mongoid/string.rb +20 -0
  123. data/lib/sunspot/mongoid.rb +51 -0
  124. data/lib/sunspot/resque_session_proxy.rb +72 -0
  125. data/lib/sunspot/sunspot_spellcheck.rb +98 -0
  126. data/lib/supplejack_api.rb +13 -0
  127. data/lib/supplejack_api/admin/sortable.rb +40 -0
  128. data/lib/supplejack_api/engine.rb +46 -0
  129. data/lib/supplejack_api/harvester_constraint.rb +28 -0
  130. data/lib/supplejack_api/stylesheets.rb +36 -0
  131. data/lib/supplejack_api/utils.rb +75 -0
  132. data/lib/supplejack_api/version.rb +11 -0
  133. data/lib/tasks/resque.rake +22 -0
  134. data/lib/url_validator.rb +38 -0
  135. data/spec/controllers/supplejack_api/admin/base_controller_spec.rb +55 -0
  136. data/spec/controllers/supplejack_api/admin/site_activities_controller_spec.rb +43 -0
  137. data/spec/controllers/supplejack_api/admin/users_controller_spec.rb +79 -0
  138. data/spec/controllers/supplejack_api/application_controller_spec.rb +133 -0
  139. data/spec/controllers/supplejack_api/concepts_controller_spec.rb +83 -0
  140. data/spec/controllers/supplejack_api/concerns/records_controller_metrics_spec.rb +60 -0
  141. data/spec/controllers/supplejack_api/harvester/concepts_controller_spec.rb +57 -0
  142. data/spec/controllers/supplejack_api/harvester/records_controller_spec.rb +138 -0
  143. data/spec/controllers/supplejack_api/metrics_api_controller_spec.rb +71 -0
  144. data/spec/controllers/supplejack_api/partners_controller_spec.rb +77 -0
  145. data/spec/controllers/supplejack_api/records_controller_spec.rb +143 -0
  146. data/spec/controllers/supplejack_api/set_items_controller_spec.rb +78 -0
  147. data/spec/controllers/supplejack_api/sources_controller_spec.rb +161 -0
  148. data/spec/controllers/supplejack_api/status_controller_spec.rb +120 -0
  149. data/spec/controllers/supplejack_api/user_sets_controller_spec.rb +233 -0
  150. data/spec/controllers/supplejack_api/users_controller_spec.rb +61 -0
  151. data/spec/dummy/README.rdoc +268 -0
  152. data/spec/dummy/Rakefile +7 -0
  153. data/spec/dummy/app/assets/javascripts/application.js +23 -0
  154. data/spec/dummy/app/assets/stylesheets/application.css +22 -0
  155. data/spec/dummy/app/controllers/application_controller.rb +10 -0
  156. data/spec/dummy/app/helpers/application_helper.rb +9 -0
  157. data/spec/dummy/app/supplejack_api/concept_schema.rb +83 -0
  158. data/spec/dummy/app/supplejack_api/record_schema.rb +64 -0
  159. data/spec/dummy/app/supplejack_api/record_schema.txt +66 -0
  160. data/spec/dummy/app/views/layouts/application.html.erb +23 -0
  161. data/spec/dummy/app/workers/supplejack_api/clear_index_buffer.rb +32 -0
  162. data/spec/dummy/app/workers/supplejack_api/flush_old_records_worker.rb +17 -0
  163. data/spec/dummy/app/workers/supplejack_api/index_buffer.rb +49 -0
  164. data/spec/dummy/app/workers/supplejack_api/index_source_worker.rb +39 -0
  165. data/spec/dummy/app/workers/supplejack_api/index_worker.rb +82 -0
  166. data/spec/dummy/app/workers/supplejack_api/store_user_activity_worker.rb +24 -0
  167. data/spec/dummy/config.ru +11 -0
  168. data/spec/dummy/config/application.rb +76 -0
  169. data/spec/dummy/config/application.yml +31 -0
  170. data/spec/dummy/config/application.yml.example +36 -0
  171. data/spec/dummy/config/boot.rb +17 -0
  172. data/spec/dummy/config/environment.rb +12 -0
  173. data/spec/dummy/config/environments/development.rb +42 -0
  174. data/spec/dummy/config/environments/production.rb +76 -0
  175. data/spec/dummy/config/environments/test.rb +46 -0
  176. data/spec/dummy/config/initializers/backtrace_silencers.rb +14 -0
  177. data/spec/dummy/config/initializers/devise.rb +214 -0
  178. data/spec/dummy/config/initializers/inflections.rb +22 -0
  179. data/spec/dummy/config/initializers/kaminari_config.rb +17 -0
  180. data/spec/dummy/config/initializers/mime_types.rb +12 -0
  181. data/spec/dummy/config/initializers/mongoid.rb +9 -0
  182. data/spec/dummy/config/initializers/quiet_logger.rb +23 -0
  183. data/spec/dummy/config/initializers/resque.rb +18 -0
  184. data/spec/dummy/config/initializers/secret_token.rb +14 -0
  185. data/spec/dummy/config/initializers/session_store.rb +15 -0
  186. data/spec/dummy/config/initializers/simple_form.rb +149 -0
  187. data/spec/dummy/config/initializers/simple_form_foundation.rb +33 -0
  188. data/spec/dummy/config/initializers/state_machine.rb +8 -0
  189. data/spec/dummy/config/initializers/sunspot.rb +32 -0
  190. data/spec/dummy/config/initializers/wrap_parameters.rb +17 -0
  191. data/spec/dummy/config/locales/devise.en.yml +63 -0
  192. data/spec/dummy/config/locales/en.yml +66 -0
  193. data/spec/dummy/config/locales/simple_form.en.yml +33 -0
  194. data/spec/dummy/config/mongoid.travis.yml +34 -0
  195. data/spec/dummy/config/mongoid.yml +36 -0
  196. data/spec/dummy/config/resque-pool.yml +18 -0
  197. data/spec/dummy/config/resque_schedule.yml +12 -0
  198. data/spec/dummy/config/routes.rb +11 -0
  199. data/spec/dummy/config/secrets.yml +8 -0
  200. data/spec/dummy/config/sunspot.yml +38 -0
  201. data/spec/dummy/db/concepts.json +37 -0
  202. data/spec/dummy/db/source_authorities.json +116 -0
  203. data/spec/dummy/public/404.html +35 -0
  204. data/spec/dummy/public/422.html +35 -0
  205. data/spec/dummy/public/500.html +34 -0
  206. data/spec/dummy/public/favicon.ico +8 -0
  207. data/spec/dummy/script/rails +6 -0
  208. data/spec/dummy/solr/collection1/conf/elevate.xml +36 -0
  209. data/spec/dummy/solr/collection1/conf/mapping-FoldToASCII.txt +3813 -0
  210. data/spec/dummy/solr/collection1/conf/schema.xml +292 -0
  211. data/spec/dummy/solr/collection1/conf/solrconfig.xml +1780 -0
  212. data/spec/dummy/solr/collection1/conf/spellings.txt +2 -0
  213. data/spec/dummy/solr/collection1/conf/stopwords.txt +58 -0
  214. data/spec/dummy/solr/collection1/conf/synonyms.txt +31 -0
  215. data/spec/factories/concepts.rb +16 -0
  216. data/spec/factories/daily_metrics.rb +10 -0
  217. data/spec/factories/faceted_metrics.rb +25 -0
  218. data/spec/factories/fragment.rb +14 -0
  219. data/spec/factories/partners.rb +14 -0
  220. data/spec/factories/record_interaction.rb +17 -0
  221. data/spec/factories/records.rb +47 -0
  222. data/spec/factories/set_interaction.rb +15 -0
  223. data/spec/factories/source_authorities.rb +19 -0
  224. data/spec/factories/sources.rb +16 -0
  225. data/spec/factories/usage_metrics.rb +20 -0
  226. data/spec/factories/user_activities.rb +14 -0
  227. data/spec/factories/user_sets.rb +27 -0
  228. data/spec/factories/users.rb +23 -0
  229. data/spec/helpers/application_helper_spec.rb +35 -0
  230. data/spec/models/concept_spec.rb +163 -0
  231. data/spec/models/fragment_spec.rb +15 -0
  232. data/spec/models/site_activity_spec.rb +103 -0
  233. data/spec/models/source_activity_spec.rb +56 -0
  234. data/spec/models/source_authority_spec.rb +42 -0
  235. data/spec/models/supplejack_api/api_concept/concept_fragment_spec.rb +189 -0
  236. data/spec/models/supplejack_api/api_record/record_fragment_spec.rb +189 -0
  237. data/spec/models/supplejack_api/concept_spec.rb +0 -0
  238. data/spec/models/supplejack_api/interaction_updaters/all_usage_metric_spec.rb +41 -0
  239. data/spec/models/supplejack_api/interaction_updaters/set_metrics_spec.rb +32 -0
  240. data/spec/models/supplejack_api/interaction_updaters/usage_metrics_spec.rb +44 -0
  241. data/spec/models/supplejack_api/partner_spec.rb +20 -0
  242. data/spec/models/supplejack_api/record_search_spec.rb +429 -0
  243. data/spec/models/supplejack_api/record_spec.rb +280 -0
  244. data/spec/models/supplejack_api/schema_definition_spec.rb +272 -0
  245. data/spec/models/supplejack_api/search_spec.rb +243 -0
  246. data/spec/models/supplejack_api/set_item_spec.rb +123 -0
  247. data/spec/models/supplejack_api/source_spec.rb +22 -0
  248. data/spec/models/supplejack_api/support/fragment_helpers_spec.rb +216 -0
  249. data/spec/models/supplejack_api/support/harvestable_spec.rb +177 -0
  250. data/spec/models/supplejack_api/support/searchable_spec.rb +85 -0
  251. data/spec/models/supplejack_api/support/storable_spec.rb +18 -0
  252. data/spec/models/supplejack_api/user_activity_spec.rb +88 -0
  253. data/spec/models/supplejack_api/user_set_spec.rb +559 -0
  254. data/spec/models/supplejack_api/user_spec.rb +348 -0
  255. data/spec/routing/concepts_routing_spec.rb +22 -0
  256. data/spec/routing/harvester_constraint_spec.rb +66 -0
  257. data/spec/routing/harvester_routing_spec.rb +51 -0
  258. data/spec/routing/partner_routing_spec.rb +34 -0
  259. data/spec/routing/records_routing_spec.rb +26 -0
  260. data/spec/routing/sets_routing_spec.rb +44 -0
  261. data/spec/routing/source_routing_spec.rb +38 -0
  262. data/spec/routing/users_routing_spec.rb +18 -0
  263. data/spec/serializers/concept_record_serializer_spec.rb +30 -0
  264. data/spec/serializers/supplejack_api/application_serializer_spec.rb +14 -0
  265. data/spec/serializers/supplejack_api/concept_search_serializer_spec.rb +34 -0
  266. data/spec/serializers/supplejack_api/concept_serializer_spec.rb +92 -0
  267. data/spec/serializers/supplejack_api/record_search_serializer_spec.rb +34 -0
  268. data/spec/serializers/supplejack_api/record_serializer_spec.rb +271 -0
  269. data/spec/serializers/supplejack_api/search_serializer_spec.rb +90 -0
  270. data/spec/serializers/supplejack_api/user_serializer_spec.rb +22 -0
  271. data/spec/serializers/supplejack_api/user_set_serializer_spec.rb +96 -0
  272. data/spec/services/metrics_api/v3/api_spec.rb +23 -0
  273. data/spec/services/metrics_api/v3/endpoints/facets_spec.rb +25 -0
  274. data/spec/services/metrics_api/v3/endpoints/global_spec.rb +22 -0
  275. data/spec/services/metrics_api/v3/endpoints/root_spec.rb +49 -0
  276. data/spec/services/metrics_api/v3/presenters/extended_metadata_spec.rb +49 -0
  277. data/spec/spec_helper.rb +70 -0
  278. data/spec/support/api/schemas/metrics/daily_metrics_metadata.json +24 -0
  279. data/spec/support/api/schemas/metrics/extended_metrics.json +26 -0
  280. data/spec/support/api/schemas/metrics/extended_response.json +6 -0
  281. data/spec/support/api/schemas/metrics/facets_response.json +6 -0
  282. data/spec/support/api/schemas/metrics/record_metadata.json +33 -0
  283. data/spec/support/api/schemas/metrics/top_level_response.json +6 -0
  284. data/spec/support/api/schemas/metrics/view_metadata.json +33 -0
  285. data/spec/support/api_schema_matcher.rb +14 -0
  286. data/spec/support/devise.rb +10 -0
  287. data/spec/workers/supplejack_api/daily_metrics_worker_spec.rb +140 -0
  288. data/spec/workers/supplejack_api/flush_old_records_worker_spec.rb +20 -0
  289. data/spec/workers/supplejack_api/index_worker_spec.rb +52 -0
  290. data/spec/workers/supplejack_api/source_index_worker_spec.rb +61 -0
  291. 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