qa 2.0.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +54 -6
  3. data/app/controllers/qa/application_controller.rb +24 -0
  4. data/app/controllers/qa/linked_data_terms_controller.rb +116 -51
  5. data/app/controllers/qa/terms_controller.rb +7 -2
  6. data/app/models/qa/mesh_tree.rb +5 -9
  7. data/app/models/qa/subject_mesh_term.rb +2 -7
  8. data/config/authorities/linked_data/agrovoc.json +8 -1
  9. data/config/initializers/linked_data_authorities.rb +1 -17
  10. data/config/routes.rb +11 -0
  11. data/lib/generators/qa/apidoc/USAGE +11 -0
  12. data/lib/generators/qa/apidoc/apidoc_generator.rb +22 -0
  13. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/apidoc.json +1322 -0
  14. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/favicon-16x16.png +0 -0
  15. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/favicon-32x32.png +0 -0
  16. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/index.html +61 -0
  17. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/oauth2-redirect.html +67 -0
  18. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-bundle.js +93 -0
  19. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-bundle.js.map +1 -0
  20. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-standalone-preset.js +14 -0
  21. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui-standalone-preset.js.map +1 -0
  22. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.css +3 -0
  23. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.css.map +1 -0
  24. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.js +9 -0
  25. data/lib/generators/qa/apidoc/templates/public/qa/apidoc/swagger-ui.js.map +1 -0
  26. data/lib/generators/qa/install/install_generator.rb +11 -0
  27. data/lib/generators/qa/install/templates/config/initializers/qa.rb +13 -0
  28. data/lib/generators/qa/local/tables/mysql/mysql_generator.rb +1 -1
  29. data/lib/generators/qa/local/tables/tables_generator.rb +1 -1
  30. data/lib/qa.rb +16 -0
  31. data/lib/qa/authorities/assign_fast_subauthority.rb +3 -3
  32. data/lib/qa/authorities/getty/aat.rb +13 -6
  33. data/lib/qa/authorities/getty/tgn.rb +11 -22
  34. data/lib/qa/authorities/getty/ulan.rb +13 -16
  35. data/lib/qa/authorities/linked_data.rb +1 -0
  36. data/lib/qa/authorities/linked_data/authority_service.rb +47 -0
  37. data/lib/qa/authorities/linked_data/config.rb +9 -3
  38. data/lib/qa/authorities/linked_data/config/search_config.rb +16 -2
  39. data/lib/qa/authorities/linked_data/config/term_config.rb +17 -3
  40. data/lib/qa/authorities/linked_data/find_term.rb +4 -3
  41. data/lib/qa/authorities/linked_data/generic_authority.rb +8 -1
  42. data/lib/qa/authorities/linked_data/rdf_helper.rb +15 -0
  43. data/lib/qa/authorities/linked_data/search_query.rb +19 -3
  44. data/lib/qa/authorities/loc/generic_authority.rb +2 -2
  45. data/lib/qa/authorities/loc_subauthority.rb +2 -2
  46. data/lib/qa/authorities/local.rb +2 -4
  47. data/lib/qa/authorities/local/file_based_authority.rb +1 -1
  48. data/lib/qa/authorities/local/mysql_table_based_authority.rb +11 -2
  49. data/lib/qa/authorities/local/table_based_authority.rb +2 -1
  50. data/lib/qa/authorities/mesh_tools/mesh_data_parser.rb +1 -1
  51. data/lib/qa/authorities/mesh_tools/mesh_importer.rb +1 -1
  52. data/lib/qa/authorities/oclcts/generic_oclc_authority.rb +1 -3
  53. data/lib/qa/configuration.rb +34 -0
  54. data/lib/qa/version.rb +1 -1
  55. data/lib/tasks/mesh.rake +3 -3
  56. data/spec/controllers/linked_data_terms_controller_spec.rb +247 -18
  57. data/spec/controllers/terms_controller_spec.rb +87 -12
  58. data/spec/fixtures/authorities/linked_data/lod_encoding_config.json +91 -0
  59. data/spec/fixtures/authorities/linked_data/lod_term_id_param_config.json +27 -0
  60. data/spec/fixtures/authorities/linked_data/lod_term_uri_param_config.json +27 -0
  61. data/spec/fixtures/{lexvo_snippet.rdf → lexvo_snippet.rdf.xml} +1 -0
  62. data/spec/lib/authorities/assign_fast_spec.rb +3 -1
  63. data/spec/lib/authorities/file_based_authority_spec.rb +19 -11
  64. data/spec/lib/authorities/geonames_spec.rb +3 -3
  65. data/spec/lib/authorities/getty/aat_spec.rb +14 -8
  66. data/spec/lib/authorities/getty/tgn_spec.rb +8 -15
  67. data/spec/lib/authorities/getty/ulan_spec.rb +8 -6
  68. data/spec/lib/authorities/getty_spec.rb +2 -1
  69. data/spec/lib/authorities/linked_data/authority_service_spec.rb +47 -0
  70. data/spec/lib/authorities/linked_data/generic_authority_spec.rb +56 -14
  71. data/spec/lib/authorities/linked_data/search_config_spec.rb +33 -19
  72. data/spec/lib/authorities/linked_data/search_query_spec.rb +67 -15
  73. data/spec/lib/authorities/linked_data/term_config_spec.rb +34 -20
  74. data/spec/lib/authorities/loc_spec.rb +9 -9
  75. data/spec/lib/authorities/local_spec.rb +7 -8
  76. data/spec/lib/authorities/oclcts_spec.rb +27 -20
  77. data/spec/lib/authorities/table_based_authority_spec.rb +5 -3
  78. data/spec/lib/authorities_loc_subauthorities.rb +2 -2
  79. data/spec/lib/configuration_spec.rb +58 -0
  80. data/spec/lib/mesh_data_parser_spec.rb +2 -0
  81. data/spec/lib/services/rdf_authority_parser_spec.rb +1 -1
  82. data/spec/lib/tasks/mesh.rake_spec.rb +13 -12
  83. data/spec/models/subject_mesh_term_spec.rb +2 -0
  84. data/spec/requests/cors_headers_spec.rb +118 -0
  85. data/spec/spec_helper.rb +2 -2
  86. metadata +167 -137
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 15f2c24ef66af417831964088303e576bc6a41b2
4
- data.tar.gz: d1f95c9f7f81a25052efb3fad0a9e9aec4dd94d8
2
+ SHA256:
3
+ metadata.gz: '00029794cefd74912e6ae326330554bb59e3fa0733c5f0b62eae96aaedc397f1'
4
+ data.tar.gz: 325f45dd7d9e188f57da3c2667f677725a48a2b6e439b71839a15503d875fd0e
5
5
  SHA512:
