]> git.openstreetmap.org Git - rails.git/commitdiff
Add diary entry subscribe/unsubscribe GET pages
authorAnton Khorev <tony29@yandex.ru>
Sat, 17 Feb 2024 02:43:13 +0000 (05:43 +0300)
committerAnton Khorev <tony29@yandex.ru>
Sat, 17 Feb 2024 02:43:13 +0000 (05:43 +0300)
app/controllers/diary_entries_controller.rb
app/views/diary_entries/_diary_entry.html.erb
app/views/diary_entries/_diary_entry_heading.html.erb [new file with mode: 0644]
app/views/diary_entries/subscribe.html.erb [new file with mode: 0644]
app/views/diary_entries/unsubscribe.html.erb [new file with mode: 0644]
config/locales/en.yml
config/routes.rb
test/controllers/diary_entries_controller_test.rb

index 1f9574b9cbab8313e7cc0e9b7540c85ae5d9f3fe..1a3d648f460a4f089ca362ac00c9ac88efc7915e 100644 (file)
@@ -157,21 +157,25 @@ class DiaryEntriesController < ApplicationController
   end
 
   def subscribe
-    diary_entry = DiaryEntry.find(params[:id])
+    @diary_entry = DiaryEntry.find(params[:id])
 
-    diary_entry.subscriptions.create(:user => current_user) unless diary_entry.subscribers.exists?(current_user.id)
+    if request.post?
+      @diary_entry.subscriptions.create(:user => current_user) unless @diary_entry.subscribers.exists?(current_user.id)
 
-    redirect_to diary_entry_path(diary_entry.user, diary_entry)
+      redirect_to diary_entry_path(@diary_entry.user, @diary_entry)
+    end
   rescue ActiveRecord::RecordNotFound
     render :action => "no_such_entry", :status => :not_found
   end
 
   def unsubscribe
-    diary_entry = DiaryEntry.find(params[:id])
+    @diary_entry = DiaryEntry.find(params[:id])
 
-    diary_entry.subscriptions.where(:user => current_user).delete_all if diary_entry.subscribers.exists?(current_user.id)
+    if request.post?
+      @diary_entry.subscriptions.where(:user => current_user).delete_all if @diary_entry.subscribers.exists?(current_user.id)
 
-    redirect_to diary_entry_path(diary_entry.user, diary_entry)
+      redirect_to diary_entry_path(@diary_entry.user, @diary_entry)
+    end
   rescue ActiveRecord::RecordNotFound
     render :action => "no_such_entry", :status => :not_found
   end
index f69c7e552c3bf80f0adff79febae210093eb2a47..8bd4dc57fd652b78c6dc2a9d70abd332f1f1e537 100644 (file)
@@ -1,26 +1,5 @@
 <article class='diary_post border-top border-grey py-3<%= " text-muted px-3 bg-danger bg-opacity-10" unless diary_entry.visible %> user_<%= diary_entry.user.id %>'>
-  <div class='mb-3'>
-    <% if @user %>
-      <h2><%= link_to diary_entry.title, diary_entry_path(diary_entry.user, diary_entry) %></h2>
-    <% else %>
-      <div class="row">
-        <div class="col-auto">
-          <%= user_thumbnail diary_entry.user %>
-        </div>
-        <div class="col">
-          <h2><%= link_to diary_entry.title, diary_entry_path(diary_entry.user, diary_entry) %></h2>
-        </div>
-      </div>
-    <% end %>
-
-    <small class='text-muted'>
-      <%= t(".posted_by_html", :link_user => (link_to diary_entry.user.display_name, user_path(diary_entry.user)), :created => l(diary_entry.created_at, :format => :blog), :language_link => (link_to diary_entry.language.name, :controller => "diary_entries", :action => "index", :display_name => nil, :language => diary_entry.language_code)) %>
-      <% if (l(diary_entry.updated_at, :format => :blog) != l(diary_entry.created_at, :format => :blog)) %>
-        <%= t(".updated_at_html", :updated => l(diary_entry.updated_at, :format => :blog)) %>
-      <% end %>
-    </small>
-
-  </div>
+  <%= render :partial => "diary_entry_heading", :object => diary_entry, :as => "diary_entry" %>
 
   <div class="richtext text-break" xml:lang="<%= diary_entry.language_code %>" lang="<%= diary_entry.language_code %>">
     <%= diary_entry.body.to_html %>
