geoblacklight_admin 0.1.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +58 -59
  3. data/Rakefile +25 -10
  4. data/app/assets/javascripts/geoblacklight_admin.js +1 -1
  5. data/app/assets/stylesheets/geoblacklight_admin/modules/_forms.scss +108 -0
  6. data/app/controllers/admin/documents_controller.rb +22 -13
  7. data/app/controllers/admin/search_controller.rb +2 -1
  8. data/app/controllers/admin/users_controller.rb +1 -1
  9. data/app/indexers/document_indexer.rb +1 -1
  10. data/app/jobs/export_job.rb +7 -5
  11. data/app/jobs/export_json_bulk_job.rb +95 -0
  12. data/app/jobs/export_json_job.rb +14 -12
  13. data/app/models/blacklight_api.rb +6 -6
  14. data/app/models/blacklight_api_facets.rb +7 -2
  15. data/app/models/blacklight_api_ids.rb +3 -4
  16. data/app/models/bulk_action.rb +1 -1
  17. data/app/views/admin/document_accesses/destroy_all.html.erb +1 -1
  18. data/app/views/admin/document_downloads/destroy_all.html.erb +1 -1
  19. data/app/views/admin/documents/_form_nav.html.erb +3 -1
  20. data/app/views/admin/documents/_json_file.jbuilder +14 -0
  21. data/app/views/admin/documents/_result_selected_options.html.erb +3 -1
  22. data/app/views/admin/documents/fetch.json_file.jbuilder +9 -0
  23. data/app/views/admin/documents/index.json_file.jbuilder +9 -0
  24. data/app/views/admin/elements/index.html.erb +1 -1
  25. data/app/views/admin/form_elements/index.html.erb +1 -1
  26. data/app/views/admin/shared/_navbar.html.erb +3 -3
  27. data/app/views/admin/shared/_toast.html.erb +1 -1
  28. data/app/views/admin/users/index.html.erb +1 -1
  29. data/config/locales/documents.en.yml +3 -0
  30. data/db/migrate/20230316183001_add_geoblacklight_admin_gem.rb +1 -0
  31. data/db/seeds.rb +0 -1
  32. data/db/seeds_elements.csv +56 -55
  33. data/db/seeds_elements.numbers +0 -0
  34. data/db/seeds_form_elements.csv +65 -64
  35. data/db/seeds_form_elements.numbers +0 -0
  36. data/lib/generators/geoblacklight_admin/config_generator.rb +31 -76
  37. data/lib/generators/geoblacklight_admin/install_generator.rb +1 -9
  38. data/lib/generators/geoblacklight_admin/templates/config/geomg_aardvark_schema.json +12 -6
  39. data/lib/generators/geoblacklight_admin/templates/config/initializers/devise.rb +315 -0
  40. data/lib/generators/geoblacklight_admin/templates/config/initializers/kithe.rb +2 -0
  41. data/lib/generators/geoblacklight_admin/templates/config/initializers/mime_types.rb +15 -0
  42. data/lib/generators/geoblacklight_admin/templates/config/initializers/pagy.rb +2 -0
  43. data/lib/generators/geoblacklight_admin/templates/config/initializers/simple_form.rb +178 -0
  44. data/lib/generators/geoblacklight_admin/templates/config/initializers/simple_form_bootstrap.rb +365 -0
  45. data/lib/generators/geoblacklight_admin/templates/config/settings.yml +74 -22
  46. data/lib/generators/geoblacklight_admin/templates/javascript/controllers/results_controller.js +10 -0
  47. data/lib/generators/geoblacklight_admin/templates/package.json +2 -0
  48. data/lib/generators/geoblacklight_admin/templates/solr/conf/schema.xml +3 -3
  49. data/lib/generators/geoblacklight_admin/views_generator.rb +2 -2
  50. data/lib/geoblacklight_admin/version.rb +1 -1
  51. data/lib/tasks/geoblacklight_admin.rake +6 -6
  52. metadata +24 -17
  53. data/lib/generators/geoblacklight_admin/example_docs_generator.rb +0 -18
  54. /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/confirmations/new.html.erb +0 -0
  55. /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/invitations/edit.html.erb +0 -0
  56. /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/invitations/new.html.erb +0 -0
  57. /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/mailer/invitation_instructions.html.erb +0 -0
  58. /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/mailer/invitation_instructions.text.erb +0 -0
  59. /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/passwords/edit.html.erb +0 -0
  60. /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/passwords/new.html.erb +0 -0
  61. /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/registrations/edit.html.erb +0 -0
  62. /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/registrations/new.html.erb +0 -0
  63. /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/sessions/new.html.erb +0 -0
  64. /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/shared/_links.html.erb +0 -0
  65. /data/{app/views/admin → lib/generators/geoblacklight_admin/templates}/devise/unlocks/new.html.erb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7684e47be28824d2066af09187c41a5f443cf3ead2ea32d83c22c7bb1b254c2d
