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,41 @@
1
+ # frozen_string_literal: true
2
+ module SupplejackApi
3
+ module InteractionUpdaters
4
+ class AllUsageMetric
5
+ BLACKLISTED_FIELDS = [:_id, :created_at, :updated_at, :date, :record_field_value].freeze
6
+ attr_reader :model
7
+
8
+ def initialize
9
+ # Slightly nonstandard model, so mock ActiveRecord interactions
10
+ # that the InteractionMetricsWorker performs
11
+ @model = OpenStruct.new(all: OpenStruct.new(delete_all: true))
12
+ end
13
+
14
+ def process(*)
15
+ usage_metrics = SupplejackApi::UsageMetrics
16
+ .where(:record_field_value.ne => 'all')
17
+ .created_on(Time.zone.today)
18
+ fields_to_update = SupplejackApi::UsageMetrics
19
+ .fields
20
+ .keys
21
+ .map(&:to_sym)
22
+ .reject { |field| BLACKLISTED_FIELDS.include? field }
23
+ summed_usage_metrics_fields = usage_metrics.reduce({}) do |acc, el|
24
+ fields_to_update.each_with_object(acc) do |field, accumulator|
25
+ accumulator[field] = accumulator[field].to_i + el[field]
26
+ end
27
+ end
28
+ all_metric = SupplejackApi::UsageMetrics.find_or_create_by(
29
+ record_field_value: 'all',
30
+ date: Time.zone.today
31
+ ) do |m|
32
+ m.record_field_value = 'all'
33
+ m.date = Time.zone.today
34
+ end
35
+
36
+ all_metric.update(summed_usage_metrics_fields)
37
+ true
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ module SupplejackApi
3
+ module InteractionUpdaters
4
+ class SetMetrics
5
+ attr_reader :model
6
+
7
+ def initialize
8
+ @model = SupplejackApi::InteractionModels::Set
9
+ end
10
+
11
+ def process(set_interactions)
12
+ unique_facets = set_interactions.map(&:facet).uniq
13
+
14
+ unique_facets.each do |facet|
15
+ metric = SupplejackApi::UsageMetrics.find_or_create_by(
16
+ date: Date.current,
17
+ record_field_value: facet
18
+ ) do |um|
19
+ um.date = Date.current
20
+ um.record_field_value = facet
21
+ end
22
+
23
+ records_added = set_interactions.count { |x| x.facet == facet }
24
+ metric.records_added_to_user_sets += records_added
25
+ metric.save!
26
+ end
27
+
28
+ true
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+ module SupplejackApi
3
+ module InteractionUpdaters
4
+ class UsageMetrics
5
+ attr_reader :model
6
+
7
+ def initialize
8
+ @model = SupplejackApi::InteractionModels::Record
9
+ end
10
+
11
+ def process(record_interactions)
12
+ search_counts = build_hash_for(record_interactions, 'search')
13
+ get_counts = build_hash_for(record_interactions, 'get')
14
+ user_set_counts = build_hash_for(record_interactions, 'user_set')
15
+
16
+ unique_facets = (search_counts.keys + get_counts.keys + user_set_counts.keys).uniq
17
+
18
+ # Creating metrics for each primary collection
19
+ unique_facets.each do |facet|
20
+ process_facet(facet, search_counts, get_counts, user_set_counts)
21
+ end
22
+
23
+ true
24
+ end
25
+
26
+ private
27
+
28
+ def process_facet(facet, search_counts, get_counts, user_set_counts)
29
+ usage_metric_entry = SupplejackApi::UsageMetrics.find_or_create_by(
30
+ date: Date.current,
31
+ record_field_value: facet
32
+ ) do |metric|
33
+ metric.date = Date.current
34
+ metric.record_field_value = facet
35
+ end
36
+
37
+ # set everything to default value of 0 if no value is present, makes following code simpler
38
+ [search_counts, get_counts, user_set_counts].each do |x|
39
+ x[facet] = 0 unless x[facet]
40
+ end
41
+
42
+ searches = usage_metric_entry.searches + search_counts[facet]
43
+ gets = usage_metric_entry.gets + get_counts[facet]
44
+ user_set_views = usage_metric_entry.user_set_views + user_set_counts[facet]
45
+
46
+ total = searches + gets + user_set_views
47
+
48
+ usage_metric_entry.update(
49
+ searches: searches,
50
+ gets: gets,
51
+ user_set_views: user_set_views,
52
+ total_views: total
53
+ )
54
+ end
55
+
56
+ def build_hash_for(record_interactions, request_type)
57
+ filtered_record_interactions = record_interactions.select { |rl| rl.request_type == request_type }
58
+ counts_by_facet = {}
59
+
60
+ filtered_record_interactions.each do |rl|
61
+ next unless rl.log_values.present?
62
+
63
+ rl.log_values.each do |facet|
64
+ counts_by_facet[facet] = 0 unless counts_by_facet.key? facet
65
+ counts_by_facet[facet] += 1
66
+ end
67
+ end
68
+
69
+ counts_by_facet
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,24 @@
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 Partner
11
+ include Mongoid::Document
12
+ include ActiveModel::MassAssignmentSecurity
13
+
14
+ store_in collection: 'partners', session: 'strong'
15
+
16
+ attr_accessible :_id, :name
17
+
18
+ field :name, type: String
19
+
20
+ has_many :sources, class_name: 'SupplejackApi::Source'
21
+
22
+ validates :name, presence: true
23
+ end
24
+ end
@@ -0,0 +1,30 @@
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 PreviewRecord
11
+ # These records are used for previewing in squirrel, expire after 60 seconds
12
+
13
+ include Support::Storable
14
+ include Support::FragmentHelpers
15
+ include Support::Harvestable
16
+
17
+ store_in collection: 'preview_records'
18
+
19
+ embeds_many :fragments, cascade_callbacks: true, class_name: 'SupplejackApi::ApiRecord::RecordFragment'
20
+ embeds_one :merged_fragment, class_name: 'SupplejackApi::ApiRecord::RecordFragment'
21
+
22
+ auto_increment :record_id, session: 'strong', collection: 'preview_sequences'
23
+
24
+ build_model_fields
25
+
26
+ def fragment_class
27
+ SupplejackApi::ApiRecord::RecordFragment
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,18 @@
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 Record
11
+ include Support::Storable
12
+ include Support::Searchable
13
+ include Support::Harvestable
14
+ include Support::FragmentHelpers
15
+ include ActiveModel::SerializerSupport
16
+ include SupplejackApi::Concerns::Record
17
+ end
18
+ end
@@ -0,0 +1,12 @@
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 RecordSearch < Search
11
+ end
12
+ end
@@ -0,0 +1,147 @@
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 SchemaDefinition
11
+ extend ActiveSupport::Concern
12
+
13
+ ALLOWED_ATTRIBUTES = {
14
+ field: [:type, :search_value, :search_boost, :multi_value, :search_as, :store,
15
+ :solr_name, :namespace, :namespace_field, :default_value, :date_format],
16
+ group: [:fields, :includes],
17
+ role: [:default, :field_restrictions, :record_restrictions, :admin],
18
+ namespace: [:url],
19
+ mongo_index: [:fields, :index_options],
20
+ model_field: [:type, :field_options, :validation, :index_fields, :index_options,
21
+ :search_value, :search_as, :store, :namespace]
22
+ }.freeze
23
+
24
+ included do
25
+ cattr_accessor :fields, :groups, :roles, :default_role, :namespaces, :mongo_indexes, :model_fields
26
+ end
27
+
28
+ module ClassMethods
29
+ [:string, :integer, :datetime, :boolean, :latlon].each do |type|
30
+ define_method(type) do |*args, &block|
31
+ field(type, *args, &block)
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def field(type, name, options = {}, &block)
38
+ self.fields ||= {}
39
+ options[:type] = type
40
+
41
+ field = Field.new(name, options, &block)
42
+ self.fields[name] = field
43
+ end
44
+
45
+ def group(name, options = {}, &block)
46
+ self.groups ||= {}
47
+
48
+ group = Group.new(name, options, &block)
49
+ group.include_groups_from(groups)
50
+
51
+ self.groups[name] = group
52
+ end
53
+
54
+ def role(name, options = {}, &block)
55
+ self.roles ||= {}
56
+
57
+ role = Role.new(name, options, &block)
58
+ self.default_role = role if role.default
59
+
60
+ self.roles[name] = role
61
+ end
62
+
63
+ def namespace(name, options = {})
64
+ self.namespaces ||= {}
65
+
66
+ namespace = Namespace.new(name, options)
67
+ self.namespaces[name] = namespace
68
+ end
69
+
70
+ def mongo_index(name, options = {})
71
+ self.mongo_indexes ||= {}
72
+
73
+ mongo_index = MongoIndex.new(name, options)
74
+ self.mongo_indexes[name] = mongo_index
75
+ end
76
+
77
+ def model_field(name, options = {}, &block)
78
+ self.model_fields ||= {}
79
+
80
+ model_field = ModelField.new(name, options, &block)
81
+ self.model_fields[name] = model_field
82
+ end
83
+ end
84
+
85
+ class SchemaObject
86
+ ALLOWED_ATTRIBUTES = ALLOWED_ATTRIBUTES.values.flatten
87
+
88
+ attr_reader :name
89
+
90
+ def initialize(name, options, &block)
91
+ @name = name
92
+
93
+ builder = SchemaObjectBuilder.new(options)
94
+ builder.instance_eval(&block) if block_given?
95
+
96
+ @options = builder.options
97
+ end
98
+
99
+ ALLOWED_ATTRIBUTES.each do |attr|
100
+ define_method(attr) do
101
+ @options[attr]
102
+ end
103
+ end
104
+
105
+ class SchemaObjectBuilder
106
+ attr_reader :options
107
+
108
+ def initialize(options)
109
+ @options = options
110
+ end
111
+
112
+ ALLOWED_ATTRIBUTES.each do |attr|
113
+ define_method(attr) do |*args, &block|
114
+ @options[attr] = block || args.first
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ class Field < SchemaObject
121
+ def namespace_field
122
+ namespace_field = !!@options[:namespace_field] ? @options[:namespace_field] : @name
123
+ end
124
+ end
125
+
126
+ class Namespace < SchemaObject
127
+ end
128
+
129
+ class Group < SchemaObject
130
+ def include_groups_from(existing_groups)
131
+ return unless @options[:includes].present?
132
+
133
+ included_fields = @options[:includes].collect { |g| existing_groups[g].fields }
134
+ @options[:fields] = included_fields.flatten | @options[:fields]
135
+ end
136
+ end
137
+
138
+ class Role < SchemaObject
139
+ end
140
+
141
+ class MongoIndex < SchemaObject
142
+ end
143
+
144
+ class ModelField < SchemaObject
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,14 @@
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 Search
11
+ include ActiveModel::SerializerSupport
12
+ include SupplejackApi::Concerns::Searchable
13
+ end
14
+ end
@@ -0,0 +1,57 @@
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 SetItem
11
+ include Mongoid::Document
12
+
13
+ ATTRIBUTES = RecordSchema.groups[:sets].fields
14
+
15
+ attr_accessor :record
16
+
17
+ embedded_in :user_set, class_name: 'SupplejackApi::UserSet'
18
+
19
+ field :record_id, type: Integer
20
+ field :position, type: Integer
21
+
22
+ validates :record_id, presence: true, uniqueness: true, numericality: { greater_than: 0 }
23
+ validates :position, presence: true
24
+ validate :not_adding_set_to_itself
25
+
26
+ before_validation :set_position
27
+ after_destroy :reindex_record
28
+
29
+ def not_adding_set_to_itself
30
+ return unless user_set.record && record_id == user_set.record.record_id
31
+
32
+ errors.add(:set, "can't be added to itself")
33
+ end
34
+
35
+ # Dynamically define methods for the attributes that get added to the set_item from
36
+ # the actual Record.
37
+ #
38
+ ATTRIBUTES.each do |record_attr|
39
+ define_method(record_attr) do
40
+ record.try(:send, record_attr)
41
+ end
42
+ end
43
+
44
+ # Set the default position as the last in the set, if not defined.
45
+ #
46
+ def set_position
47
+ return if position
48
+
49
+ positions = user_set.set_items.map(&:position)
50
+ self.position = positions.compact.max.to_i + 1
51
+ end
52
+
53
+ def reindex_record
54
+ SupplejackApi::Record.custom_find(record_id).index rescue nil
55
+ end
56
+ end
57
+ end