6
- metadata.gz: 4c37c298ea575d83360d160e4d5463077da86375cdb0596bf0ca0914e3f137febe7de56cf1eb014a8b740b380b4168018e6f356219b2d0ced6cb77c0a0c6616a
7
- data.tar.gz: 0ab1fa42c0d0722fb8e455c3cca0de392561763f5535ce04afeaf9095941e91b271d882162f1d2edbdab15f1234a9b45dbe00a1c249a9b28765b0684a0bdd8bc
6
+ metadata.gz: 9784b68a0c26d296de87e9eaa617437fee2daa11789ac70d2212a2c364613073b15fef1f941ba670a56aff1c5400cf45bd0e7e50aad41c736703030b4402a62c
7
+ data.tar.gz: 7b4016ed6d919e1cd1497a0de4465695954fb552916d6d01c0aa833f7eabde71b7dcaa7391e6b076221c0e80285ed308affb7d1e60c064f0f57951415ddf0125
data/README.md CHANGED
@@ -1,8 +1,16 @@
1
1
  # Questioning Authority
2
2
 
3
- [![Build Status](https://travis-ci.org/samvera/questioning_authority.png?branch=master)](https://travis-ci.org/samvera/questioning_authority) [![Gem Version](https://badge.fury.io/rb/qa.png)](http://badge.fury.io/rb/qa)
3
+ Code:
4
+ [![Gem Version](https://badge.fury.io/rb/qa.png)](http://badge.fury.io/rb/qa)
5
+ [![Build Status](https://travis-ci.org/samvera/questioning_authority.png?branch=master)](https://travis-ci.org/samvera/questioning_authority)
4
6
  [![Coverage Status](https://coveralls.io/repos/github/samvera/questioning_authority/badge.svg?branch=master)](https://coveralls.io/github/samvera/questioning_authority?branch=master)
5
7
 
8
+ Docs:
9
+ [![Contribution Guidelines](http://img.shields.io/badge/CONTRIBUTING-Guidelines-blue.svg)](./CONTRIBUTING.md)
10
+ [![Apache 2.0 License](http://img.shields.io/badge/APACHE2-license-blue.svg)](./LICENSE)
11
+
12
+ Jump In: [![Slack Status](http://slack.samvera.org/badge.svg)](http://slack.samvera.org/)
13
+
6
14
  You should question your authorities.
7
15
 
8
16
  ----
@@ -29,10 +37,12 @@ You should question your authorities.
29
37
  * [Add javascript to support autocomplete](#add-javascript-to-support-autocomplete)
30
38
  * [Developer Notes](#developer-notes)
31
39
  * [Compatibility](#compatibility)
40
+ * [Product Owner & Maintenance](#product-owner--maintenance)
41
+ * [Product Owner](#product-owner)
32
42
  * [Help](#help)
43
+ * [Acknowledgments](#acknowledgments)
33
44
 
34
45
  ----
35
-
36
46
  ## What does this do?
37
47
 
38
48
  Provides a set of uniform RESTful routes to query any controlled vocabulary or set of authority terms.
@@ -303,7 +313,7 @@ This will create two tables/models Qa::LocalAuthority and Qa::LocalAuthorityEntr
303
313
  label: 'Uighur',
304
314
  uri: 'http://id.loc.gov/vocabulary/languages/uig')
305
315
 
306
- Unfortunately, Rails doesn't have a mechnism for adding functional indexes to tables, so if you have a lot of rows, you'll want to add an index:
316
+ Unfortunately, Rails doesn't have a mechanism for adding functional indexes to tables, so if you have a lot of rows, you'll want to add an index:
307
317
 
308
318
  CREATE INDEX "index_qa_local_authority_entries_on_lower_label" ON
309
319
  "qa_local_authority_entries" (local_authority_id, lower(label))
@@ -330,7 +340,7 @@ The entire list (up to the first 1000 terms) can also be returned using:
330
340
 
331
341
  #### Loading RDF data into database tables
332
342
 
333
- You can use the Qa::Services::RDFAuthorityParser to import rdf files into yopur database tables. See the class file, lib/qa/services/rdf_authority_parser.rb, for examples and more information.
343
+ You can use the Qa::Services::RDFAuthorityParser to import rdf files into your database tables. See the class file, lib/qa/services/rdf_authority_parser.rb, for examples and more information.
334
344
  To run the class in your local project you must include `gem 'linkeddata'` into your Gemfile and `require 'linkeddata'` into an initializer or your application.rb
335
345
 
336
346
  ### Medical Subject Headings (MeSH)
@@ -348,7 +358,7 @@ Then, create the tables in your database
348
358
 
349
359
  rake db:migrate
350
360
 
351
- Now that you've setup your application to use MeSH terms, you'll now need to load the tems into your
361
+ Now that you've setup your application to use MeSH terms, you'll now need to load the terms into your
352
362
  database so you can query them locally.
353
363
 
354
364
  To import the mesh terms into the local database, first download the MeSH descriptor dump in ASCII
@@ -385,6 +395,8 @@ gem 'rdf-rdfxml'
385
395
 
386
396
  #### Configuring a LOD Authority
387
397
 
398
+ There are a number of authority configurations that are available. See (ld4l-labs/linked_data_authorities)[https://github.com/ld4l-labs/linked_data_authorities] for configurations and instructions on how to use them. These are updated periodically, so check back from time to time to see what's new.
399
+
388
400
  Access to LOD authorities can be configured. Currently, a configuration exists in QA for OCLC Fast Linked Data, Library of
389
401
  Congress (terms only), and Agrovoc. Look for configuration files in
390
402
  [/config/authorities/linked_data](https://github.com/samvera/questioning_authority/tree/master/config/authorities/linked_data).
@@ -613,7 +625,26 @@ NOTE: All predicates with the URI as the subject will be included under "predica
613
625
 
614
626
  See [Using with autocomplete in Sufia](https://github.com/samvera/questioning_authority/wiki/Using-with-autocomplete-in-Sufia) in the wiki documentation for QA.
615
627
 
628
+ If you are using jQueryUI >= 1.8 you can use the [autocomplete function](http://api.jqueryui.com/autocomplete/), for example:
616
629
 
630
+ ```
631
+ $(function(){
632
+ $('#some_input').autocomplete({
633
+ source: function (request, response) {
634
+ $.ajax({
635
+ url: "/qa/search/loc/subjects?q=" + request.term,
636
+ type: 'GET',
637
+ dataType: 'json',
638
+ complete: function (xhr, status) {
639
+ var results = $.parseJSON(xhr.responseText);
640
+ response(results);
641
+ }
642
+ });
643
+ },
644
+ autoFocus: true
645
+ });
646
+ });
647
+ ```
617
648
 
618
649
  # Developer Notes
619
650
 
@@ -637,9 +668,26 @@ Commit your features into a new branch and submit a pull request.
637
668
  * Ruby 2.4 or the latest 2.3 version is recommended. Later versions may also work.
638
669
  * Rails 5 is required. We recommend the latest Rails 5.0 release.
639
670
 
671
+ ## Product Owner & Maintenance
672
+
673
+ Questioning Authority is a Core Component of the Samvera community. The documentation for
674
+ what this means can be found
675
+ [here](http://samvera.github.io/core_components.html#requirements-for-a-core-component).
676
+
677
+ ### Product Owner
678
+
679
+ [elrayle](https://github.com/elrayle)
680
+
640
681
  # Help
641
682
 
642
- For help with Questioning Authority, contact <samvera-tech@googlegroups.com>.
683
+ The Samvera community is here to help. Please see our [support guide](./SUPPORT.md).
684
+
685
+ # Acknowledgments
686
+
687
+ This software has been developed by and is brought to you by the Samvera community. Learn more at the
688
+ [Samvera website](http://samvera.org/).
689
+
690
+ ![Samvera Logo](https://wiki.duraspace.org/download/thumbnails/87459292/samvera-fall-font2-200w.png?version=1&modificationDate=1498550535816&api=v2)
643
691
 
644
692
  ### Special thanks to...
645
693
 
@@ -1,4 +1,28 @@
1
1
  module Qa
2
2
  class ApplicationController < ActionController::Base
3
+ skip_before_action :verify_authenticity_token, only: :options, raise: false
4
+
5
+ # Process the OPTIONS method for all routes
6
+ # @see route definitions in /config/routes.rb
7
+ # @note Reference: https://fetch.spec.whatwg.org/#http-access-control-allow-headers
8
+ def options
9
+ unless Qa.config.cors_headers?
10
+ head :not_implemented
11
+ return
12
+ end
13
+ response.headers['Access-Control-Allow-Origin'] = '*'
14
+ response.headers['Access-Control-Allow-Methods'] = 'GET, OPTIONS'
15
+ head :no_content
16
+ end
17
+
18
+ # Add cors headers to the passed in http response if cors_headers are enabled. Called by all controller actions
19
+ # to adjust the response.
20
+ # @param http response
21
+ # @see /lib/generators/qa/install/templates/config/initializers/qa.rb
22
+ # @note The qa.rb initializer is copied to /config/initializers/qa.rb and can be modified to enable/disable cors headers.
23
+ # @note Reference: https://fetch.spec.whatwg.org/#http-access-control-allow-headers
24
+ def self.cors_allow_origin_header(response)
25
+ response.headers['Access-Control-Allow-Origin'] = '*' if Qa.config.cors_headers?
26
+ end
3
27
  end
4
28
  end
@@ -1,10 +1,14 @@
1
1
  # This controller is used for all requests to linked data authorities. It will verify params and figure
2
2
  # out which linked data authority to query based on the 'vocab' param.
3
3
 
4
- class Qa::LinkedDataTermsController < ApplicationController
5
- before_action :check_authority, :init_authority
4
+ class Qa::LinkedDataTermsController < ::ApplicationController
5
+ before_action :check_authority, :init_authority, except: [:list, :reload]
6
6
  before_action :check_search_subauthority, :check_query_param, only: :search
7
7
  before_action :check_show_subauthority, :check_id_param, only: :show
8
+ before_action :check_uri_param, only: :fetch
9
+ before_action :validate_auth_reload_token, only: :reload
10
+
11
+ delegate :cors_allow_origin_header, to: Qa::ApplicationController
8
12
 
9
13
  # Provide a warning if there is a request for all terms.
10
14
  def index
@@ -12,56 +16,91 @@ class Qa::LinkedDataTermsController < ApplicationController
12
16
  head :not_found
13
17
  end
14
18
 
19
+ # Return a list of supported authority names
20
+ # get "/list/linked_data/authorities"
21
+ # @see Qa::Authorities::LinkedData::AuthorityService#authority_names
22
+ def list
23
+ render json: Qa::Authorities::LinkedData::AuthorityService.authority_names.to_json
24
+ end
25
+
26
+ # Reload authority configurations
27
+ # get "/reload/linked_data/authorities?auth_token=YOUR_AUTH_TOKEN_DEFINED_HERE"
28
+ # @see Qa::Authorities::LinkedData::AuthorityService#load_authorities
29
+ def reload
30
+ Qa::Authorities::LinkedData::AuthorityService.load_authorities
31
+ list
32
+ end
33
+
15
34
  # Return a list of terms based on a query
35
+ # get "/search/linked_data/:vocab(/:subauthority)"
16
36
  # @see Qa::Authorities::LinkedData::SearchQuery#search
17
37
  def search
18
- begin
19
- terms = @authority.search(query, subauth: subauthority, language: language, replacements: replacement_params)
20
- rescue Qa::ServiceUnavailable
21
- logger.warn "Service Unavailable - Search query #{query} unsuccessful for#{subauth_warn_msg} authority #{vocab_param}"
22
- head :service_unavailable
23
- return
24
- rescue Qa::ServiceError
25
- logger.warn "Internal Server Error - Search query #{query} unsuccessful for#{subauth_warn_msg} authority #{vocab_param}"
26
- head :internal_server_error
27
- return
28
- rescue RDF::FormatError
29
- logger.warn "RDF Format Error - Results from search query #{query} for#{subauth_warn_msg} authority #{vocab_param} was not identified as a valid RDF format. You may need to include the linkeddata gem."
30
- head :internal_server_error
31
- return
32
- end
38
+ terms = @authority.search(query, subauth: subauthority, language: language, replacements: replacement_params)
39
+ cors_allow_origin_header(response)
33
40
  render json: terms
41
+ rescue Qa::ServiceUnavailable
42
+ logger.warn "Service Unavailable - Search query #{query} unsuccessful for#{subauth_warn_msg} authority #{vocab_param}"
43
+ head :service_unavailable
44
+ rescue Qa::ServiceError
45
+ logger.warn "Internal Server Error - Search query #{query} unsuccessful for#{subauth_warn_msg} authority #{vocab_param}"
46
+ head :internal_server_error
47
+ rescue RDF::FormatError
48
+ logger.warn "RDF Format Error - Results from search query #{query} for#{subauth_warn_msg} authority #{vocab_param} " \
49
+ "was not identified as a valid RDF format. You may need to include the linkeddata gem."
50
+ head :internal_server_error
34
51
  end
35
52
 
36
- # Return all the information for a given term
53
+ # Return all the information for a given term given an id or URI
54
+ # get "/show/linked_data/:vocab/:id"
55
+ # get "/show/linked_data/:vocab/:subauthority/:id
37
56
  # @see Qa::Authorities::LinkedData::FindTerm#find
38
- def show
39
- begin
40
- term = @authority.find(id, subauth: subauthority, language: language, replacements: replacement_params)
41
- rescue Qa::TermNotFound
42
- logger.warn "Term Not Found - Fetch term #{id} unsuccessful for#{subauth_warn_msg} authority #{vocab_param}"
43
- head :not_found
44
- return
45
- rescue Qa::ServiceUnavailable
46
- logger.warn "Service Unavailable - Fetch term #{id} unsuccessful for#{subauth_warn_msg} authority #{vocab_param}"
47
- head :service_unavailable
48
- return
49
- rescue Qa::ServiceError
50
- logger.warn "Internal Server Error - Fetch term #{id} unsuccessful for#{subauth_warn_msg} authority #{vocab_param}"
51
- head :internal_server_error
52
- return
53
- rescue RDF::FormatError
54
- logger.warn "RDF Format Error - Results from fetch term #{id} for#{subauth_warn_msg} authority #{vocab_param} was not identified as a valid RDF format. You may need to include the linkeddata gem."
55
- head :internal_server_error
56
- return
57
- end
58
- render json: term
57
+ def show # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
58
+ term = @authority.find(id, subauth: subauthority, language: language, replacements: replacement_params, jsonld: jsonld?)
59
+ cors_allow_origin_header(response)
60
+ content_type = jsonld? ? 'application/ld+json' : 'application/json'
61
+ render json: term, content_type: content_type
62
+ rescue Qa::TermNotFound
63
+ logger.warn "Term Not Found - Fetch term #{id} unsuccessful for#{subauth_warn_msg} authority #{vocab_param}"
64
+ head :not_found
65
+ rescue Qa::ServiceUnavailable
66
+ logger.warn "Service Unavailable - Fetch term #{id} unsuccessful for#{subauth_warn_msg} authority #{vocab_param}"
67
+ head :service_unavailable
68
+ rescue Qa::ServiceError
69
+ logger.warn "Internal Server Error - Fetch term #{id} unsuccessful for#{subauth_warn_msg} authority #{vocab_param}"
70
+ head :internal_server_error
71
+ rescue RDF::FormatError
72
+ logger.warn "RDF Format Error - Results from fetch term #{id} for#{subauth_warn_msg} authority #{vocab_param} " \
73
+ "was not identified as a valid RDF format. You may need to include the linkeddata gem."
74
+ head :internal_server_error
75
+ end
76
+
77
+ # Return all the information for a given term given a URI
78
+ # get "/fetch/linked_data/:vocab"
79
+ # @see Qa::Authorities::LinkedData::FindTerm#find
80
+ def fetch # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
81
+ term = @authority.find(uri, subauth: subauthority, language: language, replacements: replacement_params, jsonld: jsonld?)
82
+ cors_allow_origin_header(response)
83
+ content_type = jsonld? ? 'application/ld+json' : 'application/json'
84
+ render json: term, content_type: content_type
85
+ rescue Qa::TermNotFound
86
+ logger.warn "Term Not Found - Fetch term #{uri} unsuccessful for#{subauth_warn_msg} authority #{vocab_param}"
87
+ head :not_found
88
+ rescue Qa::ServiceUnavailable
89
+ logger.warn "Service Unavailable - Fetch term #{uri} unsuccessful for#{subauth_warn_msg} authority #{vocab_param}"
90
+ head :service_unavailable
91
+ rescue Qa::ServiceError
92
+ logger.warn "Internal Server Error - Fetch term #{uri} unsuccessful for#{subauth_warn_msg} authority #{vocab_param}"
93
+ head :internal_server_error
94
+ rescue RDF::FormatError
95
+ logger.warn "RDF Format Error - Results from fetch term #{uri} for#{subauth_warn_msg} authority #{vocab_param} " \
96
+ "was not identified as a valid RDF format. You may need to include the linkeddata gem."
97
+ head :internal_server_error
59
98
  end
60
99
 
61
100
  private
62
101
 
63
102
  def check_authority
64
- if params[:vocab].nil? || !params[:vocab].size.positive?
103
+ if params[:vocab].nil? || !params[:vocab].size.positive? # rubocop:disable Style/GuardClause
65
104
  logger.warn "Required param 'vocab' is missing or empty"
66
105
  head :bad_request
67
106
  end
@@ -69,7 +108,7 @@ class Qa::LinkedDataTermsController < ApplicationController
69
108
 
70
109
  def check_search_subauthority
71
110
  return if subauthority.nil?
72
- unless @authority.search_subauthority?(subauthority)
111
+ unless @authority.search_subauthority?(subauthority) # rubocop:disable Style/GuardClause
73
112
  logger.warn "Unable to initialize linked data search sub-authority '#{subauthority}' for authority '#{vocab_param}'"
74
113
  head :bad_request
75
114
  end
@@ -77,7 +116,7 @@ class Qa::LinkedDataTermsController < ApplicationController
77
116
 
78
117
  def check_show_subauthority
79
118
  return if subauthority.nil?
80
- unless @authority.term_subauthority?(subauthority)
119
+ unless @authority.term_subauthority?(subauthority) # rubocop:disable Style/GuardClause
81
120
  logger.warn "Unable to initialize linked data term sub-authority '#{subauthority}' for authority '#{vocab_param}'"
82
121
  head :bad_request
83
122
  end
@@ -95,10 +134,20 @@ class Qa::LinkedDataTermsController < ApplicationController
95
134
  end
96
135
 
97
136
  def check_query_param
98
- if params[:q].nil? || !params[:q].size.positive?
99
- logger.warn "Required search param 'q' is missing or empty"
100
- head :bad_request
101
- end
137
+ missing_required_param('search', 'q') if params[:q].blank?
138
+ end
139
+
140
+ def check_id_param
141
+ missing_required_param('show', 'id') if id.blank?
142
+ end
143
+
144
+ def check_uri_param
145
+ missing_required_param('fetch', 'uri') if uri.blank?
146
+ end
147
+
148
+ def missing_required_param(action_name, param_name)
149
+ logger.warn "Required #{action_name} param '#{param_name}' is missing or empty"
150
+ head :bad_request
102
151
  end
103
152
 
104
153
  # converts wildcards into URL-encoded characters
@@ -106,11 +155,8 @@ class Qa::LinkedDataTermsController < ApplicationController
106
155
  params[:q].gsub("*", "%2A")
107
156
  end
108
157
 
109
- def check_id_param
110
- if params[:id].nil? || !params[:id].size.positive?
111
- logger.warn "Required show param 'id' is missing or empty"
112
- head :bad_request
113
- end
158
+ def uri
159
+ params[:uri]
114
160
  end
115
161
 
116
162
  def id
@@ -132,4 +178,23 @@ class Qa::LinkedDataTermsController < ApplicationController
132
178
  def subauth_warn_msg
133
179
  subauthority.nil? ? "" : " sub-authority #{subauthority} in"
134
180
  end
181
+
182
+ def format
183
+ return 'json' unless params.key?(:format)
184
+ return 'json' if params[:format].blank?
185
+ params[:format]
186
+ end
187
+
188
+ def jsonld?
189
+ format == 'jsonld'
190
+ end
191
+
192
+ def validate_auth_reload_token
193
+ token = params.key?(:auth_token) ? params[:auth_token] : nil
194
+ valid = Qa.config.valid_authority_reload_token?(token)
195
+ return true if valid
196
+ logger.warn "FAIL: unable to reload authorities; error_msg: Invalid token (#{token}) does not match expected token."
197
+ head :unauthorized
198
+ false
199
+ end
135
200
  end
@@ -3,12 +3,15 @@
3
3
  # All the authority classes inherit from a super class so they implement the
4
4
  # same methods.
5
5
 
6
- class Qa::TermsController < ApplicationController
6
+ class Qa::TermsController < ::ApplicationController
7
7
  before_action :check_vocab_param, :init_authority
8
8
  before_action :check_query_param, only: :search
9
9
 
10
+ delegate :cors_allow_origin_header, to: Qa::ApplicationController
11
+
10
12
  # If the subauthority supports it, return a list of all terms in the authority
11
13
  def index
14
+ cors_allow_origin_header(response)
12
15
  render json: begin
13
16
  @authority.all
14
17
  rescue NotImplementedError
@@ -19,12 +22,14 @@ class Qa::TermsController < ApplicationController
19
22
  # Return a list of terms based on a query
20
23
  def search
21
24
  terms = @authority.method(:search).arity == 2 ? @authority.search(url_search, self) : @authority.search(url_search)
25
+ cors_allow_origin_header(response)
22
26
  render json: terms
23
27
  end
24
28
 
25
29
  # If the subauthority supports it, return all the information for a given term
26
30
  def show
27
31
  term = @authority.find(params[:id])
32
+ cors_allow_origin_header(response)
28
33
  render json: term
29
34
  end
30
35
 
@@ -32,7 +37,7 @@ class Qa::TermsController < ApplicationController
32
37
  head :not_found unless params[:vocab].present?
33
38
  end
34
39
 
35
- def init_authority
40
+ def init_authority # rubocop:disable Metrics/MethodLength
36
41
  begin
37
42
  mod = authority_class.camelize.constantize
38
43
  rescue NameError
@@ -6,12 +6,8 @@ class Qa::MeshTree < ActiveRecord::Base
6
6
  end
7
7
 
8
8
  def eval_tree_path
9
- trees = read_attribute(:eval_tree_path) || write_attribute(:eval_tree_path, "")
10
- if trees
11
- trees.split("|")
12
- else
13
- []
14
- end
9
+ trees = self[:eval_tree_path] || (self[:eval_tree_path] = "")
10
+ trees ? trees.split("|") : []
15
11
  end
16
12
 
17
13
  def classify_tree
@@ -20,10 +16,10 @@ class Qa::MeshTree < ActiveRecord::Base
20
16
  end
21
17
 
22
18
  def classify_tree!
23
- unless classify_tree.empty?
19
+ unless classify_tree.empty? # rubocop:disable Style/GuardClause
24
20
  tree_path = classify_tree.join('|')
25
- puts "After Join #{tree_path.inspect}"
26
- update_attribute(:eval_tree_path, tree_path)
21
+ Rails.logger.info "After Join #{tree_path.inspect}"
22
+ update_attribute(:eval_tree_path, tree_path) # rubocop:disable Rails/SkipsModelValidations # TODO: Explore how to avoid use of update_attribute.
27
23
  end
28
24
  end
29
25