From 1263a722132824ceeaf395a09bba4ccd3c44f9b6 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 8 Oct 2018 13:55:24 -0700 Subject: [PATCH 01/36] Initial Rails setup --- .gitignore | 27 ++ .ruby-version | 1 + Gemfile | 81 +++++ Gemfile.lock | 277 ++++++++++++++++++ Guardfile | 9 + Rakefile | 6 + app/assets/config/manifest.js | 3 + app/assets/images/.keep | 0 app/assets/javascripts/application.js | 20 ++ app/assets/javascripts/cable.js | 13 + app/assets/javascripts/channels/.keep | 0 app/assets/stylesheets/application.scss | 18 ++ app/channels/application_cable/channel.rb | 4 + app/channels/application_cable/connection.rb | 4 + app/controllers/application_controller.rb | 2 + app/controllers/concerns/.keep | 0 app/helpers/application_helper.rb | 2 + app/jobs/application_job.rb | 2 + app/mailers/application_mailer.rb | 4 + app/models/application_record.rb | 3 + app/models/concerns/.keep | 0 app/views/layouts/application.html.erb | 15 + app/views/layouts/mailer.html.erb | 13 + app/views/layouts/mailer.text.erb | 1 + bin/bundle | 3 + bin/rails | 9 + bin/rake | 9 + bin/setup | 36 +++ bin/spring | 17 ++ bin/update | 31 ++ bin/yarn | 11 + config.ru | 5 + config/application.rb | 25 ++ config/boot.rb | 4 + config/cable.yml | 10 + config/credentials.yml.enc | 1 + config/database.yml | 85 ++++++ config/environment.rb | 5 + config/environments/development.rb | 61 ++++ config/environments/production.rb | 94 ++++++ config/environments/test.rb | 46 +++ .../application_controller_renderer.rb | 8 + config/initializers/assets.rb | 14 + config/initializers/backtrace_silencers.rb | 7 + .../initializers/content_security_policy.rb | 25 ++ config/initializers/cookies_serializer.rb | 5 + .../initializers/filter_parameter_logging.rb | 4 + config/initializers/inflections.rb | 16 + config/initializers/mime_types.rb | 4 + config/initializers/wrap_parameters.rb | 14 + config/locales/en.yml | 33 +++ config/puma.rb | 34 +++ config/routes.rb | 3 + config/spring.rb | 6 + config/storage.yml | 34 +++ db/seeds.rb | 7 + lib/assets/.keep | 0 lib/tasks/.keep | 0 log/.keep | 0 package.json | 5 + public/404.html | 67 +++++ public/422.html | 67 +++++ public/500.html | 66 +++++ public/apple-touch-icon-precomposed.png | 0 public/apple-touch-icon.png | 0 public/favicon.ico | 0 public/robots.txt | 1 + storage/.keep | 0 test/application_system_test_case.rb | 5 + test/controllers/.keep | 0 test/fixtures/.keep | 0 test/fixtures/files/.keep | 0 test/helpers/.keep | 0 test/integration/.keep | 0 test/mailers/.keep | 0 test/models/.keep | 0 test/system/.keep | 0 test/test_helper.rb | 24 ++ tmp/.keep | 0 vendor/.keep | 0 80 files changed, 1406 insertions(+) create mode 100644 .gitignore create mode 100644 .ruby-version create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Guardfile create mode 100644 Rakefile create mode 100644 app/assets/config/manifest.js create mode 100644 app/assets/images/.keep create mode 100644 app/assets/javascripts/application.js create mode 100644 app/assets/javascripts/cable.js create mode 100644 app/assets/javascripts/channels/.keep create mode 100644 app/assets/stylesheets/application.scss create mode 100644 app/channels/application_cable/channel.rb create mode 100644 app/channels/application_cable/connection.rb create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/concerns/.keep create mode 100644 app/helpers/application_helper.rb create mode 100644 app/jobs/application_job.rb create mode 100644 app/mailers/application_mailer.rb create mode 100644 app/models/application_record.rb create mode 100644 app/models/concerns/.keep create mode 100644 app/views/layouts/application.html.erb create mode 100644 app/views/layouts/mailer.html.erb create mode 100644 app/views/layouts/mailer.text.erb create mode 100755 bin/bundle create mode 100755 bin/rails create mode 100755 bin/rake create mode 100755 bin/setup create mode 100755 bin/spring create mode 100755 bin/update create mode 100755 bin/yarn create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/cable.yml create mode 100644 config/credentials.yml.enc create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/application_controller_renderer.rb create mode 100644 config/initializers/assets.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/content_security_policy.rb create mode 100644 config/initializers/cookies_serializer.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/puma.rb create mode 100644 config/routes.rb create mode 100644 config/spring.rb create mode 100644 config/storage.yml create mode 100644 db/seeds.rb create mode 100644 lib/assets/.keep create mode 100644 lib/tasks/.keep create mode 100644 log/.keep create mode 100644 package.json create mode 100644 public/404.html create mode 100644 public/422.html create mode 100644 public/500.html create mode 100644 public/apple-touch-icon-precomposed.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon.ico create mode 100644 public/robots.txt create mode 100644 storage/.keep create mode 100644 test/application_system_test_case.rb create mode 100644 test/controllers/.keep create mode 100644 test/fixtures/.keep create mode 100644 test/fixtures/files/.keep create mode 100644 test/helpers/.keep create mode 100644 test/integration/.keep create mode 100644 test/mailers/.keep create mode 100644 test/models/.keep create mode 100644 test/system/.keep create mode 100644 test/test_helper.rb create mode 100644 tmp/.keep create mode 100644 vendor/.keep diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..18b43c9cd2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore uploaded files in development +/storage/* +!/storage/.keep + +/node_modules +/yarn-error.log + +/public/assets +.byebug_history + +# Ignore master key for decrypting credentials and more. +/config/master.key diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000000..25c81fe399 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +ruby-2.5.1 \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000000..6219256bd8 --- /dev/null +++ b/Gemfile @@ -0,0 +1,81 @@ +source 'https://rubygems.org' +git_source(:github) { |repo| "https://github.com/#{repo}.git" } + +ruby '2.5.1' + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.2.1' +# Use postgresql as the database for Active Record +gem 'pg', '>= 0.18', '< 2.0' +# Use Puma as the app server +gem 'puma', '~> 3.11' +# Use SCSS for stylesheets +gem 'sass-rails', '~> 5.0' +# Use Uglifier as compressor for JavaScript assets +gem 'uglifier', '>= 1.3.0' +# See https://github.com/rails/execjs#readme for more supported runtimes +# gem 'mini_racer', platforms: :ruby + +# Use CoffeeScript for .coffee assets and views +# gem 'coffee-rails', '~> 4.2' +# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks +gem 'turbolinks', '~> 5' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +gem 'jbuilder', '~> 2.5' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 4.0' +# Use ActiveModel has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use ActiveStorage variant +# gem 'mini_magick', '~> 4.8' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +# Reduces boot times through caching; required in config/boot.rb +gem 'bootsnap', '>= 1.1.0', 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] +end + +group :development do + # Access an interactive console on exception pages or by calling 'console' anywhere in the code. + gem 'web-console', '>= 3.3.0' + gem 'listen', '>= 3.0.5', '< 3.2' + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' + gem 'spring-watcher-listen', '~> 2.0.0' +end + +group :test do + # Adds support for Capybara system testing and selenium driver + gem 'capybara', '>= 2.15' + gem 'selenium-webdriver' + # Easy installation and use of chromedriver to run system tests with Chrome + gem 'chromedriver-helper' +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +gem 'jquery-rails' +gem 'jquery-turbolinks' +gem 'bootstrap', '~> 4.1.3' +group :development, :test do + gem 'pry-rails' +end + +group :development do + gem 'better_errors' + gem 'binding_of_caller' + gem 'guard' + gem 'guard-minitest' +end + +group :test do + gem 'minitest-rails' + gem 'minitest-reporters' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000000..2ed655c894 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,277 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (5.2.1) + actionpack (= 5.2.1) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailer (5.2.1) + actionpack (= 5.2.1) + actionview (= 5.2.1) + activejob (= 5.2.1) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.2.1) + actionview (= 5.2.1) + activesupport (= 5.2.1) + rack (~> 2.0) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.2.1) + activesupport (= 5.2.1) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.2.1) + activesupport (= 5.2.1) + globalid (>= 0.3.6) + activemodel (5.2.1) + activesupport (= 5.2.1) + activerecord (5.2.1) + activemodel (= 5.2.1) + activesupport (= 5.2.1) + arel (>= 9.0) + activestorage (5.2.1) + actionpack (= 5.2.1) + activerecord (= 5.2.1) + marcel (~> 0.3.1) + activesupport (5.2.1) + 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) + ansi (1.5.0) + archive-zip (0.11.0) + io-like (~> 0.3.0) + arel (9.0.0) + autoprefixer-rails (9.1.4) + execjs + better_errors (2.5.0) + coderay (>= 1.0.0) + erubi (>= 1.0.0) + rack (>= 0.9.0) + bindex (0.5.0) + binding_of_caller (0.8.0) + debug_inspector (>= 0.0.1) + bootsnap (1.3.2) + msgpack (~> 1.0) + bootstrap (4.1.3) + autoprefixer-rails (>= 6.0.3) + popper_js (>= 1.12.9, < 2) + sass (>= 3.5.2) + builder (3.2.3) + byebug (10.0.2) + capybara (3.9.0) + addressable + mini_mime (>= 0.1.3) + nokogiri (~> 1.8) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + xpath (~> 3.1) + childprocess (0.9.0) + ffi (~> 1.0, >= 1.0.11) + chromedriver-helper (2.1.0) + archive-zip (~> 0.10) + nokogiri (~> 1.8) + coderay (1.1.2) + concurrent-ruby (1.0.5) + crass (1.0.4) + debug_inspector (0.0.3) + erubi (1.7.1) + execjs (2.7.0) + ffi (1.9.25) + formatador (0.2.5) + globalid (0.4.1) + activesupport (>= 4.2.0) + guard (2.14.2) + formatador (>= 0.2.4) + listen (>= 2.7, < 4.0) + lumberjack (>= 1.0.12, < 2.0) + nenv (~> 0.1) + notiffany (~> 0.0) + pry (>= 0.9.12) + shellany (~> 0.0) + thor (>= 0.18.1) + guard-compat (1.2.1) + guard-minitest (2.4.6) + guard-compat (~> 1.2) + minitest (>= 3.0) + i18n (1.1.0) + concurrent-ruby (~> 1.0) + io-like (0.3.0) + jbuilder (2.7.0) + activesupport (>= 4.2.0) + multi_json (>= 1.2) + jquery-rails (4.3.3) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) + jquery-turbolinks (2.1.0) + railties (>= 3.1.0) + turbolinks + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + loofah (2.2.2) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + lumberjack (1.0.13) + mail (2.7.0) + mini_mime (>= 0.1.1) + marcel (0.3.3) + mimemagic (~> 0.3.2) + method_source (0.9.0) + mimemagic (0.3.2) + mini_mime (1.0.1) + mini_portile2 (2.3.0) + minitest (5.11.3) + minitest-rails (3.0.0) + minitest (~> 5.8) + railties (~> 5.0) + minitest-reporters (1.3.5) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + msgpack (1.2.4) + multi_json (1.13.1) + nenv (0.3.0) + nio4r (2.3.1) + nokogiri (1.8.5) + mini_portile2 (~> 2.3.0) + notiffany (0.1.1) + nenv (~> 0.1) + shellany (~> 0.0) + pg (1.1.3) + popper_js (1.14.3) + pry (0.11.3) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + pry-rails (0.3.6) + pry (>= 0.10.4) + public_suffix (3.0.3) + puma (3.12.0) + rack (2.0.5) + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (5.2.1) + actioncable (= 5.2.1) + actionmailer (= 5.2.1) + actionpack (= 5.2.1) + actionview (= 5.2.1) + activejob (= 5.2.1) + activemodel (= 5.2.1) + activerecord (= 5.2.1) + activestorage (= 5.2.1) + activesupport (= 5.2.1) + bundler (>= 1.3.0) + railties (= 5.2.1) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.0.4) + loofah (~> 2.2, >= 2.2.2) + railties (5.2.1) + actionpack (= 5.2.1) + activesupport (= 5.2.1) + method_source + rake (>= 0.8.7) + thor (>= 0.19.0, < 2.0) + rake (12.3.1) + rb-fsevent (0.10.3) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + ruby-progressbar (1.10.0) + ruby_dep (1.5.0) + rubyzip (1.2.2) + sass (3.6.0) + 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.0.7) + railties (>= 4.0.0, < 6) + sass (~> 3.1) + sprockets (>= 2.8, < 4.0) + sprockets-rails (>= 2.0, < 4.0) + tilt (>= 1.1, < 3) + selenium-webdriver (3.14.1) + childprocess (~> 0.5) + rubyzip (~> 1.2, >= 1.2.2) + shellany (0.0.1) + spring (2.0.2) + activesupport (>= 4.2) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (3.7.2) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.2.1) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + thor (0.20.0) + thread_safe (0.3.6) + tilt (2.0.8) + turbolinks (5.2.0) + turbolinks-source (~> 5.2) + turbolinks-source (5.2.0) + tzinfo (1.2.5) + thread_safe (~> 0.1) + uglifier (4.1.19) + execjs (>= 0.3.0, < 3) + web-console (3.7.0) + actionview (>= 5.0) + activemodel (>= 5.0) + bindex (>= 0.4.0) + railties (>= 5.0) + websocket-driver (0.7.0) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.3) + xpath (3.1.0) + nokogiri (~> 1.8) + +PLATFORMS + ruby + +DEPENDENCIES + better_errors + binding_of_caller + bootsnap (>= 1.1.0) + bootstrap (~> 4.1.3) + byebug + capybara (>= 2.15) + chromedriver-helper + guard + guard-minitest + jbuilder (~> 2.5) + jquery-rails + jquery-turbolinks + listen (>= 3.0.5, < 3.2) + minitest-rails + minitest-reporters + pg (>= 0.18, < 2.0) + pry-rails + puma (~> 3.11) + rails (~> 5.2.1) + sass-rails (~> 5.0) + selenium-webdriver + spring + spring-watcher-listen (~> 2.0.0) + turbolinks (~> 5) + tzinfo-data + uglifier (>= 1.3.0) + web-console (>= 3.3.0) + +RUBY VERSION + ruby 2.5.1p57 + +BUNDLED WITH + 1.16.2 diff --git a/Guardfile b/Guardfile new file mode 100644 index 0000000000..e34f706f4a --- /dev/null +++ b/Guardfile @@ -0,0 +1,9 @@ +guard :minitest, autorun: false, spring: true do + watch(%r{^app/(.+).rb$}) { |m| "test/#{m[1]}_test.rb" } + watch(%r{^app/controllers/application_controller.rb$}) { 'test/controllers' } + watch(%r{^app/controllers/(.+)_controller.rb$}) { |m| "test/integration/#{m[1]}_test.rb" } + watch(%r{^app/views/(.+)_mailer/.+}) { |m| "test/mailers/#{m[1]}_mailer_test.rb" } + watch(%r{^lib/(.+).rb$}) { |m| "test/lib/#{m[1]}_test.rb" } + watch(%r{^test/.+_test.rb$}) + watch(%r{^test/test_helper.rb$}) { 'test' } +end diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000000..e85f913914 --- /dev/null +++ b/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative 'config/application' + +Rails.application.load_tasks diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js new file mode 100644 index 0000000000..b16e53d6d5 --- /dev/null +++ b/app/assets/config/manifest.js @@ -0,0 +1,3 @@ +//= link_tree ../images +//= link_directory ../javascripts .js +//= link_directory ../stylesheets .css diff --git a/app/assets/images/.keep b/app/assets/images/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js new file mode 100644 index 0000000000..4f73c21a7d --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,20 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's +// vendor/assets/javascripts directory can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// compiled file. JavaScript code in this file should be added after the last require_* statement. +// +// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details +// about supported directives. + //= require jquery3 + //= require popper + //= require bootstrap-sprockets + +// +//= require rails-ujs +//= require activestorage +//= require turbolinks +//= require_tree . diff --git a/app/assets/javascripts/cable.js b/app/assets/javascripts/cable.js new file mode 100644 index 0000000000..739aa5f022 --- /dev/null +++ b/app/assets/javascripts/cable.js @@ -0,0 +1,13 @@ +// Action Cable provides the framework to deal with WebSockets in Rails. +// You can generate new channels where WebSocket features live using the `rails generate channel` command. +// +//= require action_cable +//= require_self +//= require_tree ./channels + +(function() { + this.App || (this.App = {}); + + App.cable = ActionCable.createConsumer(); + +}).call(this); diff --git a/app/assets/javascripts/channels/.keep b/app/assets/javascripts/channels/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss new file mode 100644 index 0000000000..8b1701e581 --- /dev/null +++ b/app/assets/stylesheets/application.scss @@ -0,0 +1,18 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's + * vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. + * + */ + +/* Custom bootstrap variables must be set or imported *before* bootstrap. */ +@import "bootstrap"; +/* Import scss content */ +@import "**/*"; diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb new file mode 100644 index 0000000000..d672697283 --- /dev/null +++ b/app/channels/application_cable/channel.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb new file mode 100644 index 0000000000..0ff5442f47 --- /dev/null +++ b/app/channels/application_cable/connection.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 0000000000..09705d12ab --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,2 @@ +class ApplicationController < ActionController::Base +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 0000000000..de6be7945c --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb new file mode 100644 index 0000000000..a009ace51c --- /dev/null +++ b/app/jobs/application_job.rb @@ -0,0 +1,2 @@ +class ApplicationJob < ActiveJob::Base +end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb new file mode 100644 index 0000000000..286b2239d1 --- /dev/null +++ b/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: 'from@example.com' + layout 'mailer' +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 0000000000..10a4cba84d --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 0000000000..f32268a271 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,15 @@ + + + + MediaRanker + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> + <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb new file mode 100644 index 0000000000..cbd34d2e9d --- /dev/null +++ b/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb new file mode 100644 index 0000000000..37f0bddbd7 --- /dev/null +++ b/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/bin/bundle b/bin/bundle new file mode 100755 index 0000000000..f19acf5b5c --- /dev/null +++ b/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) +load Gem.bin_path('bundler', 'bundle') diff --git a/bin/rails b/bin/rails new file mode 100755 index 0000000000..5badb2fde0 --- /dev/null +++ b/bin/rails @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/bin/rake b/bin/rake new file mode 100755 index 0000000000..d87d5f5781 --- /dev/null +++ b/bin/rake @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/bin/setup b/bin/setup new file mode 100755 index 0000000000..94fd4d7977 --- /dev/null +++ b/bin/setup @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + 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' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:setup' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/spring b/bin/spring new file mode 100755 index 0000000000..fb2ec2ebb4 --- /dev/null +++ b/bin/spring @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# This file loads spring without using Bundler, in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +unless defined?(Spring) + require 'rubygems' + require 'bundler' + + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + spring = lockfile.specs.detect { |spec| spec.name == "spring" } + if spring + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version + require 'spring/binstub' + end +end diff --git a/bin/update b/bin/update new file mode 100755 index 0000000000..58bfaed518 --- /dev/null +++ b/bin/update @@ -0,0 +1,31 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = File.expand_path('..', __dir__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a way to update your development environment automatically. + # Add necessary update steps to this file. + + puts '== Installing dependencies ==' + 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' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/yarn b/bin/yarn new file mode 100755 index 0000000000..460dd565b4 --- /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.ru b/config.ru new file mode 100644 index 0000000000..f7ba0b527b --- /dev/null +++ b/config.ru @@ -0,0 +1,5 @@ +# This file is used by Rack-based servers to start the application. + +require_relative 'config/environment' + +run Rails.application diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 0000000000..08db79cb25 --- /dev/null +++ b/config/application.rb @@ -0,0 +1,25 @@ +require_relative 'boot' + +require 'rails/all' + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module MediaRanker + class Application < Rails::Application + config.generators do |g| + # Force new test files to be generated in the minitest-spec style + g.test_framework :minitest, spec: true + # Always use .js files, never .coffee + g.javascript_engine :js + end + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 5.2 + + # Settings in config/environments/* take precedence over those specified here. + # 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 new file mode 100644 index 0000000000..b9e460cef3 --- /dev/null +++ b/config/boot.rb @@ -0,0 +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 new file mode 100644 index 0000000000..0b286f676e --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: async + +production: + adapter: redis + url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> + channel_prefix: MediaRanker_production diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc new file mode 100644 index 0000000000..74b5d379a2 --- /dev/null +++ b/config/credentials.yml.enc @@ -0,0 +1 @@ +ER+J52zzYtrhHViWjq1ND0JiD5I+pc8fBf2/TxI1TjhUcKigcGEc2kk1G+0uSU/IIILAaRbu9u8QjK3mZGp4/8rVwRBO/BZULUiJHiuuMToJN4STJgO/PZS1XJIVls7USeWWe/BrvBs3AEMkDcDxMcQwsPTMbkbOq+kdSZdcU3DpiCYGWu7G5L/CJ9dMvZB6NPRKQF3cV+H9tnOa8Vsyp2j1JHz7WR9+a3dAxU3q9zAnK6o1rsrdJCx+MfiIlZBCLdVxK3TSPcaxtPNHl5YjklYh8jrgGESp6ZW4VQ9CsmCardagsgU28gTTyg8dLYyPUMaz80ziozKPPLF05RT+46pYsmdJb0H1X0JEXOPlgwTSwQsFG620x3fHn1V4vAetH4h6LxqnrI6GEtSW45TKODEV/er5icLp3miU--NSEMK649DchO4EHW--kGTgqlyr5PsAR167XB/keQ== \ No newline at end of file diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 0000000000..0bd2511123 --- /dev/null +++ b/config/database.yml @@ -0,0 +1,85 @@ +# PostgreSQL. Versions 9.1 and up are supported. +# +# Install the pg driver: +# gem install pg +# On OS X with Homebrew: +# gem install pg -- --with-pg-config=/usr/local/bin/pg_config +# On OS X with MacPorts: +# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config +# On Windows: +# gem install pg +# Choose the win32 build. +# Install PostgreSQL and put its /bin directory on your path. +# +# Configure Using Gemfile +# gem 'pg' +# +default: &default + adapter: postgresql + encoding: unicode + # For details on connection pooling, see Rails configuration guide + # http://guides.rubyonrails.org/configuring.html#database-pooling + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + +development: + <<: *default + database: MediaRanker_development + + # The specified database role being used to connect to postgres. + # To create additional roles in postgres see `$ createuser --help`. + # When left blank, postgres will use the default role. This is + # the same name as the operating system user that initialized the database. + #username: MediaRanker + + # The password associated with the postgres role (username). + #password: + + # Connect on a TCP socket. Omitted by default since the client uses a + # domain socket that doesn't need configuration. Windows does not have + # domain sockets, so uncomment these lines. + #host: localhost + + # The TCP port the server listens on. Defaults to 5432. + # If your server runs on a different port number, change accordingly. + #port: 5432 + + # Schema search path. The server defaults to $user,public + #schema_search_path: myapp,sharedapp,public + + # Minimum log levels, in increasing order: + # debug5, debug4, debug3, debug2, debug1, + # log, notice, warning, error, fatal, and panic + # Defaults to warning. + #min_messages: notice + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: MediaRanker_test + +# As with config/secrets.yml, you never want to store sensitive information, +# like your database password, in your source code. If your source code is +# ever seen by anyone, they now have access to your database. +# +# Instead, provide the password as a unix environment variable when you boot +# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database +# for a full rundown on how to provide these environment variables in a +# production deployment. +# +# On Heroku and other platform providers, you may have a full connection URL +# available as an environment variable. For example: +# +# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" +# +# You can use this database configuration with: +# +# production: +# url: <%= ENV['DATABASE_URL'] %> +# +production: + <<: *default + database: MediaRanker_production + username: MediaRanker + password: <%= ENV['MEDIARANKER_DATABASE_PASSWORD'] %> diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 0000000000..426333bb46 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 0000000000..1311e3e4ef --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,61 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + # 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=#{2.days.to_i}" + } + else + config.action_controller.perform_caching = false + + 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 + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # 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. + config.assets.debug = true + + # Suppress logger output for asset requests. + config.assets.quiet = true + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true + + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + config.file_watcher = ActiveSupport::EventedFileUpdateChecker +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 0000000000..bd39d9d752 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,94 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + 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? + + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # 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 + + # 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 + # config.action_cable.url = 'wss://example.com/cable' + # 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 + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # 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 = "MediaRanker_#{Rails.env}" + + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 0000000000..0a38fd3ce9 --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,46 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # 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 + + # 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=#{1.hour.to_i}" + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # 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. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # 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 new file mode 100644 index 0000000000..89d2efab2b --- /dev/null +++ b/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# 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 new file mode 100644 index 0000000000..4b828e80cb --- /dev/null +++ b/config/initializers/assets.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# 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. +# 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 the app/assets +# folder are already added. +# Rails.application.config.assets.precompile += %w( admin.js admin.css ) diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000000..59385cdf37 --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb new file mode 100644 index 0000000000..d3bcaa5ec8 --- /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/cookies_serializer.rb b/config/initializers/cookies_serializer.rb new file mode 100644 index 0000000000..5a6a32d371 --- /dev/null +++ b/config/initializers/cookies_serializer.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Specify a serializer for the signed and encrypted cookie jars. +# Valid options are :json, :marshal, and :hybrid. +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000000..4a994e1e7b --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 0000000000..ac033bf9dc --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 0000000000..dc1899682b --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 0000000000..bbfc3961bf --- /dev/null +++ b/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 0000000000..decc5a8573 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,33 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# 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. + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 0000000000..a5eccf816b --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,34 @@ +# 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. +# +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. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# 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`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# 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. +# +# preload_app! + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000000..787824f888 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,3 @@ +Rails.application.routes.draw do + # 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 new file mode 100644 index 0000000000..9fa7863f99 --- /dev/null +++ b/config/spring.rb @@ -0,0 +1,6 @@ +%w[ + .ruby-version + .rbenv-vars + tmp/restart.txt + tmp/caching-dev.txt +].each { |path| Spring.watch(path) } diff --git a/config/storage.yml b/config/storage.yml new file mode 100644 index 0000000000..d32f76e8fb --- /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/seeds.rb b/db/seeds.rb new file mode 100644 index 0000000000..1beea2accd --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,7 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). +# +# Examples: +# +# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) +# Character.create(name: 'Luke', movie: movies.first) diff --git a/lib/assets/.keep b/lib/assets/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/log/.keep b/log/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package.json b/package.json new file mode 100644 index 0000000000..625900f9d8 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "name": "MediaRanker", + "private": true, + "dependencies": {} +} diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000000..2be3af26fc --- /dev/null +++ b/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/422.html b/public/422.html new file mode 100644 index 0000000000..c08eac0d1d --- /dev/null +++ b/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/500.html b/public/500.html new file mode 100644 index 0000000000..78a030af22 --- /dev/null +++ b/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000000..37b576a4a0 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/storage/.keep b/storage/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb new file mode 100644 index 0000000000..d19212abd5 --- /dev/null +++ b/test/application_system_test_case.rb @@ -0,0 +1,5 @@ +require "test_helper" + +class ApplicationSystemTestCase < ActionDispatch::SystemTestCase + driven_by :selenium, using: :chrome, screen_size: [1400, 1400] +end diff --git a/test/controllers/.keep b/test/controllers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/.keep b/test/fixtures/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/files/.keep b/test/fixtures/files/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/helpers/.keep b/test/helpers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/integration/.keep b/test/integration/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/mailers/.keep b/test/mailers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/models/.keep b/test/models/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/system/.keep b/test/system/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000000..2b5172a7d6 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,24 @@ +ENV["RAILS_ENV"] = "test" +require File.expand_path("../../config/environment", __FILE__) +require "rails/test_help" +require "minitest/rails"require "minitest/reporters" # for Colorized output +# For colorful output! +Minitest::Reporters.use!( + Minitest::Reporters::SpecReporter.new, + ENV, + Minitest.backtrace_filter +) + + +# To add Capybara feature tests add `gem "minitest-rails-capybara"` +# to the test group in the Gemfile and uncomment the following: +# require "minitest/rails/capybara" + +# Uncomment for awesome colorful output +# require "minitest/pride" + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + # Add more helper methods to be used by all tests here... +end diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 0000000000..e69de29bb2 From 4c41d7829f8574a28bdb57584f520e5d5f1d4285 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 8 Oct 2018 14:16:30 -0700 Subject: [PATCH 02/36] Created works model --- app/assets/javascripts/works.js | 2 ++ app/assets/stylesheets/works.scss | 3 +++ app/controllers/works_controller.rb | 7 ++++++ app/helpers/works_helper.rb | 2 ++ app/models/work.rb | 2 ++ app/views/works/index.html.erb | 2 ++ app/views/works/show.html.erb | 2 ++ config/routes.rb | 2 ++ db/migrate/20181008210125_create_works.rb | 16 +++++++++++++ db/schema.rb | 28 +++++++++++++++++++++++ test/controllers/works_controller_test.rb | 14 ++++++++++++ test/fixtures/works.yml | 25 ++++++++++++++++++++ test/models/work_test.rb | 9 ++++++++ 13 files changed, 114 insertions(+) create mode 100644 app/assets/javascripts/works.js create mode 100644 app/assets/stylesheets/works.scss create mode 100644 app/controllers/works_controller.rb create mode 100644 app/helpers/works_helper.rb create mode 100644 app/models/work.rb create mode 100644 app/views/works/index.html.erb create mode 100644 app/views/works/show.html.erb create mode 100644 db/migrate/20181008210125_create_works.rb create mode 100644 db/schema.rb create mode 100644 test/controllers/works_controller_test.rb create mode 100644 test/fixtures/works.yml create mode 100644 test/models/work_test.rb diff --git a/app/assets/javascripts/works.js b/app/assets/javascripts/works.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/works.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/works.scss b/app/assets/stylesheets/works.scss new file mode 100644 index 0000000000..5618452f3e --- /dev/null +++ b/app/assets/stylesheets/works.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Works controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb new file mode 100644 index 0000000000..7c133769e2 --- /dev/null +++ b/app/controllers/works_controller.rb @@ -0,0 +1,7 @@ +class WorksController < ApplicationController + def index + end + + def show + end +end diff --git a/app/helpers/works_helper.rb b/app/helpers/works_helper.rb new file mode 100644 index 0000000000..ccb78c2b73 --- /dev/null +++ b/app/helpers/works_helper.rb @@ -0,0 +1,2 @@ +module WorksHelper +end diff --git a/app/models/work.rb b/app/models/work.rb new file mode 100644 index 0000000000..95322dd45e --- /dev/null +++ b/app/models/work.rb @@ -0,0 +1,2 @@ +class Work < ApplicationRecord +end diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb new file mode 100644 index 0000000000..e519642270 --- /dev/null +++ b/app/views/works/index.html.erb @@ -0,0 +1,2 @@ +

