diff --git a/Gemfile b/Gemfile index c30ae8bac9778866656693b1291bb063689b8d84..bdea39956f1f381971998bd0c3e10535f1c136a5 100644 --- a/Gemfile +++ b/Gemfile @@ -1,65 +1,69 @@ -source 'https://rubygems.org' +source "https://rubygems.org" git_source(:github) { |repo| "https://github.com/#{repo}.git" } -ruby '3.0.1' +ruby "3.0.1" # Bundle edge Rails instead: gem 'rails', github: 'rails/rails', branch: 'main' -gem 'rails', '~> 6.1.3', '>= 6.1.3.2' +gem "rails", "~> 6.1.3", ">= 6.1.3.2" # Use sqlite3 as the database for Active Record # gem 'sqlite3' -gem 'pg' +gem "pg" # gem 'devise' # Use Puma as the app server -gem 'puma', '~> 5.0' +gem "puma", "~> 5.0" # Use SCSS for stylesheets -gem 'sass-rails', '>= 6' +gem "sass-rails", ">= 6" # Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker -gem 'webpacker' +gem "webpacker" # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks -gem 'turbolinks', '~> 5' +gem "turbolinks", "~> 5" # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder -gem 'jbuilder', '~> 2.7' +gem "jbuilder", "~> 2.7" # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 4.0' # Use Active Model has_secure_password # gem 'bcrypt', '~> 3.1.7' -gem 'openssl' -gem 'rsolr' -gem 'sidekiq', '~> 6.0' -gem 'pragmatic_tokenizer' -gem 'activerecord-session_store' +# Use OpenSSL for encryption of Auth Token +gem "openssl" +# Use rSolr for search queries +gem "rsolr" +# Use rack-cors for cross-origin requests +gem "rack-cors" +gem "sidekiq", "~> 6.0" +gem "pragmatic_tokenizer" +gem "activerecord-session_store" # Use Active Storage variant # gem 'image_processing', '~> 1.2' # Reduces boot times through caching; required in config/boot.rb -gem 'bootsnap', '>= 1.4.4', require: false +gem "bootsnap", ">= 1.4.4", require: false group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console - gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] + gem "byebug", platforms: [:mri, :mingw, :x64_mingw] end group :development do # Access an interactive console on exception pages or by calling 'console' anywhere in the code. - gem 'web-console', '>= 4.1.0' + gem "web-console", ">= 4.1.0" # Display performance information such as SQL time and flame graphs for each request in your browser. # Can be configured to work on production as well see: https://github.com/MiniProfiler/rack-mini-profiler/blob/master/README.md - gem 'rack-mini-profiler', '~> 2.0' - gem 'listen', '~> 3.3' + gem "rack-mini-profiler", "~> 2.0" + gem "listen", "~> 3.3" # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring - gem 'spring' - gem 'brakeman' + gem "spring" + gem "brakeman" end group :test do # Adds support for Capybara system testing and selenium driver - gem 'capybara', '>= 3.26' - gem 'selenium-webdriver' + gem "capybara", ">= 3.26" + gem "selenium-webdriver" # Easy installation and use of web drivers to run system tests with browsers - gem 'webdrivers' + gem "webdrivers" end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] +gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/Gemfile.lock b/Gemfile.lock index 1a3761a164884ef4b637e89ed1da346e916fcb1a..4fd921cdfc2edb5c082bd52e972a3832387799ea 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -127,6 +127,8 @@ GEM nio4r (~> 2.0) racc (1.6.0) rack (2.2.4) + rack-cors (1.1.1) + rack (>= 2.0.0) rack-mini-profiler (2.3.4) rack (>= 1.2.0) rack-proxy (0.7.2) @@ -244,6 +246,7 @@ DEPENDENCIES pg pragmatic_tokenizer puma (~> 5.0) + rack-cors rack-mini-profiler (~> 2.0) rails (~> 6.1.3, >= 6.1.3.2) rsolr diff --git a/app/controllers/concerns/authentication.rb b/app/controllers/concerns/authentication.rb index 1223267dac2f36c856b7ac113be20e508e5a9f46..c573d8cc931f28cafbccafba36ab4a7917eb1750 100644 --- a/app/controllers/concerns/authentication.rb +++ b/app/controllers/concerns/authentication.rb @@ -11,11 +11,14 @@ module Authentication end def authenticate_user! - # id_dict = { "labs_user_id" => decrypt_header(request.headers["X-Auth-Newseye-Token"]) } - id_dict = { "labs_user_id" => "3"} + id_dict = { "labs_user_id" => decrypt_header(request.headers["X-Auth-Newseye-Token"]) } + # id_dict = { "labs_user_id" => "42" } @user = User.find_by(labs_user_id: id_dict["labs_user_id"]) if @user - login @user unless session[:current_user_id] + if !session[:current_user_id] + puts "Logging in the user since current_user_id was not set" + login @user + end else @user = User.new(id_dict) if @user.save @@ -27,13 +30,14 @@ module Authentication def login(user) reset_session session[:current_user_id] = user.id + puts "The user id taken from session is " + String(session[:current_user_id]) end private def current_user - # Current.user ||= User.find_by(labs_user_id: decrypt_header(request.headers["X-Auth-Newseye-Token"])) - Current.user ||= User.find_by(labs_user_id: "3") + Current.user ||= User.find_by(labs_user_id: decrypt_header(request.headers["X-Auth-Newseye-Token"])) + # Current.user ||= User.find_by(labs_user_id: "42") end def decrypt_header(token) diff --git a/app/javascript/packs/controllers/viewer_controller.js b/app/javascript/packs/controllers/viewer_controller.js index b3d29725c72bbe1f1d88392b33c88ff98eb9dd92..116d23482f3d1131a932823ad51bd191ccd0f1c8 100644 --- a/app/javascript/packs/controllers/viewer_controller.js +++ b/app/javascript/packs/controllers/viewer_controller.js @@ -374,7 +374,7 @@ export default class extends Controller { } this.viewer = OpenSeadragon({ id: "openseadragon_view", - prefixUrl: "/openseadragon/images/", + prefixUrl: "/static/js/openseadragon/images/feathericons/", sequenceMode: true, initialPage: initialPage, tileSources: this.pagesValue, diff --git a/app/javascript/packs/utils/dataset_api.js b/app/javascript/packs/utils/dataset_api.js index 622c80ea483d2d34cf63aa7d80b6155c82c525f8..ef24e5717d3cf0e8b7110f3e8227d9db5a1f1479 100644 --- a/app/javascript/packs/utils/dataset_api.js +++ b/app/javascript/packs/utils/dataset_api.js @@ -2,8 +2,8 @@ export class DatasetAPI { static create_dataset(title, callback) { $.ajax({ type: "POST", - url: "/dataset/create", - data: {title: title}, + url: "/en/tool/newspapers-platform/dataset/create", + data: { title: title }, headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -18,8 +18,8 @@ export class DatasetAPI { static rename_dataset(id, title, callback) { $.ajax({ type: "POST", - url: "/dataset/rename", - data: {id: id, title: title}, + url: "/en/tool/newspapers-platform/dataset/rename", + data: { id: id, title: title }, headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -34,8 +34,8 @@ export class DatasetAPI { static import_dataset(id, title, callback) { $.ajax({ type: "POST", - url: "/dataset/import", - data: {original_dataset_id: id, title: title}, + url: "/en/tool/newspapers-platform/dataset/import", + data: { original_dataset_id: id, title: title }, headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -51,8 +51,8 @@ export class DatasetAPI { static delete_dataset(datasetId, callback) { $.ajax({ type: "POST", - url: "/dataset/delete", - data: {dataset_id: datasetId}, + url: "/en/tool/newspapers-platform/dataset/delete", + data: { dataset_id: datasetId }, headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -68,7 +68,7 @@ export class DatasetAPI { static update_datasets_list(callback) { $.ajax({ type: "GET", - url: "/datasets/update", + url: "/en/tool/newspapers-platform/datasets/update", headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -85,7 +85,7 @@ export class DatasetAPI { static setCurrentWorkingDataset(datasetId, callback) { $.ajax({ type: "POST", - url: "/datasets/working_dataset", + url: "/en/tool/newspapers-platform/datasets/working_dataset", headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -101,7 +101,7 @@ export class DatasetAPI { static addSelectedDocumentsToWorkingDataset(documentsIds, callback) { $.ajax({ type: "POST", - url: "/datasets/add_selected_documents", + url: "/en/tool/newspapers-platform/datasets/add_selected_documents", headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -117,7 +117,7 @@ export class DatasetAPI { static addSelectedCompoundToWorkingDataset(compoundId, callback) { $.ajax({ type: "POST", - url: "/datasets/add_compound", + url: "/en/tool/newspapers-platform/datasets/add_compound", headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -133,7 +133,7 @@ export class DatasetAPI { static removeSelectedDocumentsToWorkingDataset(documentsIds, callback) { $.ajax({ type: "POST", - url: "/datasets/remove_selected_documents", + url: "/en/tool/newspapers-platform/datasets/remove_selected_documents", headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -149,7 +149,7 @@ export class DatasetAPI { static addAllDocumentsToWorkingDataset(searchParams, callback) { $.ajax({ type: "POST", - url: "/datasets/add_all_documents", + url: "/en/tool/newspapers-platform/datasets/add_all_documents", headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -165,7 +165,7 @@ export class DatasetAPI { static exportDataset(datasetId, exportType, callback) { $.ajax({ type: "POST", - url: "/datasets/export_dataset", + url: "/en/tool/newspapers-platform/datasets/export_dataset", headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -182,7 +182,7 @@ export class DatasetAPI { static paginateDataset(datasetId, page, per_page, sort, sort_order, type, callback) { $.ajax({ type: "POST", - url: `/dataset/${datasetId}/paginate`, + url: `/en/tool/newspapers-platform/dataset/${datasetId}/paginate`, headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -199,7 +199,7 @@ export class DatasetAPI { static getDatasets(callback) { $.ajax({ type: "GET", - url: `/datasets/list`, + url: "/en/tool/newspapers-platform/datasets/list", headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -213,7 +213,7 @@ export class DatasetAPI { static toggleSharingStatus(dataset_id, callback) { $.ajax({ type: "POST", - url: `/dataset/toggle_sharing_status`, + url: "/en/tool/newspapers-platform/dataset/toggle_sharing_status", headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, diff --git a/app/javascript/packs/utils/search_api.js b/app/javascript/packs/utils/search_api.js index 52408f59d79eaf7d8f7d98764809436fe71581be..8c56006100597b68e4e95f6804a9cccdcc931c60 100644 --- a/app/javascript/packs/utils/search_api.js +++ b/app/javascript/packs/utils/search_api.js @@ -3,8 +3,8 @@ export class SearchAPI { static load_dataset_named_entities(dataset_id, callback) { $.ajax({ type: "POST", - url: "/dataset_named_entities", - data: {dataset_id: dataset_id}, + url: "/en/tool/newspapers-platform/dataset_named_entities", + data: { dataset_id: dataset_id }, headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -20,8 +20,8 @@ export class SearchAPI { static load_named_entities(docs_ids, callback) { $.ajax({ type: "POST", - url: "/named_entities", - data: {docs_ids: docs_ids}, + url: "/en/tool/newspapers-platform/named_entities", + data: { docs_ids: docs_ids }, headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -37,8 +37,8 @@ export class SearchAPI { static facetPagination(fieldName, nbPages, currentPage, callback) { $.ajax({ type: "POST", - url: "/catalog/facet_pagination", - data: {field_name: fieldName, nb_pages: nbPages, current_page: currentPage}, + url: "/en/tool/newspapers-platform/catalog/facet_pagination", + data: { field_name: fieldName, nb_pages: nbPages, current_page: currentPage }, headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -54,7 +54,7 @@ export class SearchAPI { static wideDatesHistogram(callback) { $.ajax({ type: "POST", - url: "/catalog/wide_dates_histogram", + url: "/en/tool/newspapers-platform/catalog/wide_dates_histogram", data: {}, headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') @@ -71,7 +71,7 @@ export class SearchAPI { static confirm_compond_creation(article_parts, callback) { $.ajax({ type: "POST", - url: `/catalog/confirm_compound_creation`, + url: `/en/tool/newspapers-platform/catalog/confirm_compound_creation`, headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -87,7 +87,7 @@ export class SearchAPI { static create_compound(title, all_text, issue_id, article_parts_ids, callback) { $.ajax({ type: "POST", - url: `/catalog/create_compound`, + url: `/en/tool/newspapers-platform/catalog/create_compound`, headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -106,7 +106,7 @@ export class SearchAPI { static delete_compound_article(compound_id, callback) { $.ajax({ type: "POST", - url: `/catalog/delete_compound`, + url: `/en/tool/newspapers-platform/catalog/delete_compound`, headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, @@ -122,7 +122,7 @@ export class SearchAPI { static random_sample(callback) { $.ajax({ type: "POST", - url: `/catalog/random_sample`, + url: `/en/tool/newspapers-platform/catalog/random_sample`, headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }, diff --git a/app/views/catalog/_date_facet.html.erb b/app/views/catalog/_date_facet.html.erb index f3569b9a812aa29c46669ab204954d8e76e236b7..c054514e934d9e042bced1a4142d88cef54c448c 100644 --- a/app/views/catalog/_date_facet.html.erb +++ b/app/views/catalog/_date_facet.html.erb @@ -15,7 +15,7 @@ <div class="accordion-body" data-controller="date-facets" data-date-facets-max-date-value="<%= datepicker_max_date %>" data-date-facets-min-date-value="<%= datepicker_min_date %>"> - <form action="/search" method="get"> + <form action="./search" method="get"> <div class="input-group mb-2"> <span class="input-group-text">From</span> <input class="form-control" type="date" id="date_facet_from" name="f[date_created_dtsi][from]" diff --git a/app/views/catalog/_search_form.html.erb b/app/views/catalog/_search_form.html.erb index 10d476926bbee2d383c18f126089fb2135687f47..61e5b7a18d36791c7a9d8596209500fb1398abfc 100644 --- a/app/views/catalog/_search_form.html.erb +++ b/app/views/catalog/_search_form.html.erb @@ -1,6 +1,6 @@ <div id="search_forms"> <div id="search_form" class="mb-2"> - <form action="/search" method="get" class="row"> + <form action="./search" method="get" class="row"> <div class="col-3 btn-group" role="group"> <input type="radio" class="btn-check" name="search_type" value="exact" id="exact_search" autocomplete="off" <%= "checked" if @search_type.nil? || @search_type == "exact" %>> <label class="btn btn-outline-primary" for="exact_search">Exact search</label> diff --git a/app/views/dataset/_document.html.erb b/app/views/dataset/_document.html.erb index 8ab1625b9e75dd035c4bb0e5dedf52a3dfed49f5..82f6334a82bdef00fcd9c3cc771a89d450def822 100644 --- a/app/views/dataset/_document.html.erb +++ b/app/views/dataset/_document.html.erb @@ -5,11 +5,11 @@ <h5> <% if doc.is_a?(Article) - url = "/catalog/#{doc.issue_id}?selected=#{doc.id}" + url = "/en/tool/newspapers-platform/catalog/#{doc.issue_id}?selected=#{doc.id}" elsif doc.is_a?(CompoundArticle) - url = "/catalog/#{doc.issue_id}?selected_compound=#{doc.id}" + url = "/en/tool/newspapers-platform/catalog/#{doc.issue_id}?selected_compound=#{doc.id}" else - url = "/catalog/#{doc.id}" + url = "/en/tool/newspapers-platform/catalog/#{doc.id}" end %> <a href="<%= url %>"> diff --git a/app/views/dataset/_public_datasets_modal.html.erb b/app/views/dataset/_public_datasets_modal.html.erb index e2dd8bed90b717bd7ae15c1ac9ab8ccd6ea5bcc5..a8e1a98ce8908306cb5dc2f36fe5bf4c12d5f0a1 100644 --- a/app/views/dataset/_public_datasets_modal.html.erb +++ b/app/views/dataset/_public_datasets_modal.html.erb @@ -28,7 +28,8 @@ </td> <td> <% user = User.find(d.user_id) %> - <% username = user.email[0...user.email.index('@')] %> + <%# <% username = user.email[0...user.email.index('@')] %> + <% username = user.id %> <%= username %> </td> <td> diff --git a/config/environments/development.rb b/config/environments/development.rb index 40355712a9d24a056ca3d3d54771848bbdd316e6..0f21118e206f3d535d98a67dd40037fa1f2026bb 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -3,7 +3,7 @@ require "active_support/core_ext/integer/time" Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. - config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } + config.action_mailer.default_url_options = { host: "localhost", port: 3000 } # In the development environment your application's code is reloaded any time # it changes. This slows down response time but is perfect for development @@ -18,13 +18,13 @@ Rails.application.configure do # Enable/disable caching. By default caching is disabled. # Run rails dev:cache to toggle caching. - if Rails.root.join('tmp', 'caching-dev.txt').exist? + if Rails.root.join("tmp", "caching-dev.txt").exist? config.action_controller.perform_caching = true config.action_controller.enable_fragment_cache_logging = true config.cache_store = :memory_store config.public_file_server.headers = { - 'Cache-Control' => "public, max-age=#{2.days.to_i}" + "Cache-Control" => "public, max-age=#{2.days.to_i}", } else config.action_controller.perform_caching = false @@ -75,4 +75,8 @@ Rails.application.configure do # Uncomment if you wish to allow Action Cable access from any origin. # config.action_cable.disable_request_forgery_protection = true + config.action_cable.url = "http://127.0.0.1:3000/cable" + config.action_cable.disable_request_forgery_protection = true + config.action_controller.forgery_protection_origin_check = false + config.action_controller.default_protect_from_forgery = false end diff --git a/config/locales/newspapers.en.yml b/config/locales/newspapers.en.yml index 97c4a43d0d957f613b6581ea86909654c01419c5..2c2c6557c62423893d64762e96e8c09416063a24 100644 --- a/config/locales/newspapers.en.yml +++ b/config/locales/newspapers.en.yml @@ -18,7 +18,7 @@ en: 1: 'Monday' 2: 'Tuesday' 3: 'Wednesday' - 4: 'Thirsday' + 4: 'Thursday' 5: 'Friday' 6: 'Saturday' titles: