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