diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index de1c9ad..43263c5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - ruby-version: ["3.0", "3.1"] + ruby-version: ["3.2", "3.3"] services: db: @@ -68,7 +68,7 @@ jobs: - name: Set up Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: "3.0" + ruby-version: "3.2" bundler-cache: true # runs 'bundle install' and caches installed gems automatically - name: Run rubocop run: bundle exec rubocop @@ -96,7 +96,7 @@ jobs: - name: Set up Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: "3.0" + ruby-version: "3.2" bundler-cache: true # runs 'bundle install' and caches installed gems automatically - name: Prepare env: diff --git a/Gemfile b/Gemfile index 18d2c39..d63c7cc 100644 --- a/Gemfile +++ b/Gemfile @@ -6,7 +6,7 @@ gem 'actionpack' gem 'activerecord' gem 'railties' -gem 'pg', '< 1.3.0' # newer requires posgresql >= 9.3 +gem 'pg' gem 'active_model_serializers' gem 'jwt' @@ -28,9 +28,6 @@ gem 'bootsnap', require: false # which is currently not available in production. gem 'rdoc', '< 6.4.0' -# Ruby 3.0 uses this version of the base64 default gem -gem 'base64', '0.1.0' - group :development, :test do # Use sqlite3 as the database for Active Record gem 'sqlite3' @@ -48,10 +45,6 @@ group :development do gem 'rubocop-rails' # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' - - # Loading the listen gem enables an evented file system monitor. Check - # https://github.com/guard/listen#listen-adapters if on Windows or *BSD. - # gem 'listen', '~> 3.0.4' end group :test do diff --git a/Gemfile.lock b/Gemfile.lock index 8e7ea43..b33d5f0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,18 +1,18 @@ GEM remote: https://rubygems.org/ specs: - actionpack (7.1.5) - actionview (= 7.1.5) - activesupport (= 7.1.5) + actionpack (8.0.0) + actionview (= 8.0.0) + activesupport (= 8.0.0) nokogiri (>= 1.8.5) - racc rack (>= 2.2.4) rack-session (>= 1.0.1) rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actionview (7.1.5) - activesupport (= 7.1.5) + useragent (~> 0.16) + actionview (8.0.0) + activesupport (= 8.0.0) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) @@ -22,25 +22,25 @@ GEM activemodel (>= 4.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activemodel (7.1.5) - activesupport (= 7.1.5) - activerecord (7.1.5) - activemodel (= 7.1.5) - activesupport (= 7.1.5) + activemodel (8.0.0) + activesupport (= 8.0.0) + activerecord (8.0.0) + activemodel (= 8.0.0) + activesupport (= 8.0.0) timeout (>= 0.4.0) - activesupport (7.1.5) + activesupport (8.0.0) base64 benchmark (>= 0.3) bigdecimal - concurrent-ruby (~> 1.0, >= 1.0.2) + concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) logger (>= 1.4.2) minitest (>= 5.1) - mutex_m securerandom (>= 0.3) - tzinfo (~> 2.0) + tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) airbrussh (1.5.3) sshkit (>= 1.6.1, != 1.7.0) ast (2.4.2) @@ -105,7 +105,6 @@ GEM ruby2_keywords (>= 0.0.5) msgpack (1.7.5) multi_json (1.15.0) - mutex_m (0.2.0) net-scp (4.0.0) net-ssh (>= 2.6.5, < 8.0.0) net-sftp (4.0.0) @@ -122,7 +121,7 @@ GEM parser (3.3.6.0) ast (~> 2.4.1) racc - pg (1.2.3) + pg (1.5.9) puma (6.4.3) nio4r (~> 2.0) racc (1.8.1) @@ -147,13 +146,13 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - rails-i18n (7.0.10) + rails-i18n (8.0.1) i18n (>= 0.7, < 2) - railties (>= 6.0.0, < 8) - railties (7.1.5) - actionpack (= 7.1.5) - activesupport (= 7.1.5) - irb + railties (>= 8.0.0, < 9) + railties (8.0.0) + actionpack (= 8.0.0) + activesupport (= 8.0.0) + irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) @@ -198,8 +197,9 @@ GEM simplecov-lcov (0.8.0) simplecov_json_formatter (0.1.4) spring (4.2.1) - sqlite3 (2.0.4) + sqlite3 (2.2.0) mini_portile2 (~> 2.8.0) + sqlite3 (2.2.0-x86_64-linux-gnu) sshkit (1.23.2) base64 net-scp (>= 1.1.2) @@ -214,7 +214,9 @@ GEM tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicode-display_width (2.6.0) - zeitwerk (2.6.18) + uri (1.0.2) + useragent (0.16.10) + zeitwerk (2.7.1) PLATFORMS ruby @@ -224,7 +226,6 @@ DEPENDENCIES actionpack active_model_serializers activerecord - base64 (= 0.1.0) bootsnap byebug capistrano-passenger @@ -232,7 +233,7 @@ DEPENDENCIES jwt kaminari mocha - pg (< 1.3.0) + pg puma rack-cors rails-erd diff --git a/app/models/access_code.rb b/app/models/access_code.rb index a3b7845..22d7414 100644 --- a/app/models/access_code.rb +++ b/app/models/access_code.rb @@ -13,14 +13,16 @@ class AccessCode < ApplicationRecord - include UserStampable CODE_LENGTH = 6 attr_readonly :code + belongs_to :creator, optional: true, class_name: 'User' + validates :expires_at, presence: true before_validation :generate_code, on: :create + before_save :set_user_stamps scope :list, -> { order(expires_at: :desc) } scope :expired, -> { where(expires_at: ...Time.zone.today) } @@ -32,4 +34,10 @@ def generate_code generate_code if AccessCode.exists?(code: code) end + def set_user_stamps + return unless User.current + + self.creator = User.current if new_record? + end + end diff --git a/app/models/archive_format.rb b/app/models/archive_format.rb index 9db3ed2..e0a6f6a 100644 --- a/app/models/archive_format.rb +++ b/app/models/archive_format.rb @@ -27,8 +27,8 @@ class ArchiveFormat < ApplicationRecord attr_readonly :codec - enum download_permission: { public: 0, logged_in: 1, priviledged: 2, admin: 3 }, - _prefix: true + enum :download_permission, { public: 0, logged_in: 1, priviledged: 2, admin: 3 }, + prefix: true belongs_to :profile diff --git a/app/models/broadcast.rb b/app/models/broadcast.rb index 3355525..27530ea 100644 --- a/app/models/broadcast.rb +++ b/app/models/broadcast.rb @@ -18,10 +18,10 @@ class Broadcast < ApplicationRecord - include UserStampable include NonOverlappable belongs_to :show + belongs_to :updater, optional: true, class_name: 'User' has_many :audio_files, dependent: :restrict_with_error has_many :tracks, dependent: :nullify @@ -30,6 +30,7 @@ class Broadcast < ApplicationRecord validates :started_at, :finished_at, uniqueness: true before_validation :set_show_label_if_empty + before_save :set_user_stamps after_create :assign_tracks scope :list, -> { order('broadcasts.started_at') } @@ -63,4 +64,10 @@ def assign_tracks .update_all(broadcast_id: id) end + def set_user_stamps + return unless User.current + + self.updater = User.current + end + end diff --git a/app/models/concerns/user_stampable.rb b/app/models/concerns/user_stampable.rb index cd0e429..3e43a35 100644 --- a/app/models/concerns/user_stampable.rb +++ b/app/models/concerns/user_stampable.rb @@ -5,8 +5,8 @@ module UserStampable extend ActiveSupport::Concern included do - belongs_to :creator, optional: true, class_name: 'User' if column_names.include?('creator_id') - belongs_to :updater, optional: true, class_name: 'User' if column_names.include?('updater_id') + belongs_to :creator, optional: true, class_name: 'User' + belongs_to :updater, optional: true, class_name: 'User' before_save :set_user_stamps end @@ -16,8 +16,8 @@ module UserStampable def set_user_stamps return unless User.current - self.creator = User.current if new_record? && respond_to?(:creator=) - self.updater = User.current if respond_to?(:updater=) + self.creator = User.current if new_record? + self.updater = User.current end end diff --git a/bin/dev b/bin/dev new file mode 100755 index 0000000..3925783 --- /dev/null +++ b/bin/dev @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +exec './bin/rails', 'server', *ARGV diff --git a/bin/rubocop b/bin/rubocop new file mode 100755 index 0000000..f45b065 --- /dev/null +++ b/bin/rubocop @@ -0,0 +1,10 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require 'rubygems' +require 'bundler/setup' + +# explicit rubocop config increases performance slightly while avoiding config confusion. +ARGV.unshift('--config', File.expand_path('../.rubocop.yml', __dir__)) + +load Gem.bin_path('rubocop', 'rubocop') diff --git a/config/application.rb b/config/application.rb index 9edd55b..82830fb 100644 --- a/config/application.rb +++ b/config/application.rb @@ -18,11 +18,16 @@ class Application < Rails::Application attr_accessor :settings # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 7.1 + config.load_defaults 8.0 # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. + # + # Please, add to the `ignore` list any other `lib` subdirectories that do + # not contain `.rb` files, or that should not be reloaded or eager loaded. + # Common ones are `templates`, `generators`, or `middleware`, for example. + config.autoload_lib(ignore: %w[tasks capistrano]) # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake time:zones:all" for a time zone names list. Default is UTC. diff --git a/config/environments/development.rb b/config/environments/development.rb index b1136f4..4395e3d 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -48,4 +48,7 @@ # Highlight code that triggered database queries in logs. config.active_record.verbose_query_logs = true + + # Raise error when a before_action's only/except options reference missing actions. + config.action_controller.raise_on_missing_callback_actions = true end diff --git a/config/environments/production.rb b/config/environments/production.rb index e51c86a..19c6921 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -21,6 +21,9 @@ # Apache or NGINX already handles this. config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + # Cache assets for far-future expiry since they are all digest stamped. + config.public_file_server.headers = { 'cache-control' => "public, max-age=#{1.year.to_i}" } + # Enable serving of images, stylesheets, and JavaScripts from an asset server. # config.asset_host = 'http://assets.example.com' @@ -28,6 +31,9 @@ config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + # Assume all access to the app is happening through a SSL-terminating reverse proxy. + config.assume_ssl = true + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. config.force_ssl = ENV['RAAR_SSL'] == 'true' @@ -62,6 +68,9 @@ end end + # Prevent health checks from clogging up the logs. + config.silence_healthcheck_path = '/up' + # Use a different cache store in production. # config.cache_store = :mem_cache_store diff --git a/config/environments/test.rb b/config/environments/test.rb index b5bd854..24b9ce1 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -13,7 +13,7 @@ # Do not eager load code on boot. This avoids loading your whole application # just for the purpose of running a single test. If you are using a tool that # preloads Rails for running tests, you may have to set it to true. - config.eager_load = false + config.eager_load = ENV['CI'].present? # Configure public file server for tests with Cache-Control for performance. config.public_file_server.enabled = true @@ -51,4 +51,7 @@ # Raises error for missing translations # config.action_view.raise_on_missing_translations = true + + # Raise error when a before_action's only/except options reference missing actions. + config.action_controller.raise_on_missing_callback_actions = true end diff --git a/config/puma.rb b/config/puma.rb index 69e2645..d398337 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -1,40 +1,43 @@ # frozen_string_literal: true -# Puma can serve each request in a thread from an internal thread pool. -# The `threads` method setting takes two numbers: a minimum and maximum. -# Any libraries that use thread pools should be configured to match -# the maximum value specified for Puma. Default is set to 5 threads for minimum -# and maximum; this matches the default thread size of Active Record. +# This configuration file will be evaluated by Puma. The top-level methods that +# are invoked here are part of Puma's configuration DSL. For more information +# about methods provided by the DSL, see https://puma.io/puma/Puma/DSL.html. # -max_threads_count = ENV.fetch('RAILS_MAX_THREADS', 5) -min_threads_count = ENV.fetch('RAILS_MIN_THREADS') { max_threads_count } -threads min_threads_count, max_threads_count - -# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +# Puma starts a configurable number of processes (workers) and each process +# serves each request in a thread from an internal thread pool. # -port ENV.fetch('PORT', 3000) - -# Specifies the `environment` that Puma will run in. +# You can control the number of workers using ENV["WEB_CONCURRENCY"]. You +# should only set this value when you want to run 2 or more workers. The +# default is already 1. # -environment ENV.fetch('RAILS_ENV', 'development') - -# Specifies the `pidfile` that Puma will use. -pidfile ENV.fetch('PIDFILE', 'tmp/pids/server.pid') - -# Specifies the number of `workers` to boot in clustered mode. -# Workers are forked web server processes. If using threads and workers together -# the concurrency of the application would be max `threads` * `workers`. -# Workers do not work on JRuby or Windows (both of which do not support -# processes). +# The ideal number of threads per worker depends both on how much time the +# application spends waiting for IO operations and on how much you wish to +# prioritize throughput over latency. # -# workers ENV.fetch("WEB_CONCURRENCY") { 2 } - -# Use the `preload_app!` method when specifying a `workers` number. -# This directive tells Puma to first boot the application and load code -# before forking the application. This takes advantage of Copy On Write -# process behavior so workers use less memory. +# As a rule of thumb, increasing the number of threads will increase how much +# traffic a given process can handle (throughput), but due to CRuby's +# Global VM Lock (GVL) it has diminishing returns and will degrade the +# response time (latency) of the application. # -# preload_app! +# The default is set to 3 threads as it's deemed a decent compromise between +# throughput and latency for the average Rails application. +# +# Any libraries that use a connection pool or another resource pool should +# be configured to provide at least as many connections as the number of +# threads. This includes Active Record's `pool` parameter in `database.yml`. +threads_count = ENV.fetch('RAILS_MAX_THREADS', 3) +threads threads_count, threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +port ENV.fetch('PORT', 3000) -# Allow puma to be restarted by `rails restart` command. +# Allow puma to be restarted by `bin/rails restart` command. plugin :tmp_restart + +# Run the Solid Queue supervisor inside of Puma for single-server deployments +plugin :solid_queue if ENV['SOLID_QUEUE_IN_PUMA'] + +# Specify the PID file. Defaults to tmp/pids/server.pid in development. +# In other environments, only set the PID file if requested. +pidfile ENV['PIDFILE'] if ENV['PIDFILE'] diff --git a/doc/swagger.json b/doc/swagger.json index 967cc67..43081b3 100644 --- a/doc/swagger.json +++ b/doc/swagger.json @@ -124,19 +124,13 @@ }, "security": [ { - "http_token": [ - - ] + "http_token": [] }, { - "api_token": [ - - ] + "api_token": [] }, { - "access_code": [ - - ] + "access_code": [] } ] } @@ -227,19 +221,13 @@ }, "security": [ { - "http_token": [ - - ] + "http_token": [] }, { - "api_token": [ - - ] + "api_token": [] }, { - "access_code": [ - - ] + "access_code": [] } ] } @@ -288,19 +276,13 @@ }, "security": [ { - "http_token": [ - - ] + "http_token": [] }, { - "api_token": [ - - ] + "api_token": [] }, { - "access_code": [ - - ] + "access_code": [] } ] } @@ -391,19 +373,13 @@ }, "security": [ { - "http_token": [ - - ] + "http_token": [] }, { - "api_token": [ - - ] + "api_token": [] }, { - "access_code": [ - - ] + "access_code": [] } ] } @@ -459,19 +435,13 @@ }, "security": [ { - "http_token": [ - - ] + "http_token": [] }, { - "api_token": [ - - ] + "api_token": [] }, { - "access_code": [ - - ] + "access_code": [] } ] } @@ -505,19 +475,13 @@ }, "security": [ { - "http_token": [ - - ] + "http_token": [] }, { - "api_token": [ - - ] + "api_token": [] }, { - "access_code": [ - - ] + "access_code": [] } ] }, @@ -565,19 +529,13 @@ }, "security": [ { - "api_token": [ - - ] + "api_token": [] }, { - "http_token": [ - - ] + "http_token": [] }, { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -605,24 +563,16 @@ }, "security": [ { - "http_token": [ - - ] + "http_token": [] }, { - "api_token": [ - - ] + "api_token": [] }, { - "access_code": [ - - ] + "access_code": [] }, { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -715,19 +665,13 @@ }, "security": [ { - "http_token": [ - - ] + "http_token": [] }, { - "api_token": [ - - ] + "api_token": [] }, { - "access_code": [ - - ] + "access_code": [] } ] } @@ -762,19 +706,13 @@ }, "security": [ { - "http_token": [ - - ] + "http_token": [] }, { - "api_token": [ - - ] + "api_token": [] }, { - "access_code": [ - - ] + "access_code": [] } ] }, @@ -822,19 +760,13 @@ }, "security": [ { - "api_token": [ - - ] + "api_token": [] }, { - "http_token": [ - - ] + "http_token": [] }, { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -877,9 +809,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -920,9 +850,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -957,9 +885,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -1007,9 +933,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -1037,9 +961,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -1121,19 +1043,13 @@ }, "security": [ { - "http_token": [ - - ] + "http_token": [] }, { - "api_token": [ - - ] + "api_token": [] }, { - "access_code": [ - - ] + "access_code": [] } ] } @@ -1180,19 +1096,13 @@ }, "security": [ { - "http_token": [ - - ] + "http_token": [] }, { - "api_token": [ - - ] + "api_token": [] }, { - "access_code": [ - - ] + "access_code": [] } ] } @@ -1239,19 +1149,13 @@ }, "security": [ { - "http_token": [ - - ] + "http_token": [] }, { - "api_token": [ - - ] + "api_token": [] }, { - "access_code": [ - - ] + "access_code": [] } ] } @@ -1322,9 +1226,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -1366,9 +1268,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -1403,9 +1303,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -1454,9 +1352,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -1485,9 +1381,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -1534,9 +1428,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -1585,9 +1477,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -1629,9 +1519,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -1687,9 +1575,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -1725,9 +1611,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -1756,9 +1640,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -1812,9 +1694,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -1870,9 +1750,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -1921,9 +1799,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -1986,9 +1862,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -2031,9 +1905,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -2076,9 +1948,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -2120,9 +1990,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -2157,9 +2025,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -2208,9 +2074,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -2239,9 +2103,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -2284,9 +2146,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -2328,9 +2188,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -2365,9 +2223,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -2416,9 +2272,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -2447,9 +2301,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -2489,9 +2341,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -2533,9 +2383,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -2570,9 +2418,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -2621,9 +2467,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -2652,9 +2496,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -2695,9 +2537,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -2740,9 +2580,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -2784,9 +2622,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -2821,9 +2657,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -2872,9 +2706,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }, @@ -2903,9 +2735,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] } @@ -2947,9 +2777,7 @@ }, "security": [ { - "jwt_token": [ - - ] + "jwt_token": [] } ] }