Works#index

+

Find me in app/views/works/index.html.erb

diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb new file mode 100644 index 0000000000..c096804302 --- /dev/null +++ b/app/views/works/show.html.erb @@ -0,0 +1,2 @@ +

Works#show

+

Find me in app/views/works/show.html.erb

diff --git a/config/routes.rb b/config/routes.rb index 787824f888..2e44827fa1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,5 @@ Rails.application.routes.draw do + get 'works/index' + get 'works/show' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end diff --git a/db/migrate/20181008210125_create_works.rb b/db/migrate/20181008210125_create_works.rb new file mode 100644 index 0000000000..43f422fdf1 --- /dev/null +++ b/db/migrate/20181008210125_create_works.rb @@ -0,0 +1,16 @@ +class CreateWorks < ActiveRecord::Migration[5.2] + def change + create_table :works do |t| + t.string :title + t.string :creator + t.integer :publication_year + t.string :description + t.string :category + + + t.timestamps + end + end +end + +#category,title,creator,publication_year,description diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..9eb8eb1c13 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,28 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 2018_10_08_210125) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "works", force: :cascade do |t| + t.string "title" + t.string "creator" + t.integer "publication_year" + t.string "description" + t.string "category" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb new file mode 100644 index 0000000000..8ce4006de3 --- /dev/null +++ b/test/controllers/works_controller_test.rb @@ -0,0 +1,14 @@ +require "test_helper" + +describe WorksController do + it "should get index" do + get works_index_url + value(response).must_be :success? + end + + it "should get show" do + get works_show_url + value(response).must_be :success? + end + +end diff --git a/test/fixtures/works.yml b/test/fixtures/works.yml new file mode 100644 index 0000000000..ebcb919ec1 --- /dev/null +++ b/test/fixtures/works.yml @@ -0,0 +1,25 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + title: MyString + string: MyString + created_by: MyString + string: MyString + publication_year: MyString + integer: MyString + description: MyString + string: MyString + category: MyString + string: MyString + +two: + title: MyString + string: MyString + created_by: MyString + string: MyString + publication_year: MyString + integer: MyString + description: MyString + string: MyString + category: MyString + string: MyString diff --git a/test/models/work_test.rb b/test/models/work_test.rb new file mode 100644 index 0000000000..f6fba7104d --- /dev/null +++ b/test/models/work_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Work do + let(:work) { Work.new } + + it "must be valid" do + value(work).must_be :valid? + end +end From 7a4fc3a11c72d41514e40c8beff42847086635f1 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 8 Oct 2018 14:39:09 -0700 Subject: [PATCH 03/36] Successfully seeded data --- db/seeds.rb | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/db/seeds.rb b/db/seeds.rb index 1beea2accd..381d79dab9 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -5,3 +5,43 @@ # # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) # Character.create(name: 'Luke', movie: movies.first) + + +require 'csv' + +MEDIA_FILE = Rails.root.join('db', 'media_seeds.csv') +puts "Loading raw media data from #{MEDIA_FILE}" + +media_failures = [] +CSV.foreach(MEDIA_FILE, :headers => true) do |row| + work = Work.new + work.category = row['category'] + work.title = row['title'] + work.creator = row['creator'] + work.publication_year = row['publication_year'] + work.description = row['description'] + successful = work.save + if !successful + media_failures << work + puts "Failed to save media: #{work.inspect}" + else + puts "Created media: #{work.inspect}" + end +end + +puts "Added #{Work.count} media records" +puts "#{media_failures.length} media failed to save" + + +# +# +# # Since we set the primary key (the ID) manually on each of the +# # tables, we've got to tell postgres to reload the latest ID +# # values. Otherwise when we create a new record it will try +# # to start at ID 1, which will be a conflict. +# puts "Manually resetting PK sequence on each table" +# ActiveRecord::Base.connection.tables.each do |t| +# ActiveRecord::Base.connection.reset_pk_sequence!(t) +# end + +puts "done" From b3820818a6c3402f531a5f91f10a21ba853fd0cf Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 8 Oct 2018 15:05:56 -0700 Subject: [PATCH 04/36] Added routes for Work --- config/routes.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 2e44827fa1..4f1f7ed898 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,4 @@ Rails.application.routes.draw do - get 'works/index' - get 'works/show' + resources :works # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end From e7639320543a274c60f102b0754ce3d1545b1eff Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 8 Oct 2018 15:21:14 -0700 Subject: [PATCH 05/36] Added action methods to the controller --- app/controllers/works_controller.rb | 39 +++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 7c133769e2..957c17c4b0 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -1,7 +1,46 @@ class WorksController < ApplicationController def index + @works = Work.all.order(:title) end def show + id = params[:id] + @work = Work.find_by(id: id) + + if @work.nill? + render :notfound, status: :not_found + end + end + + def edit + @work = Work.find_by(id: params[:id]) + end + + def create + @work = Work.new(work_params) + if @work.save + redirect_to work_path(@work.id) + else + render :new + end + end + + def update + @work = Work.find_by(id: params[:id]) + if @work.update(work_params) + redirect_to work_path(@work.id) + end + end + + def destroy + work = Work.find_by(id: params[:id]) + work.destroy + redirect_to works_path + end + + private + + def work_params + return params.require(:work).permit(:title) end end From e1850d31ff24fc72fa22723709589ce8ba0bd1ab Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 8 Oct 2018 15:30:00 -0700 Subject: [PATCH 06/36] Created votes and users models and controllers --- app/assets/javascripts/users.js | 2 ++ app/assets/javascripts/votes.js | 2 ++ app/assets/stylesheets/users.scss | 3 +++ app/assets/stylesheets/votes.scss | 3 +++ app/controllers/users_controller.rb | 2 ++ app/controllers/votes_controller.rb | 2 ++ app/controllers/works_controller.rb | 8 +++++--- app/helpers/users_helper.rb | 2 ++ app/helpers/votes_helper.rb | 2 ++ app/models/user.rb | 2 ++ app/models/vote.rb | 2 ++ db/migrate/20181008222912_create_votes.rb | 8 ++++++++ db/migrate/20181008222940_create_users.rb | 9 +++++++++ test/controllers/users_controller_test.rb | 7 +++++++ test/controllers/votes_controller_test.rb | 7 +++++++ test/fixtures/users.yml | 7 +++++++ test/fixtures/votes.yml | 11 +++++++++++ test/models/user_test.rb | 9 +++++++++ test/models/vote_test.rb | 9 +++++++++ 19 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 app/assets/javascripts/users.js create mode 100644 app/assets/javascripts/votes.js create mode 100644 app/assets/stylesheets/users.scss create mode 100644 app/assets/stylesheets/votes.scss create mode 100644 app/controllers/users_controller.rb create mode 100644 app/controllers/votes_controller.rb create mode 100644 app/helpers/users_helper.rb create mode 100644 app/helpers/votes_helper.rb create mode 100644 app/models/user.rb create mode 100644 app/models/vote.rb create mode 100644 db/migrate/20181008222912_create_votes.rb create mode 100644 db/migrate/20181008222940_create_users.rb create mode 100644 test/controllers/users_controller_test.rb create mode 100644 test/controllers/votes_controller_test.rb create mode 100644 test/fixtures/users.yml create mode 100644 test/fixtures/votes.yml create mode 100644 test/models/user_test.rb create mode 100644 test/models/vote_test.rb diff --git a/app/assets/javascripts/users.js b/app/assets/javascripts/users.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/users.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/votes.js b/app/assets/javascripts/votes.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/votes.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss new file mode 100644 index 0000000000..31a2eacb84 --- /dev/null +++ b/app/assets/stylesheets/users.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Users controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/votes.scss b/app/assets/stylesheets/votes.scss new file mode 100644 index 0000000000..9a6720f80e --- /dev/null +++ b/app/assets/stylesheets/votes.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Votes controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb new file mode 100644 index 0000000000..3e74dea87f --- /dev/null +++ b/app/controllers/users_controller.rb @@ -0,0 +1,2 @@ +class UsersController < ApplicationController +end diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb new file mode 100644 index 0000000000..ffdb2760e0 --- /dev/null +++ b/app/controllers/votes_controller.rb @@ -0,0 +1,2 @@ +class VotesController < ApplicationController +end diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 957c17c4b0..68a0a5f24b 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -12,9 +12,6 @@ def show end end - def edit - @work = Work.find_by(id: params[:id]) - end def create @work = Work.new(work_params) @@ -25,6 +22,11 @@ def create end end + def edit + @work = Work.find_by(id: params[:id]) + end + + def update @work = Work.find_by(id: params[:id]) if @work.update(work_params) diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb new file mode 100644 index 0000000000..2310a240d7 --- /dev/null +++ b/app/helpers/users_helper.rb @@ -0,0 +1,2 @@ +module UsersHelper +end diff --git a/app/helpers/votes_helper.rb b/app/helpers/votes_helper.rb new file mode 100644 index 0000000000..5a82eed07d --- /dev/null +++ b/app/helpers/votes_helper.rb @@ -0,0 +1,2 @@ +module VotesHelper +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 0000000000..379658a509 --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,2 @@ +class User < ApplicationRecord +end diff --git a/app/models/vote.rb b/app/models/vote.rb new file mode 100644 index 0000000000..4c58e4f3d5 --- /dev/null +++ b/app/models/vote.rb @@ -0,0 +1,2 @@ +class Vote < ApplicationRecord +end diff --git a/db/migrate/20181008222912_create_votes.rb b/db/migrate/20181008222912_create_votes.rb new file mode 100644 index 0000000000..aa134a1296 --- /dev/null +++ b/db/migrate/20181008222912_create_votes.rb @@ -0,0 +1,8 @@ +class CreateVotes < ActiveRecord::Migration[5.2] + def change + create_table :votes do |t| + + t.timestamps + end + end +end diff --git a/db/migrate/20181008222940_create_users.rb b/db/migrate/20181008222940_create_users.rb new file mode 100644 index 0000000000..9c711e759b --- /dev/null +++ b/db/migrate/20181008222940_create_users.rb @@ -0,0 +1,9 @@ +class CreateUsers < ActiveRecord::Migration[5.2] + def change + create_table :users do |t| + t.string :username + + t.timestamps + end + end +end diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb new file mode 100644 index 0000000000..89decb54e0 --- /dev/null +++ b/test/controllers/users_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe UsersController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/votes_controller_test.rb b/test/controllers/votes_controller_test.rb new file mode 100644 index 0000000000..cf4d03935f --- /dev/null +++ b/test/controllers/votes_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe VotesController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml new file mode 100644 index 0000000000..952febd97d --- /dev/null +++ b/test/fixtures/users.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + username: MyString + +two: + username: MyString diff --git a/test/fixtures/votes.yml b/test/fixtures/votes.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/votes.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/models/user_test.rb b/test/models/user_test.rb new file mode 100644 index 0000000000..cc862ac2d9 --- /dev/null +++ b/test/models/user_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe User do + let(:user) { User.new } + + it "must be valid" do + value(user).must_be :valid? + end +end diff --git a/test/models/vote_test.rb b/test/models/vote_test.rb new file mode 100644 index 0000000000..fc15947bd3 --- /dev/null +++ b/test/models/vote_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Vote do + let(:vote) { Vote.new } + + it "must be valid" do + value(vote).must_be :valid? + end +end From 3e5c50b8a416d8a5459bed8c9a1fc185220def26 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 8 Oct 2018 16:30:02 -0700 Subject: [PATCH 07/36] Added controllers and models for users and votes --- app/controllers/users_controller.rb | 46 +++++++++++++++++++++++++++++ app/controllers/votes_controller.rb | 46 +++++++++++++++++++++++++++++ app/controllers/works_controller.rb | 2 +- config/routes.rb | 2 ++ db/schema.rb | 13 +++++++- 5 files changed, 107 insertions(+), 2 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 3e74dea87f..51af14c323 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,2 +1,48 @@ class UsersController < ApplicationController + def index + @users = User.all.order(:title) + end + + def show + id = params[:id] + @user = User.find_by(id: id) + + if @user.nil? + render :notfound, status: :not_found + end + end + + + def create + @user = User.new(user_params) + if @user.save + redirect_to user_path(@user.id) + else + render :new + end + end + + def edit + @user = User.find_by(id: params[:id]) + end + + + def update + @user = User.find_by(id: params[:id]) + if @user.update(user_params) + redirect_to user_path(@user.id) + end + end + + def destroy + user = User.find_by(id: params[:id]) + user.destroy + redirect_to users_path + end + + private + + def user_params + return params.require(:user).permit(:title) + end end diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb index ffdb2760e0..d2306b2dd8 100644 --- a/app/controllers/votes_controller.rb +++ b/app/controllers/votes_controller.rb @@ -1,2 +1,48 @@ class VotesController < ApplicationController + def index + @votes = Votes.all.order(:title) + end + + def show + id = params[:id] + @vote = Votes.find_by(id: id) + + if @vote.nil? + render :notfound, status: :not_found + end + end + + + def create + @vote = Votes.new(vote_params) + if @vote.save + redirect_to vote_path(@vote.id) + else + render :new + end + end + + def edit + @vote = Votes.find_by(id: params[:id]) + end + + + def update + @vote = Votes.find_by(id: params[:id]) + if @vote.update(vote_params) + redirect_to vote_path(@vote.id) + end + end + + def destroy + vote = Votes.find_by(id: params[:id]) + vote.destroy + redirect_to votes_path + end + + private + + def vote_params + return params.require(:vote).permit(:title) + end end diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 68a0a5f24b..f61f73d146 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -7,7 +7,7 @@ def show id = params[:id] @work = Work.find_by(id: id) - if @work.nill? + if @work.nil? render :notfound, status: :not_found end end diff --git a/config/routes.rb b/config/routes.rb index 4f1f7ed898..99c6d7b1bb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,6 @@ Rails.application.routes.draw do resources :works + resources :votes + resources :users # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end diff --git a/db/schema.rb b/db/schema.rb index 9eb8eb1c13..fc0935f3c5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,11 +10,22 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2018_10_08_210125) do +ActiveRecord::Schema.define(version: 2018_10_08_222940) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "users", force: :cascade do |t| + t.string "username" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "votes", force: :cascade do |t| + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "works", force: :cascade do |t| t.string "title" t.string "creator" From 717b86b3136f337939c20128f38962d512d70bfb Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 8 Oct 2018 16:43:24 -0700 Subject: [PATCH 08/36] Added action_view.rb file in confi/initializers so that validation errors will appear on webpage --- app/models/work.rb | 2 ++ app/views/users/index.html.erb | 2 ++ app/views/users/show.html.erb | 2 ++ app/views/votes/index.html.erb | 2 ++ app/views/votes/show.html.erb | 2 ++ config/initializers/action_view.rb | 1 + 6 files changed, 11 insertions(+) create mode 100644 app/views/users/index.html.erb create mode 100644 app/views/users/show.html.erb create mode 100644 app/views/votes/index.html.erb create mode 100644 app/views/votes/show.html.erb create mode 100644 config/initializers/action_view.rb diff --git a/app/models/work.rb b/app/models/work.rb index 95322dd45e..c3ef9aed85 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -1,2 +1,4 @@ class Work < ApplicationRecord + + end diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb new file mode 100644 index 0000000000..1c4400cb96 --- /dev/null +++ b/app/views/users/index.html.erb @@ -0,0 +1,2 @@ +

