Skip to content

Commit 02bede7

Browse files
committed
Refactor friendships controller and model
1 parent aaffdaa commit 02bede7

23 files changed

+291
-314
lines changed

app/abilities/ability.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def initialize(user)
4242
can [:create, :subscribe, :unsubscribe], DiaryEntry
4343
can :update, DiaryEntry, :user => user
4444
can [:create], DiaryComment
45-
can [:make_friend, :remove_friend], Friendship
45+
can [:index, :create, :destroy], Follow
4646
can [:create, :reply, :show, :inbox, :outbox, :muted, :mark, :unmute, :destroy], Message
4747
can [:close, :reopen], Note
4848
can [:show, :update], :preference

app/controllers/changesets_controller.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def index
5555
elsif @params[:bbox]
5656
changesets = conditions_bbox(changesets, BoundingBox.from_bbox_params(params))
5757
elsif @params[:friends] && current_user
58-
changesets = changesets.where(:user => current_user.friends.identifiable)
58+
changesets = changesets.where(:user => current_user.followings.identifiable)
5959
elsif @params[:nearby] && current_user
6060
changesets = changesets.where(:user => current_user.nearby)
6161
end

app/controllers/diary_entries_controller.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def index
2929
elsif params[:friends]
3030
if current_user
3131
@title = t ".title_followed"
32-
entries = DiaryEntry.where(:user => current_user.friends)
32+
entries = DiaryEntry.where(:user => current_user.followings)
3333
else
3434
require_user
3535
return

app/controllers/follows_controller.rb

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
class FollowsController < ApplicationController
2+
include UserMethods
3+
4+
layout "site"
5+
6+
before_action :authorize_web
7+
before_action :set_locale
8+
before_action :check_database_readable
9+
10+
authorize_resource
11+
12+
before_action :check_database_writable, :only => [:create, :destroy, :index]
13+
before_action :lookup_friend, :only => [:create, :destroy, :index]
14+
15+
def index
16+
@already_follows = current_user.friends_with?(@friend)
17+
end
18+
19+
def create
20+
follow = Follow.new
21+
follow.befriender = current_user
22+
follow.befriendee = @friend
23+
if current_user.friends_with?(@friend)
24+
flash[:warning] = t ".already_followed", :name => @friend.display_name
25+
elsif current_user.follows.where(:created_at => Time.now.utc - 1.hour..).count >= current_user.max_friends_per_hour
26+
flash[:error] = t ".limit_exceeded"
27+
elsif follow.save
28+
flash[:notice] = t ".success", :name => @friend.display_name
29+
UserMailer.friendship_notification(follow).deliver_later
30+
else
31+
follow.add_error(t(".failed", :name => @friend.display_name))
32+
end
33+
34+
referer = safe_referer(params[:referer]) if params[:referer]
35+
36+
redirect_to referer || user_path
37+
end
38+
39+
def destroy
40+
if current_user.friends_with?(@friend)
41+
Follow.where(:befriender => current_user, :befriendee => @friend).delete_all
42+
flash[:notice] = t ".success", :name => @friend.display_name
43+
else
44+
flash[:error] = t ".not_followed", :name => @friend.display_name
45+
end
46+
47+
referer = safe_referer(params[:referer]) if params[:referer]
48+
49+
redirect_to referer || user_path
50+
end
51+
52+
private
53+
54+
##
55+
# ensure that there is a "friend" instance variable
56+
def lookup_friend
57+
@friend = User.active.find_by!(:display_name => params[:display_name])
58+
rescue ActiveRecord::RecordNotFound
59+
render_unknown_user params[:display_name]
60+
end
61+
end

app/controllers/friendships_controller.rb

-61
This file was deleted.

app/models/friendship.rb renamed to app/models/follow.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
# friends_user_id_fkey (user_id => users.id)
1919
#
2020

21-
class Friendship < ApplicationRecord
21+
class Follow < ApplicationRecord
2222
self.table_name = "friends"
2323

