Add badge achievemnt context message markdown (#382)

* Add badge achievemnt context message markdown

* Add badge rewarder method for beloved comments
This commit is contained in:
Ben Halpern 2018-06-04 17:31:01 -04:00 committed by GitHub
parent 535f3d02b3
commit fd4390983c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 49 additions and 7 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -10,7 +10,7 @@
</p>
<p>
<em>
<%= @badge_achievement.rewarding_context_message %>
<%= @badge_achievement.rewarding_context_message.html_safe %>
</em>
</p>
<br/>

View file

@ -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%>

View file

@ -11,7 +11,7 @@
<% end %>
<p style="width: 90%;margin: 8px auto">
<em>
<%= activity['actor'].rewarding_context_message %>
<%= activity['actor'].rewarding_context_message.html_safe %>
</em>
</p>
<a href="/<%= activity['object'].username %>">

View file

@ -0,0 +1,5 @@
class AddRewardingContextMessageMarkdownToBadgeAchievements < ActiveRecord::Migration[5.1]
def change
add_column :badge_achievements, :rewarding_context_message_markdown, :text
end
end

View file

@ -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"

View file

@ -69,6 +69,7 @@ end
task :award_badges => :environment do
BadgeRewarder.new.award_yearly_club_badges
BadgeRewarder.new.award_beloved_comment_badges
end

View file

@ -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?("</a>"))
end
end