Works#index

+

Find me in app/views/users/index.html.erb

diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb new file mode 100644 index 0000000000..19c57c45c3 --- /dev/null +++ b/app/views/users/show.html.erb @@ -0,0 +1,2 @@ +

Works#show

+

Find me in app/views/users/show.html.erb

diff --git a/app/views/votes/index.html.erb b/app/views/votes/index.html.erb new file mode 100644 index 0000000000..ebf0349bb5 --- /dev/null +++ b/app/views/votes/index.html.erb @@ -0,0 +1,2 @@ +

Votes#index

+

Find me in app/views/votes/index.html.erb

diff --git a/app/views/votes/show.html.erb b/app/views/votes/show.html.erb new file mode 100644 index 0000000000..4e770528dc --- /dev/null +++ b/app/views/votes/show.html.erb @@ -0,0 +1,2 @@ +

Votes#show

+

Find me in app/views/votes/show.html.erb

diff --git a/config/initializers/action_view.rb b/config/initializers/action_view.rb new file mode 100644 index 0000000000..142d382f87 --- /dev/null +++ b/config/initializers/action_view.rb @@ -0,0 +1 @@ +Rails.application.config.action_view.form_with_generates_remote_forms = false From 3d15934f22b06fe7f0d8b00fa27aecf949f9d432 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 8 Oct 2018 17:14:25 -0700 Subject: [PATCH 09/36] Updated view for work index --- app/views/works/index.html.erb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb index e519642270..9887734348 100644 --- a/app/views/works/index.html.erb +++ b/app/views/works/index.html.erb @@ -1,2 +1,14 @@

Works#index

Find me in app/views/works/index.html.erb

+ +<%['movie', 'book', 'album'].each do |category| %> +

Top <%=category.capitalize%>s

+ <% @works.each do |work| %> + <%if category == work.category%> +

