From d130f68172162a2372952d25a3b6aa0d317d531d Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Mon, 13 Apr 2020 20:15:18 +0200 Subject: [PATCH] Upgrade from Rails 5.0 to 5.2 --- .ruby-version | 2 +- Gemfile | 8 +- Gemfile.lock | 359 +++++++++--------- .../users/omniauth_callbacks_controller.rb | 2 +- app/models/screenshot.rb | 22 +- app/views/welcome/home.slim | 4 +- bin/bundle | 2 +- bin/setup | 6 +- bin/update | 6 +- bin/yarn | 11 + config/application.rb | 9 +- config/boot.rb | 1 + config/cable.yml | 3 +- config/environments/development.rb | 11 +- config/environments/production.rb | 22 +- config/environments/test.rb | 16 +- .../application_controller_renderer.rb | 10 +- config/initializers/assets.rb | 9 +- .../initializers/content_security_policy.rb | 25 ++ config/initializers/devise.rb | 34 +- config/initializers/new_framework_defaults.rb | 4 +- .../new_framework_defaults_5_2.rb | 38 ++ config/locales/devise.en.yml | 3 +- config/locales/en.yml | 10 + config/puma.rb | 26 +- config/routes.rb | 2 + config/spring.rb | 4 +- config/storage.yml | 34 ++ db/schema.rb | 122 +++--- 29 files changed, 504 insertions(+), 301 deletions(-) create mode 100755 bin/yarn create mode 100644 config/initializers/content_security_policy.rb create mode 100644 config/initializers/new_framework_defaults_5_2.rb create mode 100644 config/storage.yml diff --git a/.ruby-version b/.ruby-version index 005119b..57cf282 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.4.1 +2.6.5 diff --git a/Gemfile b/Gemfile index 4b7caf5..12d3010 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,13 @@ source 'https://rubygems.org' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '~> 5.0.0', '>= 5.0.0.1' +gem 'rails', '~> 5.2' + +gem 'bootsnap' + +# To create variants (different sizes) of screenshot images saved in ActiveStorage +#gem 'image_processing' +gem 'mini_magick' # Use Puma as the app server gem 'puma', '~> 3.0' diff --git a/Gemfile.lock b/Gemfile.lock index 694b278..21d35c6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,69 +7,75 @@ GIT GEM remote: https://rubygems.org/ specs: - actioncable (5.0.7) - actionpack (= 5.0.7) - nio4r (>= 1.2, < 3.0) - websocket-driver (~> 0.6.1) - actionmailer (5.0.7) - actionpack (= 5.0.7) - actionview (= 5.0.7) - activejob (= 5.0.7) + actioncable (5.2.4.2) + actionpack (= 5.2.4.2) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailer (5.2.4.2) + actionpack (= 5.2.4.2) + actionview (= 5.2.4.2) + activejob (= 5.2.4.2) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.0.7) - actionview (= 5.0.7) - activesupport (= 5.0.7) - rack (~> 2.0) - rack-test (~> 0.6.3) + actionpack (5.2.4.2) + actionview (= 5.2.4.2) + activesupport (= 5.2.4.2) + rack (~> 2.0, >= 2.0.8) + rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.0.7) - activesupport (= 5.0.7) + actionview (5.2.4.2) + activesupport (= 5.2.4.2) builder (~> 3.1) - erubis (~> 2.7.0) + erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) - activejob (5.0.7) - activesupport (= 5.0.7) + activejob (5.2.4.2) + activesupport (= 5.2.4.2) globalid (>= 0.3.6) - activemodel (5.0.7) - activesupport (= 5.0.7) - activerecord (5.0.7) - activemodel (= 5.0.7) - activesupport (= 5.0.7) - arel (~> 7.0) - activesupport (5.0.7) + activemodel (5.2.4.2) + activesupport (= 5.2.4.2) + activerecord (5.2.4.2) + activemodel (= 5.2.4.2) + activesupport (= 5.2.4.2) + arel (>= 9.0) + activestorage (5.2.4.2) + actionpack (= 5.2.4.2) + activerecord (= 5.2.4.2) + marcel (~> 0.3.1) + activesupport (5.2.4.2) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) - addressable (2.5.2) - public_suffix (>= 2.0.2, < 4.0) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) ansi (1.5.0) - arel (7.1.4) + arel (9.0.0) babel-source (5.8.35) babel-transpiler (0.7.0) babel-source (>= 4.0, < 6) execjs (~> 2.0) - bcrypt (3.1.12) - better_errors (2.4.0) + bcrypt (3.1.13) + better_errors (2.6.0) coderay (>= 1.0.0) erubi (>= 1.0.0) rack (>= 0.9.0) - bindex (0.5.0) + bindex (0.8.1) binding_of_caller (0.8.0) debug_inspector (>= 0.0.1) - builder (3.2.3) - byebug (10.0.2) - callsite (0.0.11) - capybara (2.18.0) + bootsnap (1.4.6) + msgpack (~> 1.0) + builder (3.2.4) + byebug (11.1.1) + capybara (3.32.1) addressable mini_mime (>= 0.1.3) - nokogiri (>= 1.3.3) - rack (>= 1.0.0) - rack-test (>= 0.5.4) - xpath (>= 2.0, < 4.0) + nokogiri (~> 1.8) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (~> 1.5) + xpath (~> 3.2) choice (0.2.0) climate_control (0.2.0) coderay (1.1.2) @@ -80,35 +86,34 @@ GEM coffee-script-source execjs coffee-script-source (1.12.2) - concurrent-ruby (1.0.5) - cookies_eu (1.7.1) + concurrent-ruby (1.1.6) + cookies_eu (1.7.6) js_cookie_rails (~> 2.2.0) - crass (1.0.4) + crass (1.0.6) debug_inspector (0.0.3) - devise (4.4.3) + devise (4.7.1) bcrypt (~> 3.0) orm_adapter (~> 0.1) - railties (>= 4.1.0, < 6.0) + railties (>= 4.1.0) responders warden (~> 1.2.3) - erubi (1.7.1) - erubis (2.7.0) + erubi (1.9.0) execjs (2.7.0) fancybox-rails (0.3.1) railties (>= 3.1.0) - faraday (0.12.2) + faraday (1.0.1) multipart-post (>= 1.2, < 3) - ffi (1.9.23) - font-awesome-rails (4.7.0.4) - railties (>= 3.2, < 6.0) + ffi (1.12.2) + font-awesome-rails (4.7.0.5) + railties (>= 3.2, < 6.1) formatador (0.2.5) - foundation-rails (6.4.3.0) + foundation-rails (6.6.2.0) railties (>= 3.1.0) - sass (>= 3.3.0, < 3.5) + sass (>= 3.3.0) sprockets-es6 (>= 0.9.0) - globalid (0.4.1) + globalid (0.4.2) activesupport (>= 4.2.0) - guard (2.14.2) + guard (2.16.2) formatador (>= 0.2.4) listen (>= 2.7, < 4.0) lumberjack (>= 1.0.12, < 2.0) @@ -124,164 +129,165 @@ GEM guard-rails (0.8.1) guard (~> 2.11) guard-compat (~> 1.0) - hashie (3.5.7) - i18n (1.0.1) + hashie (4.1.0) + i18n (1.8.2) concurrent-ruby (~> 1.0) - jbuilder (2.7.0) - activesupport (>= 4.2.0) - multi_json (>= 1.2) - jquery-rails (4.3.3) + jbuilder (2.10.0) + activesupport (>= 5.0.0) + jquery-rails (4.3.5) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) js_cookie_rails (2.2.0) railties (>= 3.1) json (1.8.6) - jwt (1.5.6) + jwt (2.2.1) libv8 (3.16.14.19) listen (3.0.8) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - loofah (2.2.2) + loofah (2.5.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) - lumberjack (1.0.13) - mail (2.7.0) + lumberjack (1.2.4) + mail (2.7.1) mini_mime (>= 0.1.1) - meta_request (0.6.0) - callsite (~> 0.0, >= 0.0.11) + marcel (0.3.3) + mimemagic (~> 0.3.2) + meta_request (0.7.2) rack-contrib (>= 1.1, < 3) - railties (>= 3.0.0, < 6) - method_source (0.9.0) - mime-types (3.1) + railties (>= 3.0.0, < 7) + method_source (1.0.0) + mime-types (3.3.1) mime-types-data (~> 3.2015) - mime-types-data (3.2016.0521) - mimemagic (0.3.2) - mini_mime (1.0.0) - mini_portile2 (2.3.0) - minitest (5.11.3) - minitest-capybara (0.8.2) - capybara (~> 2.2) - minitest (~> 5.0) - rake - minitest-metadata (0.6.0) - minitest (>= 4.7, < 6.0) - minitest-rails (3.0.0) - minitest (~> 5.8) - railties (~> 5.0) - minitest-rails-capybara (3.0.1) - capybara (~> 2.7) - minitest-capybara (~> 0.8) - minitest-metadata (~> 0.6) - minitest-rails (~> 3.0) - minitest-reporters (1.2.0) + mime-types-data (3.2019.1009) + mimemagic (0.3.4) + mini_magick (4.10.1) + mini_mime (1.0.2) + mini_portile2 (2.4.0) + minitest (5.14.0) + minitest-rails (5.2.0) + minitest (~> 5.10) + railties (~> 5.2.0) + minitest-rails-capybara (0.0.2) + capybara + minitest-rails + minitest-reporters (1.4.2) ansi builder minitest (>= 5.0) ruby-progressbar - multi_json (1.13.1) + msgpack (1.3.3) + multi_json (1.14.1) multi_xml (0.6.0) - multipart-post (2.0.0) + multipart-post (2.1.1) nenv (0.3.0) - nio4r (2.3.1) - nokogiri (1.8.2) - mini_portile2 (~> 2.3.0) - notiffany (0.1.1) + nio4r (2.5.2) + nokogiri (1.10.9) + mini_portile2 (~> 2.4.0) + notiffany (0.1.3) nenv (~> 0.1) shellany (~> 0.0) - oauth2 (1.4.0) - faraday (>= 0.8, < 0.13) - jwt (~> 1.0) + oauth2 (1.4.4) + faraday (>= 0.8, < 2.0) + jwt (>= 1.0, < 3.0) multi_json (~> 1.3) multi_xml (~> 0.5) rack (>= 1.2, < 3) - omniauth (1.8.1) - hashie (>= 3.4.6, < 3.6.0) + omniauth (1.9.1) + hashie (>= 3.4.6) rack (>= 1.6.2, < 3) omniauth-amazon (1.0.1) omniauth (~> 1.0) omniauth-oauth2 (~> 1.1) - omniauth-github (1.3.0) + omniauth-github (1.4.0) omniauth (~> 1.5) omniauth-oauth2 (>= 1.4.0, < 2.0) - omniauth-google-oauth2 (0.5.3) - jwt (>= 1.5) + omniauth-google-oauth2 (0.8.0) + jwt (>= 2.0) omniauth (>= 1.1.1) - omniauth-oauth2 (>= 1.5) - omniauth-oauth2 (1.5.0) + omniauth-oauth2 (>= 1.6) + omniauth-oauth2 (1.6.0) oauth2 (~> 1.1) - omniauth (~> 1.2) + omniauth (~> 1.9) omniauth-openid (1.0.1) omniauth (~> 1.0) rack-openid (~> 1.3.1) orm_adapter (0.5.0) - paperclip (6.0.0) + paperclip (6.1.0) activemodel (>= 4.2.0) activesupport (>= 4.2.0) mime-types mimemagic (~> 0.3.0) terrapin (~> 0.6.0) - pg (1.0.0) - pg_search (2.1.2) - activerecord (>= 4.2) - activesupport (>= 4.2) - arel (>= 6) - pry (0.11.3) - coderay (~> 1.1.0) - method_source (~> 0.9.0) - public_suffix (3.0.2) - puma (3.11.4) - rack (2.0.5) - rack-contrib (2.0.1) + pg (1.2.3) + pg_search (2.3.2) + activerecord (>= 5.2) + activesupport (>= 5.2) + pry (0.13.1) + coderay (~> 1.1) + method_source (~> 1.0) + public_suffix (4.0.4) + puma (3.12.4) + rack (2.2.2) + rack-contrib (2.2.0) rack (~> 2.0) rack-openid (1.3.1) rack (>= 1.1.0) ruby-openid (>= 2.1.8) - rack-test (0.6.3) - rack (>= 1.0) - rails (5.0.7) - actioncable (= 5.0.7) - actionmailer (= 5.0.7) - actionpack (= 5.0.7) - actionview (= 5.0.7) - activejob (= 5.0.7) - activemodel (= 5.0.7) - activerecord (= 5.0.7) - activesupport (= 5.0.7) + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (5.2.4.2) + actioncable (= 5.2.4.2) + actionmailer (= 5.2.4.2) + actionpack (= 5.2.4.2) + actionview (= 5.2.4.2) + activejob (= 5.2.4.2) + activemodel (= 5.2.4.2) + activerecord (= 5.2.4.2) + activestorage (= 5.2.4.2) + activesupport (= 5.2.4.2) bundler (>= 1.3.0) - railties (= 5.0.7) + railties (= 5.2.4.2) sprockets-rails (>= 2.0.0) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) - rails-erd (1.5.2) - activerecord (>= 3.2) - activesupport (>= 3.2) + rails-erd (1.6.0) + activerecord (>= 4.2) + activesupport (>= 4.2) choice (~> 0.2.0) ruby-graphviz (~> 1.2) - rails-html-sanitizer (1.0.4) - loofah (~> 2.2, >= 2.2.2) - railties (5.0.7) - actionpack (= 5.0.7) - activesupport (= 5.0.7) + rails-html-sanitizer (1.3.0) + loofah (~> 2.3) + railties (5.2.4.2) + actionpack (= 5.2.4.2) + activesupport (= 5.2.4.2) method_source rake (>= 0.8.7) - thor (>= 0.18.1, < 2.0) - rake (12.3.1) + thor (>= 0.19.0, < 2.0) + rake (13.0.1) rb-fsevent (0.10.3) - rb-inotify (0.9.10) - ffi (>= 0.5.0, < 2) + rb-inotify (0.10.1) + ffi (~> 1.0) rdoc (4.3.0) ref (2.0.0) - responders (2.4.0) - actionpack (>= 4.2.0, < 5.3) - railties (>= 4.2.0, < 5.3) - ruby-graphviz (1.2.3) - ruby-openid (2.7.0) - ruby-progressbar (1.9.0) - sass (3.4.25) - sass-rails (5.0.7) - railties (>= 4.0.0, < 6) + regexp_parser (1.7.0) + responders (3.0.0) + actionpack (>= 5.0) + railties (>= 5.0) + rexml (3.2.4) + ruby-graphviz (1.2.5) + rexml + ruby-openid (2.9.2) + ruby-progressbar (1.10.1) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sass-rails (5.1.0) + railties (>= 5.2.0) sass (~> 3.1) sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) @@ -290,19 +296,18 @@ GEM json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) shellany (0.0.1) - slim (3.0.9) + slim (4.0.1) temple (>= 0.7.6, < 0.9) - tilt (>= 1.3.3, < 2.1) - slim-rails (3.1.3) + tilt (>= 2.0.6, < 2.1) + slim-rails (3.2.0) actionpack (>= 3.1) railties (>= 3.1) - slim (~> 3.0) - spring (2.0.2) - activesupport (>= 4.2) + slim (>= 3.0, < 5.0) + spring (2.1.0) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) - sprockets (3.7.1) + sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) sprockets-es6 (0.9.2) @@ -313,36 +318,36 @@ GEM actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) - temple (0.8.0) + temple (0.8.2) terrapin (0.6.0) climate_control (>= 0.0.3, < 1.0) therubyracer (0.12.3) libv8 (~> 3.16.14.15) ref - thor (0.20.0) + thor (1.0.1) thread_safe (0.3.6) - tilt (2.0.8) - turbolinks (5.1.1) - turbolinks-source (~> 5.1) - turbolinks-source (5.1.0) - tzinfo (1.2.5) + tilt (2.0.10) + turbolinks (5.2.1) + turbolinks-source (~> 5.2) + turbolinks-source (5.2.0) + tzinfo (1.2.7) thread_safe (~> 0.1) - uglifier (4.1.10) + uglifier (4.2.0) execjs (>= 0.3.0, < 3) - warden (1.2.7) - rack (>= 1.0) - web-console (3.6.2) + warden (1.2.8) + rack (>= 2.0.6) + web-console (3.7.0) actionview (>= 5.0) activemodel (>= 5.0) bindex (>= 0.4.0) railties (>= 5.0) - websocket-driver (0.6.5) + websocket-driver (0.7.1) websocket-extensions (>= 0.1.0) - websocket-extensions (0.1.3) - will_paginate (3.1.6) + websocket-extensions (0.1.4) + will_paginate (3.3.0) will_paginate-foundation (6.2.1) will_paginate (>= 3.0.3) - xpath (3.1.0) + xpath (3.2.0) nokogiri (~> 1.8) PLATFORMS @@ -351,6 +356,7 @@ PLATFORMS DEPENDENCIES better_errors binding_of_caller + bootsnap byebug bzip2-ruby! coffee-rails (~> 4.2) @@ -365,6 +371,7 @@ DEPENDENCIES jquery-rails listen (~> 3.0.5) meta_request + mini_magick minitest-rails minitest-rails-capybara minitest-reporters @@ -377,7 +384,7 @@ DEPENDENCIES pg pg_search puma (~> 3.0) - rails (~> 5.0.0, >= 5.0.0.1) + rails (~> 5.2) rails-erd sass-rails (~> 5.0) sdoc (~> 0.4.0) @@ -393,4 +400,4 @@ DEPENDENCIES will_paginate-foundation BUNDLED WITH - 1.16.2 + 1.17.2 diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb index e36f6fd..70e4b04 100644 --- a/app/controllers/users/omniauth_callbacks_controller.rb +++ b/app/controllers/users/omniauth_callbacks_controller.rb @@ -1,7 +1,7 @@ class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController # Workaround for https://github.com/plataformatec/devise/issues/2432 - skip_before_filter :verify_authenticity_token + # skip_before_filter :verify_authenticity_token def launchpad login_via 'Launchpad' diff --git a/app/models/screenshot.rb b/app/models/screenshot.rb index 7d64166..5fc4da4 100644 --- a/app/models/screenshot.rb +++ b/app/models/screenshot.rb @@ -3,13 +3,15 @@ class Screenshot < ApplicationRecord belongs_to :user, inverse_of: :screenshots # Use paperclip gem to handle image files related to screenshots - has_attached_file :image, - styles: { :large => '800x600>', :thumb => '160x120>' }, - default_url: '/images/dummy/no-screenshots-available.svg', - path: ':rails_root/public/screenshots/:id_partition/:style.png', - url: '/screenshots/:id_partition/:style.png' - validates_attachment_content_type :image, :content_type => 'image/png' - validates_with AttachmentSizeValidator, :attributes => :image, :less_than => 5.megabytes + has_one_attached :image + + # has_attached_file :image, + # styles: { :large => '800x600>', :thumb => '160x120>' }, + # default_url: '/images/dummy/no-screenshots-available.svg', + # path: ':rails_root/public/screenshots/:id_partition/:style.png', + # url: '/screenshots/:id_partition/:style.png' + #validates_attachment_content_type :image, :content_type => 'image/png' + #validates_with AttachmentSizeValidator, :attributes => :image, :less_than => 5.megabytes # validate :validate_image_is_unique validates :delete_reason, length: { in: 5..100 }, allow_nil: true @@ -59,9 +61,9 @@ class Screenshot < ApplicationRecord end # Return Debshots 1.x path to allow migration of images into Paperclip filesystem schema - def image_url(size) - "live/screenshots/approved/#{self.package.name[0]}/#{self.package.name}/#{self.id}_#{size}.png" - end + # def image_url(size) + # "live/screenshots/approved/#{self.package.name[0]}/#{self.package.name}/#{self.id}_#{size}.png" + # end # Long status text for public users def status diff --git a/app/views/welcome/home.slim b/app/views/welcome/home.slim index 33df0ee..4433b14 100644 --- a/app/views/welcome/home.slim +++ b/app/views/welcome/home.slim @@ -30,7 +30,7 @@ h2 Newest upload .thumb-height a href=package_path(@newest_upload.package.name) - = image_tag(@newest_upload.image.url(:thumb, timestamp: false), alt: @newest_upload.caption) + = image_tag(@newest_upload.image.variant(resize: "160x120"), alt: @newest_upload.caption) p strong =@newest_upload.package.name @@ -40,7 +40,7 @@ h2 Most popular .thumb-height a href=package_path(@most_popular_package.name) - img src=@most_popular_package.screenshots.first.image.url(:thumb, timestamp: false) + = image_tag(@most_popular_package.screenshots.first.image.variant(resize: "160x120")) p strong =@most_popular_package.name diff --git a/bin/bundle b/bin/bundle index 66e9889..f19acf5 100755 --- a/bin/bundle +++ b/bin/bundle @@ -1,3 +1,3 @@ #!/usr/bin/env ruby -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) load Gem.bin_path('bundler', 'bundle') diff --git a/bin/setup b/bin/setup index e620b4d..94fd4d7 100755 --- a/bin/setup +++ b/bin/setup @@ -1,10 +1,9 @@ #!/usr/bin/env ruby -require 'pathname' require 'fileutils' include FileUtils # path to your application root. -APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) +APP_ROOT = File.expand_path('..', __dir__) def system!(*args) system(*args) || abort("\n== Command #{args} failed ==") @@ -18,6 +17,9 @@ chdir APP_ROOT do system! 'gem install bundler --conservative' system('bundle check') || system!('bundle install') + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + # puts "\n== Copying sample files ==" # unless File.exist?('config/database.yml') # cp 'config/database.yml.sample', 'config/database.yml' diff --git a/bin/update b/bin/update index a8e4462..58bfaed 100755 --- a/bin/update +++ b/bin/update @@ -1,10 +1,9 @@ #!/usr/bin/env ruby -require 'pathname' require 'fileutils' include FileUtils # path to your application root. -APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) +APP_ROOT = File.expand_path('..', __dir__) def system!(*args) system(*args) || abort("\n== Command #{args} failed ==") @@ -18,6 +17,9 @@ chdir APP_ROOT do system! 'gem install bundler --conservative' system('bundle check') || system!('bundle install') + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + puts "\n== Updating database ==" system! 'bin/rails db:migrate' diff --git a/bin/yarn b/bin/yarn new file mode 100755 index 0000000..460dd56 --- /dev/null +++ b/bin/yarn @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +APP_ROOT = File.expand_path('..', __dir__) +Dir.chdir(APP_ROOT) do + begin + exec "yarnpkg", *ARGV + rescue Errno::ENOENT + $stderr.puts "Yarn executable was not detected in the system." + $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" + exit 1 + end +end diff --git a/config/application.rb b/config/application.rb index 4f76acb..8a708fd 100644 --- a/config/application.rb +++ b/config/application.rb @@ -8,9 +8,12 @@ Bundler.require(*Rails.groups) module Debshots class Application < Rails::Application + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 5.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. - config.autoload_paths << Rails.root.join('lib') + # Application configuration can go into files in config/initializers + # -- all .rb files in that directory are automatically loaded after loading + # the framework and any gems in your application. end end diff --git a/config/boot.rb b/config/boot.rb index 30f5120..b9e460c 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -1,3 +1,4 @@ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) require 'bundler/setup' # Set up gems listed in the Gemfile. +require 'bootsnap/setup' # Speed up boot time by caching expensive operations. diff --git a/config/cable.yml b/config/cable.yml index 0bbde6f..d89aa0b 100644 --- a/config/cable.yml +++ b/config/cable.yml @@ -6,4 +6,5 @@ test: production: adapter: redis - url: redis://localhost:6379/1 + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: debshots_production diff --git a/config/environments/development.rb b/config/environments/development.rb index 6b4507b..2a4ea12 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -13,12 +13,13 @@ Rails.application.configure do config.consider_all_requests_local = true # Enable/disable caching. By default caching is disabled. - if Rails.root.join('tmp/caching-dev.txt').exist? + # Run rails dev:cache to toggle caching. + if Rails.root.join('tmp', 'caching-dev.txt').exist? config.action_controller.perform_caching = true config.cache_store = :memory_store config.public_file_server.headers = { - 'Cache-Control' => 'public, max-age=172800' + 'Cache-Control' => "public, max-age=#{2.days.to_i}" } else config.action_controller.perform_caching = false @@ -26,6 +27,9 @@ Rails.application.configure do config.cache_store = :null_store end + # Store uploaded files on the local file system (see config/storage.yml for options) + config.active_storage.service = :local + # Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = false @@ -37,6 +41,9 @@ Rails.application.configure do # Raise an error on page load if there are pending migrations. config.active_record.migration_error = :page_load + # Highlight code that triggered database queries in logs. + config.active_record.verbose_query_logs = true + # Debug mode disables concatenation and preprocessing of assets. # This option may cause significant delays in view rendering with a large # number of complex assets. diff --git a/config/environments/production.rb b/config/environments/production.rb index 5960d25..a34fdd1 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -14,14 +14,17 @@ Rails.application.configure do config.consider_all_requests_local = false config.action_controller.perform_caching = true + # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] + # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). + # config.require_master_key = true + # Disable serving static files from the `/public` folder by default since # Apache or NGINX already handles this. - # config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? - config.public_file_server.enabled = false + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? # Compress JavaScripts and CSS. config.assets.js_compressor = :uglifier - config.assets.css_compressor = :sass + # config.assets.css_compressor = :sass # Do not fallback to assets pipeline if a precompiled asset is missed. # config.assets.compile = false @@ -35,7 +38,10 @@ Rails.application.configure do # Specifies the header that your server uses for sending files. # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache - config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Store uploaded files on the local file system (see config/storage.yml for options) + config.active_storage.service = :local # Mount Action Cable outside main process or domain # config.action_cable.mount_path = nil @@ -43,12 +49,11 @@ Rails.application.configure do # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - #config.force_ssl = true + # config.force_ssl = true # Use the lowest log level to ensure availability of diagnostic information # when problems arise. - # config.log_level = :debug - config.log_level = :warn + config.log_level = :debug # Prepend all log lines with the following tags. config.log_tags = [ :request_id ] @@ -59,6 +64,7 @@ Rails.application.configure do # Use a real queuing backend for Active Job (and separate queues per environment) # config.active_job.queue_adapter = :resque # config.active_job.queue_name_prefix = "debshots_#{Rails.env}" + config.action_mailer.perform_caching = false # Ignore bad email addresses and do not raise email delivery errors. @@ -82,7 +88,7 @@ Rails.application.configure do if ENV["RAILS_LOG_TO_STDOUT"].present? logger = ActiveSupport::Logger.new(STDOUT) logger.formatter = config.log_formatter - config.logger = ActiveSupport::TaggedLogging.new(logger) + config.logger = ActiveSupport::TaggedLogging.new(logger) end # Do not dump schema after migrations. diff --git a/config/environments/test.rb b/config/environments/test.rb index 58f91c2..8e01a71 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -12,12 +12,11 @@ Rails.application.configure do # preloads Rails for running tests, you may have to set it to true. config.eager_load = false - # Test :sorted or :random. ":random" may be safer but harder to debug. - config.active_support.test_order = :sorted - - # Configure static asset server for tests with Cache-Control for performance. + # Configure public file server for tests with Cache-Control for performance. config.public_file_server.enabled = true - config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' } + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.hour.to_i}" + } # Show full error reports and disable caching. config.consider_all_requests_local = true @@ -28,6 +27,10 @@ Rails.application.configure do # Disable request forgery protection in test environment. config.action_controller.allow_forgery_protection = false + + # Store uploaded files on the local file system in a temporary directory + config.active_storage.service = :test + config.action_mailer.perform_caching = false # Tell Action Mailer not to deliver emails to the real world. @@ -55,5 +58,6 @@ Rails.application.configure do config.image_sizes = { large: '800x600', small: '160x120', - } + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true end diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb index 51639b6..89d2efa 100644 --- a/config/initializers/application_controller_renderer.rb +++ b/config/initializers/application_controller_renderer.rb @@ -1,6 +1,8 @@ # Be sure to restart your server when you modify this file. -# ApplicationController.renderer.defaults.merge!( -# http_host: 'example.org', -# https: false -# ) +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb index 01ef3e6..4b828e8 100644 --- a/config/initializers/assets.rb +++ b/config/initializers/assets.rb @@ -3,9 +3,12 @@ # Version of your assets, change this if you want to expire all your assets. Rails.application.config.assets.version = '1.0' -# Add additional assets to the asset load path +# Add additional assets to the asset load path. # Rails.application.config.assets.paths << Emoji.images_path +# Add Yarn node_modules folder to the asset load path. +Rails.application.config.assets.paths << Rails.root.join('node_modules') # Precompile additional assets. -# application.js, application.css, and all non-JS/CSS in app/assets folder are already added. -# Rails.application.config.assets.precompile += %w( search.js ) +# application.js, application.css, and all non-JS/CSS in the app/assets +# folder are already added. +# Rails.application.config.assets.precompile += %w( admin.js admin.css ) diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb new file mode 100644 index 0000000..d3bcaa5 --- /dev/null +++ b/config/initializers/content_security_policy.rb @@ -0,0 +1,25 @@ +# Be sure to restart your server when you modify this file. + +# Define an application-wide content security policy +# For further information see the following documentation +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy + +# Rails.application.config.content_security_policy do |policy| +# policy.default_src :self, :https +# policy.font_src :self, :https, :data +# policy.img_src :self, :https, :data +# policy.object_src :none +# policy.script_src :self, :https +# policy.style_src :self, :https + +# # Specify URI for violation reports +# # policy.report_uri "/csp-violation-report-endpoint" +# end + +# If you are using UJS then enable automatic nonce generation +# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) } + +# Report CSP violations to a specified URI +# For further information see the following documentation: +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only +# Rails.application.config.content_security_policy_report_only = true diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 1170645..c7484a4 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + # Use this hook to configure devise mailer, warden hooks and so forth. # Many of these configuration options can be set straight in your model. Devise.setup do |config| @@ -8,6 +10,10 @@ Devise.setup do |config| # by default. You can change it below and use your own secret key. # config.secret_key = '7124681eb3be46bd68df035f39e47f46c8456276a0ee51989eb3a29a2f3e90b227b079ce54e166eee1599ac3ebf6b72ab073f4dcb74685336241b698f0ca7800' + # ==> Controller configuration + # Configure the parent class to the devise controllers. + # config.parent_controller = 'DeviseController' + # ==> Mailer Configuration # Configure the e-mail address which will be shown in Devise::Mailer, # note that it will be overwritten if you use your own mailer class @@ -111,15 +117,21 @@ Devise.setup do |config| # Set up a pepper to generate the hashed password. # config.pepper = '28cbda9dffa4952d8234ceb9a2e98e804c349d010c9ca90139d6401eaccb5a76f7fa77fa5162483ae67db6d6fbb3535e2ec62d850b35742e8dd1c3ea5a4a460c' - # Send a notification email when the user's password is changed + # Send a notification to the original email when the user's email is changed. + # config.send_email_changed_notification = false + + # Send a notification email when the user's password is changed. # config.send_password_change_notification = false # ==> Configuration for :confirmable # A period that the user is allowed to access the website even without # confirming their account. For instance, if set to 2.days, the user will be # able to access the website for two days without confirming their account, - # access will be blocked just in the third day. Default is 0.days, meaning - # the user cannot access the website without confirming their account. + # access will be blocked just in the third day. + # You can also set it to nil, which will allow the user to access the website + # without confirming their account. + # Default is 0.days, meaning the user cannot access the website without + # confirming their account. # config.allow_unconfirmed_access_for = 2.days # A period that the user is allowed to confirm their account before their @@ -243,9 +255,7 @@ Devise.setup do |config| # config.navigational_formats = ['*/*', :html] # The default HTTP method used to sign out a resource. Default is :delete. - # config.sign_out_via = :delete - # Workaround: logging out would not work without Javascript otherwise - config.sign_out_via = :get + config.sign_out_via = :delete # ==> OmniAuth # Add a new OmniAuth provider. Check the wiki for more information on setting @@ -292,4 +302,16 @@ Devise.setup do |config| client_options: { ssl: { ca_path: '/etc/ssl/certs' } } + # ==> Turbolinks configuration + # If your app is using Turbolinks, Turbolinks::Controller needs to be included to make redirection work correctly: + # + # ActiveSupport.on_load(:devise_failure_app) do + # include Turbolinks::Controller + # end + + # ==> Configuration for :registerable + + # When set to false, does not sign a user in automatically after their password is + # changed. Defaults to true, so a user is signed in automatically after changing a password. + # config.sign_in_after_change_password = true end diff --git a/config/initializers/new_framework_defaults.rb b/config/initializers/new_framework_defaults.rb index 4415dc3..b332127 100644 --- a/config/initializers/new_framework_defaults.rb +++ b/config/initializers/new_framework_defaults.rb @@ -6,6 +6,8 @@ # # Read the Guide for Upgrading Ruby on Rails for more info on each option. +#Rails.application.config.action_controller.raise_on_unfiltered_parameters = true + # Enable per-form CSRF tokens. Previous versions had false. Rails.application.config.action_controller.per_form_csrf_tokens = false @@ -20,4 +22,4 @@ ActiveSupport.to_time_preserves_timezone = false Rails.application.config.active_record.belongs_to_required_by_default = false # Do not halt callback chains when a callback returns false. Previous versions had true. -ActiveSupport.halt_callback_chains_on_return_false = true +#ActiveSupport.halt_callback_chains_on_return_false = true diff --git a/config/initializers/new_framework_defaults_5_2.rb b/config/initializers/new_framework_defaults_5_2.rb new file mode 100644 index 0000000..c383d07 --- /dev/null +++ b/config/initializers/new_framework_defaults_5_2.rb @@ -0,0 +1,38 @@ +# Be sure to restart your server when you modify this file. +# +# This file contains migration options to ease your Rails 5.2 upgrade. +# +# Once upgraded flip defaults one by one to migrate to the new default. +# +# Read the Guide for Upgrading Ruby on Rails for more info on each option. + +# Make Active Record use stable #cache_key alongside new #cache_version method. +# This is needed for recyclable cache keys. +# Rails.application.config.active_record.cache_versioning = true + +# Use AES-256-GCM authenticated encryption for encrypted cookies. +# Also, embed cookie expiry in signed or encrypted cookies for increased security. +# +# This option is not backwards compatible with earlier Rails versions. +# It's best enabled when your entire app is migrated and stable on 5.2. +# +# Existing cookies will be converted on read then written with the new scheme. +# Rails.application.config.action_dispatch.use_authenticated_cookie_encryption = true + +# Use AES-256-GCM authenticated encryption as default cipher for encrypting messages +# instead of AES-256-CBC, when use_authenticated_message_encryption is set to true. +# Rails.application.config.active_support.use_authenticated_message_encryption = true + +# Add default protection from forgery to ActionController::Base instead of in +# ApplicationController. +# Rails.application.config.action_controller.default_protect_from_forgery = true + +# Store boolean values are in sqlite3 databases as 1 and 0 instead of 't' and +# 'f' after migrating old data. +# Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true + +# Use SHA-1 instead of MD5 to generate non-sensitive digests, such as the ETag header. +# Rails.application.config.active_support.use_sha1_digests = true + +# Make `form_with` generate id attributes for any generated HTML tags. +# Rails.application.config.action_view.form_with_generates_ids = true diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml index 0b8f130..ca3d619 100644 --- a/config/locales/devise.en.yml +++ b/config/locales/devise.en.yml @@ -42,8 +42,9 @@ en: signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated." signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked." signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account." - update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address." + update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirmation link to confirm your new email address." updated: "Your account has been updated successfully." + updated_but_not_signed_in: "Your account has been updated successfully, but since your password was changed, you need to sign in again" sessions: signed_in: "Signed in successfully." signed_out: "Signed out successfully." diff --git a/config/locales/en.yml b/config/locales/en.yml index b08bd2f..2eac009 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -16,6 +16,16 @@ # # This would use the information in config/locales/es.yml. # +# The following keys must be escaped otherwise they will not be retrieved by +# the default I18n backend: +# +# true, false, on, off, yes, no +# +# Instead, surround them with single quotes. +# +# en: +# 'true': 'foo' +# # To learn more, please read the Rails Internationalization guide # available at http://guides.rubyonrails.org/i18n.html. diff --git a/config/puma.rb b/config/puma.rb index c7f311f..b210207 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -1,13 +1,13 @@ # Puma can serve each request in a thread from an internal thread pool. -# The `threads` method setting takes two numbers a minimum and maximum. +# 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. +# and maximum; this matches the default thread size of Active Record. # -threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i +threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } threads threads_count, threads_count -# Specifies the `port` that Puma will listen on to receive requests, default is 3000. +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. # port ENV.fetch("PORT") { 3000 } @@ -15,6 +15,9 @@ port ENV.fetch("PORT") { 3000 } # 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 webserver processes. If using threads and workers together # the concurrency of the application would be max `threads` * `workers`. @@ -26,22 +29,9 @@ environment ENV.fetch("RAILS_ENV") { "development" } # 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. If you use this option -# you need to make sure to reconnect any threads in the `on_worker_boot` -# block. +# process behavior so workers use less memory. # # preload_app! -# The code in the `on_worker_boot` will be called if you are using -# clustered mode by specifying a number of `workers`. After each worker -# process is booted this block will be run, if you are using `preload_app!` -# option you will want to use this block to reconnect to any threads -# or connections that may have been created at application boot, Ruby -# cannot share connections between processes. -# -# on_worker_boot do -# ActiveRecord::Base.establish_connection if defined?(ActiveRecord) -# end - # Allow puma to be restarted by `rails restart` command. plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb index 0358902..e504b96 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -105,4 +105,6 @@ Rails.application.routes.draw do # # (app/controllers/admin/products_controller.rb) # resources :products # end + + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end diff --git a/config/spring.rb b/config/spring.rb index c9119b4..9fa7863 100644 --- a/config/spring.rb +++ b/config/spring.rb @@ -1,6 +1,6 @@ -%w( +%w[ .ruby-version .rbenv-vars tmp/restart.txt tmp/caching-dev.txt -).each { |path| Spring.watch(path) } +].each { |path| Spring.watch(path) } diff --git a/config/storage.yml b/config/storage.yml new file mode 100644 index 0000000..d32f76e --- /dev/null +++ b/config/storage.yml @@ -0,0 +1,34 @@ +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) +# amazon: +# service: S3 +# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> +# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> +# region: us-east-1 +# bucket: your_own_bucket + +# Remember not to checkin your GCS keyfile to a repository +# google: +# service: GCS +# project: your_project +# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> +# bucket: your_own_bucket + +# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) +# microsoft: +# service: AzureStorage +# storage_account_name: your_account_name +# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> +# container: your_container_name + +# mirror: +# service: Mirror +# primary: local +# mirrors: [ amazon, google, microsoft ] diff --git a/db/schema.rb b/db/schema.rb index 5bed4e2..02aaf91 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,78 +10,100 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170422183028) do +ActiveRecord::Schema.define(version: 2020_04_13_210200) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" - create_table "logs", force: :cascade do |t| - t.string "message" - t.string "level" - t.string "section" - t.string "token" - t.inet "ip_address" + create_table "active_storage_attachments", force: :cascade do |t| + t.string "name", null: false + t.string "record_type", null: false + t.bigint "record_id", null: false + t.bigint "blob_id", null: false + t.datetime "created_at", null: false + t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id" + t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true + end + + create_table "active_storage_blobs", force: :cascade do |t| + t.string "key", null: false + t.string "filename", null: false + t.string "content_type" + t.text "metadata" + t.bigint "byte_size", null: false + t.string "checksum", null: false + t.datetime "created_at", null: false + t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true + end + + create_table "logs", id: :serial, force: :cascade do |t| + t.string "message" + t.string "level" + t.string "section" + t.string "token" + t.inet "ip_address" t.datetime "created_at", null: false t.datetime "updated_at", null: false end - create_table "packages", force: :cascade do |t| - t.string "name", null: false - t.string "description", limit: 80 - t.string "section", limit: 50 - t.string "maintainer", limit: 100 - t.string "maintainer_email", limit: 100 - t.string "homepage", limit: 400 - t.string "version", limit: 200 - t.text "long_description" - t.string "origin", limit: 80 + create_table "packages", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.string "description", limit: 80 + t.string "section", limit: 50 + t.string "maintainer", limit: 100 + t.string "maintainer_email", limit: 100 + t.string "homepage", limit: 400 + t.string "version", limit: 200 + t.text "long_description" + t.string "origin", limit: 80 t.datetime "created_at" t.datetime "updated_at" - t.integer "visits", default: 0 + t.integer "visits", default: 0 t.index "(((setweight(to_tsvector('english'::regconfig, COALESCE((name)::text, ''::text)), 'A'::\"char\") || setweight(to_tsvector('english'::regconfig, COALESCE((description)::text, ''::text)), 'B'::\"char\")) || setweight(to_tsvector('english'::regconfig, COALESCE(long_description, ''::text)), 'C'::\"char\")))", name: "packages_fts", using: :gin - t.index ["name"], name: "packages_name_key", unique: true, using: :btree + t.index ["name"], name: "packages_name_key", unique: true end - create_table "screenshots", force: :cascade do |t| - t.integer "package_id" - t.string "version", limit: 50 + create_table "screenshots", id: :serial, force: :cascade do |t| + t.integer "package_id" + t.string "version", limit: 50 t.datetime "created_at" - t.string "uploaderhash", limit: 72 - t.string "uploaderip", limit: 15 - t.boolean "approved", default: false, null: false - t.boolean "markedfordelete" - t.string "delete_reason", limit: 100 - t.text "description" + t.string "uploaderhash", limit: 72 + t.string "uploaderip", limit: 15 + t.boolean "approved", default: false, null: false + t.boolean "markedfordelete" + t.string "delete_reason", limit: 100 + t.text "description" t.datetime "updated_at" - t.string "image_file_name" - t.string "image_content_type" - t.integer "image_file_size" + t.string "image_file_name" + t.string "image_content_type" + t.integer "image_file_size" t.datetime "image_updated_at" - t.string "image_fingerprint" - t.integer "user_id", default: 0 - t.index ["id", "approved"], name: "id_approved", using: :btree - t.index ["id", "uploaderhash"], name: "id_uploaderhash", using: :btree + t.string "image_fingerprint" + t.integer "user_id", default: 0 + t.index ["id", "approved"], name: "id_approved" + t.index ["id", "uploaderhash"], name: "id_uploaderhash" end - create_table "users", force: :cascade do |t| - t.text "name" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "email", default: "", null: false - t.string "encrypted_password", default: "", null: false - t.integer "sign_in_count", default: 0, null: false + create_table "users", id: :serial, force: :cascade do |t| + t.text "name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false + t.integer "sign_in_count", default: 0, null: false t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" - t.inet "current_sign_in_ip" - t.inet "last_sign_in_ip" - t.integer "failed_attempts", default: 0, null: false - t.string "unlock_token" + t.inet "current_sign_in_ip" + t.inet "last_sign_in_ip" + t.integer "failed_attempts", default: 0, null: false + t.string "unlock_token" t.datetime "locked_at" - t.string "provider" - t.string "uid" - t.integer "admin", default: 0 - t.index ["email", "provider"], name: "index_users_on_email_and_provider", unique: true, using: :btree + t.string "provider" + t.string "uid" + t.integer "admin", default: 0 + t.index ["email", "provider"], name: "index_users_on_email_and_provider", unique: true end + add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" add_foreign_key "screenshots", "packages", name: "screenshots_package_id_fkey" end