diff options
| author | Star Rauchenberger <fefferburbia@gmail.com> | 2024-12-07 10:33:07 -0500 |
|---|---|---|
| committer | Star Rauchenberger <fefferburbia@gmail.com> | 2024-12-07 10:33:07 -0500 |
| commit | 9681897e9ace534c4559fa9be20aa86af1a42e13 (patch) | |
| tree | 85fbe155f6d1db7f8e232dac40be109fa066f9ed | |
| parent | de217df62df5725450ba7fd0084a00a8ebe24599 (diff) | |
| download | thoughts-9681897e9ace534c4559fa9be20aa86af1a42e13.tar.gz thoughts-9681897e9ace534c4559fa9be20aa86af1a42e13.tar.bz2 thoughts-9681897e9ace534c4559fa9be20aa86af1a42e13.zip | |
Add daily upvote email like AO3 kudos
| -rw-r--r-- | Capfile | 1 | ||||
| -rw-r--r-- | Gemfile | 1 | ||||
| -rw-r--r-- | Gemfile.lock | 4 | ||||
| -rw-r--r-- | app/mailers/vote_mailer.rb | 7 | ||||
| -rw-r--r-- | app/models/quote.rb | 4 | ||||
| -rw-r--r-- | app/views/vote_mailer/daily_report_email.html.haml | 8 | ||||
| -rw-r--r-- | app/views/vote_mailer/daily_report_email.text.erb | 5 | ||||
| -rw-r--r-- | config/schedule.rb | 23 | ||||
| -rw-r--r-- | lib/tasks/tasks.rake | 10 | ||||
| -rw-r--r-- | test/mailers/previews/vote_mailer_preview.rb | 11 | ||||
| -rw-r--r-- | test/mailers/vote_mailer_test.rb | 12 |
11 files changed, 86 insertions, 0 deletions
| diff --git a/Capfile b/Capfile index 1ace4ce..8915892 100644 --- a/Capfile +++ b/Capfile | |||
| @@ -14,6 +14,7 @@ require "capistrano/bundler" | |||
| 14 | require "capistrano/rails/assets" | 14 | require "capistrano/rails/assets" |
| 15 | require "capistrano/rails/migrations" | 15 | require "capistrano/rails/migrations" |
| 16 | require "capistrano/passenger" | 16 | require "capistrano/passenger" |
| 17 | require "whenever/capistrano" | ||
| 17 | 18 | ||
| 18 | # Load custom tasks from `lib/capistrano/tasks` if you have any defined | 19 | # Load custom tasks from `lib/capistrano/tasks` if you have any defined |
| 19 | Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r } | 20 | Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r } |
| diff --git a/Gemfile b/Gemfile index de04f85..d74e090 100644 --- a/Gemfile +++ b/Gemfile | |||
| @@ -85,3 +85,4 @@ gem 'active_storage_validations' | |||
| 85 | gem "image_processing", ">= 1.2" | 85 | gem "image_processing", ">= 1.2" |
| 86 | gem "meta-tags" | 86 | gem "meta-tags" |
| 87 | gem 'rails_autolink' | 87 | gem 'rails_autolink' |
| 88 | gem 'whenever', "~> 1.0.0", require: false | ||
| diff --git a/Gemfile.lock b/Gemfile.lock index ce12201..2980acc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock | |||
| @@ -135,6 +135,7 @@ GEM | |||
| 135 | rack (>= 1.0.0) | 135 | rack (>= 1.0.0) |
| 136 | rack-test (>= 0.5.4) | 136 | rack-test (>= 0.5.4) |
| 137 | xpath (>= 2.0, < 4.0) | 137 | xpath (>= 2.0, < 4.0) |
| 138 | chronic (0.10.2) | ||
| 138 | climate_control (0.2.0) | 139 | climate_control (0.2.0) |
| 139 | coffee-rails (4.2.2) | 140 | coffee-rails (4.2.2) |
| 140 | coffee-script (>= 2.2.0) | 141 | coffee-script (>= 2.2.0) |
| @@ -364,6 +365,8 @@ GEM | |||
| 364 | websocket-driver (0.7.6) | 365 | websocket-driver (0.7.6) |
| 365 | websocket-extensions (>= 0.1.0) | 366 | websocket-extensions (>= 0.1.0) |
| 366 | websocket-extensions (0.1.5) | 367 | websocket-extensions (0.1.5) |
| 368 | whenever (1.0.0) | ||
| 369 | chronic (>= 0.6.3) | ||
| 367 | will_paginate (4.0.0) | 370 | will_paginate (4.0.0) |
| 368 | xpath (3.2.0) | 371 | xpath (3.2.0) |
| 369 | nokogiri (~> 1.8) | 372 | nokogiri (~> 1.8) |
| @@ -418,6 +421,7 @@ DEPENDENCIES | |||
| 418 | tzinfo-data | 421 | tzinfo-data |
| 419 | web-console (>= 3.3.0) | 422 | web-console (>= 3.3.0) |
| 420 | webrick (~> 1.7) | 423 | webrick (~> 1.7) |
| 424 | whenever (~> 1.0.0) | ||
| 421 | will_paginate (~> 4.0) | 425 | will_paginate (~> 4.0) |
| 422 | 426 | ||
| 423 | BUNDLED WITH | 427 | BUNDLED WITH |
| diff --git a/app/mailers/vote_mailer.rb b/app/mailers/vote_mailer.rb new file mode 100644 index 0000000..77ac3d1 --- /dev/null +++ b/app/mailers/vote_mailer.rb | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | class VoteMailer < ApplicationMailer | ||
| 2 | def daily_report_email | ||
| 3 | @entries = params[:votes].group_by { |v| "#{v.votable_type}_#{v.votable_id}" }.values | ||
| 4 | # weird way of getting the admin's email | ||
| 5 | mail to: User.first.email, subject: "[Four Island] You have upvotes!" | ||
| 6 | end | ||
| 7 | end | ||
| diff --git a/app/models/quote.rb b/app/models/quote.rb index 518d53b..3301667 100644 --- a/app/models/quote.rb +++ b/app/models/quote.rb | |||
| @@ -17,6 +17,10 @@ class Quote < ApplicationRecord | |||
| 17 | scope :published, -> { where(state: :published) } | 17 | scope :published, -> { where(state: :published) } |
| 18 | scope :pending, -> { where(state: :pending) } | 18 | scope :pending, -> { where(state: :pending) } |
| 19 | 19 | ||
| 20 | def title | ||
| 21 | "Quote \##{id}" | ||
| 22 | end | ||
| 23 | |||
| 20 | def published_date | 24 | def published_date |
| 21 | created_at.strftime("%B %d %Y at %I:%M:%S") + created_at.strftime(" %p").downcase + created_at.strftime(" %Z") | 25 | created_at.strftime("%B %d %Y at %I:%M:%S") + created_at.strftime(" %p").downcase + created_at.strftime(" %Z") |
| 22 | end | 26 | end |
| diff --git a/app/views/vote_mailer/daily_report_email.html.haml b/app/views/vote_mailer/daily_report_email.html.haml new file mode 100644 index 0000000..ab54df2 --- /dev/null +++ b/app/views/vote_mailer/daily_report_email.html.haml | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | %p | ||
| 2 | Users have upvoted content on Four Island in the last day! | ||
| 3 | %ul | ||
| 4 | - @entries.each do |entry| | ||
| 5 | %li | ||
| 6 | %strong= pluralize(entry.size, "person") | ||
| 7 | left an upvote on | ||
| 8 | = link_to entry.first.votable.title, entry.first.votable, style: "font-weight: bold; font-style: italic" | ||
| diff --git a/app/views/vote_mailer/daily_report_email.text.erb b/app/views/vote_mailer/daily_report_email.text.erb new file mode 100644 index 0000000..22ea368 --- /dev/null +++ b/app/views/vote_mailer/daily_report_email.text.erb | |||
| @@ -0,0 +1,5 @@ | |||
| 1 | Users have upvoted content on Four Island in the last day! | ||
| 2 | |||
| 3 | <% @entries.each do |entry| %> | ||
| 4 | - <%= pluralize(entry.size, "person") %> left an upvote on <%= entry.first.votable.title %> (<%= url_for(entry.first.votable) %>) | ||
| 5 | <% end %> | ||
| diff --git a/config/schedule.rb b/config/schedule.rb new file mode 100644 index 0000000..e53ebf4 --- /dev/null +++ b/config/schedule.rb | |||
| @@ -0,0 +1,23 @@ | |||
| 1 | # Use this file to easily define all of your cron jobs. | ||
| 2 | # | ||
| 3 | # It's helpful, but not entirely necessary to understand cron before proceeding. | ||
| 4 | # http://en.wikipedia.org/wiki/Cron | ||
| 5 | |||
| 6 | # Example: | ||
| 7 | # | ||
| 8 | # set :output, "/path/to/my/cron_log.log" | ||
| 9 | # | ||
| 10 | # every 2.hours do | ||
| 11 | # command "/usr/bin/some_great_command" | ||
| 12 | # runner "MyModel.some_method" | ||
| 13 | # rake "some:great:rake:task" | ||
| 14 | # end | ||
| 15 | # | ||
| 16 | # every 4.days do | ||
| 17 | # runner "AnotherModel.prune_old_records" | ||
| 18 | # end | ||
| 19 | |||
| 20 | # Learn more: http://github.com/javan/whenever | ||
| 21 | every 1.day, at: "6:00am" do | ||
| 22 | rake "thoughts:email_upvote_report" | ||
| 23 | end | ||
| diff --git a/lib/tasks/tasks.rake b/lib/tasks/tasks.rake new file mode 100644 index 0000000..fee22f4 --- /dev/null +++ b/lib/tasks/tasks.rake | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | namespace :thoughts do | ||
| 2 | desc "Email a review of the last day's upvotes" | ||
| 3 | task :email_upvote_report => :environment do | ||
| 4 | votes = Vote.where("created_at > ?", 1.day.ago).where(upvote: 1).all | ||
| 5 | |||
| 6 | unless votes.empty? | ||
| 7 | VoteMailer.with(votes: votes).daily_report_email.deliver | ||
| 8 | end | ||
| 9 | end | ||
| 10 | end | ||
| diff --git a/test/mailers/previews/vote_mailer_preview.rb b/test/mailers/previews/vote_mailer_preview.rb new file mode 100644 index 0000000..dfc5da1 --- /dev/null +++ b/test/mailers/previews/vote_mailer_preview.rb | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | # Preview all emails at http://localhost:3000/rails/mailers/vote_mailer | ||
| 2 | class VoteMailerPreview < ActionMailer::Preview | ||
| 3 | |||
| 4 | # Preview this email at http://localhost:3000/rails/mailers/vote_mailer/daily_report_email | ||
| 5 | def daily_report_email | ||
| 6 | # Duplicating logic from the task... love it | ||
| 7 | votes = Vote.where("created_at > ?", 1.day.ago).where(upvote: 1).all | ||
| 8 | VoteMailer.with(votes: votes).daily_report_email | ||
| 9 | end | ||
| 10 | |||
| 11 | end | ||
| diff --git a/test/mailers/vote_mailer_test.rb b/test/mailers/vote_mailer_test.rb new file mode 100644 index 0000000..efe8236 --- /dev/null +++ b/test/mailers/vote_mailer_test.rb | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | require "test_helper" | ||
| 2 | |||
| 3 | class VoteMailerTest < ActionMailer::TestCase | ||
| 4 | test "daily_report_email" do | ||
| 5 | mail = VoteMailer.daily_report_email | ||
| 6 | assert_equal "Daily report email", mail.subject | ||
| 7 | assert_equal ["to@example.org"], mail.to | ||
| 8 | assert_equal ["from@example.com"], mail.from | ||
| 9 | assert_match "Hi", mail.body.encoded | ||
| 10 | end | ||
| 11 | |||
| 12 | end | ||