4
- data.tar.gz: d444226fbbacfcc2b344e595c8920758e0a75b7981c7202041063fd26d89fec1
3
+ metadata.gz: f18e2477b4c86505e2db4f96deecdd1cb1c7a3da7e6a5ec914d62cb03d96462f
4
+ data.tar.gz: 65686ca5de9a294a3232e87c9639b0ee4dec85e2eb6f4d858f0dd47da81b3e97
5
5
  SHA512:
6
- metadata.gz: 89901b678a8a2e240d63297a8a23ecce61e24c15d2e622b333710dcc4ad4d976ec205b583b1abf4373fb398962812895599650864ddb170137c01ca00f2f756d
7
- data.tar.gz: c07f011ff04015800cec00397e7bbf65ef33a8e0511e56e300930dfe1eb9d2c110148666e805f863e7bfc18aa7fe311887f9abc5c5839387a5afb0dbcd0f2d4f
6
+ metadata.gz: 9a55943084756c68c07211e72de617cf1440f7128912bac6549ffcc95ac51733d2e3d21c165fb8f24acd6dda315c9a316056bda088e5eae65081552c9e6ce302
7
+ data.tar.gz: '090b8cdcac146e2fc720004f923dc73e4cedb3a00c75ea13d90f1ec0c3786b57be9ae65a9d29858e09dea66eb43bfcfbf68b3e0288c5414ff3b0b04bbe41cc92'
data/README.md CHANGED
@@ -1,13 +1,14 @@
1
1
  # geoblacklight_admin
2
2
 
