]> git.openstreetmap.org Git - rails.git/commitdiff
Create message mute resource
authorAnton Khorev <tony29@yandex.ru>
Thu, 23 Jan 2025 01:13:52 +0000 (04:13 +0300)
committerAnton Khorev <tony29@yandex.ru>
Fri, 24 Jan 2025 01:36:04 +0000 (04:36 +0300)
app/abilities/ability.rb
app/controllers/messages/mutes_controller.rb [new file with mode: 0644]
app/controllers/messages_controller.rb
app/views/messages/mailboxes/_message.html.erb
config/locales/en.yml
config/routes.rb
test/controllers/messages/mutes_controller_test.rb [new file with mode: 0644]

index 262e92c26df4793fac47ce2a209d94c1b63d4f64..3116bc5cdd451501ccbaebe66d3034f0178c2887 100644 (file)
@@ -43,7 +43,7 @@ class Ability
         can :update, DiaryEntry, :user => user
         can [:create], DiaryComment
         can [:show, :create, :destroy], Follow
-        can [:read, :create, :unmute, :destroy], Message
+        can [:read, :create, :destroy], Message
         can [:close, :reopen], Note
         can [:read, :update], :preference
         can :update, :profile
diff --git a/app/controllers/messages/mutes_controller.rb b/app/controllers/messages/mutes_controller.rb
new file mode 100644 (file)
index 0000000..0d0ef7d
--- /dev/null
@@ -0,0 +1,33 @@
+module Messages
+  class MutesController < ApplicationController
+    layout "site"
+
+    before_action :authorize_web
+    before_action :set_locale
+
+    authorize_resource :message
+
+    before_action :check_database_readable
+    before_action :check_database_writable
+
+    # Moves message into Inbox by unsetting the muted-flag
+    def destroy
+      message = current_user.muted_messages.find(params[:message_id])
+
+      if message.unmute
+        flash[:notice] = t(".notice")
+      else
+        flash[:error] = t(".error")
+      end
+
+      if current_user.muted_messages.none?
+        redirect_to messages_inbox_path
+      else
+        redirect_to messages_muted_inbox_path
+      end
+    rescue ActiveRecord::RecordNotFound
+      @title = t "messages.no_such_message.title"
+      render :template => "messages/no_such_message", :status => :not_found
+    end
+  end
+end
index 5a63dfd6e018f8179bf3028a28f800c516ceb236..1979c9edc5f7bf8feba00f9901150af9420c4038 100644 (file)
@@ -73,23 +73,6 @@ class MessagesController < ApplicationController
     render :action => "no_such_message", :status => :not_found
   end
 
-  # Moves message into Inbox by unsetting the muted-flag
-  def unmute
-    message = current_user.muted_messages.find(params[:message_id])
-
-    if message.unmute
-      flash[:notice] = t(".notice")
-    else
-      flash[:error] = t(".error")
-    end
-
-    if current_user.muted_messages.none?
-      redirect_to messages_inbox_path
-    else
-      redirect_to messages_muted_inbox_path
-    end
-  end
-
   private
 
   ##
index 96d3fa2ca676bc3d03ed6c1caf43748acb916951..5c9c4eb49104529cb685d99c2a26ae9aea3c1c65 100644 (file)
@@ -8,7 +8,7 @@
       <%= button_to t(".read_button"), message_read_mark_path(message), :method => :post, :class => "btn btn-sm btn-primary", :form => { :data => { :turbo => true }, :hidden => message.message_read? } %>
       <%= button_to t(".destroy_button"), message_path(message, :referer => request.fullpath), :method => :delete, :class => "btn btn-sm btn-danger", :form => { :data => { :turbo => true }, :class => "destroy-message" } %>
       <% if message.muted? %>
-        <%= button_to t(".unmute_button"), message_unmute_path(message), :method => :patch, :class => "btn btn-sm btn-secondary", :form => { :data => { :turbo => true } } %>
+        <%= button_to t(".unmute_button"), message_mute_path(message), :method => :delete, :class => "btn btn-sm btn-secondary", :form => { :data => { :turbo => true } } %>
       <% end %>
     </div>
   </td>