diff --git a/app/views/diary_entries/_diary_entry_heading.html.erb b/app/views/diary_entries/_diary_entry_heading.html.erb
new file mode 100644 (file)
index 0000000..ef924ff
--- /dev/null
@@ -0,0 +1,21 @@
+<div class='mb-3'>
+  <% if @user %>
+    <h2><%= link_to diary_entry.title, diary_entry_path(diary_entry.user, diary_entry) %></h2>
+  <% else %>
+    <div class="row">
+      <div class="col-auto">
+        <%= user_thumbnail diary_entry.user %>
+      </div>
+      <div class="col">
+        <h2><%= link_to diary_entry.title, diary_entry_path(diary_entry.user, diary_entry) %></h2>
+      </div>
+    </div>
+  <% end %>
+
+  <small class='text-muted'>
+    <%= t("diary_entries.diary_entry.posted_by_html", :link_user => (link_to diary_entry.user.display_name, user_path(diary_entry.user)), :created => l(diary_entry.created_at, :format => :blog), :language_link => (link_to diary_entry.language.name, :controller => "diary_entries", :action => "index", :display_name => nil, :language => diary_entry.language_code)) %>
+    <% if (l(diary_entry.updated_at, :format => :blog) != l(diary_entry.created_at, :format => :blog)) %>
+      <%= t("diary_entries.diary_entry.updated_at_html", :updated => l(diary_entry.updated_at, :format => :blog)) %>
+    <% end %>
+  </small>
+</div>
diff --git a/app/views/diary_entries/subscribe.html.erb b/app/views/diary_entries/subscribe.html.erb
new file mode 100644 (file)
index 0000000..e18be2b
--- /dev/null
@@ -0,0 +1,12 @@
+<% content_for :heading do %>
+  <h1><%= t ".heading", :user => @diary_entry.user.display_name %></h1>
+<% end %>
+
+<%= render :partial => "diary_entry_heading", :object => @diary_entry, :as => "diary_entry" %>
+
+<%= bootstrap_form_tag do |f| %>
+  <% if params[:referer] -%>
+  <%= f.hidden_field :referer, :value => params[:referer] %>
+  <% end -%>
+  <%= f.primary t(".button") %>
+<% end %>
diff --git a/app/views/diary_entries/unsubscribe.html.erb b/app/views/diary_entries/unsubscribe.html.erb
new file mode 100644 (file)
index 0000000..e18be2b
--- /dev/null
@@ -0,0 +1,12 @@
+<% content_for :heading do %>
+  <h1><%= t ".heading", :user => @diary_entry.user.display_name %></h1>
+<% end %>
+
+<%= render :partial => "diary_entry_heading", :object => @diary_entry, :as => "diary_entry" %>
+
+<%= bootstrap_form_tag do |f| %>
+  <% if params[:referer] -%>
+  <%= f.hidden_field :referer, :value => params[:referer] %>
+  <% end -%>
+  <%= f.primary t(".button") %>
+<% end %>
index d664826393916b840376a283ea6e157c9aa6bc95..338f2c0874542f2b7e9021d84458562fa786a960 100644 (file)
@@ -576,6 +576,12 @@ en:
       comment: Comment
       newer_comments: "Newer Comments"
       older_comments: "Older Comments"
+    subscribe:
+      heading: Subscribe to the following diary entry discussion?
+      button: Subscribe to discussion
+    unsubscribe:
+      heading: Unsubscribe from the following diary entry discussion?
+      button: Unsubscribe from discussion
   doorkeeper:
     errors:
       messages:
index 09afe8fd928926139b8b80c93f26bd531c535522..da27f07543b23dc96e3c7a812ff60b049d0b0018 100644 (file)
@@ -244,8 +244,8 @@ OpenStreetMap::Application.routes.draw do
   post "/user/:display_name/diary/:id/unhide" => "diary_entries#unhide", :id => /\d+/, :as => :unhide_diary_entry
   post "/user/:display_name/diary/:id/hidecomment/:comment" => "diary_entries#hidecomment", :id => /\d+/, :comment => /\d+/, :as => :hide_diary_comment
   post "/user/:display_name/diary/:id/unhidecomment/:comment" => "diary_entries#unhidecomment", :id => /\d+/, :comment => /\d+/, :as => :unhide_diary_comment
-  post "/user/:display_name/diary/:id/subscribe" => "diary_entries#subscribe", :as => :diary_entry_subscribe, :id => /\d+/
-  post "/user/:display_name/diary/:id/unsubscribe" => "diary_entries#unsubscribe", :as => :diary_entry_unsubscribe, :id => /\d+/
+  match "/user/:display_name/diary/:id/subscribe" => "diary_entries#subscribe", :via => [:get, :post], :as => :diary_entry_subscribe, :id => /\d+/
+  match "/user/:display_name/diary/:id/unsubscribe" => "diary_entries#unsubscribe", :via => [:get, :post], :as => :diary_entry_unsubscribe, :id => /\d+/
 
   # user pages
   resources :users, :path => "user", :param => :display_name, :only => [:show, :destroy]
index b83e9b7a0e07e96e287514010daf76e930f891d1..e7d812b3e7fa8fabae7d9fe8151834eb601caeb3 100644 (file)
@@ -98,10 +98,18 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
       { :path => "/user/username/diary/1/unhidecomment/2", :method => :post },
       { :controller => "diary_entries", :action => "unhidecomment", :display_name => "username", :id => "1", :comment => "2" }
     )
+    assert_routing(
+      { :path => "/user/username/diary/1/subscribe", :method => :get },
+      { :controller => "diary_entries", :action => "subscribe", :display_name => "username", :id => "1" }
+    )
     assert_routing(
       { :path => "/user/username/diary/1/subscribe", :method => :post },
       { :controller => "diary_entries", :action => "subscribe", :display_name => "username", :id => "1" }
     )
+    assert_routing(
+      { :path => "/user/username/diary/1/unsubscribe", :method => :get },
+      { :controller => "diary_entries", :action => "unsubscribe", :display_name => "username", :id => "1" }
+    )
     assert_routing(
       { :path => "/user/username/diary/1/unsubscribe", :method => :post },
       { :controller => "diary_entries", :action => "unsubscribe", :display_name => "username", :id => "1" }
@@ -916,6 +924,25 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     assert_response :not_found
   end
 
+  def test_subscribe_page
+    user = create(:user)
+    other_user = create(:user)
+    diary_entry = create(:diary_entry, :user => user)
+    path = diary_entry_subscribe_path(:id => diary_entry, :display_name => user.display_name)
+
+    get path
+    assert_response :redirect
+    assert_redirected_to login_path(:referer => path)
+
+    session_for(other_user)
+    get path
+    assert_response :success
+    assert_dom ".content-body" do
+      assert_dom "a[href='#{diary_entry_path(:id => diary_entry, :display_name => user.display_name)}']", :text => diary_entry.title
+      assert_dom "a[href='#{user_path(user)}']", :text => user.display_name
+    end
+  end
+
   def test_subscribe_success
     user = create(:user)
     other_user = create(:user)
@@ -953,6 +980,25 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     end
   end
 
+  def test_unsubscribe_page
+    user = create(:user)
+    other_user = create(:user)
+    diary_entry = create(:diary_entry, :user => user)
+    path = diary_entry_unsubscribe_path(:id => diary_entry, :display_name => user.display_name)
+
+    get path
+    assert_response :redirect
+    assert_redirected_to login_path(:referer => path)
+
+    session_for(other_user)
+    get path
+    assert_response :success
+    assert_dom ".content-body" do
+      assert_dom "a[href='#{diary_entry_path(:id => diary_entry, :display_name => user.display_name)}']", :text => diary_entry.title
+      assert_dom "a[href='#{user_path(user)}']", :text => user.display_name
+    end
+  end
+
   def test_unsubscribe_success
     user = create(:user)
     other_user = create(:user)