<%= link_to "#{work.title}", work_path(work.id)%> by <%=work.creator%>

+

+ Votes: Method goes here +

+ <%end%> + <%end%> +<%end%> From e07d065a22657a9214a4c326d9e0692eb5f5fb8f Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 8 Oct 2018 17:56:46 -0700 Subject: [PATCH 10/36] Added main and index pages for all the works --- app/controllers/works_controller.rb | 4 ++++ app/views/users/index.html.erb | 2 +- app/views/users/show.html.erb | 2 +- app/views/works/index.html.erb | 28 +++++++++++++++++++++------- app/views/works/main.html.erb | 14 ++++++++++++++ config/routes.rb | 1 + 6 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 app/views/works/main.html.erb diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index f61f73d146..09b6a0d89b 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -3,6 +3,10 @@ def index @works = Work.all.order(:title) end + def main + @works = Work.all.order(:title) + end + def show id = params[:id] @work = Work.find_by(id: id) diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb index 1c4400cb96..e28a7f7391 100644 --- a/app/views/users/index.html.erb +++ b/app/views/users/index.html.erb @@ -1,2 +1,2 @@ -

Works#index

+

Userss#index

Find me in app/views/users/index.html.erb

diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index 19c57c45c3..e5fa3adf14 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -1,2 +1,2 @@ -

Works#show

+

Users#show

Find me in app/views/users/show.html.erb

diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb index 9887734348..b5c2e8c97e 100644 --- a/app/views/works/index.html.erb +++ b/app/views/works/index.html.erb @@ -1,14 +1,28 @@

Works#index

Find me in app/views/works/index.html.erb

- <%['movie', 'book', 'album'].each do |category| %> -

Top <%=category.capitalize%>s

+

<%=category%>s

+ + + + + + + + + <% @works.each do |work| %> + <%if category == work.category%> -

<%= link_to "#{work.title}", work_path(work.id)%> by <%=work.creator%>

-

- Votes: Method goes here -

+ + + + + + <%end%> <%end%> - <%end%> + +
VotesTitleCreated ByPublishedUpvote
VOTES<%=link_to work.title, work_path(work.id) %><%=work.creator%><%=work.publication_year%><%= link_to "Upvote", edit_work_path(work.id) %>
+ + <%end%> diff --git a/app/views/works/main.html.erb b/app/views/works/main.html.erb new file mode 100644 index 0000000000..aab9a5c7e3 --- /dev/null +++ b/app/views/works/main.html.erb @@ -0,0 +1,14 @@ +

Works#main

+

Find me in app/views/works/index.html.erb

+ +<%['movie', 'book', 'album'].each do |category| %> +

Top <%=category.capitalize%>s

+ <% @works.each do |work| %> + <%if category == work.category%> +

<%= link_to "#{work.title}", work_path(work.id)%> by <%=work.creator%>

+

+ Votes: Method goes here +

+ <%end%> + <%end%> +<%end%> diff --git a/config/routes.rb b/config/routes.rb index 99c6d7b1bb..c838d5223d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,5 @@ Rails.application.routes.draw do + root 'works#main' resources :works resources :votes resources :users From 721eabaf417b791e181041d65bbdae19b4c31372 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 8 Oct 2018 18:35:46 -0700 Subject: [PATCH 11/36] Created partial view for form to update & create new works --- app/controllers/works_controller.rb | 2 +- app/models/work.rb | 3 ++- app/views/layouts/_form.html.erb | 26 ++++++++++++++++++++++++++ app/views/works/new.html.erb | 8 ++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 app/views/layouts/_form.html.erb create mode 100644 app/views/works/new.html.erb diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 09b6a0d89b..27e1a658a9 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -27,7 +27,7 @@ def create end def edit - @work = Work.find_by(id: params[:id]) + @work = Work.find_by(id: params[:id].to_i) end diff --git a/app/models/work.rb b/app/models/work.rb index c3ef9aed85..6c0ef9652d 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -1,4 +1,5 @@ class Work < ApplicationRecord - + validates :title, presence: true, uniqueness: true + validates :publication_year, length: { is: 4} end diff --git a/app/views/layouts/_form.html.erb b/app/views/layouts/_form.html.erb new file mode 100644 index 0000000000..14fdeace5f --- /dev/null +++ b/app/views/layouts/_form.html.erb @@ -0,0 +1,26 @@ + +<%= form_with model: @work, method: method, message: message do |f| %> +

<%= message %>

+ + +
+

message

+<%= f.label :category, "Category"%> +<%= f.select :category, ['movie', 'album','book']%> + +<%= f.label :title, "Title"%> +<%= f.text_field :title%> + +<%= f.label :creator, "Creator"%> +<%= f.text_field :creator%> + +<%= f.label :publication_year, "Publication Year"%> +<%= f.text_field :publication_year%> + +<%= f.label :description, "Description"%> +<%= f.text_field :description%> + + +<%= f.submit button_text%> + +<% end %> diff --git a/app/views/works/new.html.erb b/app/views/works/new.html.erb new file mode 100644 index 0000000000..fb25e238c4 --- /dev/null +++ b/app/views/works/new.html.erb @@ -0,0 +1,8 @@ +

Works#New

+

Find me in app/views/works/new.html.erb

+ +<%= render partial: "layouts/form", +locals: {message: "Add a new work", + method: :post, + button_text: 'Create Work' + } %> From ee0f2e6842cd11fe35c8d0805387d41f3e542a7c Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Tue, 9 Oct 2018 16:20:08 -0700 Subject: [PATCH 12/36] Added view for work show --- app/controllers/users_controller.rb | 3 +++ app/controllers/works_controller.rb | 5 ++++- app/models/work.rb | 2 +- app/views/layouts/_form.html.erb | 7 +++---- app/views/layouts/application.html.erb | 17 +++++++++++++++++ app/views/works/new.html.erb | 2 +- app/views/works/notfound.html.erb | 1 + app/views/works/show.html.erb | 10 ++++++++++ 8 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 app/views/works/notfound.html.erb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 51af14c323..9be3d131d4 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -12,6 +12,9 @@ def show end end + def new + @user = User.new + end def create @user = User.new(user_params) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 27e1a658a9..6eb4e38ecd 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -16,6 +16,9 @@ def show end end + def new + @work = Work.new + end def create @work = Work.new(work_params) @@ -47,6 +50,6 @@ def destroy private def work_params - return params.require(:work).permit(:title) + return params.require(:work).permit(:title,:category,:publication_year,:description) end end diff --git a/app/models/work.rb b/app/models/work.rb index 6c0ef9652d..030577e482 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -1,5 +1,5 @@ class Work < ApplicationRecord validates :title, presence: true, uniqueness: true - validates :publication_year, length: { is: 4} + #validates :publication_year, length: { is: 4} end diff --git a/app/views/layouts/_form.html.erb b/app/views/layouts/_form.html.erb index 14fdeace5f..8efe0fa2e2 100644 --- a/app/views/layouts/_form.html.erb +++ b/app/views/layouts/_form.html.erb @@ -1,10 +1,9 @@ -<%= form_with model: @work, method: method, message: message do |f| %> -

<%= message %>

- +<%= form_with model: @work, message: message do |f| %> +

<%= message %>


-

message

+

<%= message %>

<%= f.label :category, "Category"%> <%= f.select :category, ['movie', 'album','book']%> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index f32268a271..6b24284f18 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -10,6 +10,23 @@ +
+

<%= link_to "Media Ranker", root_path , id: "home-link" %> | Ranking the Best of Everything

+ + +
<%= yield %> diff --git a/app/views/works/new.html.erb b/app/views/works/new.html.erb index fb25e238c4..97d1b3ebb3 100644 --- a/app/views/works/new.html.erb +++ b/app/views/works/new.html.erb @@ -1,8 +1,8 @@

Works#New

Find me in app/views/works/new.html.erb

+ <%= render partial: "layouts/form", locals: {message: "Add a new work", - method: :post, button_text: 'Create Work' } %> diff --git a/app/views/works/notfound.html.erb b/app/views/works/notfound.html.erb new file mode 100644 index 0000000000..223c7ef337 --- /dev/null +++ b/app/views/works/notfound.html.erb @@ -0,0 +1 @@ +

404 Page not Found

diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb index c096804302..248daa04f3 100644 --- a/app/views/works/show.html.erb +++ b/app/views/works/show.html.erb @@ -1,2 +1,12 @@

Works#show

Find me in app/views/works/show.html.erb

+ +

<%= @work.title =%>

+

Created by: <%= @work.creator %>

+

Published: <%= @work.publication_year %>

+

<%= @work.description =%>