index d1df36f8388289bf5ba2bbc68b868a6aab8a53cb..da3afb2ee8fa0051619703e947265ef57d09f650 100644 (file)
@@ -1782,9 +1782,6 @@ en:
       destroy_button: "Delete"
       back: "Back"
       wrong_user: "You are logged in as '%{user}' but the message you have asked to read was not sent by or to that user. Please log in as the correct user in order to read it."
-    unmute:
-      notice: "Message has been moved to Inbox"
-      error: "The message could not be moved to the Inbox."
     destroy:
       destroyed: "Message deleted"
     read_marks:
@@ -1792,6 +1789,10 @@ en:
         notice: "Message marked as read"
       destroy:
         notice: "Message marked as unread"
+    mutes:
+      destroy:
+        notice: "Message has been moved to Inbox"
+        error: "The message could not be moved to the Inbox."
     mailboxes:
       heading:
         my_inbox: "My Inbox"
index 453c625adea0b8c28f9b83cdd2a832f469cdd4ac..6e5e73855c34a23e7931042703e2b3e503ff5fb1 100644 (file)
@@ -322,11 +322,10 @@ OpenStreetMap::Application.routes.draw do
 
   # messages
   resources :messages, :path_names => { :new => "new/:display_name" }, :id => /\d+/, :only => [:new, :create, :show, :destroy] do
-    patch :unmute
-
     scope :module => :messages do
       resource :reply, :path_names => { :new => "new" }, :only => :new
       resource :read_mark, :only => [:create, :destroy]
+      resource :mute, :only => :destroy
     end
   end
   namespace :messages, :path => "/messages" do
diff --git a/test/controllers/messages/mutes_controller_test.rb b/test/controllers/messages/mutes_controller_test.rb
new file mode 100644 (file)
index 0000000..f405c06
--- /dev/null
@@ -0,0 +1,68 @@
+require "test_helper"
+
+module Messages
+  class MutesControllerTest < ActionDispatch::IntegrationTest
+    ##
+    # test all routes which lead to this controller
+    def test_routes
+      assert_routing(
+        { :path => "/messages/1/mute", :method => :delete },
+        { :controller => "messages/mutes", :action => "destroy", :message_id => "1" }
+      )
+    end
+
+    def test_destroy_when_not_logged_in
+      sender_user = create(:user)
+      recipient_user = create(:user)
+      create(:user_mute, :owner => recipient_user, :subject => sender_user)
+      message = create(:message, :unread, :sender => sender_user, :recipient => recipient_user)
+
+      delete message_mute_path(message)
+      assert_response :forbidden
+    end
+
+    def test_destroy_as_other_user
+      sender_user = create(:user)
+      recipient_user = create(:user)
+      create(:user_mute, :owner => recipient_user, :subject => sender_user)
+      message = create(:message, :unread, :sender => sender_user, :recipient => recipient_user)
+      session_for(create(:user))
+
+      delete message_mute_path(message)
+      assert_response :not_found
+      assert_template "no_such_message"
+    end
+
+    def test_destroy_as_sender
+      sender_user = create(:user)
+      recipient_user = create(:user)
+      create(:user_mute, :owner => recipient_user, :subject => sender_user)
+      message = create(:message, :unread, :sender => sender_user, :recipient => recipient_user)
+      session_for(sender_user)
+
+      delete message_mute_path(message)
+      assert_response :not_found
+      assert_template "no_such_message"
+    end
+
+    def test_destroy_as_recipient
+      sender_user = create(:user)
+      recipient_user = create(:user)
+      create(:user_mute, :owner => recipient_user, :subject => sender_user)
+      message = create(:message, :unread, :sender => sender_user, :recipient => recipient_user)
+      session_for(recipient_user)
+
+      delete message_mute_path(message)
+      assert_redirected_to messages_inbox_path
+      assert_not message.reload.muted
+    end
+
+    def test_destroy_on_missing_message
+      session_for(create(:user))
+
+      delete message_mute_path(99999)
+      assert_response :not_found
+      assert_template "no_such_message"
+    end
+  end
+end