Fixup make_friend and remove_friend properly
authorTom Hughes <tom@compton.nu>
Wed, 15 Aug 2012 18:48:06 +0000 (19:48 +0100)
committerTom Hughes <tom@compton.nu>
Wed, 15 Aug 2012 19:13:14 +0000 (20:13 +0100)
Requests using POST are now actioned immediately, while requests
using GET present a confirmation page.

app/controllers/user_controller.rb
app/views/user/_contact.html.erb
app/views/user/make_friend.html.erb [new file with mode: 0644]
app/views/user/remove_friend.html.erb [new file with mode: 0644]
app/views/user/view.html.erb
config/locales/en.yml
config/routes.rb
test/functional/user_controller_test.rb

index 443c433..620ab50 100644 (file)
@@ -397,47 +397,55 @@ class UserController < ApplicationController
   end
 
   def make_friend
-    if params[:display_name]
-      name = params[:display_name]
-      new_friend = User.active.where(:display_name => name).first
-      friend = Friend.new
-      friend.user_id = @user.id
-      friend.friend_user_id = new_friend.id
-      unless @user.is_friends_with?(new_friend)
-        if friend.save
-          flash[:notice] = t 'user.make_friend.success', :name => name
-          Notifier.friend_notification(friend).deliver
+    @new_friend = User.find_by_display_name(params[:display_name])
+
+    if @new_friend
+      if request.post?
+        friend = Friend.new
+        friend.user_id = @user.id
+        friend.friend_user_id = @new_friend.id
+        unless @user.is_friends_with?(@new_friend)
+          if friend.save
+            flash[:notice] = t 'user.make_friend.success', :name => @new_friend.display_name
+            Notifier.friend_notification(friend).deliver
+          else
+            friend.add_error(t('user.make_friend.failed', :name => @new_friend.display_name))
+          end
         else
-          friend.add_error(t('user.make_friend.failed', :name => name))
+          flash[:warning] = t 'user.make_friend.already_a_friend', :name => @new_friend.display_name
         end
-      else
-        flash[:warning] = t 'user.make_friend.already_a_friend', :name => name
-      end
 
-      if params[:referer]
-        redirect_to params[:referer]
-      else
-        redirect_to :controller => 'user', :action => 'view'
+        if params[:referer]
+          redirect_to params[:referer]
+        else
+          redirect_to :controller => 'user', :action => 'view'
+        end
       end
+    else
+      render_unknown_user params[:display_name]
     end
   end
 
   def remove_friend
-    if params[:display_name]
-      name = params[:display_name]
-      friend = User.active.where(:display_name => name).first
-      if @user.is_friends_with?(friend)
-        Friend.delete_all "user_id = #{@user.id} AND friend_user_id = #{friend.id}"
-        flash[:notice] = t 'user.remove_friend.success', :name => friend.display_name
-      else
-        flash[:error] = t 'user.remove_friend.not_a_friend', :name => friend.display_name
-      end
+    @friend = User.find_by_display_name(params[:display_name])
 
-      if params[:referer]
-        redirect_to params[:referer]
-      else
-        redirect_to :controller => 'user', :action => 'view'
+    if @friend
+      if request.post?
+        if @user.is_friends_with?(@friend)
+          Friend.delete_all "user_id = #{@user.id} AND friend_user_id = #{@friend.id}"
+          flash[:notice] = t 'user.remove_friend.success', :name => @friend.display_name
+        else
+          flash[:error] = t 'user.remove_friend.not_a_friend', :name => @friend.display_name
+        end
+
+        if params[:referer]
+          redirect_to params[:referer]
+        else
+          redirect_to :controller => 'user', :action => 'view'
+        end
       end
+    else
+      render_unknown_user params[:display_name]
     end
   end
 
index 2418ed2..c0bf160 100644 (file)
@@ -33,9 +33,9 @@
     <%= link_to t('user.view.send message'), :controller => 'message', :action => 'new', :display_name => contact.display_name %>
     |
     <% if @user.is_friends_with?(contact) %>
-      <%= link_to t('user.view.remove as friend'), :controller => 'user', :action => 'remove_friend', :display_name => contact.display_name, :referer => request.fullpath, :method => :post %>
+      <%= link_to t('user.view.remove as friend'), remove_friend_path(:display_name => contact.display_name, :referer => request.fullpath), :method => :post %>
     <% else %>
-      <%= link_to t('user.view.add as friend'), :controller => 'user', :action => 'make_friend', :display_name => contact.display_name, :referer => request.fullpath, :method => :post %>
+      <%= link_to t('user.view.add as friend'), make_friend_path(:display_name => contact.display_name, :referer => request.fullpath), :method => :post %>
     <% end %>
   </td>
 </tr>
