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,59 @@
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 SiteActivity
11
+ include Mongoid::Document
12
+ include Mongoid::Timestamps
13
+ include Sortable::Query
14
+
15
+ store_in collection: 'site_activities'
16
+
17
+ field :date, type: Date
18
+ field :user_sets, type: Integer
19
+ field :search, type: Integer
20
+ field :records, type: Integer
21
+ field :source_clicks, type: Integer
22
+ field :total, type: Integer
23
+
24
+ validates_uniqueness_of :date
25
+
26
+ IMPLICIT_FIELDS = %w(_type _id created_at updated_at).freeze
27
+
28
+ def self.generate_activity(time = Time.now)
29
+ site_activity_date = time.to_date
30
+ user_activities = SupplejackApi::UserActivity.gt(created_at: time - 12.hours).lte(created_at: time)
31
+
32
+ attributes = { user_sets: 0, search: 0, records: 0 }
33
+
34
+ user_activities.each do |user_activity|
35
+ [:user_sets, :search, :records].each do |field|
36
+ attributes[field] += user_activity.send(field)['total'] if user_activity.send(field)
37
+ end
38
+ end
39
+
40
+ # The date stored is yesterday's date since the activity corresponds to the day before.
41
+ attributes[:date] = site_activity_date
42
+
43
+ site_activity = new(attributes)
44
+ site_activity.source_clicks = SupplejackApi::SourceActivity.get_source_clicks || 0
45
+ SupplejackApi::SourceActivity.reset
46
+ site_activity.calculate_total
47
+ site_activity.save
48
+ site_activity
49
+ end
50
+
51
+ def self.activities
52
+ %w(date search user_sets records source_clicks total) - IMPLICIT_FIELDS
53
+ end
54
+
55
+ def calculate_total
56
+ self.total = user_sets + records + search + source_clicks
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,28 @@
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 Source
11
+ include Mongoid::Document
12
+ include ActiveModel::MassAssignmentSecurity
13
+
14
+ store_in collection: 'sources', session: 'strong'
15
+
16
+ attr_accessible :name, :source_id, :_id, :partner_id, :status
17
+
18
+ field :name, type: String
19
+ field :source_id, type: String
20
+ field :status, type: String, default: 'active'
21
+
22
+ belongs_to :partner, class_name: 'SupplejackApi::Partner'
23
+
24
+ validates :name, presence: true
25
+
26
+ scope :suppressed, -> { where(status: 'suppressed') }
27
+ end
28
+ end
@@ -0,0 +1,36 @@
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 SourceActivity
11
+ include Mongoid::Document
12
+ include Mongoid::Timestamps
13
+
14
+ store_in collection: 'source_activities'
15
+
16
+ field :source_clicks, type: Integer, default: 0
17
+
18
+ private_class_method :new
19
+
20
+ def self.increment
21
+ if first
22
+ first.inc(source_clicks: 1)
23
+ else
24
+ SupplejackApi::SourceActivity.create(source_clicks: 1)
25
+ end
26
+ end
27
+
28
+ def self.get_source_clicks
29
+ SupplejackApi::SourceActivity.first.try(:source_clicks)
30
+ end
31
+
32
+ def self.reset
33
+ SupplejackApi::SourceActivity.first.try(:delete)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,42 @@
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 SourceAuthority
11
+ include Mongoid::Document
12
+ include Mongoid::Timestamps
13
+ include Mongoid::Attributes::Dynamic
14
+
15
+ # TODO: Move this to a class/module that store all the constants
16
+ MONGOID_TYPE_NAMES = {
17
+ string: String,
18
+ integer: Integer,
19
+ datetime: DateTime,
20
+ boolean: Boolean
21
+ }.freeze
22
+
23
+ store_in collection: 'source_authorities'
24
+
25
+ field :concept_type, type: String
26
+ field :internal_identifier, type: String
27
+ field :concept_score, type: Integer
28
+ field :source_id, type: String
29
+ field :source_name, type: String
30
+ field :url, type: String
31
+
32
+ # TODO: Add field validations
33
+
34
+ belongs_to :concept, class_name: 'SupplejackApi::Concept'
35
+
36
+ ConceptSchema.fields.each do |name, field|
37
+ next if field.store == false
38
+ type = field.multi_value.presence ? Array : MONGOID_TYPE_NAMES[field.type]
39
+ field name, type: type
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,37 @@
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 SupplejackSchema
11
+ extend ActiveSupport::Concern
12
+ include SupplejackApi::SchemaDefinition
13
+
14
+ CORE_FIELDS = [
15
+ :internal_identifier,
16
+ :status,
17
+ :record_type,
18
+ :created_at,
19
+ :updated_at
20
+ ].freeze
21
+
22
+ included do
23
+ CORE_FIELDS.each do |field|
24
+ string field, store: false
25
+ end
26
+
27
+ group :internal_fields do
28
+ fields CORE_FIELDS
29
+ end
30
+
31
+ # Index core fields in mongo
32
+ # mongo_index :status, fields: [{status: 1}]
33
+ # mongo_index :internal_identifier, fields: [{internal_identifier: 1}]
34
+ # mongo_index :updated_at, fields: [{updated_at: 1}]
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,79 @@
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 Support
11
+ module Concept
12
+ module Searchable
13
+ extend ActiveSupport::Concern
14
+
15
+ SUNSPOT_TYPE_NAMES = {
16
+ string: :string,
17
+ integer: :integer,
18
+ datetime: :time,
19
+ boolean: :boolean,
20
+ latlon: :latlon
21
+ }.freeze
22
+
23
+ included do
24
+ include Sunspot::Mongoid
25
+
26
+ searchable do
27
+ build_sunspot_schema(self)
28
+ end # searchable
29
+ end # included
30
+
31
+ module ClassMethods
32
+ def custom_find(id, _scope = nil, options = {})
33
+ options ||= {}
34
+ class_scope = unscoped
35
+
36
+ if id.to_s =~ /^\d+$/
37
+ data = class_scope.where(concept_id: id).first
38
+ elsif id.to_s =~ /^[0-9a-f]{24}$/i
39
+ data = class_scope.find(id)
40
+ end
41
+
42
+ raise Mongoid::Errors::DocumentNotFound.new(self, [id], [id]) unless data
43
+
44
+ data
45
+ end
46
+
47
+ def build_sunspot_schema(builder)
48
+ ConceptSchema.model_fields.each do |_name, field|
49
+ options = {}
50
+ search_as = field.search_as || []
51
+
52
+ value_block = nil
53
+ if field.search_value.present?
54
+ value_block = proc do
55
+ field.search_value.call(self)
56
+ end
57
+ end
58
+
59
+ options[:as] = field.solr_name if field.solr_name.present?
60
+
61
+ if search_as.include? :filter
62
+ filter_options = {}
63
+ filter_options[:multiple] = true if field.multi_value.present?
64
+ type = SUNSPOT_TYPE_NAMES[field.type]
65
+
66
+ builder.public_send(type, field.name, options.merge(filter_options), &value_block)
67
+ end
68
+
69
+ if search_as.include? :fulltext
70
+ options[:boost] = field.search_boost if field.search_boost.present?
71
+ builder.text field.name, options, &value_block
72
+ end
73
+ end
74
+ end
75
+ end # module ClassMethods
76
+ end # module Searchable
77
+ end # module Concept
78
+ end # module Support
79
+ end # module SupplejackApi
@@ -0,0 +1,59 @@
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 Support
11
+ module Concept
12
+ module Storable
13
+ extend ActiveSupport::Concern
14
+
15
+ included do
16
+ include Mongoid::Document
17
+ include Mongoid::Timestamps
18
+ include Mongoid::Attributes::Dynamic
19
+
20
+ store_in collection: 'concepts'
21
+
22
+ has_many :source_authorities, class_name: 'SupplejackApi::SourceAuthority'
23
+
24
+ # Both of these fields are required in SJ API Core
25
+ # No need to configure in *Schema
26
+ field :concept_type, type: String
27
+ auto_increment :concept_id
28
+
29
+ index({ concept_id: 1 }, unique: true)
30
+
31
+ ConceptSchema.model_fields.each do |name, option|
32
+ next if option.store == false
33
+ field name.to_sym, option.field_options if !!option.field_options
34
+
35
+ # TODO: Set the Mongo index
36
+ # TODO: Set the validation
37
+ end
38
+
39
+ def records
40
+ # Limit the number of records by 50
41
+ SupplejackApi::Record.where(concept_ids: id).limit(50).to_a
42
+ end
43
+ end # included
44
+
45
+ def edm_type
46
+ concept_type.gsub(/edm:/, '').downcase.pluralize
47
+ end
48
+
49
+ def site_id
50
+ [ENV['CONCEPT_HTTP_HOST'], 'concepts', concept_id].join('/')
51
+ end
52
+
53
+ def context
54
+ [ENV['HTTP_HOST'], 'schema'].join('/')
55
+ end
56
+ end # module
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,96 @@
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 Support
11
+ module FragmentHelpers
12
+ extend ActiveSupport::Concern
13
+
14
+ included do
15
+ validate :validate_unique_source_ids
16
+ end
17
+
18
+ def source_ids
19
+ fragments.map(&:source_id)
20
+ end
21
+
22
+ def duplicate_source_ids?
23
+ source_ids.size != fragments.distinct(:source_id).count
24
+ end
25
+
26
+ def validate_unique_source_ids
27
+ return unless duplicate_source_ids?
28
+
29
+ errors.add(:base, "fragment source_ids must be unique, source_ids: #{source_ids}")
30
+ klass_name = fragment_class.to_s.demodulize.gsub(/Fragment/, '')
31
+ klass_id = "#{klass_name.downcase}_id"
32
+ log_message = "#{klass_name} with #{klass_id}:#{send(klass_id)},"
33
+ log_message += " internal_identifier:#{internal_identifier} failed validation."
34
+ log_message += " Fragment source_ids must be unique, source_ids: #{source_ids}"
35
+ ValidationLogger.logger.error(log_message)
36
+ end
37
+
38
+ def primary_fragment(attributes = {})
39
+ primary = fragments.where(priority: 0).first
40
+ primary ? primary : fragments.build(attributes.merge(priority: 0))
41
+ end
42
+
43
+ def primary_fragment!(attributes = {})
44
+ primary_fragment(attributes).tap(&:save)
45
+ end
46
+
47
+ def merge_fragments
48
+ self.merged_fragment = nil
49
+
50
+ return unless fragments.size > 1
51
+
52
+ self.merged_fragment = fragment_class.new
53
+
54
+ fragment_class.mutable_fields.each do |name, field_type|
55
+ if field_type == Array
56
+ values = Set.new
57
+ sorted_fragments.each do |s|
58
+ values += Array(s.public_send(name))
59
+ end
60
+ merged_fragment.public_send("#{name}=", values.to_a)
61
+ else
62
+ values = sorted_fragments.to_a.map { |s| s.public_send(name) }
63
+ merged_fragment.public_send("#{name}=", values.compact.first)
64
+ end
65
+ end
66
+
67
+ merged_fragment.unset(:priority)
68
+ end
69
+
70
+ # Fetch the attribute from the underlying
71
+ # merged_fragment or only fragment.
72
+ # Means that record.{attribute} (ie. record.name) works for convenience
73
+ # and abstracts away the fact that fragments exist
74
+ # rubocop:disable Style/MethodMissing
75
+ def method_missing(symbol, *_args)
76
+ type = fragment_class.mutable_fields[symbol.to_s]
77
+
78
+ if merged_fragment
79
+ value = merged_fragment.public_send(symbol)
80
+ elsif fragments.first
81
+ value = fragments.first.public_send(symbol)
82
+ end
83
+ type == Array ? Array(value) : value
84
+ end
85
+ # rubocop:enable Style/MethodMissing
86
+
87
+ def sorted_fragments
88
+ fragments.sort_by { |s| s.priority || Integer::INT32_MAX }
89
+ end
90
+
91
+ def find_fragment(source_id)
92
+ fragments.where(source_id: source_id).first
93
+ end
94
+ end
95
+ end
96
+ end