24-
belongs_to :befriender, :class_name => "User", :foreign_key => :user_id
25-
belongs_to :befriendee, :class_name => "User", :foreign_key => :friend_user_id
24+
belongs_to :befriender, :class_name => "User", :foreign_key => :user_id, :inverse_of => :follows
25+
belongs_to :befriendee, :class_name => "User", :foreign_key => :friend_user_id, :inverse_of => :follows
2626
end

app/models/user.rb

+4-4
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ class User < ApplicationRecord
5858
has_many :new_messages, -> { where(:to_user_visible => true, :muted => false, :message_read => false).order(:sent_on => :desc) }, :class_name => "Message", :foreign_key => :to_user_id
5959
has_many :sent_messages, -> { where(:from_user_visible => true).order(:sent_on => :desc).preload(:sender, :recipient) }, :class_name => "Message", :foreign_key => :from_user_id
6060
has_many :muted_messages, -> { where(:to_user_visible => true, :muted => true).order(:sent_on => :desc).preload(:sender, :recipient) }, :class_name => "Message", :foreign_key => :to_user_id
61-
has_many :friendships, -> { joins(:befriendee).where(:users => { :status => %w[active confirmed] }) }
62-
has_many :friends, :through => :friendships, :source => :befriendee
61+
has_many :follows, -> { joins(:befriendee).where(:users => { :status => %w[active confirmed] }) }
62+
has_many :followings, :through => :follows, :source => :befriendee
6363
has_many :preferences, :class_name => "UserPreference"
6464
has_many :changesets, -> { order(:created_at => :desc) }, :inverse_of => :user
6565
has_many :changeset_comments, :foreign_key => :author_id, :inverse_of => :author
@@ -281,7 +281,7 @@ def distance(nearby_user)
281281
end
282282

283283
def friends_with?(new_friend)
284-
friendships.exists?(:befriendee => new_friend)
284+
follows.exists?(:befriendee => new_friend)
285285
end
286286

287287
##
@@ -412,7 +412,7 @@ def max_messages_per_hour
412412
def max_friends_per_hour
413413
account_age_in_seconds = Time.now.utc - created_at
414414
account_age_in_hours = account_age_in_seconds / 3600
415-
recent_friends = Friendship.where(:befriendee => self).where(:created_at => Time.now.utc - 3600..).count
415+
recent_friends = Follow.where(:befriendee => self).where(:created_at => Time.now.utc - 3600..).count
416416
max_friends = account_age_in_hours.ceil + recent_friends - (active_reports * 10)
417417
max_friends.clamp(0, Settings.max_friends_per_hour)
418418
end

app/views/dashboards/_contact.html.erb

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@
3636
<li><%= link_to t("users.show.send message"), new_message_path(contact) %></li>
3737
<li>
3838
<% if current_user.friends_with?(contact) %>
39-
<%= link_to t("users.show.unfollow"), remove_friend_path(:display_name => contact.display_name, :referer => request.fullpath), :method => :post %>
39+
<%= link_to t("users.show.unfollow"), follow_path(:display_name => contact.display_name, :referer => request.fullpath), :method => :delete %>
4040
<% else %>
41-
<%= link_to t("users.follow"), make_friend_path(:display_name => contact.display_name, :referer => request.fullpath), :method => :post %>
41+
<%= link_to t("users.follow"), follow_path(:display_name => contact.display_name, :referer => request.fullpath), :method => :post %>
4242
<% end %>
4343
</li>
4444
</ul>

app/views/dashboards/show.html.erb

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
<%= tag.div "", :id => "map", :class => "content_map border border-secondary-subtle rounded z-0", :data => { :user => user_data } %>
2323
<% end %>
2424

25-
<% friends = @user.friends %>
25+
<% friends = @user.followings %>
2626
<% nearby = @user.nearby - friends %>
2727
</div>
2828