diff --git a/app/views/user/make_friend.html.erb b/app/views/user/make_friend.html.erb
new file mode 100644 (file)
index 0000000..abae0d2
--- /dev/null
@@ -0,0 +1,7 @@
+<h1><%= t "user.make_friend.heading", :user => @new_friend.display_name %></h1>
+<%= form_tag do %>
+  <% if params[:referer] -%>
+  <%= hidden_field_tag("referer", params[:referer]) %>
+  <% end -%>
+  <%= submit_tag t("user.make_friend.button") %>
+<% end %>
diff --git a/app/views/user/remove_friend.html.erb b/app/views/user/remove_friend.html.erb
new file mode 100644 (file)
index 0000000..0919bc9
--- /dev/null
@@ -0,0 +1,7 @@
+<h1><%= t "user.remove_friend.heading", :user => @friend.display_name %></h1>
+<%= form_tag do %>
+  <% if params[:referer] -%>
+  <%= hidden_field_tag("referer", params[:referer]) %>
+  <% end -%>
+  <%= submit_tag t("user.remove_friend.button") %>
+<% end %>
index 8ba4c07..da58043 100644 (file)
@@ -41,9 +41,9 @@
     <%= link_to t('user.view.comments'), :controller => 'diary_entry', :action => 'comments', :display_name => @this_user.display_name %>
     |
     <% if @user and @user.is_friends_with?(@this_user) %>
-      <%= link_to t('user.view.remove as friend'), :controller => 'user', :action => 'remove_friend', :display_name => @this_user.display_name, :method => :post %>
+      <%= link_to t('user.view.remove as friend'), remove_friend_path(:display_name => @this_user.display_name), :method => :post %>
     <% else %>
-      <%= link_to t('user.view.add as friend'), :controller => 'user', :action => 'make_friend', :display_name => @this_user.display_name, :method => :post %>
+      <%= link_to t('user.view.add as friend'), make_friend_path(:display_name => @this_user.display_name), :method => :post %>
     <% end %>
     <% if @this_user.blocks.exists? %>
       |
index 7ecb5c2..34104a7 100644 (file)
@@ -1831,10 +1831,14 @@ en:
     go_public:
       flash success: "All your edits are now public, and you are now allowed to edit."
     make_friend:
+      heading: "Add %{user} as a friend?"
+      button: "Add as friend"
       success: "%{name} is now your friend."
       failed: "Sorry, failed to add %{name} as a friend."
       already_a_friend: "You are already friends with %{name}."
     remove_friend:
+      heading: "Remove %{user} as a friend?"
+      button: "Remove as friend"
       success: "%{name} was removed from your friends."
       not_a_friend: "%{name} is not one of your friends."
     filter:
index c5119b9..1ef0c31 100644 (file)
@@ -174,8 +174,8 @@ OpenStreetMap::Application.routes.draw do
 
   # user pages
   match '/user/:display_name' => 'user#view', :via => :get, :as => "user"
-  match '/user/:display_name/make_friend' => 'user#make_friend', :via => :post
-  match '/user/:display_name/remove_friend' => 'user#remove_friend', :via => :post
+  match '/user/:display_name/make_friend' => 'user#make_friend', :via => [:get, :post], :as => "make_friend"
+  match '/user/:display_name/remove_friend' => 'user#remove_friend', :via => [:get, :post], :as => "remove_friend"
   match '/user/:display_name/account' => 'user#account', :via => [:get, :post]
   match '/user/:display_name/set_status' => 'user#set_status', :via => :get, :as => :set_status_user
   match '/user/:display_name/delete' => 'user#delete', :via => :get, :as => :delete_user
index e853081..fbceb3c 100644 (file)
@@ -139,10 +139,18 @@ class UserControllerTest < ActionController::TestCase
       { :controller => "user", :action => "account", :display_name => "username" }
     )
 
+    assert_routing(
+      { :path => "/user/username/make_friend", :method => :get },
+      { :controller => "user", :action => "make_friend", :display_name => "username" }
+    )
     assert_routing(
       { :path => "/user/username/make_friend", :method => :post },
       { :controller => "user", :action => "make_friend", :display_name => "username" }
     )
+    assert_routing(
+      { :path => "/user/username/remove_friend", :method => :get },
+      { :controller => "user", :action => "remove_friend", :display_name => "username" }
+    )
     assert_routing(
       { :path => "/user/username/remove_friend", :method => :post },
       { :controller => "user", :action => "remove_friend", :display_name => "username" }