From fd4390983cd4637c23c3ab5e079e6ac5c9fa741f Mon Sep 17 00:00:00 2001 From: Ben Halpern Date: Mon, 4 Jun 2018 17:31:01 -0400 Subject: [PATCH] Add badge achievemnt context message markdown (#382) * Add badge achievemnt context message markdown * Add badge rewarder method for beloved comments --- app/dashboards/badge_achievement_dashboard.rb | 3 ++- app/labor/badge_rewarder.rb | 18 ++++++++++++++++-- app/models/badge_achievement.rb | 12 ++++++++++++ .../notify_mailer/new_badge_email.html.erb | 2 +- .../notify_mailer/new_badge_email.text.erb | 2 +- .../activities/_badgeachievement.html.erb | 2 +- ...t_message_markdown_to_badge_achievements.rb | 5 +++++ db/schema.rb | 3 ++- lib/tasks/fetch.rake | 1 + spec/models/badge_achievement_spec.rb | 8 ++++++++ 10 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 db/migrate/20180604200603_add_rewarding_context_message_markdown_to_badge_achievements.rb diff --git a/app/dashboards/badge_achievement_dashboard.rb b/app/dashboards/badge_achievement_dashboard.rb index 778932b0b..477227c96 100644 --- a/app/dashboards/badge_achievement_dashboard.rb +++ b/app/dashboards/badge_achievement_dashboard.rb @@ -13,6 +13,7 @@ class BadgeAchievementDashboard < Administrate::BaseDashboard name_of_user: NameOfUserField, badge: Field::BelongsTo, rewarder: Field::BelongsTo.with_options(class_name: "User"), + rewarding_context_message_markdown: Field::String, rewarding_context_message: Field::String, id: Field::Number, rewarder_id: UserIdField, @@ -50,7 +51,7 @@ class BadgeAchievementDashboard < Administrate::BaseDashboard # on the model's form (`new` and `edit`) pages. FORM_ATTRIBUTES = [ :user_id, - :rewarding_context_message, + :rewarding_context_message_markdown, :badge, :rewarder_id, ].freeze diff --git a/app/labor/badge_rewarder.rb b/app/labor/badge_rewarder.rb index 85ff90793..dd6a26ebd 100644 --- a/app/labor/badge_rewarder.rb +++ b/app/labor/badge_rewarder.rb @@ -1,9 +1,23 @@ class BadgeRewarder def award_yearly_club_badges message = "Happy DEV birthday!" - User.where("created_at < ? AND created_at > ?",1.year.ago, 367.days.ago).each do |user| - BadgeAchievement.create(user_id: user.id, badge_id: 2, rewarding_context_message: message) + User.where("created_at < ? AND created_at > ?", 1.year.ago, 367.days.ago).each do |user| + BadgeAchievement.create( + user_id: user.id, + badge_id: 2, + rewarding_context_message_markdown: message) # ID 2 is the proper ID in prod. We should change in future to ENV var. end end + + def award_beloved_comment_badges + Comment.where("positive_reactions_count > ?", 24).each do |comment| + message = "You're DEV famous! [This is the comment](https://dev.to#{comment.path}) for which you are being recognized. 😄" + BadgeAchievement.create( + user_id: comment.user_id, + badge_id: 3, + rewarding_context_message_markdown: message) + # ID 3 is the proper ID in prod. We should change in future to ENV var. + end + end end diff --git a/app/models/badge_achievement.rb b/app/models/badge_achievement.rb index 436e07069..f45ffe412 100644 --- a/app/models/badge_achievement.rb +++ b/app/models/badge_achievement.rb @@ -11,6 +11,18 @@ class BadgeAchievement < ApplicationRecord as_activity after_create :send_email_notification + before_validation :render_rewarding_context_message_html + + def render_rewarding_context_message_html + if rewarding_context_message_markdown.present? + parsed_markdown = MarkdownParser.new(rewarding_context_message_markdown) + html = parsed_markdown.finalize + final_html = ActionController::Base.helpers.sanitize html, + tags: %w(strong em i b u a code), + attributes: %w(href name) + self.rewarding_context_message = final_html + end + end def name_of_user user.name diff --git a/app/views/mailers/notify_mailer/new_badge_email.html.erb b/app/views/mailers/notify_mailer/new_badge_email.html.erb index 30f5f711d..d302cf4c3 100644 --- a/app/views/mailers/notify_mailer/new_badge_email.html.erb +++ b/app/views/mailers/notify_mailer/new_badge_email.html.erb @@ -10,7 +10,7 @@

- <%= @badge_achievement.rewarding_context_message %> + <%= @badge_achievement.rewarding_context_message.html_safe %>


diff --git a/app/views/mailers/notify_mailer/new_badge_email.text.erb b/app/views/mailers/notify_mailer/new_badge_email.text.erb index b79cec8a5..460218f76 100644 --- a/app/views/mailers/notify_mailer/new_badge_email.text.erb +++ b/app/views/mailers/notify_mailer/new_badge_email.text.erb @@ -2,6 +2,6 @@ Congratulations, <%= @user.name %>! You got the <%= @badge.title %> badge! Be su <%= @badge.description %> -<%= @badge_achievement.rewarding_context_message %> +<%= strip_tags @badge_achievement.rewarding_context_message %> https://dev.to/<%= @user.username%> \ No newline at end of file diff --git a/app/views/notifications/activity/activities/_badgeachievement.html.erb b/app/views/notifications/activity/activities/_badgeachievement.html.erb index f0c156dfd..ab016981d 100644 --- a/app/views/notifications/activity/activities/_badgeachievement.html.erb +++ b/app/views/notifications/activity/activities/_badgeachievement.html.erb @@ -11,7 +11,7 @@ <% end %>

- <%= activity['actor'].rewarding_context_message %> + <%= activity['actor'].rewarding_context_message.html_safe %>

diff --git a/db/migrate/20180604200603_add_rewarding_context_message_markdown_to_badge_achievements.rb b/db/migrate/20180604200603_add_rewarding_context_message_markdown_to_badge_achievements.rb new file mode 100644 index 000000000..e03191458 --- /dev/null +++ b/db/migrate/20180604200603_add_rewarding_context_message_markdown_to_badge_achievements.rb @@ -0,0 +1,5 @@ +class AddRewardingContextMessageMarkdownToBadgeAchievements < ActiveRecord::Migration[5.1] + def change + add_column :badge_achievements, :rewarding_context_message_markdown, :text + end +end diff --git a/db/schema.rb b/db/schema.rb index 537545171..7a1d11658 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: 20180601195848) do +ActiveRecord::Schema.define(version: 20180604200603) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -115,6 +115,7 @@ ActiveRecord::Schema.define(version: 20180601195848) do t.datetime "created_at", null: false t.integer "rewarder_id" t.text "rewarding_context_message" + t.text "rewarding_context_message_markdown" t.datetime "updated_at", null: false t.bigint "user_id", null: false t.index ["badge_id"], name: "index_badge_achievements_on_badge_id" diff --git a/lib/tasks/fetch.rake b/lib/tasks/fetch.rake index 2d077fa86..be297f8c7 100644 --- a/lib/tasks/fetch.rake +++ b/lib/tasks/fetch.rake @@ -69,6 +69,7 @@ end task :award_badges => :environment do BadgeRewarder.new.award_yearly_club_badges + BadgeRewarder.new.award_beloved_comment_badges end diff --git a/spec/models/badge_achievement_spec.rb b/spec/models/badge_achievement_spec.rb index c705f9a77..bc1ae84d0 100644 --- a/spec/models/badge_achievement_spec.rb +++ b/spec/models/badge_achievement_spec.rb @@ -18,4 +18,12 @@ RSpec.describe BadgeAchievement, type: :model do BadgeAchievement.create!(user_id: user.id, badge_id: badge.id, rewarder_id: create(:user).id) end.to raise_error end + + it "turns rewarding_context_message_markdown into rewarding_context_message HTML" do + achievement = BadgeAchievement.create(user_id: user.id, + badge_id: badge.id, + rewarder_id: create(:user).id, + rewarding_context_message_markdown: "Hello [Yoho](/hey)") + expect(achievement.rewarding_context_message.include?("")) + end end