app/views/follows/index.html.erb

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<% content_for :heading do %>
2+
<h1><%= t(@already_follows ? ".unfollow.heading" : ".follow.heading", :user => @friend.display_name) %></h1>
3+
<% end %>
4+
5+
<%= link_to t(@already_follows ? ".unfollow.button" : ".follow.button"),
6+
follow_path(:display_name => @friend.display_name, :referer => params[:referer]),
7+
:method => (@already_follows ? :delete : :post),
8+
:class => "btn btn-sm btn-primary" %>

app/views/friendships/make_friend.html.erb

-10
This file was deleted.

app/views/friendships/remove_friend.html.erb

-10
This file was deleted.

app/views/users/show.html.erb

+2-2
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@
8484
<% if current_user %>
8585
<li>
8686
<% if current_user.friends_with?(@user) %>
87-
<%= link_to t(".unfollow"), remove_friend_path(:display_name => @user.display_name), :method => :post %>
87+
<%= link_to t(".unfollow"), follow_path(:display_name => @user.display_name), :method => :delete %>
8888
<% else %>
89-
<%= link_to t(".follow"), make_friend_path(:display_name => @user.display_name), :method => :post %>
89+
<%= link_to t(".follow"), follow_path(:display_name => @user.display_name), :method => :post %>
9090
<% end %>
9191
</li>
9292
<% end %>

config/locales/en.yml

+10-7
Original file line numberDiff line numberDiff line change
@@ -651,17 +651,20 @@ en:
651651
not_found:
652652
title: File not found
653653
description: Couldn't find a file/directory/API operation by that name on the OpenStreetMap server (HTTP 404)
654-
friendships:
655-
make_friend:
656-
heading: "Do you want to follow %{user}?"
657-
button: "Follow User"
654+
follows:
655+
index:
656+
follow:
657+
heading: "Do you want to follow %{user}?"
658+
button: "Follow User"
659+
unfollow:
660+
heading: "Do you want to unfollow %{user}?"
661+
button: "Unfollow"
662+
create:
658663
success: "You are now following %{name}!"
659664
failed: "Sorry, your request to follow %{name} has failed."
660665
already_followed: "You already follow %{name}."
661666
limit_exceeded: "You have followed a lot of users recently. Please wait a while before trying to follow any more."
662-
remove_friend:
663-
heading: "Do you want to unfollow %{user}?"
664-
button: "Unfollow"
667+
destroy:
665668
success: "You successfully unfollowed %{name}."
666669
not_followed: "You are not following %{name}."
667670
geocoder:

config/routes.rb

+4-2
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,10 @@
280280
resource :profile, :only => [:edit, :update]
281281

282282
# friendships
283-
match "/user/:display_name/make_friend" => "friendships#make_friend", :via => [:get, :post], :as => "make_friend"
284-
match "/user/:display_name/remove_friend" => "friendships#remove_friend", :via => [:get, :post], :as => "remove_friend"
283+
scope "/user/:display_name" do
284+
resource :follow, :only => [:create, :destroy], :path => "follow"
285+
end
286+
get "/user/:display_name/follow" => "follows#index"
285287

286288
# user lists
287289
match "/users" => "users#index", :via => [:get, :post]

test/controllers/changesets_controller_test.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ def test_index_user_not_found
190190
# Checks the display of the friends changesets listing
191191
def test_index_friends
192192
private_user = create(:user, :data_public => true)
193-
friendship = create(:friendship, :befriender => private_user)
193+
friendship = create(:follow, :befriender => private_user)
194194
changeset = create(:changeset, :user => friendship.befriendee, :num_changes => 1)
195195
_changeset2 = create(:changeset, :user => create(:user), :num_changes => 1)
196196

test/controllers/diary_entries_controller_test.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ def test_index_user
390390
def test_index_friends
391391
user = create(:user)
392392
other_user = create(:user)
393-
friendship = create(:friendship, :befriender => user)
393+
friendship = create(:follow, :befriender => user)
394394
diary_entry = create(:diary_entry, :user => friendship.befriendee)
395395
_other_entry = create(:diary_entry, :user => other_user)
396396

0 commit comments

Comments
 (0)