3
- GeoBlacklight Admin is a [GeoBlacklight](https://github.com/geoblacklight/geoblacklight) plugin, built on [Kithe](https://github.com/sciencehistory/kithe), that provides a complex web-form for editing documents and an CSV-based import/export workflow for OpenGeoMetadata's [Aardvark schema](https://opengeometadata.org/ogm-aardvark/). It's a Rubygem port of the Big Ten Academic Alliance's production workflow tool [GEOMG](https://github.com/geobtaa/geomg).
3
+ ![CI](https://github.com/geobtaa/geoblacklight_admin/actions/workflows/ci.yml/badge.svg)
4
4
 
5
- ## Warning: Pre-Alpha
5
+ GeoBlacklight Admin is a [GeoBlacklight](https://github.com/geoblacklight/geoblacklight) plugin, built on [Kithe](https://github.com/sciencehistory/kithe), that provides a complex web-form for editing documents and an CSV-based import/export workflow for OpenGeoMetadata's [Aardvark schema](https://opengeometadata.org/ogm-aardvark/). GBL Admin is based on the Big Ten Academic Alliance's production workflow tool [GEOMG](https://github.com/geobtaa/geomg).
6
6
 
7
- > :warning: This gem is not ready for public adoption yet, but hopefully someday soon (Late Summer 2023?). Feel free to kick the tires if you are curious and know GeoBlacklight's codebase/stack well.
7
+ [![GeoBlackliht Admin](https://raw.githubusercontent.com/geobtaa/geoblacklight_admin/develop/docs/gbl_admin_screenshot.png)](https://youtu.be/lWjcr-Ow228 "GeoBlacklight Admin")
8
8
 
9
9
  ## Requirements
10
10
 
11
+ * Rails v6.1 (not v7 yet)
11
12
  * Blacklight v7 (not v8)
12
13
  * GeoBlacklight v4 (not v3)
13
14
  * Solr v8.4+
@@ -15,43 +16,26 @@ GeoBlacklight Admin is a [GeoBlacklight](https://github.com/geoblacklight/geobla
15
16
  * Redis (for Sidekiq)
16
17
  * OpenGeoMetadata's Aardvark Schema
17
18
 
18
- ## Install Notes
19
+ ## Installation
19
20
 
20
- ### Terminal 1 - Drop/Create application PG database
21
- ```bash
22
- psql postgres
23
- DROP DATABASE geoblacklight_development;
24
- CREATE DATABASE geoblacklight_development;
25
- ```
26
-
27
- ### Terminal 2 - Bundle and run generator
28
- ```bash
29
- bundle install
30
- bundle exec rake engine_cart:generate
31
- ```
21
+ ### PostgreSQL
32
22
 
33
- When the .internal_test_app is built, edit `geoblacklight_admin_helper.rb`, and uncomment this Pagy include. Why including Pagy here breaks the entire generator build is beyond me...
23
+ You need a PostgreSQL database to use this project.
34
24
 
35
- ```bash
36
- # @TODO:
37
- # Cannot generate app if uncommented...
38
- # Uncomment after app is generated to fix view errors
39
- # include ::Pagy::Frontend
40
- ```
25
+ * Homebrew: https://wiki.postgresql.org/wiki/Homebrew
26
+ * Docker: https://www.docker.com/blog/how-to-use-the-postgres-docker-official-image/
41
27
 
42
- ### Terminal 2 - Seed and spin up server
43
- ```bash
44
- cd .internal_test_app
45
- bundle exec rake db:seed
28
+ ### Install Template
46
29
 
47
- # JS was breaking in dev mode, had to add the yarn package below - EWL 6/5/23
48
- yarn add @babel/plugin-proposal-private-methods --dev
30
+ Use Ruby v3.2 and Rails v6.1.7.4 to bootstrap a new GeoBlacklight + GBL Admin application using the template script:
49
31
 
50
- # Run the app server
32
+ ```bash
33
+ rails _6.1.7.4_ new gbl_admin -m https://raw.githubusercontent.com/geobtaa/geoblacklight_admin/develop/template.rb
34
+ cd gbl_admin
51
35
  bundle exec rake gbl_admin:server
52
36
  ```
53
37
 
54
- You're now done generating the test app and populating the Elements / FormElements tables with the basic Aardvark controls.
38
+ You have now generated the .internal_test_app and populated the Elements / FormElements tables for OMG Aardvark support.
55
39
 
56
40
  ### View App in Browser
57
41
 
@@ -59,12 +43,48 @@ You're now done generating the test app and populating the Elements / FormElemen
59
43
  2. Click on the "Sign in" link
60
44
  3. Enter email: admin@geoblacklight.org and password: 123456
61
45
  4. Click on the "GBL Admin" link
62
- 5. Import some CSV
46
+ 5. Import some CSV (test/fixtures/files/btaa_sample_records.csv)
63
47
 
64
48
  -----
65
49
 
66
- ### TODOs - Running list of things to accomplish
50
+ ## Run Project for Local Development
51
+ Drop and recreate databases (or engine_cart:generate will fail)
67
52
 
53
+ ### Drop/Create application PG database
54
+ ```bash
55
+ psql postgres
56
+ DROP DATABASE geoblacklight_development;
57
+ CREATE DATABASE geoblacklight_development;
58
+ ```
59
+
60
+ ```bash
61
+ cd project root
62
+ bundle install
63
+ bundle exec rake engine_cart:regenerate
64
+ ```
65
+
66
+ ### Run Solr
67
+ ```bash
68
+ bin/rails geoblacklight:solr
69
+ ```
70
+
71
+ ### Run App
72
+ ```bash
73
+ cd .internal_test_app
74
+ bundle exec rails server
75
+ ```
76
+
77
+ ### Lint App
78
+ ```bash
79
+ standardrb .
80
+ ```
81
+
82
+ ### Test App
83
+ ```bash
84
+ RAILS_ENV=test bundle exec rails test
85
+ ```
86
+
87
+ ## TODOs
68
88
  * ~~SolrWrapper - Add persist option~~
69
89
  * ~~BlacklightApi returns not auth'd message (not requiring auth for now (not sensitive data))~~
70
90
  * ~~Facet links need /admin nesting~~
@@ -78,31 +98,10 @@ You're now done generating the test app and populating the Elements / FormElemen
78
98
  * ~~Routes - Get devise user~~
79
99
  * ~~No route matches [GET] "/users/sign_out"~~
80
100
  * ~~Bookmarks need to be Admin::Bookmarks~~
81
- * GitHub Actions / CI integration
82
- * Port the GEOMG test suite
101
+ * ~~GitHub Actions / CI integration~~
102
+ * ~~Port the GEOMG test suite~~
103
+ * ~~Project gem dependency injection redundancy...~~
104
+ * DRY up Engine routing
83
105
  * Remove legacy GEOMG / B1G everywhere...
84
106
  * Send GBLADMIN JavaScript pack to NPM like Blacklight
85
- * Project gem dependency injection redundancy...
86
- * Likely a lot more polish to be uncovered...
87
-
88
-
89
- # To Run Project
90
- drop and create databases (or engine_cart will fail)
91
- cd project root
92
- bundle exec rake engine_cart:regenerate
93
-
94
- ## Run Solr
95
- bin/rails geoblacklight:solr
96
-
97
- ## Run App
98
- cd .internal_test_app
99
- bundle exec rails server
100
-
101
- ## Test App
102
- bundle exec rails test
103
- cd .internal_test_app
104
- rake db:seed
105
- rake geomg:solr:reindex
106
-
107
- # @TODO: Add chosen.js css
108
- # @TODO: Fix missing select form-control class
107
+ * Likely some more polish to be uncovered...
data/Rakefile CHANGED
@@ -24,14 +24,6 @@ RuboCop::RakeTask.new(:rubocop)
24
24
  require "solr_wrapper/rake_task"
25
25
  require "engine_cart/rake_task"
26
26
  require "geoblacklight_admin/version"
27
-
28
- desc "Run test suite"
29
- task "ci" do
30
- ENV["RAILS_ENV"] = "test"
31
- system("RAILS_ENV=test bundle exec rake test") || false
32
- # system("RAILS_ENV=test bundle exec rake geomg:solr:reindex") || false
33
- end
34
-
35
27
  require "rake/testtask"
36
28
 
37
29
  # Searches for files ending in _test.rb in the test directory
@@ -45,12 +37,35 @@ end
45
37
  # Will use test as defaut task if rake is run by itself
46
38
  task default: :test
47
39
 
40
+ desc "Run test suite"
41
+ task ci: ["geoblacklight:generate"] do
42
+ within_test_app do
43
+ system "RAILS_ENV=test bin/rails db:migrate"
44
+ system "RAILS_ENV=test rake db:seed"
45
+ system "RAILS_ENV=test rails webpacker:compile"
46
+ end
47
+
48
+ # Run RSpec tests with Coverage
49
+ Rake::Task["geoblacklight:coverage"].invoke
50
+ end
51
+
48
52
  namespace :geoblacklight do
53
+ desc "Run tests with coverage"
54
+ task :coverage do
55
+ ENV["COVERAGE"] = "true"
56
+ # Rake::Task["spec"].invoke
57
+ Rake::Task["test"].invoke
58
+ end
59
+
60
+ desc "Create the test rails app"
61
+ task generate: ["engine_cart:generate"] do
62
+ # Intentionally Empty Block
63
+ end
64
+
49
65
  namespace :internal do
50
66
  task seed: ["engine_cart:generate"] do
51
67
  within_test_app do
52
- # @TODO - Seed Elements / FormElements
53
- # system "bundle exec rake gbl_admin:seed"
68
+ system "bundle exec rake db:seed"
54
69
  system "bundle exec rake geoblacklight:downloads:mkdir"
55
70
  end
56
71
  end
@@ -13,7 +13,7 @@
13
13
 
14
14
  //= require jquery3
15
15
  //= require rails-ujs
16
- //= require cocoon
16
+ //= require @nathanvda/cocoon/cocoon.js
17
17
  //= require chosen-jquery/lib/chosen.jquery.js
18
18
 
19
19
  // VENDOR
@@ -26,3 +26,111 @@ label, legend {
26
26
  html {
27
27
  scroll-padding-top: 4rem; /* height of your sticky header */
28
28
  }
29
+
30
+ // Simple Form / Bootstrap 5 / Select
31
+ //
32
+ // GBL is using BS4 now, but SimpleForm is already on BS5
33
+ // Adding support for BS5's .form-select class until we upgrade to BS5
34
+ $form-select-padding-y: $input-padding-y;
35
+ $form-select-padding-x: $input-padding-x;
36
+ $form-select-font-family: $input-font-family;
37
+ $form-select-font-size: $input-font-size;
38
+ $form-select-indicator-padding: $form-select-padding-x * 3; // Extra padding for background-image
39
+ $form-select-font-weight: $input-font-weight;
40
+ $form-select-line-height: $input-line-height;
41
+ $form-select-color: $input-color;
42
+ $form-select-bg: $input-bg;
43
+ $form-select-disabled-color: null;
44
+ $form-select-disabled-bg: $gray-200;
45
+ $form-select-disabled-border-color: $gray-800;
46
+ $form-select-bg-position: right $form-select-padding-x center;
47
+ $form-select-bg-size: 16px 12px; // In pixels because image dimensions
48
+ $form-select-indicator-color: $gray-800;
49
+ $form-select-indicator: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='#{$form-select-indicator-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/></svg>");
50
+
51
+ $form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding;
52
+ $form-select-feedback-icon-position: center right $form-select-indicator-padding;
53
+ $form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half;
54
+
55
+ $form-select-border-width: $input-border-width;
56
+ $form-select-border-color: $input-border-color;
57
+ $form-select-border-radius: $border-radius;
58
+
59
+ $form-select-focus-border-color: $input-focus-border-color;
60
+ $form-select-focus-width: $input-focus-width;
61
+ $form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color;
62
+
63
+ $form-select-padding-y-sm: $input-padding-y-sm;
64
+ $form-select-padding-x-sm: $input-padding-x-sm;
65
+ $form-select-font-size-sm: $input-font-size-sm;
66
+
67
+ $form-select-padding-y-lg: $input-padding-y-lg;
68
+ $form-select-padding-x-lg: $input-padding-x-lg;
69
+ $form-select-font-size-lg: $input-font-size-lg;
70
+
71
+ $form-select-transition: $input-transition;
72
+
73
+ .form-select {
74
+ display: block;
75
+ width: 100%;
76
+ padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;
77
+ // stylelint-disable-next-line property-no-vendor-prefix
78
+ -moz-padding-start: subtract($form-select-padding-x, 3px); // See https://github.com/twbs/bootstrap/issues/32636
79
+ font-family: $form-select-font-family;
80
+ @include font-size($form-select-font-size);
81
+ font-weight: $form-select-font-weight;
82
+ line-height: $form-select-line-height;
83
+ color: $form-select-color;
84
+ background-color: $form-select-bg;
85
+ background-image: escape-svg($form-select-indicator);
86
+ background-repeat: no-repeat;
87
+ background-position: $form-select-bg-position;
88
+ background-size: $form-select-bg-size;
89
+ border: $form-select-border-width solid $form-select-border-color;
90
+ @include border-radius($form-select-border-radius, 0);
91
+ @include transition($form-select-transition);
92
+ appearance: none;
93
+
94
+ &:focus {
95
+ border-color: $form-select-focus-border-color;
96
+ outline: 0;
97
+ @if $enable-shadows {
98
+ @include box-shadow($form-select-box-shadow, $form-select-focus-box-shadow);
99
+ } @else {
100
+ // Avoid using mixin so we can pass custom focus shadow properly
101
+ box-shadow: $form-select-focus-box-shadow;
102
+ }
103
+ }
104
+
105
+ &[multiple],
106
+ &[size]:not([size="1"]) {
107
+ padding-right: $form-select-padding-x;
108
+ background-image: none;
109
+ }
110
+
111
+ &:disabled {
112
+ color: $form-select-disabled-color;
113
+ background-color: $form-select-disabled-bg;
114
+ border-color: $form-select-disabled-border-color;
115
+ }
116
+
117
+ // Remove outline from select box in FF
118
+ &:-moz-focusring {
119
+ color: transparent;
120
+ text-shadow: 0 0 0 $form-select-color;
121
+ }
122
+ }
123
+
124
+ .form-select-sm {
125
+ padding-top: $form-select-padding-y-sm;
126
+ padding-bottom: $form-select-padding-y-sm;
127
+ padding-left: $form-select-padding-x-sm;
128
+ @include font-size($form-select-font-size-sm);
129
+ }
130
+
131
+ .form-select-lg {
132
+ padding-top: $form-select-padding-y-lg;
133
+ padding-bottom: $form-select-padding-y-lg;
134
+ padding-left: $form-select-padding-x-lg;
135
+ @include font-size($form-select-font-size-lg);
136
+ }
@@ -10,6 +10,8 @@ module Admin
10
10
  # GET /documents
11
11
  # GET /documents.json
12
12
  def index
13
+ @request = "#{request.protocol}#{request.host}:#{request.port}"
14
+
13
15
  query_params = {
14
16
  q: params["q"],
15
17
  f: params["f"],
@@ -18,7 +20,7 @@ module Admin
18
20
  sort: params["sort"] || "score desc",
19
21
  daterange: params["daterange"] || nil
20
22
  }
21
- @documents = BlacklightApi.new(**query_params)
23
+ @documents = BlacklightApi.new(@request, **query_params)
22
24
 
23
25
  respond_to do |format|
24
26
  format.html { render :index }
@@ -26,38 +28,44 @@ module Admin
26
28
 
27
29
  # JSON - BTAA Aardvark
28
30
  format.json_btaa_aardvark do
29
- ExportJsonJob.perform_later(current_user, query_params.merge!({format: "json_btaa_aardvark"}),
31
+ ExportJsonJob.perform_later(@request, current_user, query_params.merge!({format: "json_btaa_aardvark"}),
30
32
  ExportJsonService)
31
33
  head :no_content
32
34
  end
33
35
 
34
36
  # JSON - GBL Aardvark
35
37
  format.json_aardvark do
36
- ExportJsonJob.perform_later(current_user, query_params.merge!({format: "json_aardvark"}), ExportJsonService)
38
+ ExportJsonJob.perform_later(@request, current_user, query_params.merge!({format: "json_aardvark"}), ExportJsonService)
37
39
  head :no_content
38
40
  end
39
41
 
40
42
  # JSON - GBL v1
41
43
  format.json_gbl_v1 do
42
- ExportJsonJob.perform_later(current_user, query_params.merge!({format: "json_gbl_v1"}), ExportJsonService)
44
+ ExportJsonJob.perform_later(@request, current_user, query_params.merge!({format: "json_gbl_v1"}), ExportJsonService)
45
+ head :no_content
46
+ end
47
+
48
+ # JSON - FILE
49
+ format.json_file do
50
+ ExportJsonBulkJob.perform_later(@request, current_user, query_params.merge!({format: "json_file"}), ExportJsonService)
43
51
  head :no_content
44
52
  end
45
53
 
46
54
  # CSV - B1G
47
55
  format.csv do
48
- ExportJob.perform_later(current_user, query_params, ExportCsvService)
56
+ ExportJob.perform_later(@request, current_user, query_params, ExportCsvService)
49
57
  head :no_content
50
58
  end
51
59
 
52
60
  # CSV Document Downloads - B1G
53
61
  format.csv_document_downloads do
54
- ExportJob.perform_later(current_user, query_params, ExportCsvDocumentDownloadsService)
62
+ ExportJob.perform_later(@request, current_user, query_params, ExportCsvDocumentDownloadsService)
55
63
  head :no_content
56
64
  end
57
65
 
58
66
  # CSV Document Access Links - B1G
59
67
  format.csv_document_access_links do
60
- ExportJob.perform_later(current_user, query_params, ExportCsvDocumentAccessLinksService)
68
+ ExportJob.perform_later(@request, current_user, query_params, ExportCsvDocumentAccessLinksService)
61
69
  head :no_content
62
70
  end
63
71
  end
@@ -65,6 +73,7 @@ module Admin
65
73
 
66
74
  # Fetch documents from array of friendlier_ids
67
75
  def fetch
76
+ @request = "#{request.protocol}#{request.host}:#{request.port}"
68
77
  @documents = Document.where(friendlier_id: params["ids"])
69
78
 
70
79
  respond_to do |format|
@@ -73,42 +82,42 @@ module Admin
73
82
 
74
83
  # JSON - BTAA Aardvark
75
84
  format.json_btaa_aardvark do
76
- ExportJsonJob.perform_later(current_user, {ids: @documents.pluck(:friendlier_id), format: "json_btaa_aardvark"},
85
+ ExportJsonJob.perform_later(@request, current_user, {ids: @documents.pluck(:friendlier_id), format: "json_btaa_aardvark"},
77
86
  ExportJsonService)
78
87
  head :no_content
79
88
  end
80
89
 
81
90
  # JSON - GBL Aardvark
82
91
  format.json_aardvark do
83
- ExportJsonJob.perform_later(current_user, {ids: @documents.pluck(:friendlier_id), format: "json_aardvark"},
92
+ ExportJsonJob.perform_later(@request, current_user, {ids: @documents.pluck(:friendlier_id), format: "json_aardvark"},
84
93
  ExportJsonService)
85
94
  head :no_content
86
95
  end
87
96
 
88
97
  # JSON - GBL v1
89
98
  format.json_gbl_v1 do
90
- ExportJsonJob.perform_later(current_user, {ids: @documents.pluck(:friendlier_id), format: "json_gbl_v1"},
99
+ ExportJsonJob.perform_later(@request, current_user, {ids: @documents.pluck(:friendlier_id), format: "json_gbl_v1"},
91
100
  ExportJsonService)
92
101
  head :no_content
93
102
  end
94
103
 
95
104
  # CSV - B1G
96
105
  format.csv do
97
- ExportJob.perform_later(current_user, {ids: @documents.pluck(:friendlier_id), format: "csv"},
106
+ ExportJob.perform_later(@request, current_user, {ids: @documents.pluck(:friendlier_id), format: "csv"},
98
107
  ExportCsvService)
99
108
  head :no_content
100
109
  end
101
110
 
102
111
  # CSV Document Downloads - B1G
103
112
  format.csv_document_downloads do
104
- ExportJob.perform_later(current_user,
113
+ ExportJob.perform_later(@request, current_user,
105
114
  {ids: @documents.pluck(:friendlier_id), format: "csv_document_downloads"}, ExportCsvDocumentDownloadsService)
106
115
  head :no_content
107
116
  end
108
117
 
109
118
  # CSV Document Downloads - B1G
110
119
  format.csv_document_access_links do
111
- ExportJob.perform_later(current_user,
120
+ ExportJob.perform_later(@request, current_user,
112
121
  {ids: @documents.pluck(:friendlier_id), format: "csv_document_access_links"}, ExportCsvDocumentAccessLinksService)
113
122
  head :no_content
114
123
  end
@@ -4,7 +4,8 @@
4
4
  module Admin
5
5
  class SearchController < Admin::AdminController
6
6
  def index
7
- @facet_options = BlacklightApiFacets.new.facets
7
+ @request = "#{request.protocol}#{request.host}:#{request.port}"
8
+ @facet_options = BlacklightApiFacets.new(@request).facets
8
9
  end
9
10
  end
10
11
  end
@@ -4,7 +4,7 @@
4
4
  module Admin
5
5
  class UsersController < Admin::AdminController
6
6
  def index
7
- @users = User.all
7
+ @users = User.where(admin: true)
8
8
  end
9
9
  end
10
10
  end
@@ -28,7 +28,7 @@ class DocumentIndexer < Kithe::Indexer
28
28
  rec.updated_at.utc.iso8601 if rec&.updated_at
29
29
  end
30
30
 
31
- # - GEOMG
31
+ # - GBL ADMIN
32
32
  to_field "b1g_geom_import_id_ssi", obj_extract("import_id")
33
33
  end
34
34
  end
@@ -6,8 +6,9 @@ require "csv"
6
6
  class ExportJob < ApplicationJob
7
7
  queue_as :default
8
8
 
9
- def perform(current_user, query_params, export_service)
9
+ def perform(request, current_user, query_params, export_service)
10
10
  logger.debug("\n\n Background Job: ♞")
11
+ logger.debug("Request: #{request.inspect}")
11
12
  logger.debug("User: #{current_user.inspect}")
12
13
  logger.debug("Query: #{query_params.inspect}")
13
14
  logger.debug("Export Service: #{export_service.inspect}")
@@ -17,7 +18,7 @@ class ExportJob < ApplicationJob
17
18
  ActionCable.server.broadcast("export_channel", {data: "Hello from Export Job!"})
18
19
 
19
20
  # Query params into Doc ids
20
- document_ids = query_params[:ids] || crawl_query(query_params)
21
+ document_ids = query_params[:ids] || crawl_query(request, query_params)
21
22
 
22
23
  logger.debug("Document Ids: #{document_ids}")
23
24
 
@@ -56,15 +57,16 @@ class ExportJob < ApplicationJob
56
57
  })
57
58
  end
58
59
 
59
- def crawl_query(query_params, doc_ids = [])
60
+ def crawl_query(request, query_params, doc_ids = [])
60
61
  logger.debug("\n\n CRAWL Query: #{query_params}")
61
- api_results = BlacklightApiIds.new(query_params)
62
+ logger.debug("\n\n CRAWL Query Request: #{request}")
63
+ api_results = BlacklightApiIds.new(request, query_params)
62
64
  logger.debug("API Results: #{api_results.results.inspect}")
63
65
 
64
66
  doc_ids << api_results.results.pluck("id")
65
67
 
66
68
  unless api_results.meta["pages"]["next_page"].nil?
67
- crawl_query(query_params.merge!({page: api_results.meta["pages"]["next_page"]}),
69
+ crawl_query(request, query_params.merge!({page: api_results.meta["pages"]["next_page"]}),
68
70
  doc_ids)
69
71
  end
70
72
 
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "csv"
4
+
5
+ # ExportJsonBulkJob
6
+ class ExportJsonBulkJob < ApplicationJob
7
+ queue_as :default
8
+
9
+ def perform(request, current_user, query_params, export_service)
10
+ logger.debug("\n\n Background Job: ♞")
11
+ logger.debug("Request: #{request.inspect}")
12
+ logger.debug("User: #{current_user.inspect}")
13
+ logger.debug("Query: #{query_params.inspect}")
14
+ logger.debug("Export Service: #{export_service.inspect}")
15
+ logger.debug("\n\n")
16
+
17
+ # Test broadcast
18
+ ActionCable.server.broadcast("export_channel", {data: "Hello from Export Job!"})
19
+
20
+ # Query params into Doc ids
21
+ document_ids = query_params[:ids] || crawl_query(request, query_params)
22
+
23
+ logger.debug("Document Ids: #{document_ids}")
24
+
25
+ # Send progress
26
+ documents = export_service.call(document_ids)
27
+
28
+ begin
29
+ # Array of JSON
30
+ @json_array = []
31
+
32
+ documents.each do |doc|
33
+ json_output = Admin::DocumentsController.render("_json_file.jbuilder",
34
+ locals: {document: doc})
35
+
36
+ json_obj = JSON.parse(json_output)
37
+ Rails.logger.debug json_obj
38
+
39
+ # Remove nil/null values from JSON
40
+ json_obj.compact!
41
+
42
+ @json_array << JSON.pretty_generate(json_obj)
43
+
44
+ rescue NoMethodError => e
45
+ Rails.logger.debug { "==== Error! - #{doc.friendlier_id} ====" }
46
+ Rails.logger.debug e.inspect
47
+ next
48
+ end
49
+ end
50
+
51
+ # Write into tempfile
52
+ @tempfile = Tempfile.new(["export-#{Time.zone.today}", ".json"]).tap do |file|
53
+ file.write("[#{@json_array.join(",")}]")
54
+ end
55
+ @tempfile.rewind
56
+
57
+ # Create notification
58
+ # Message: "Download Type|Row Count|Button Label"
59
+ notification = ExportNotification.with(message: "JSON FILE |#{ActionController::Base.helpers.number_with_delimiter(documents.size)} rows|JSON")
60
+
61
+ # Deliver notification
62
+ notification.deliver(current_user)
63
+
64
+ # Attach JSON file (can only attach after persisted)
65
+ notification.record.file.attach(io: @tempfile, filename: "geomg-export-#{Time.zone.today}.json",
66
+ content_type: "application/json")
67
+
68
+ # Update UI
69
+ ActionCable.server.broadcast("export_channel", {
70
+ data: "Notification ready!",
71
+ actions: [
72
+ {
73
+ method: "RefreshNotifications",
74
+ payload: current_user.notifications.unread.count
75
+ }
76
+ ]
77
+ })
78
+ end
79
+
80
+ def crawl_query(request, query_params, doc_ids = [])
81
+ logger.debug("\n\n CRAWL Query: #{query_params}")
82
+ logger.debug("\n\n CRAWL Query Request: #{request}")
83
+ api_results = BlacklightApiIds.new(request, query_params)
84
+ logger.debug("API Results: #{api_results.results.inspect}")
85
+
86
+ doc_ids << api_results.results.pluck("id")
87
+
88
+ unless api_results.meta["pages"]["next_page"].nil?
89
+ crawl_query(request, query_params.merge!({page: api_results.meta["pages"]["next_page"]}),
90
+ doc_ids)
91
+ end
92
+
93
+ doc_ids
94
+ end
95
+ end