+ +<%= link_to "Back to media ranks", root_path%> +<%= link_to "Edit", edit_work_path %> +<%= link_to "Upvote (update link)", root_path %> +<%= link_to "Delete", work_path(@work.id) , method: :delete, id: "home-link" %> From db7c51b3b7f5d616e1f44d37108e3dbae584f714 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Tue, 9 Oct 2018 19:09:32 -0700 Subject: [PATCH 13/36] Added flash error messages --- app/controllers/works_controller.rb | 13 ++++++++++++- app/models/work.rb | 2 +- app/views/layouts/application.html.erb | 14 ++++++++++++++ app/views/works/edit.html.erb | 4 ++++ app/views/works/show.html.erb | 1 + 5 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 app/views/works/edit.html.erb diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 6eb4e38ecd..0c57c6b974 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -23,10 +23,16 @@ def new def create @work = Work.new(work_params) if @work.save + flash[:success] = 'Work Created!' redirect_to work_path(@work.id) else + flash.now[:error] = 'Work could not be created!' + @work.errors.messages.each do |field, messages| + flash.now[field] = messages + end render :new end + end def edit @@ -43,7 +49,12 @@ def update def destroy work = Work.find_by(id: params[:id]) - work.destroy + if work.nil? + flash[:error] = "Work #{params[:id]} not found" + else + work.destroy + flash[:success] = "#{work.title} deleted" + end redirect_to works_path end diff --git a/app/models/work.rb b/app/models/work.rb index 030577e482..0409523be1 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -1,5 +1,5 @@ class Work < ApplicationRecord - validates :title, presence: true, uniqueness: true + validates :title, presence: true, uniqueness: { scope: :category } #validates :publication_year, length: { is: 4} end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 6b24284f18..673c39bde6 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -26,6 +26,20 @@
  • Logout
  • +
    + <% flash.each do |name, message| %> + <% if message.class == Array %> + <% message.each do |msg| %> +
    + <%= "#{name}:" %><%= " #{msg}" %>
    + <% end %> + <% else %> +
    + <%= message %> +
    + <% end %> + <% end %> +
    <%= yield %> diff --git a/app/views/works/edit.html.erb b/app/views/works/edit.html.erb new file mode 100644 index 0000000000..890c721282 --- /dev/null +++ b/app/views/works/edit.html.erb @@ -0,0 +1,4 @@ +<%= render partial: "layouts/form", +locals: {message: "Edit", + button_text: 'Update Work' + } %> diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb index 248daa04f3..a44a79f0df 100644 --- a/app/views/works/show.html.erb +++ b/app/views/works/show.html.erb @@ -10,3 +10,4 @@ <%= link_to "Edit", edit_work_path %> <%= link_to "Upvote (update link)", root_path %> <%= link_to "Delete", work_path(@work.id) , method: :delete, id: "home-link" %> + From 21ba04c3591be80641ef02c87d76c06383c3b8f9 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Tue, 9 Oct 2018 19:59:06 -0700 Subject: [PATCH 14/36] Wrote validation and valid tests for work model --- app/views/works/index.html.erb | 2 +- test/controllers/users_controller_test.rb | 10 +-- test/controllers/votes_controller_test.rb | 12 ++-- test/controllers/works_controller_test.rb | 24 +++---- test/fixtures/works.yml | 34 ++++------ test/models/work_test.rb | 79 ++++++++++++++++++++++- test/test_helper.rb | 3 +- 7 files changed, 115 insertions(+), 49 deletions(-) diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb index b5c2e8c97e..d77442998c 100644 --- a/app/views/works/index.html.erb +++ b/app/views/works/index.html.erb @@ -18,7 +18,7 @@ <%=link_to work.title, work_path(work.id) %> <%=work.creator%> <%=work.publication_year%> - <%= link_to "Upvote", edit_work_path(work.id) %> + <%=link_to "Upvote", edit_work_path(work.id) %> <%end%> <%end%> diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index 89decb54e0..ce4b3db889 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb @@ -1,7 +1,7 @@ require "test_helper" -describe UsersController do - # it "must be a real test" do - # flunk "Need real tests" - # end -end +# describe UsersController do +# # it "must be a real test" do +# # flunk "Need real tests" +# # end +# end diff --git a/test/controllers/votes_controller_test.rb b/test/controllers/votes_controller_test.rb index cf4d03935f..925f0f2ca1 100644 --- a/test/controllers/votes_controller_test.rb +++ b/test/controllers/votes_controller_test.rb @@ -1,7 +1,7 @@ require "test_helper" - -describe VotesController do - # it "must be a real test" do - # flunk "Need real tests" - # end -end +# +# describe VotesController do +# # it "must be a real test" do +# # flunk "Need real tests" +# # end +# end diff --git a/test/controllers/works_controller_test.rb b/test/controllers/works_controller_test.rb index 8ce4006de3..4324979148 100644 --- a/test/controllers/works_controller_test.rb +++ b/test/controllers/works_controller_test.rb @@ -1,14 +1,14 @@ require "test_helper" -describe WorksController do - it "should get index" do - get works_index_url - value(response).must_be :success? - end - - it "should get show" do - get works_show_url - value(response).must_be :success? - end - -end +# describe WorksController do +# it "should get index" do +# get works_index_url +# value(response).must_be :success? +# end +# +# it "should get show" do +# get works_show_url +# value(response).must_be :success? +# end +# +# end diff --git a/test/fixtures/works.yml b/test/fixtures/works.yml index ebcb919ec1..74a3773d18 100644 --- a/test/fixtures/works.yml +++ b/test/fixtures/works.yml @@ -1,25 +1,15 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - title: MyString - string: MyString - created_by: MyString - string: MyString - publication_year: MyString - integer: MyString - description: MyString - string: MyString - category: MyString - string: MyString +harrypotter: + title: 'Harry Potter' + creator: 'Warner Brothers' + publication_year: 2005 + description: 'A movie about Harry Potter' + category: 'movie' -two: - title: MyString - string: MyString - created_by: MyString - string: MyString - publication_year: MyString - integer: MyString - description: MyString - string: MyString - category: MyString - string: MyString +pride: + title: 'Pride & Prejudice' + creator: 'Jane Austen' + publication_year: '1990' + description: 'Mr. Darcy' + category: 'book' diff --git a/test/models/work_test.rb b/test/models/work_test.rb index f6fba7104d..1d86286c1b 100644 --- a/test/models/work_test.rb +++ b/test/models/work_test.rb @@ -1,9 +1,84 @@ require "test_helper" describe Work do - let(:work) { Work.new } + let(:work) { works(:harrypotter) } it "must be valid" do - value(work).must_be :valid? + expect(work).must_be :valid? + end + + it 'has required fields' do + fields = [:title, :creator, :description, :publication_year, :category] + + fields.each do |field| + expect(work).must_respond_to field + end + end + + # describe 'Relationships' do + # it 'belongs to an author' do + # # Arrange (done with let) + # + # # Act + # author = book.author + # + # # Assert + # expect(author).must_be_instance_of Author + # expect(author.id).must_equal book.author_id + # end + # + # it 'can have many genres' do + # # Arrange, did with let + # + # # Act + # book.genres << Genre.first + # genres = book.genres + # + # + # # Assert + # expect(genres.length).must_be :>=, 1 + # genres.each do |genre| + # expect(genre).must_be_instance_of Genre + # end + # end + # end + + describe 'validations' do + it 'must have a title' do + # Arrange + work = works(:harrypotter) + work.title = nil + + # Act + #valid = book.valid? + valid = work.save + + # Assert + expect(valid).must_equal false + expect(work.errors.messages).must_include :title + expect(work.errors.messages[:title]).must_equal ["can't be blank"] + end + + + it 'requires a unique title in category' do + #other_book = book.clone + other_work = works(:pride) + other_work.title = work.title + other_work.category = work.category + + valid = other_work.valid? + + expect(valid).must_equal false + expect(other_work.errors.messages).must_include :title + end + it 'will allow a title that already exits if its in a different category' do + #other_book = book.clone + other_work = works(:pride) + other_work.title = work.title + + valid = other_work.valid? + + expect(valid).must_equal true + end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 2b5172a7d6..fb7dd505e2 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,7 +1,8 @@ ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) require "rails/test_help" -require "minitest/rails"require "minitest/reporters" # for Colorized output +require "minitest/rails" +require "minitest/reporters" # for Colorized output # For colorful output! Minitest::Reporters.use!( Minitest::Reporters::SpecReporter.new, From 67add20124dfbbaab2a4b76aaf91ee0313895f9d Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Wed, 10 Oct 2018 11:16:53 -0700 Subject: [PATCH 15/36] Cleaned up work controller with filters --- app/controllers/application_controller.rb | 9 +++++ app/controllers/works_controller.rb | 47 ++++++++++++++--------- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 09705d12ab..301b0e2e55 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,2 +1,11 @@ class ApplicationController < ActionController::Base + # before_action :set_cache_headers + # before_action :find_user + # + # private + # + # def find_ser + # @current_user = User.find_by(id: session[:user_id]) + # end + end diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 0c57c6b974..ede819a7e3 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -1,20 +1,23 @@ class WorksController < ApplicationController + before_action :find_work, only: [:show, :edit, :update, :destroy] + def index @works = Work.all.order(:title) + + medias = ['albums','movies','books'] + + medias.each do |media| + media = Work.all.order(:title).select {|work| work.category == media} + end + + end def main @works = Work.all.order(:title) end - def show - id = params[:id] - @work = Work.find_by(id: id) - - if @work.nil? - render :notfound, status: :not_found - end - end + def show; end def new @work = Work.new @@ -35,31 +38,37 @@ def create end - def edit - @work = Work.find_by(id: params[:id].to_i) - end + def edit; end def update - @work = Work.find_by(id: params[:id]) - if @work.update(work_params) + if @work && @work.update(work_params) redirect_to work_path(@work.id) + elsif @book + render :edit end end def destroy - work = Work.find_by(id: params[:id]) - if work.nil? - flash[:error] = "Work #{params[:id]} not found" - else - work.destroy - flash[:success] = "#{work.title} deleted" + if !@work.nil? + @work.destroy + flash[:success] = "#{@work.title} deleted" end redirect_to works_path end private + def find_work + @work = Work.find_by(id: params[:id]) + + if @work.nil? + flash.now[:warning] = "Work #{params[:id]} not found" + render :notfound + end + end + + def work_params return params.require(:work).permit(:title,:category,:publication_year,:description) end From b0f6eddcc6efe058e3416f14e5c973c73053a4bc Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Fri, 12 Oct 2018 14:30:08 -0700 Subject: [PATCH 16/36] Added ability to login and out --- app/controllers/application_controller.rb | 22 +++++--- app/controllers/users_controller.rb | 57 +++++++++++++------- app/controllers/works_controller.rb | 8 +-- app/models/user.rb | 3 ++ app/models/vote.rb | 4 ++ app/models/work.rb | 10 ++++ app/views/layouts/application.html.erb | 12 ++++- app/views/users/new.html.erb | 24 +++++++++ app/views/users/notfound.html.erb | 1 + config/routes.rb | 6 ++- db/migrate/20181010205245_add_fk_to_votes.rb | 6 +++ db/schema.rb | 8 ++- test/models/work_test.rb | 14 +++++ 13 files changed, 139 insertions(+), 36 deletions(-) create mode 100644 app/views/users/new.html.erb create mode 100644 app/views/users/notfound.html.erb create mode 100644 db/migrate/20181010205245_add_fk_to_votes.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 301b0e2e55..d51f39541d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,11 +1,17 @@ class ApplicationController < ActionController::Base - # before_action :set_cache_headers - # before_action :find_user - # - # private - # - # def find_ser - # @current_user = User.find_by(id: session[:user_id]) - # end + before_action :set_cache_headers + before_action :find_user + + private + + def find_user + @current_user = User.find_by(id: session[:user_id]) + end + + def set_cache_headers + response.headers["Cache-Control"] = "no-cache, no-store" + response.headers["Pragma"] = "no-cache" + response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" + end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 9be3d131d4..8218869d64 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,34 +1,51 @@ class UsersController < ApplicationController - def index - @users = User.all.order(:title) - end - def show - id = params[:id] - @user = User.find_by(id: id) - - if @user.nil? - render :notfound, status: :not_found - end + def index + @users = User.all.order(:username) end def new @user = User.new end - def create - @user = User.new(user_params) - if @user.save - redirect_to user_path(@user.id) - else - render :new + def login + user = User.find_by(username: params[:user][:username]) + + if user.nil? + user = User.create(username: params[:user][:username]) end + + session[:user_id] = user.id + flash[:success] = "Successfully created new user #{ user.username } with ID #{user.id}" + redirect_to root_path end + + + + + # def create + # @user = User.new(user_params) + # if @user.save + # redirect_to user_path(@user.id) + # else + # render :new + # end + # end + def edit @user = User.find_by(id: params[:id]) end + def show + id = params[:id] + @user = User.find_by(id: id) + + if @user.nil? + render :notfound, status: :not_found + end + end + def update @user = User.find_by(id: params[:id]) @@ -38,14 +55,14 @@ def update end def destroy - user = User.find_by(id: params[:id]) - user.destroy - redirect_to users_path + session[:user_id] = nil + flash[:success] = 'Successfully logged out' + redirect_back fallback_location: root_path end private def user_params - return params.require(:user).permit(:title) + return params.require(:user).permit(:username) end end diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index ede819a7e3..663758584c 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -4,11 +4,11 @@ class WorksController < ApplicationController def index @works = Work.all.order(:title) - medias = ['albums','movies','books'] - medias.each do |media| - media = Work.all.order(:title).select {|work| work.category == media} - end + @albums = Work.category('album') + @movies = Work.category('movie') + @books = Work.category('book') + end diff --git a/app/models/user.rb b/app/models/user.rb index 379658a509..d087b46b22 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,2 +1,5 @@ class User < ApplicationRecord + has_many :votes + has_many :works, through: :votes + end diff --git a/app/models/vote.rb b/app/models/vote.rb index 4c58e4f3d5..5de32ff4de 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -1,2 +1,6 @@ class Vote < ApplicationRecord + belongs_to :user + belongs_to :work + + end diff --git a/app/models/work.rb b/app/models/work.rb index 0409523be1..ae5cab2fc0 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -1,5 +1,15 @@ class Work < ApplicationRecord + has_many :votes + has_many :users, through: :votes + validates :title, presence: true, uniqueness: { scope: :category } #validates :publication_year, length: { is: 4} + validates :category, inclusion: { in: %w(movie album book), + message: "%{value} is not a valid size" } + + + def self.category(media) + return Work.all.order(:title).select {|work| work.category == media} + end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 673c39bde6..7454a0d9c7 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -20,12 +20,20 @@
  • <%= link_to "View all users", users_path , id: "home-link" %>
  • + <% if @current_user %> + <% else %> + + <% end %>
    <% flash.each do |name, message| %> <% if message.class == Array %> diff --git a/app/views/users/new.html.erb b/app/views/users/new.html.erb new file mode 100644 index 0000000000..f3e255bbd8 --- /dev/null +++ b/app/views/users/new.html.erb @@ -0,0 +1,24 @@ +

    Log In

    + +<%= form_with model: @user, url: login_path, method: :post do |f| %> +<%= f.label :username, "Username"%> +<%= f.text_field :username%> + +<%= f.submit 'Login', class: "btn btn-primary"%> + +<% end %> + +
    +

    A note about logging in

    +

    + There is no password field. In fact, there is no indication whatsoever + that you are who you say you are. There's nothing special about users - + username is just another piece of data that the user entered and we have to keep + track of. +

    + +

    + We'll learn more about security and authentication in the next couple weeks. + For now, don't worry about it beyond what you can see here. +

    +
    diff --git a/app/views/users/notfound.html.erb b/app/views/users/notfound.html.erb new file mode 100644 index 0000000000..e45a7d3624 --- /dev/null +++ b/app/views/users/notfound.html.erb @@ -0,0 +1 @@ +

    404 Not Found

    diff --git a/config/routes.rb b/config/routes.rb index c838d5223d..74389e744b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,6 +2,10 @@ root 'works#main' resources :works resources :votes - resources :users + +resources :users + post 'users/login', to: 'users#login', as: 'login' + delete 'users/destroy', to: 'users#destroy', as: 'logout' + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end diff --git a/db/migrate/20181010205245_add_fk_to_votes.rb b/db/migrate/20181010205245_add_fk_to_votes.rb new file mode 100644 index 0000000000..f2483b85df --- /dev/null +++ b/db/migrate/20181010205245_add_fk_to_votes.rb @@ -0,0 +1,6 @@ +class AddFkToVotes < ActiveRecord::Migration[5.2] + def change + add_reference :users , :vote, foreign_key: true + add_reference :works , :vote, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index fc0935f3c5..20b3e717db 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2018_10_08_222940) do +ActiveRecord::Schema.define(version: 2018_10_10_205245) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -19,6 +19,8 @@ t.string "username" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.bigint "vote_id" + t.index ["vote_id"], name: "index_users_on_vote_id" end create_table "votes", force: :cascade do |t| @@ -34,6 +36,10 @@ t.string "category" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.bigint "vote_id" + t.index ["vote_id"], name: "index_works_on_vote_id" end + add_foreign_key "users", "votes" + add_foreign_key "works", "votes" end diff --git a/test/models/work_test.rb b/test/models/work_test.rb index 1d86286c1b..18366ddcfb 100644 --- a/test/models/work_test.rb +++ b/test/models/work_test.rb @@ -59,6 +59,20 @@ expect(work.errors.messages[:title]).must_equal ["can't be blank"] end + it 'must have category movie, album or book' do + # Arrange + work = works(:harrypotter) + work.category = 'art' + + # Act + #valid = book.valid? + valid = work.save + + # Assert + expect(valid).must_equal false + expect(work.errors.messages).must_include :category + end + it 'requires a unique title in category' do #other_book = book.clone From a7c8b700b11c8b4619dc701b092fd72c6be9e2de Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Fri, 12 Oct 2018 14:33:11 -0700 Subject: [PATCH 17/36] Added upvote route to route.rb --- config/routes.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/routes.rb b/config/routes.rb index 74389e744b..59465ed0f8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,5 +7,8 @@ post 'users/login', to: 'users#login', as: 'login' delete 'users/destroy', to: 'users#destroy', as: 'logout' + +post 'works/upvote', to: 'works#upvote', as: 'upvote' + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end From 7c7637d95e471e7c8a89694bf1ecbacd47efe92d Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Fri, 12 Oct 2018 15:11:30 -0700 Subject: [PATCH 18/36] Added validations to votes model --- app/controllers/users_controller.rb | 9 +++- app/controllers/votes_controller.rb | 62 ++++++++++++++------------ app/controllers/works_controller.rb | 4 ++ app/views/layouts/application.html.erb | 2 +- 4 files changed, 45 insertions(+), 32 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 8218869d64..d803a955c5 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,5 +1,7 @@ class UsersController < ApplicationController + + def index @users = User.all.order(:username) end @@ -13,11 +15,14 @@ def login if user.nil? user = User.create(username: params[:user][:username]) - end - session[:user_id] = user.id flash[:success] = "Successfully created new user #{ user.username } with ID #{user.id}" redirect_to root_path + else + session[:user_id] = user.id + flash[:success] = "Successfully logged in as existing user #{ user.username }" + redirect_to root_path + end end diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb index d2306b2dd8..6a599d6d87 100644 --- a/app/controllers/votes_controller.rb +++ b/app/controllers/votes_controller.rb @@ -1,18 +1,22 @@ class VotesController < ApplicationController - def index - @votes = Votes.all.order(:title) + validates :work_id, presence: true, uniqueness: { scope: :user_id, message: "has already voted for this work" } + # def index + # @votes = Votes.all.order(:title) + # end + # + # def show + # id = params[:id] + # @vote = Votes.find_by(id: id) + # + # if @vote.nil? + # render :notfound, status: :not_found + # end + # end + + def new + @vote = Vote.new end - def show - id = params[:id] - @vote = Votes.find_by(id: id) - - if @vote.nil? - render :notfound, status: :not_found - end - end - - def create @vote = Votes.new(vote_params) if @vote.save @@ -22,23 +26,23 @@ def create end end - def edit - @vote = Votes.find_by(id: params[:id]) - end - - - def update - @vote = Votes.find_by(id: params[:id]) - if @vote.update(vote_params) - redirect_to vote_path(@vote.id) - end - end - - def destroy - vote = Votes.find_by(id: params[:id]) - vote.destroy - redirect_to votes_path - end + # def edit + # @vote = Votes.find_by(id: params[:id]) + # end + # + # + # def update + # @vote = Votes.find_by(id: params[:id]) + # if @vote.update(vote_params) + # redirect_to vote_path(@vote.id) + # end + # end + # + # def destroy + # vote = Votes.find_by(id: params[:id]) + # vote.destroy + # redirect_to votes_path + # end private diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 663758584c..946d916438 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -13,6 +13,10 @@ def index end + def upvote + if + end + def main @works = Work.all.order(:title) end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 7454a0d9c7..86fe178ffc 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -23,7 +23,7 @@ <% if @current_user %> From 5754ef7991d0b6473f05310e4829b392d36742db Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Fri, 12 Oct 2018 15:12:41 -0700 Subject: [PATCH 19/36] Added validations to votes model --- app/controllers/votes_controller.rb | 2 +- app/models/vote.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb index 6a599d6d87..cf26002416 100644 --- a/app/controllers/votes_controller.rb +++ b/app/controllers/votes_controller.rb @@ -1,5 +1,5 @@ class VotesController < ApplicationController - validates :work_id, presence: true, uniqueness: { scope: :user_id, message: "has already voted for this work" } + # def index # @votes = Votes.all.order(:title) # end diff --git a/app/models/vote.rb b/app/models/vote.rb index 5de32ff4de..2a21128ac6 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -2,5 +2,5 @@ class Vote < ApplicationRecord belongs_to :user belongs_to :work - + validates :work_id, presence: true, uniqueness: { scope: :user_id, message: "has already voted for this work" } end From 44a2342cfd90399da9d2112bb2e0bbcac269ed6c Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Fri, 12 Oct 2018 16:34:05 -0700 Subject: [PATCH 20/36] Created upvote method --- app/controllers/votes_controller.rb | 36 +++++++++++++------------- app/controllers/works_controller.rb | 18 +++++++++++-- app/views/users/new.html.erb | 15 ----------- app/views/works/index.html.erb | 2 +- app/views/works/show.html.erb | 3 +-- config/routes.rb | 2 +- db/migrate/20181012232024_vote_f_ks.rb | 6 +++++ db/schema.rb | 8 +++++- 8 files changed, 50 insertions(+), 40 deletions(-) create mode 100644 db/migrate/20181012232024_vote_f_ks.rb diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb index cf26002416..6f760b3ef5 100644 --- a/app/controllers/votes_controller.rb +++ b/app/controllers/votes_controller.rb @@ -1,5 +1,5 @@ class VotesController < ApplicationController - + # def index # @votes = Votes.all.order(:title) # end @@ -13,18 +13,18 @@ class VotesController < ApplicationController # end # end - def new - @vote = Vote.new - end - - def create - @vote = Votes.new(vote_params) - if @vote.save - redirect_to vote_path(@vote.id) - else - render :new - end - end + # def new + # @vote = Vote.new + # end + # + # def create + # @vote = Votes.new(vote_params) + # if @vote.save + # redirect_to vote_path(@vote.id) + # else + # render :new + # end + # end # def edit # @vote = Votes.find_by(id: params[:id]) @@ -44,9 +44,9 @@ def create # redirect_to votes_path # end - private - - def vote_params - return params.require(:vote).permit(:title) - end + # private + # + # def vote_params + # return params.require(:vote).permit(:title) + # end end diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 946d916438..228ce8820a 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -1,5 +1,5 @@ class WorksController < ApplicationController - before_action :find_work, only: [:show, :edit, :update, :destroy] + before_action :find_work, only: [:show, :edit, :update, :destroy, :upvote] def index @works = Work.all.order(:title) @@ -14,9 +14,22 @@ def index end def upvote - if + if @current_user.nil? + flash.now[:warning] = 'You must log in to do that' + else + vote = Vote.new(user_id: @current_user.id, work_id: @work.id) + if vote.save + flash[:success] = 'Successfully upvoted!' + else + flash[:error] = 'Could not upvote' + end + + end + + redirect_back fallback_location: work_path(@work) end + def main @works = Work.all.order(:title) end @@ -76,4 +89,5 @@ def find_work def work_params return params.require(:work).permit(:title,:category,:publication_year,:description) end + end diff --git a/app/views/users/new.html.erb b/app/views/users/new.html.erb index f3e255bbd8..be0fc02cab 100644 --- a/app/views/users/new.html.erb +++ b/app/views/users/new.html.erb @@ -7,18 +7,3 @@ <%= f.submit 'Login', class: "btn btn-primary"%> <% end %> - -
    -

    A note about logging in

    -

    - There is no password field. In fact, there is no indication whatsoever - that you are who you say you are. There's nothing special about users - - username is just another piece of data that the user entered and we have to keep - track of. -

    - -

    - We'll learn more about security and authentication in the next couple weeks. - For now, don't worry about it beyond what you can see here. -

    -
    diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb index d77442998c..fb6ac0d1dc 100644 --- a/app/views/works/index.html.erb +++ b/app/views/works/index.html.erb @@ -18,7 +18,7 @@ <%=link_to work.title, work_path(work.id) %> <%=work.creator%> <%=work.publication_year%> - <%=link_to "Upvote", edit_work_path(work.id) %> + <%=link_to "Upvote", upvote_path(work.id), method: :post %> <%end%> <%end%> diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb index a44a79f0df..2c17e2a746 100644 --- a/app/views/works/show.html.erb +++ b/app/views/works/show.html.erb @@ -8,6 +8,5 @@ <%= link_to "Back to media ranks", root_path%> <%= link_to "Edit", edit_work_path %> -<%= link_to "Upvote (update link)", root_path %> +<%= link_to "Upvote", upvote_path(@work.id), method: :post %> <%= link_to "Delete", work_path(@work.id) , method: :delete, id: "home-link" %> - diff --git a/config/routes.rb b/config/routes.rb index 59465ed0f8..500a7fd8a0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,7 +8,7 @@ delete 'users/destroy', to: 'users#destroy', as: 'logout' -post 'works/upvote', to: 'works#upvote', as: 'upvote' +post 'works/:id/upvote', to: 'works#upvote', as: 'upvote' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end diff --git a/db/migrate/20181012232024_vote_f_ks.rb b/db/migrate/20181012232024_vote_f_ks.rb new file mode 100644 index 0000000000..d182a79c75 --- /dev/null +++ b/db/migrate/20181012232024_vote_f_ks.rb @@ -0,0 +1,6 @@ +class VoteFKs < ActiveRecord::Migration[5.2] + def change + add_reference :votes , :user, foreign_key: true + add_reference :votes , :work, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 20b3e717db..d8e9a2ce3f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2018_10_10_205245) do +ActiveRecord::Schema.define(version: 2018_10_12_232024) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -26,6 +26,10 @@ create_table "votes", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.bigint "user_id" + t.bigint "work_id" + t.index ["user_id"], name: "index_votes_on_user_id" + t.index ["work_id"], name: "index_votes_on_work_id" end create_table "works", force: :cascade do |t| @@ -41,5 +45,7 @@ end add_foreign_key "users", "votes" + add_foreign_key "votes", "users" + add_foreign_key "votes", "works" add_foreign_key "works", "votes" end From 56850fdf998e06d734a6a5968e006616e5a339ad Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Sun, 14 Oct 2018 20:12:32 -0700 Subject: [PATCH 21/36] Added CSS from website --- app/assets/stylesheets/application.scss | 156 ++++++++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 8b1701e581..bcddcd7eda 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -16,3 +16,159 @@ @import "bootstrap"; /* Import scss content */ @import "**/*"; +/* latin-ext */ +@font-face { + font-family: 'Gudea'; + font-style: normal; + font-weight: 400; + src: local('Gudea'), url(https://fonts.gstatic.com/s/gudea/v7/neIFzCqgsI0mp9CG_oCsNKEyaJQ.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Gudea'; + font-style: normal; + font-weight: 400; + src: local('Gudea'), url(https://fonts.gstatic.com/s/gudea/v7/neIFzCqgsI0mp9CI_oCsNKEy.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* latin-ext */ +@font-face { + font-family: 'Gudea'; + font-style: normal; + font-weight: 700; + src: local('Gudea Bold'), local('Gudea-Bold'), url(https://fonts.gstatic.com/s/gudea/v7/neIIzCqgsI0mp9gz25WPFqwYUp31kXI.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Gudea'; + font-style: normal; + font-weight: 700; + src: local('Gudea Bold'), local('Gudea-Bold'), url(https://fonts.gstatic.com/s/gudea/v7/neIIzCqgsI0mp9gz25WBFqwYUp31.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} + +body, h1, h2, h3, h4, h5 { + font-family: "Gudea", sans-serif; +} + h1, h2, h3, h4, h5 { + font-weight: bold; +} + a, h2, h3 { + color: #26A69A; +} + main { + padding: 2rem; +} + a:hover { + color: #00796B; + text-decoration: none; +} + .btn:hover { + background-color: #00796B; +} + .btn-primary { + background-color: #26A69A; + color: white; + border-color: #26A69A; +} + .alert__container { + margin: 2rem 0 1rem 0; +} + .alert-warning { + color: #856404; + background-color: #fff3cd; + border-color: #ffeeba; +} + .alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} + .table td { + vertical-align: middle; +} + .app-header__header { + max-width: 100%; + background-color: #B2DFDB; + margin-bottom: 0.5rem; + padding: 2rem 1rem 0.5rem 1rem; +} + .app-header__header h1 { + text-align: center; + margin: 25px auto 40px auto; +} + .app-header__header h1 a { + color: #FF5722; + padding-right: 25px; + margin-right: 15px; + border-right: white 2px solid; +} + .app-header__header h1 small { + color: white; +} + .app-header__nav { + display: flex; + flex-direction: row; + justify-content: space-between; +} + .app-header__user-nav-container .nav-item { + margin-left: 2rem; +} + .app-header__nav_item { + margin-top: 1rem; +} + .app-header__nav_item .nav-link { + color: #00796B; +} + .works-votes__container { + margin-top: 2rem; +} + .works-votes__header { + color: black; +} + .spotlight { + padding: 0 2rem 2rem 2rem; +} + .spotlight__header--prefix { + color: #424242; +} + .spotlight__link-to { + border-bottom: 2px solid; +} + .root__hr { + margin: 0px auto 3rem auto; + color: #EEEEEE; +} + .top-ten__container { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-column-gap: 2em; +} + .top-ten__header { + color: #26A69A; + border-bottom: 2px solid; + border-bottom-color: #B2DFDB; +} + .top-ten__list { + list-style-type: none; + margin-left: 0; + padding-left: 0; +} + .list-group-item { + border: none; +} + .table { + width: 100%; + margin-bottom: 1rem; + background-color: transparent; +} + .user-votes__container { + margin-top: 2rem; +} + .user-votes__header { + color: black; +} From 65fe6e6a16ecb40c1281a947dd1357ee5a988303 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Sun, 14 Oct 2018 22:13:34 -0700 Subject: [PATCH 22/36] Finished updating work show page --- app/models/vote.rb | 4 ++ app/models/work.rb | 9 ++++- app/views/layouts/application.html.erb | 52 +++++++++++++------------- app/views/works/main.html.erb | 16 ++++++-- app/views/works/show.html.erb | 37 +++++++++++++++--- 5 files changed, 81 insertions(+), 37 deletions(-) diff --git a/app/models/vote.rb b/app/models/vote.rb index 2a21128ac6..2cf05427d9 100644 --- a/app/models/vote.rb +++ b/app/models/vote.rb @@ -3,4 +3,8 @@ class Vote < ApplicationRecord belongs_to :work validates :work_id, presence: true, uniqueness: { scope: :user_id, message: "has already voted for this work" } + + def date_format + self.created_at.strftime("%b %-d, %Y") + end end diff --git a/app/models/work.rb b/app/models/work.rb index ae5cab2fc0..e9dd4f35ee 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -1,7 +1,7 @@ class Work < ApplicationRecord has_many :votes has_many :users, through: :votes - + validates :title, presence: true, uniqueness: { scope: :category } #validates :publication_year, length: { is: 4} validates :category, inclusion: { in: %w(movie album book), @@ -12,4 +12,11 @@ def self.category(media) return Work.all.order(:title).select {|work| work.category == media} end + def spotlight + + end + + + + end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 86fe178ffc..a51f9de1e4 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -10,45 +10,43 @@ -
    -

    <%= link_to "Media Ranker", root_path , id: "home-link" %> | Ranking the Best of Everything

    -
    + <% end %> +
    <%= yield %> diff --git a/app/views/works/main.html.erb b/app/views/works/main.html.erb index aab9a5c7e3..26ddd150b0 100644 --- a/app/views/works/main.html.erb +++ b/app/views/works/main.html.erb @@ -1,8 +1,18 @@ -

    Works#main

    -

    Find me in app/views/works/index.html.erb

    + + +
    +

    + Media Spotlight + <%= link_to "@works.spotlight.title", work_path(@works.ids) , class: "spotlight__link-to" %> +

    +

    + 2 votes - take me back! +

    +
    + <%['movie', 'book', 'album'].each do |category| %> -

    Top <%=category.capitalize%>s

    +

    Top <%=category.capitalize%>s

    <% @works.each do |work| %> <%if category == work.category%>

    <%= link_to "#{work.title}", work_path(work.id)%> by <%=work.creator%>

    diff --git a/app/views/works/show.html.erb b/app/views/works/show.html.erb index 2c17e2a746..542427e86a 100644 --- a/app/views/works/show.html.erb +++ b/app/views/works/show.html.erb @@ -1,12 +1,37 @@ -

    Works#show

    -

    Find me in app/views/works/show.html.erb

    +

    <%= @work.title =%>

    Created by: <%= @work.creator %>

    Published: <%= @work.publication_year %>

    <%= @work.description =%>

    -<%= link_to "Back to media ranks", root_path%> -<%= link_to "Edit", edit_work_path %> -<%= link_to "Upvote", upvote_path(@work.id), method: :post %> -<%= link_to "Delete", work_path(@work.id) , method: :delete, id: "home-link" %> +
    + <%= link_to "Back to media ranks", root_path, class: "btn btn-primary"%> + <%= link_to "Edit", edit_work_path, class: "btn btn-primary" %> + <%= link_to "Upvote", upvote_path(@work.id), method: :post, class: "btn btn-primary" %> + <%= link_to "Delete", work_path(@work.id) , method: :delete, class: "btn btn-danger" %> +
    + +
    + +
    +

    <%=@work.votes.length%> Votes for this <%=@work.category.capitalize%>

    + + + + + + + + + <% @work.votes.each do |vote| %> + + + + + <%end%> + +
    UserDate
    + <%=link_to vote.user.username, user_path(vote.user_id) %> + <%=vote.date_format%>
    +
    From a4fca5e4f25bf661e00af378ea37e1cb95621499 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Sun, 14 Oct 2018 22:51:23 -0700 Subject: [PATCH 23/36] Fixed form for edit and create new works, can't get category to spread across all the way --- app/views/layouts/_form.html.erb | 35 +++++++++++++++++++++++--------- app/views/works/edit.html.erb | 6 +++++- app/views/works/new.html.erb | 4 ++-- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/app/views/layouts/_form.html.erb b/app/views/layouts/_form.html.erb index 8efe0fa2e2..4c6b4c5c6b 100644 --- a/app/views/layouts/_form.html.erb +++ b/app/views/layouts/_form.html.erb @@ -1,25 +1,40 @@ +

    <%= message %>

    <%= form_with model: @work, message: message do |f| %> -

    <%= message %>

    -
    -

    <%= message %>

    +
    <%= f.label :category, "Category"%> -<%= f.select :category, ['movie', 'album','book']%> +<%= f.select :category, ['movie', 'album','book'], class: "form-control"%> +
    +
    <%= f.label :title, "Title"%> -<%= f.text_field :title%> +<%= f.text_field :title, class: "form-control"%> +
    +
    <%= f.label :creator, "Creator"%> -<%= f.text_field :creator%> +<%= f.text_field :creator, class: "form-control"%> +
    +
    <%= f.label :publication_year, "Publication Year"%> -<%= f.text_field :publication_year%> +<%= f.text_field :publication_year, class: "form-control"%> +
    +
    <%= f.label :description, "Description"%> -<%= f.text_field :description%> +<%= f.text_area :description, class: "form-control"%> +
    - -<%= f.submit button_text%> +
    +<%= f.submit button_text, class: "btn btn-primary"%> +
    <% end %> + +
    + + +
    diff --git a/app/views/works/edit.html.erb b/app/views/works/edit.html.erb index 890c721282..9f6c54873f 100644 --- a/app/views/works/edit.html.erb +++ b/app/views/works/edit.html.erb @@ -1,4 +1,8 @@ +
    + + <%= render partial: "layouts/form", -locals: {message: "Edit", +locals: {message: "Edit This #{@work.category.capitalize}", button_text: 'Update Work' } %> +
    diff --git a/app/views/works/new.html.erb b/app/views/works/new.html.erb index 97d1b3ebb3..74d7b73a5a 100644 --- a/app/views/works/new.html.erb +++ b/app/views/works/new.html.erb @@ -1,8 +1,8 @@ -

    Works#New

    -

    Find me in app/views/works/new.html.erb

    +
    <%= render partial: "layouts/form", locals: {message: "Add a new work", button_text: 'Create Work' } %> +
    From fe07c80ceff89ffba772cce1ff8cbea9e77314a0 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Sun, 14 Oct 2018 22:51:54 -0700 Subject: [PATCH 24/36] Added saved form --- app/views/layouts/_form.html.erb | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/views/layouts/_form.html.erb b/app/views/layouts/_form.html.erb index 4c6b4c5c6b..1e8940e683 100644 --- a/app/views/layouts/_form.html.erb +++ b/app/views/layouts/_form.html.erb @@ -32,9 +32,3 @@ <% end %> - -
    - - -
    From 870aa83c8e98bcd50bc902fe605a21c723e717bd Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Sun, 14 Oct 2018 22:56:09 -0700 Subject: [PATCH 25/36] Found in stack overflow-- Select helper takes two options hashes, one for select, and the second for html options. So all you need is to give default empty options as first param after list of items and then add your class to html_options. This fixed the category drop down to be the entire width of the container --- app/views/layouts/_form.html.erb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/layouts/_form.html.erb b/app/views/layouts/_form.html.erb index 1e8940e683..3c99002685 100644 --- a/app/views/layouts/_form.html.erb +++ b/app/views/layouts/_form.html.erb @@ -4,7 +4,8 @@
    <%= f.label :category, "Category"%> -<%= f.select :category, ['movie', 'album','book'], class: "form-control"%> + +<%= f.select(:category, ['movie', 'album','book'], {}, class: "form-control")%>
    From 900abb17ddc3e0e4b9a6bfd460e953eeeaddfc44 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Sun, 14 Oct 2018 23:02:37 -0700 Subject: [PATCH 26/36] Updated HTML for users index page --- app/models/user.rb | 3 +++ app/views/users/index.html.erb | 26 ++++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index d087b46b22..a6f45a6172 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -2,4 +2,7 @@ class User < ApplicationRecord has_many :votes has_many :works, through: :votes + def date_joined + self.created_at.strftime("%b %-d, %Y") + end end diff --git a/app/views/users/index.html.erb b/app/views/users/index.html.erb index e28a7f7391..093517130e 100644 --- a/app/views/users/index.html.erb +++ b/app/views/users/index.html.erb @@ -1,2 +1,24 @@ -

    Userss#index

    -

    Find me in app/views/users/index.html.erb

    +
    +

    List of Users

    + + + + + + + + + + <% @users.each do |user|%> + + + + + + <%end%> + +
    UsernameVotesJoined
    <%=link_to user.username, user_path(user.id) %><%= user.votes.length %><%= user.date_joined %>
    + + <%=link_to "Back to Media List", root_path, class: "btn btn-secondary" %> + +
    From 38c6795a9f052a923ad64fe2a4e6b6b06f64daea Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 15 Oct 2018 00:26:27 -0700 Subject: [PATCH 27/36] Fixed spotlight page to have correct formatting --- app/controllers/works_controller.rb | 8 ++- app/models/work.rb | 12 ++++- app/views/works/index.html.erb | 24 ++++++--- app/views/works/main.html.erb | 81 ++++++++++++++++++++++------- app/views/works/new.html.erb | 1 - 5 files changed, 94 insertions(+), 32 deletions(-) diff --git a/app/controllers/works_controller.rb b/app/controllers/works_controller.rb index 228ce8820a..0598c49c11 100644 --- a/app/controllers/works_controller.rb +++ b/app/controllers/works_controller.rb @@ -2,7 +2,7 @@ class WorksController < ApplicationController before_action :find_work, only: [:show, :edit, :update, :destroy, :upvote] def index - @works = Work.all.order(:title) + @works = Work.all.sort_by{|work| -work.votes.length} @albums = Work.category('album') @@ -32,6 +32,10 @@ def upvote def main @works = Work.all.order(:title) + @spotlight = Work.spotlight + @top_albums = Work.top_albums + @top_movies = Work.top_movies + @top_books = Work.top_books end def show; end @@ -87,7 +91,7 @@ def find_work def work_params - return params.require(:work).permit(:title,:category,:publication_year,:description) + return params.require(:work).permit(:title,:category,:publication_year,:description,:creator) end end diff --git a/app/models/work.rb b/app/models/work.rb index e9dd4f35ee..a92df42daa 100644 --- a/app/models/work.rb +++ b/app/models/work.rb @@ -12,11 +12,21 @@ def self.category(media) return Work.all.order(:title).select {|work| work.category == media} end - def spotlight + def self.spotlight + return Work.all.max_by { |work| work.votes.length } + end + def self.top_albums + return Work.category('album').max_by(10) { |work| work.votes.length } end + def self.top_movies + return Work.category('movie').max_by(10) { |work| work.votes.length } + end + def self.top_books + return Work.category('book').max_by(10) { |work| work.votes.length } + end end diff --git a/app/views/works/index.html.erb b/app/views/works/index.html.erb index fb6ac0d1dc..abbd8a012a 100644 --- a/app/views/works/index.html.erb +++ b/app/views/works/index.html.erb @@ -1,8 +1,10 @@ -

    Works#index

    -

    Find me in app/views/works/index.html.erb

    +
    +

    List of Works

    +
    <%['movie', 'book', 'album'].each do |category| %> -

    <%=category%>s

    - +

    <%=category.capitalize%>s

    +
    + @@ -10,19 +12,25 @@ - + + <% @works.each do |work| %> <%if category == work.category%> - + - + <%end%> <%end%> +
    Votes TitlePublished Upvote
    VOTES<%= work.votes.length %> <%=link_to work.title, work_path(work.id) %> <%=work.creator%> <%=work.publication_year%><%=link_to "Upvote", upvote_path(work.id), method: :post %><%=link_to "Upvote", upvote_path(work.id), method: :post, class: "btn btn-primary" %>
    - +
    <%end%> + +<%=link_to "View top media", root_path,class: "btn btn-secondary" %> +<%=link_to "Add a new work", new_work_path, class: "btn btn-primary" %> +
    diff --git a/app/views/works/main.html.erb b/app/views/works/main.html.erb index 26ddd150b0..0e0baccae2 100644 --- a/app/views/works/main.html.erb +++ b/app/views/works/main.html.erb @@ -1,24 +1,65 @@ +
    +
    +

    + Media Spotlight + <%= link_to "#{@spotlight.title}", work_path(@spotlight.id) , class: "spotlight__link-to" %> + by <%=@spotlight.creator%> +

    +

    + <%= @spotlight.votes.length %> votes - <%= @spotlight.description %> +

    +
    -
    -

    - Media Spotlight - <%= link_to "@works.spotlight.title", work_path(@works.ids) , class: "spotlight__link-to" %> -

    -

    - 2 votes - take me back! -

    -
    +
    +
    +
    +

    Top Movies

    +
      + <% @top_movies.each do |work| %> +
    • +

      <%= link_to "#{work.title}", work_path(work.id)%> + by <%=work.creator%> +

      +

      + <%= work.votes.length %> votes +

      +
    • + <%end%> +
    +
    -<%['movie', 'book', 'album'].each do |category| %> -

    Top <%=category.capitalize%>s

    - <% @works.each do |work| %> - <%if category == work.category%> -

    <%= link_to "#{work.title}", work_path(work.id)%> by <%=work.creator%>

    -

    - Votes: Method goes here -

    - <%end%> - <%end%> -<%end%> +
    +

    Top Books

    +
      + <% @top_books.each do |work| %> +
    • +

      <%= link_to "#{work.title}", work_path(work.id)%> + by <%=work.creator%> +

      +

      + <%= work.votes.length %> votes +

      +
    • + <%end%> +
    +
    + +
    +

    Top Albums

    +
      + <% @top_albums.each do |work| %> +
    • +

      <%= link_to "#{work.title}", work_path(work.id)%> + by <%=work.creator%> +

      +

      + <%= work.votes.length %> votes +

      +
    • + <%end%> +
    +
    +
    +
    diff --git a/app/views/works/new.html.erb b/app/views/works/new.html.erb index 74d7b73a5a..afa64530e7 100644 --- a/app/views/works/new.html.erb +++ b/app/views/works/new.html.erb @@ -1,6 +1,5 @@
    - <%= render partial: "layouts/form", locals: {message: "Add a new work", button_text: 'Create Work' From dc508df4e04ed90be3bbda9c1dfa1673163cd26e Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 15 Oct 2018 00:29:53 -0700 Subject: [PATCH 28/36] Removed Votes controller because no views are shown for votes, using rails destroy controller --- app/assets/javascripts/votes.js | 2 - app/assets/stylesheets/votes.scss | 3 -- app/controllers/votes_controller.rb | 52 ----------------------- app/helpers/votes_helper.rb | 2 - app/views/votes/index.html.erb | 2 - app/views/votes/show.html.erb | 2 - test/controllers/votes_controller_test.rb | 7 --- 7 files changed, 70 deletions(-) delete mode 100644 app/assets/javascripts/votes.js delete mode 100644 app/assets/stylesheets/votes.scss delete mode 100644 app/controllers/votes_controller.rb delete mode 100644 app/helpers/votes_helper.rb delete mode 100644 app/views/votes/index.html.erb delete mode 100644 app/views/votes/show.html.erb delete mode 100644 test/controllers/votes_controller_test.rb diff --git a/app/assets/javascripts/votes.js b/app/assets/javascripts/votes.js deleted file mode 100644 index dee720facd..0000000000 --- a/app/assets/javascripts/votes.js +++ /dev/null @@ -1,2 +0,0 @@ -// Place all the behaviors and hooks related to the matching controller here. -// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/votes.scss b/app/assets/stylesheets/votes.scss deleted file mode 100644 index 9a6720f80e..0000000000 --- a/app/assets/stylesheets/votes.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the Votes controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/votes_controller.rb b/app/controllers/votes_controller.rb deleted file mode 100644 index 6f760b3ef5..0000000000 --- a/app/controllers/votes_controller.rb +++ /dev/null @@ -1,52 +0,0 @@ -class VotesController < ApplicationController - - # def index - # @votes = Votes.all.order(:title) - # end - # - # def show - # id = params[:id] - # @vote = Votes.find_by(id: id) - # - # if @vote.nil? - # render :notfound, status: :not_found - # end - # end - - # def new - # @vote = Vote.new - # end - # - # def create - # @vote = Votes.new(vote_params) - # if @vote.save - # redirect_to vote_path(@vote.id) - # else - # render :new - # end - # end - - # def edit - # @vote = Votes.find_by(id: params[:id]) - # end - # - # - # def update - # @vote = Votes.find_by(id: params[:id]) - # if @vote.update(vote_params) - # redirect_to vote_path(@vote.id) - # end - # end - # - # def destroy - # vote = Votes.find_by(id: params[:id]) - # vote.destroy - # redirect_to votes_path - # end - - # private - # - # def vote_params - # return params.require(:vote).permit(:title) - # end -end diff --git a/app/helpers/votes_helper.rb b/app/helpers/votes_helper.rb deleted file mode 100644 index 5a82eed07d..0000000000 --- a/app/helpers/votes_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module VotesHelper -end diff --git a/app/views/votes/index.html.erb b/app/views/votes/index.html.erb deleted file mode 100644 index ebf0349bb5..0000000000 --- a/app/views/votes/index.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

    Votes#index

    -

    Find me in app/views/votes/index.html.erb

    diff --git a/app/views/votes/show.html.erb b/app/views/votes/show.html.erb deleted file mode 100644 index 4e770528dc..0000000000 --- a/app/views/votes/show.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

    Votes#show

    -

    Find me in app/views/votes/show.html.erb

    diff --git a/test/controllers/votes_controller_test.rb b/test/controllers/votes_controller_test.rb deleted file mode 100644 index 925f0f2ca1..0000000000 --- a/test/controllers/votes_controller_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require "test_helper" -# -# describe VotesController do -# # it "must be a real test" do -# # flunk "Need real tests" -# # end -# end From 36f309cbf600724a2fb7cc1eb203a3c68375150b Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 15 Oct 2018 00:31:18 -0700 Subject: [PATCH 29/36] Cleaned up CSS --- app/assets/stylesheets/application.scss | 174 ++++++++++++------------ 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index bcddcd7eda..002785676e 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -50,125 +50,125 @@ } body, h1, h2, h3, h4, h5 { - font-family: "Gudea", sans-serif; + font-family: "Gudea", sans-serif; } - h1, h2, h3, h4, h5 { - font-weight: bold; +h1, h2, h3, h4, h5 { + font-weight: bold; } - a, h2, h3 { - color: #26A69A; +a, h2, h3 { + color: #26A69A; } - main { - padding: 2rem; +main { + padding: 2rem; } - a:hover { +a:hover { color: #00796B; text-decoration: none; } - .btn:hover { +.btn:hover { background-color: #00796B; } - .btn-primary { - background-color: #26A69A; - color: white; - border-color: #26A69A; +.btn-primary { + background-color: #26A69A; + color: white; + border-color: #26A69A; } - .alert__container { - margin: 2rem 0 1rem 0; +.alert__container { + margin: 2rem 0 1rem 0; } - .alert-warning { - color: #856404; - background-color: #fff3cd; - border-color: #ffeeba; +.alert-warning { + color: #856404; + background-color: #fff3cd; + border-color: #ffeeba; } - .alert { - position: relative; - padding: 0.75rem 1.25rem; - margin-bottom: 1rem; - border: 1px solid transparent; - border-radius: 0.25rem; +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; } - .table td { - vertical-align: middle; +.table td { + vertical-align: middle; } - .app-header__header { - max-width: 100%; - background-color: #B2DFDB; - margin-bottom: 0.5rem; - padding: 2rem 1rem 0.5rem 1rem; +.app-header__header { + max-width: 100%; + background-color: #B2DFDB; + margin-bottom: 0.5rem; + padding: 2rem 1rem 0.5rem 1rem; } - .app-header__header h1 { - text-align: center; - margin: 25px auto 40px auto; +.app-header__header h1 { + text-align: center; + margin: 25px auto 40px auto; } - .app-header__header h1 a { - color: #FF5722; - padding-right: 25px; - margin-right: 15px; - border-right: white 2px solid; +.app-header__header h1 a { + color: #FF5722; + padding-right: 25px; + margin-right: 15px; + border-right: white 2px solid; } - .app-header__header h1 small { - color: white; +.app-header__header h1 small { + color: white; } - .app-header__nav { - display: flex; - flex-direction: row; - justify-content: space-between; +.app-header__nav { + display: flex; + flex-direction: row; + justify-content: space-between; } - .app-header__user-nav-container .nav-item { - margin-left: 2rem; +.app-header__user-nav-container .nav-item { + margin-left: 2rem; } - .app-header__nav_item { - margin-top: 1rem; +.app-header__nav_item { + margin-top: 1rem; } - .app-header__nav_item .nav-link { - color: #00796B; +.app-header__nav_item .nav-link { + color: #00796B; } - .works-votes__container { - margin-top: 2rem; +.works-votes__container { + margin-top: 2rem; } - .works-votes__header { - color: black; +.works-votes__header { + color: black; } - .spotlight { - padding: 0 2rem 2rem 2rem; +.spotlight { + padding: 0 2rem 2rem 2rem; } - .spotlight__header--prefix { - color: #424242; +.spotlight__header--prefix { + color: #424242; } - .spotlight__link-to { - border-bottom: 2px solid; +.spotlight__link-to { + border-bottom: 2px solid; } - .root__hr { - margin: 0px auto 3rem auto; - color: #EEEEEE; +.root__hr { + margin: 0px auto 3rem auto; + color: #EEEEEE; } - .top-ten__container { - display: grid; - grid-template-columns: 1fr 1fr 1fr; - grid-column-gap: 2em; +.top-ten__container { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-column-gap: 2em; } - .top-ten__header { - color: #26A69A; - border-bottom: 2px solid; - border-bottom-color: #B2DFDB; +.top-ten__header { + color: #26A69A; + border-bottom: 2px solid; + border-bottom-color: #B2DFDB; } - .top-ten__list { - list-style-type: none; - margin-left: 0; - padding-left: 0; +.top-ten__list { + list-style-type: none; + margin-left: 0; + padding-left: 0; } - .list-group-item { - border: none; +.list-group-item { + border: none; } - .table { - width: 100%; - margin-bottom: 1rem; - background-color: transparent; +.table { + width: 100%; + margin-bottom: 1rem; + background-color: transparent; } - .user-votes__container { - margin-top: 2rem; +.user-votes__container { + margin-top: 2rem; } - .user-votes__header { - color: black; +.user-votes__header { + color: black; } From e1210d03658c2f01875bab022f797f5f4db59036 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 15 Oct 2018 00:33:59 -0700 Subject: [PATCH 30/36] Updated routes --- app/controllers/users_controller.rb | 16 +--------------- config/credentials.yml.enc | 2 +- config/routes.rb | 11 ++++------- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index d803a955c5..6a9ab3170f 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,6 +1,6 @@ class UsersController < ApplicationController - + def index @users = User.all.order(:username) @@ -25,19 +25,6 @@ def login end end - - - - - # def create - # @user = User.new(user_params) - # if @user.save - # redirect_to user_path(@user.id) - # else - # render :new - # end - # end - def edit @user = User.find_by(id: params[:id]) end @@ -51,7 +38,6 @@ def show end end - def update @user = User.find_by(id: params[:id]) if @user.update(user_params) diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc index 74b5d379a2..97072701cd 100644 --- a/config/credentials.yml.enc +++ b/config/credentials.yml.enc @@ -1 +1 @@ -ER+J52zzYtrhHViWjq1ND0JiD5I+pc8fBf2/TxI1TjhUcKigcGEc2kk1G+0uSU/IIILAaRbu9u8QjK3mZGp4/8rVwRBO/BZULUiJHiuuMToJN4STJgO/PZS1XJIVls7USeWWe/BrvBs3AEMkDcDxMcQwsPTMbkbOq+kdSZdcU3DpiCYGWu7G5L/CJ9dMvZB6NPRKQF3cV+H9tnOa8Vsyp2j1JHz7WR9+a3dAxU3q9zAnK6o1rsrdJCx+MfiIlZBCLdVxK3TSPcaxtPNHl5YjklYh8jrgGESp6ZW4VQ9CsmCardagsgU28gTTyg8dLYyPUMaz80ziozKPPLF05RT+46pYsmdJb0H1X0JEXOPlgwTSwQsFG620x3fHn1V4vAetH4h6LxqnrI6GEtSW45TKODEV/er5icLp3miU--NSEMK649DchO4EHW--kGTgqlyr5PsAR167XB/keQ== \ No newline at end of file +ER+J52zzYtrhHViWjq1ND0JiD5I+pc8fBf2/TxI1TjhUcKigcGEc2kk1G+0uSU/IIILAaRbu9u8QjK3mZGp4/8rVwRBO/BZULUiJHiuuMToJN4STJgO/PZS1XJIVls7USeWWe/BrvBs3AEMkDcDxMcQwsPTMbkbOq+kdSZdcU3DpiCYGWu7G5L/CJ9dMvZB6NPRKQF3cV+H9tnOa8Vsyp2j1JHz7WR9+a3dAxU3q9zAnK6o1rsrdJCx+MfiIlZBCLdVxK3TSPcaxtPNHl5YjklYh8jrgGESp6ZW4VQ9CsmCardagsgU28gTTyg8dLYyPUMaz80ziozKPPLF05RT+46pYsmdJb0H1X0JEXOPlgwTSwQsFG620x3fHn1V4vAetH4h6LxqnrI6GEtSW45TKODEV/er5icLp3miU--NSEMK649DchO4EHW--kGTgqlyr5PsAR167XB/keQ== diff --git a/config/routes.rb b/config/routes.rb index 500a7fd8a0..16f730c4fe 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,14 +1,11 @@ Rails.application.routes.draw do root 'works#main' resources :works - resources :votes + post 'works/:id/upvote', to: 'works#upvote', as: 'upvote' -resources :users - post 'users/login', to: 'users#login', as: 'login' - delete 'users/destroy', to: 'users#destroy', as: 'logout' - - -post 'works/:id/upvote', to: 'works#upvote', as: 'upvote' + resources :users + post 'users/login', to: 'users#login', as: 'login' + delete 'users/destroy', to: 'users#destroy', as: 'logout' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end From 437c1762d63d2bb56c2f3e93491b40ff453ef993 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 15 Oct 2018 01:08:11 -0700 Subject: [PATCH 31/36] Unsuccessfully tried to get the owl logo to show up on the tab --- app/assets/images/owl.png | Bin 0 -> 13218 bytes app/controllers/users_controller.rb | 3 +++ app/views/layouts/application.html.erb | 1 + app/views/users/show.html.erb | 36 +++++++++++++++++++++++-- 4 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 app/assets/images/owl.png diff --git a/app/assets/images/owl.png b/app/assets/images/owl.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ded309503e7f923da57cb00fa145fbf656ae56 GIT binary patch literal 13218 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 ZFR+vzabUC16e0W$Ojvqq0Gd4dzW|J{wv7M) literal 0 HcmV?d00001 diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 6a9ab3170f..5cacdc3086 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -33,9 +33,12 @@ def show id = params[:id] @user = User.find_by(id: id) + if @user.nil? render :notfound, status: :not_found end + + @votes = @user.votes end def update diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index a51f9de1e4..57bf629d15 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -7,6 +7,7 @@ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index e5fa3adf14..6b29e5a967 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -1,2 +1,34 @@ -

    Users#show

    -

    Find me in app/views/users/show.html.erb

    +
    +

    User Summary: <%= link_to "#{@user.username}", user_path(@user.id)%>

    +

    Joined site <%=@user.date_joined%>

    + +
    +

    Votes

    + + + + + + + + + + + + <% @votes.each do |vote| %> + + + + + + + + <%end%> + +
    Media TitleCreated ByPublishedCategoryVoted On
    <%=link_to vote.work.title, work_path(vote.work_id) %><%=vote.work.creator%><%=vote.work.publication_year%><%=vote.work.category.capitalize%><%=vote.date_format%>
    +
    + + <%=link_to "See all Users", users_path,class:"btn btn-secondary" %> + <%=link_to "Back to Media List", root_path,class:"btn btn-primary" %> + +
    From 96a95f83953e6341ff8a4016a886f3439674d608 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 15 Oct 2018 01:21:54 -0700 Subject: [PATCH 32/36] Successfully deployed, updated username form --- app/views/users/new.html.erb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/views/users/new.html.erb b/app/views/users/new.html.erb index be0fc02cab..9569908105 100644 --- a/app/views/users/new.html.erb +++ b/app/views/users/new.html.erb @@ -1,9 +1,15 @@ +

    Log In

    <%= form_with model: @user, url: login_path, method: :post do |f| %> +
    <%= f.label :username, "Username"%> -<%= f.text_field :username%> +<%= f.text_field :username,id:"username" class:"form-control"%> +
    +
    <%= f.submit 'Login', class: "btn btn-primary"%> +
    <% end %> +
    From 6122bd1b0965bfec35532958b4c83c44be1f6b4e Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 15 Oct 2018 01:26:44 -0700 Subject: [PATCH 33/36] Added a bug in the form, needed ot add an extra comma --- app/views/users/new.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/users/new.html.erb b/app/views/users/new.html.erb index 9569908105..af7f3c2a44 100644 --- a/app/views/users/new.html.erb +++ b/app/views/users/new.html.erb @@ -4,7 +4,7 @@ <%= form_with model: @user, url: login_path, method: :post do |f| %>
    <%= f.label :username, "Username"%> -<%= f.text_field :username,id:"username" class:"form-control"%> +<%= f.text_field :username,id:"username", class:"form-control"%>
    From 96289f5d911e7cfc4ecbbc369b7a12f6ce9e634b Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 15 Oct 2018 01:30:04 -0700 Subject: [PATCH 34/36] Added extra alert class to flash messages div --- app/views/layouts/application.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 57bf629d15..9bb37b2158 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -38,11 +38,11 @@ <% flash.each do |name, message| %> <% if message.class == Array %> <% message.each do |msg| %> -
    +
    <%= "#{name}:" %><%= " #{msg}" %>
    <% end %> <% else %> -
    +
    <%= message %>
    <% end %> From cd7e52b890dfbc7d06cf096284c52bbe973b69a0 Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 15 Oct 2018 07:30:42 -0700 Subject: [PATCH 35/36] Updated tests for user and votes --- test/fixtures/users.yml | 17 ++++++++++--- test/fixtures/votes.yml | 8 ++++-- test/fixtures/works.yml | 18 ++++++------- test/models/user_test.rb | 28 +++++++++++++++++--- test/models/vote_test.rb | 55 +++++++++++++++++++++++++++++++++++++--- test/models/work_test.rb | 15 ++++++----- 6 files changed, 113 insertions(+), 28 deletions(-) diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index 952febd97d..fbb93d356f 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -1,7 +1,16 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - username: MyString +danielle: + username: Danielle -two: - username: MyString +jane: + username: Jane + +austin: + username: Austin + +renee: + username: Renee + +tom: + username: Tom diff --git a/test/fixtures/votes.yml b/test/fixtures/votes.yml index dc3ee79b5d..032322b3aa 100644 --- a/test/fixtures/votes.yml +++ b/test/fixtures/votes.yml @@ -4,8 +4,12 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} +voteone: + work: harrypotter + user: danielle # column: value # -two: {} +votetwo: + work: pride + user: danielle # column: value diff --git a/test/fixtures/works.yml b/test/fixtures/works.yml index 74a3773d18..555beafc63 100644 --- a/test/fixtures/works.yml +++ b/test/fixtures/works.yml @@ -1,15 +1,15 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html harrypotter: - title: 'Harry Potter' - creator: 'Warner Brothers' + title: Harry Potter + creator: Warner Brothers publication_year: 2005 - description: 'A movie about Harry Potter' - category: 'movie' + description: A movie about Harry Potter + category: movie pride: - title: 'Pride & Prejudice' - creator: 'Jane Austen' - publication_year: '1990' - description: 'Mr. Darcy' - category: 'book' + title: Pride & Prejudice + creator: Jane Austen + publication_year: 1990 + description: Mr. Darcy + category: book diff --git a/test/models/user_test.rb b/test/models/user_test.rb index cc862ac2d9..98ade281dc 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -1,9 +1,31 @@ require "test_helper" describe User do - let(:user) { User.new } + describe "Relations" do + let(:user) { User.new } + let(:danielle) {users(:danielle)} - it "must be valid" do - value(user).must_be :valid? + it "must be valid" do + value(user).must_be :valid? + end + + it "has many votes" do + danielle.must_respond_to :votes + expect(danielle.votes.length).must_equal 2 + danielle.votes.each do |vote| + expect(vote).must_be_instance_of Vote + end + end + + it "has many works" do + danielle.must_respond_to :works + expect(danielle.works.length).must_equal 2 + danielle.works.each do |work| + expect(work).must_be_instance_of Work + end + end + end + + describe "Validations" do end end diff --git a/test/models/vote_test.rb b/test/models/vote_test.rb index fc15947bd3..40db248d3c 100644 --- a/test/models/vote_test.rb +++ b/test/models/vote_test.rb @@ -1,9 +1,58 @@ require "test_helper" describe Vote do - let(:vote) { Vote.new } - it "must be valid" do - value(vote).must_be :valid? + describe "relations" do + let(:vote1) { votes(:voteone) } + it "must be valid" do + value(vote1).must_be :valid? + end + it "has a work" do + vote1.must_respond_to :work + vote1.work.must_be_kind_of Work + end + it "has a user" do + vote1.must_respond_to :user + vote1.user.must_be_kind_of User + end + end + + describe "Validations" do + let(:pride) { works(:pride) } + let(:hp) { works(:harrypotter) } + let(:renee) { users(:renee) } + let(:austin) { users(:austin) } + + it "allows a user to vote for a work" do + vote1 = Vote.new(work: pride, user: renee) + vote1.save + expect(vote1).must_be :valid? + end + + it "allows multiple users to vote for a work" do + vote1 = Vote.new(work: pride, user: renee) + vote1.save + vote2 = Vote.new(work: pride, user: austin) + vote2.save + expect(vote2).must_be :valid? + end + + it "allows one user to vote for multiple works" do + vote1 = Vote.new(work: pride, user: renee) + vote1.save + vote2 = Vote.new(work: hp, user: renee) + vote2.save + expect(vote2).must_be :valid? + end + + it "allows user to only vote once for a work" do + vote1 = Vote.new(work: pride, user: renee) + vote1.save + vote2 = Vote.new(work: pride, user: renee) + valid = vote2.save + + expect(valid).must_equal false + expect(vote2.errors.messages).must_include :work_id + end end end diff --git a/test/models/work_test.rb b/test/models/work_test.rb index 18366ddcfb..d2d05c3b1b 100644 --- a/test/models/work_test.rb +++ b/test/models/work_test.rb @@ -16,18 +16,19 @@ end # describe 'Relationships' do - # it 'belongs to an author' do + # it 'can have many votes' do # # Arrange (done with let) - # + # work = works(:harrypotter) + # new_vote = votes(:voteone) # # Act - # author = book.author + # vote = work.votes # # # Assert - # expect(author).must_be_instance_of Author - # expect(author.id).must_equal book.author_id + # expect(vote).must_be_instance_of Vote + # expect(vote.id).must_equal work.votes_id # end # - # it 'can have many genres' do + # it 'can have many users' do # # Arrange, did with let # # # Act @@ -41,7 +42,7 @@ # expect(genre).must_be_instance_of Genre # end # end - # end + #end describe 'validations' do it 'must have a title' do From 0fd484ca9ca3021276dab2675958d8538142f33c Mon Sep 17 00:00:00 2001 From: Danielle Metzner Date: Mon, 15 Oct 2018 07:55:23 -0700 Subject: [PATCH 36/36] Added more tests to work model --- test/fixtures/works.yml | 54 ++++++++++++++++++++++++++ test/models/work_test.rb | 82 +++++++++++++++++++++++++++++----------- 2 files changed, 114 insertions(+), 22 deletions(-) diff --git a/test/fixtures/works.yml b/test/fixtures/works.yml index 555beafc63..7c0582a585 100644 --- a/test/fixtures/works.yml +++ b/test/fixtures/works.yml @@ -13,3 +13,57 @@ pride: publication_year: 1990 description: Mr. Darcy category: book + +donniedarko: + title: Donnie Darko + creator: Flower Films + publication_year: 2001 + category: movie + +10things: + title: 10 things I hate about you + creator: Touchstone + publication_year: 1999 + category: movie + +candles: + title: 16 Candles + creator: Universal + publication_year: 1984 + category: movie + +hp2: + title: Harry Potter and the Chamber of Secrets + creator: WB + publication_year: 2002 + category: movie + +hp3: + title: Harry Potter and the Prisoner of Azkaban + creator: WB + publication_year: 2004 + category: movie + +hp4: + title: Harry Potter and the Goblet of Fire + creator: WB + publication_year: 2006 + category: movie + +hp5: + title: Harry Potter and the Order of the Phoenix + creator: WB + publication_year: 2007 + category: movie + +hp6: + title: Harry Potter and the Half Blood Prince + creator: WB + publication_year: 2008 + category: movie + +hp7: + title: Harry Potter and the Deathly Hallows + creator: WB + publication_year: 2009 + category: movie diff --git a/test/models/work_test.rb b/test/models/work_test.rb index d2d05c3b1b..ab3db06ea5 100644 --- a/test/models/work_test.rb +++ b/test/models/work_test.rb @@ -15,18 +15,18 @@ end end - # describe 'Relationships' do - # it 'can have many votes' do - # # Arrange (done with let) - # work = works(:harrypotter) - # new_vote = votes(:voteone) - # # Act - # vote = work.votes - # - # # Assert - # expect(vote).must_be_instance_of Vote - # expect(vote.id).must_equal work.votes_id - # end + describe 'Relationships' do + it 'can have many votes' do + # Arrange (done with let) + work = works(:harrypotter) + vote1 = votes(:voteone) + # Act + vote = work.votes + + # Assert + expect(vote).must_be_instance_of Vote + expect(vote.id).must_equal work.votes_id + end # # it 'can have many users' do # # Arrange, did with let @@ -42,7 +42,7 @@ # expect(genre).must_be_instance_of Genre # end # end - #end + end describe 'validations' do it 'must have a title' do @@ -60,21 +60,30 @@ expect(work.errors.messages[:title]).must_equal ["can't be blank"] end + it 'cannot have category other than movie, album or book' do + # Arrange + work = works(:harrypotter) + + [nil, "art", 123, "indie"].each do |cat| + work.category = cat + valid = work.save + expect(valid).must_equal false + expect(work.errors.messages).must_include :category + end + end + it 'must have category movie, album or book' do # Arrange work = works(:harrypotter) - work.category = 'art' - # Act - #valid = book.valid? - valid = work.save + ["movie", "album", "book"].each do |cat| + work.category = cat + valid = work.save + expect(valid).must_equal true + end - # Assert - expect(valid).must_equal false - expect(work.errors.messages).must_include :category end - it 'requires a unique title in category' do #other_book = book.clone other_work = works(:pride) @@ -86,7 +95,8 @@ expect(valid).must_equal false expect(other_work.errors.messages).must_include :title end - it 'will allow a title that already exits if its in a different category' do + + it 'will allow a title that already exists if its in a different category' do #other_book = book.clone other_work = works(:pride) other_work.title = work.title @@ -96,4 +106,32 @@ expect(valid).must_equal true end end + + describe 'Media Page - Methods' do + it 'return top 10 of a given category' do + ten_movies = Work.top_movies + expect(ten_movies.length).must_equal 10 + ten_movies.each do |movie| + expect(movie.category).must_equal "movie" + end + end + + it 'will only return 10 if there are more than 10 in a category' do + new_movie = Work.new + new_movie.title = "some movie" + new_movie.category = "movie" + new_movie.save + + ten_movies = Work.top_movies + + expect(ten_movies.length).must_equal 10 + end + + it 'will only return less than 10 works if there are less than 10 in the category' do + + ten_books = Work.top_books + + expect(ten_books.length).must_equal 1 + end + end end