Skip to content
This repository has been archived by the owner on Jul 21, 2020. It is now read-only.

Commit

Permalink
Add likes to merge requests.
Browse files Browse the repository at this point in the history
Thsi fix the issue #85.
  • Loading branch information
hugopl committed Aug 24, 2019
1 parent d61202f commit 4ae9141
Show file tree
Hide file tree
Showing 12 changed files with 75 additions and 4 deletions.
1 change: 1 addition & 0 deletions app/controllers/merge_requests_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ def update
when 'accept' then accept
when 'abandon' then abandon
else
@mr.likes.create(user: current_user) if params[:mr_action] == 'like'
redirect_to(redir_params)
end
rescue RuntimeError => e
Expand Down
7 changes: 5 additions & 2 deletions app/helpers/merge_requests_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,11 @@ def patch_linter_status(patch)
end

def author_sentence(mr)
closed_info = mr.closed? ? ", #{@mr.status} by <strong>#{@mr.reviewer.name}</strong>." : ''
"Authored by <strong>#{mr.author.name}</strong>#{closed_info}".html_safe
closed_info = mr.closed? ? ", #{@mr.status} by <strong>#{@mr.reviewer.name}</strong>" : ''
likes = User.joins(:likes).where(likes: { merge_request: mr }).pluck(:name).to_sentence
likes = "<br>Looks good to: <em>#{likes}</em>." if likes.present?

"Authored by <strong>#{mr.author.name}</strong>#{closed_info}.#{likes}".html_safe
end

def search_request?
Expand Down
6 changes: 6 additions & 0 deletions app/models/like.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class Like < ApplicationRecord
belongs_to :merge_request
belongs_to :user

validates :user_id, uniqueness: { scope: :merge_request_id }
end
1 change: 1 addition & 0 deletions app/models/merge_request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class MergeRequest < ApplicationRecord

has_many :patches, -> { order(:created_at) }, dependent: :destroy
has_many :history_events, -> { order(:when) }, dependent: :destroy
has_many :likes, dependent: :destroy

enum status: %i(open integrating needs_rebase accepted abandoned)

Expand Down
5 changes: 5 additions & 0 deletions app/models/patch.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class Patch < ApplicationRecord
validates :commit_message, length: { minimum: 0 }, allow_nil: false

after_create :update_jira_ticket
after_create :reset_likes
after_commit :really_push_to_ci, on: :create, unless: :canceled?

delegate :author, to: :merge_request
Expand Down Expand Up @@ -88,4 +89,8 @@ def update_jira_ticket(silent: false)
merge_request.notify_jira if !silent && merge_request.jira_ticket_changed?
merge_request.save!
end

def reset_likes
merge_request.likes.delete_all
end
end
1 change: 1 addition & 0 deletions app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ class User < ApplicationRecord

before_create :generate_api_token
has_many :comments
has_many :likes
has_many :merge_requests, foreign_key: :author_id
has_many :patches, through: :merge_requests
has_many :locked_branches, foreign_key: :who_id
Expand Down
3 changes: 2 additions & 1 deletion app/views/merge_requests/_summary.html.haml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
.ui.top.attached.segment
.markdown= @patch.commit_message
.ui.bottom.attached.warning.message= author_sentence(@mr)
.ui.bottom.attached.warning.message
= author_sentence(@mr)

#summary-bar.ui.statistics{ class: @project.gitlab_ci? ? 'five' : 'four' }
- if @project.gitlab_ci?
Expand Down
3 changes: 3 additions & 0 deletions app/views/merge_requests/show.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@
%button#accept.ui.button{ type: 'button'} Accept
%button#abandon.ui.red.button{ type: 'button'} Abandon
%input#mr_action.ui.primary.button.push-comments{ name: 'mr_action', type: 'submit', value: 'Just push comments' }
#like.ui.icon.button.primary.push-comments
%i.thumbs.up.icon
#accept-modal.ui.basic.modal
.ui.icon.header
Expand Down
7 changes: 7 additions & 0 deletions app/webpacker/src/javascript/merge_requests.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export default function merge_requests() {
});
$('#accept').on('click', function(event) { showSubmitModal('accept'); });
$('#abandon').on('click', function(event) { showSubmitModal('abandon'); });
$('#like').on('click', function(event) { like(event); });
$('#accept-model-button').on('mouseover', function(event) { $('.js-tada').transition('tada'); });
if ($('textarea').length > 0)
new_editor($('textarea').get(0), false);
Expand All @@ -33,6 +34,12 @@ function showSubmitModal(action) {
}}).modal('show')
}

function like(event) {
$('#mr_action').val('like');
$('#mr-form').submit();
return false;
}

function request_patch_diff(event) {
var form = $(event.target.form)
var query = '?';
Expand Down
11 changes: 11 additions & 0 deletions db/migrate/20190824211848_add_likes_to_merge_requests.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class AddLikesToMergeRequests < ActiveRecord::Migration[5.2]
def change
create_table :likes do |t|
t.references :user, null: false
t.references :merge_request, null: false
t.timestamps null: false
end

add_index :likes, %i(user_id merge_request_id), unique: true
end
end
12 changes: 11 additions & 1 deletion db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 2019_08_24_052620) do
ActiveRecord::Schema.define(version: 2019_08_24_211848) do

# These are extensions that must be enabled in order to support this database
enable_extension "hstore"
Expand All @@ -37,6 +37,16 @@
t.index ["who_id"], name: "index_history_events_on_who_id"
end

create_table "likes", force: :cascade do |t|
t.bigint "user_id", null: false
t.bigint "merge_request_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["merge_request_id"], name: "index_likes_on_merge_request_id"
t.index ["user_id", "merge_request_id"], name: "index_likes_on_user_id_and_merge_request_id", unique: true
t.index ["user_id"], name: "index_likes_on_user_id"
end

create_table "locked_branches", id: :serial, force: :cascade do |t|
t.integer "project_id", null: false
t.integer "who_id", null: false
Expand Down
22 changes: 22 additions & 0 deletions spec/models/merge_request_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
describe MergeRequest do
let(:user) { create(:user) }
let(:mr) { create(:merge_request) }
let(:mr2) { create(:merge_request) }

it 'do reset likes from a merge request after a patch being added to it' do
mr2.likes.create(user: user)
mr.likes.create(user: user)
expect(mr.likes.count).to eq(1)
expect(mr2.likes.count).to eq(1)

create(:patch, merge_request: mr)
expect(mr.likes.count).to eq(0)
expect(mr2.likes.count).to eq(1)
end

it 'forbid more than one like per merge request' do
mr.likes.create(user: user)
like = mr.likes.build(user: user)
expect(like.save).to eq(false)
end
end

0 comments on commit 4ae9141

Please sign in to comment.