From 8bac0350d16cb8e2770c089c91d71f8038404de5 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 19 Apr 2017 07:52:37 -0400 Subject: Restful refactor of accounts/ routes (#2133) * Add routing specs for accounts followers and following actions * Use more restful route naming for public account follow pages Moves two actions: - accounts#followers to accounts/follower_accounts#index - accounts#following to accounts/following_accounts#index Adds routing spec to ensure prior URLs are preserved. --- app/controllers/account_follow_controller.rb | 12 +++++ app/controllers/account_unfollow_controller.rb | 12 +++++ app/controllers/accounts_controller.rb | 37 +--------------- .../concerns/account_controller_concern.rb | 51 ++++++++++++++++++++++ app/controllers/follower_accounts_controller.rb | 15 +++++++ app/controllers/following_accounts_controller.rb | 15 +++++++ app/views/accounts/_follow_grid.html.haml | 7 +++ app/views/accounts/_header.html.haml | 12 ++--- app/views/follower_accounts/index.html.haml | 6 +++ app/views/following_accounts/index.html.haml | 6 +++ 10 files changed, 131 insertions(+), 42 deletions(-) create mode 100644 app/controllers/account_follow_controller.rb create mode 100644 app/controllers/account_unfollow_controller.rb create mode 100644 app/controllers/concerns/account_controller_concern.rb create mode 100644 app/controllers/follower_accounts_controller.rb create mode 100644 app/controllers/following_accounts_controller.rb create mode 100644 app/views/accounts/_follow_grid.html.haml create mode 100644 app/views/follower_accounts/index.html.haml create mode 100644 app/views/following_accounts/index.html.haml (limited to 'app') diff --git a/app/controllers/account_follow_controller.rb b/app/controllers/account_follow_controller.rb new file mode 100644 index 000000000..185a355f8 --- /dev/null +++ b/app/controllers/account_follow_controller.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class AccountFollowController < ApplicationController + include AccountControllerConcern + + before_action :authenticate_user! + + def create + FollowService.new.call(current_user.account, @account.acct) + redirect_to account_path(@account) + end +end diff --git a/app/controllers/account_unfollow_controller.rb b/app/controllers/account_unfollow_controller.rb new file mode 100644 index 000000000..378ec86dc --- /dev/null +++ b/app/controllers/account_unfollow_controller.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +class AccountUnfollowController < ApplicationController + include AccountControllerConcern + + before_action :authenticate_user! + + def create + UnfollowService.new.call(current_user.account, @account) + redirect_to account_path(@account) + end +end diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index d4f157614..8eda96336 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -1,12 +1,7 @@ # frozen_string_literal: true class AccountsController < ApplicationController - layout 'public' - - before_action :set_account - before_action :set_link_headers - before_action :authenticate_user!, only: [:follow, :unfollow] - before_action :check_account_suspension + include AccountControllerConcern def show respond_to do |format| @@ -24,39 +19,9 @@ class AccountsController < ApplicationController end end - def follow - FollowService.new.call(current_user.account, @account.acct) - redirect_to account_path(@account) - end - - def unfollow - UnfollowService.new.call(current_user.account, @account) - redirect_to account_path(@account) - end - - def followers - @followers = @account.followers.order('follows.created_at desc').page(params[:page]).per(12) - end - - def following - @following = @account.following.order('follows.created_at desc').page(params[:page]).per(12) - end - private def set_account @account = Account.find_local!(params[:username]) end - - def set_link_headers - response.headers['Link'] = LinkHeader.new([[webfinger_account_url, [%w(rel lrdd), %w(type application/xrd+xml)]], [account_url(@account, format: 'atom'), [%w(rel alternate), %w(type application/atom+xml)]]]) - end - - def webfinger_account_url - webfinger_url(resource: @account.to_webfinger_s) - end - - def check_account_suspension - gone if @account.suspended? - end end diff --git a/app/controllers/concerns/account_controller_concern.rb b/app/controllers/concerns/account_controller_concern.rb new file mode 100644 index 000000000..d36fc8c93 --- /dev/null +++ b/app/controllers/concerns/account_controller_concern.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +module AccountControllerConcern + extend ActiveSupport::Concern + + FOLLOW_PER_PAGE = 12 + + included do + layout 'public' + before_action :set_account + before_action :set_link_headers + before_action :check_account_suspension + end + + private + + def set_account + @account = Account.find_local!(params[:account_username]) + end + + def set_link_headers + response.headers['Link'] = LinkHeader.new( + [ + webfinger_account_link, + atom_account_url_link, + ] + ) + end + + def webfinger_account_link + [ + webfinger_account_url, + [%w(rel lrdd), %w(type application/xrd+xml)], + ] + end + + def atom_account_url_link + [ + account_url(@account, format: 'atom'), + [%w(rel alternate), %w(type application/atom+xml)], + ] + end + + def webfinger_account_url + webfinger_url(resource: @account.to_webfinger_s) + end + + def check_account_suspension + gone if @account.suspended? + end +end diff --git a/app/controllers/follower_accounts_controller.rb b/app/controllers/follower_accounts_controller.rb new file mode 100644 index 000000000..165cbf1b5 --- /dev/null +++ b/app/controllers/follower_accounts_controller.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class FollowerAccountsController < ApplicationController + include AccountControllerConcern + + def index + @accounts = ordered_accounts.page(params[:page]).per(FOLLOW_PER_PAGE) + end + + private + + def ordered_accounts + @account.followers.order('follows.created_at desc') + end +end diff --git a/app/controllers/following_accounts_controller.rb b/app/controllers/following_accounts_controller.rb new file mode 100644 index 000000000..faeea144a --- /dev/null +++ b/app/controllers/following_accounts_controller.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class FollowingAccountsController < ApplicationController + include AccountControllerConcern + + def index + @accounts = ordered_accounts.page(params[:page]).per(FOLLOW_PER_PAGE) + end + + private + + def ordered_accounts + @account.following.order('follows.created_at desc') + end +end diff --git a/app/views/accounts/_follow_grid.html.haml b/app/views/accounts/_follow_grid.html.haml new file mode 100644 index 000000000..322a0ebf4 --- /dev/null +++ b/app/views/accounts/_follow_grid.html.haml @@ -0,0 +1,7 @@ +.accounts-grid + - if accounts.empty? + = render partial: 'accounts/nothing_here' + - else + = render partial: 'accounts/grid_card', collection: accounts, as: :account, cached: true + += paginate accounts diff --git a/app/views/accounts/_header.html.haml b/app/views/accounts/_header.html.haml index 6538885a0..ed13ab57c 100644 --- a/app/views/accounts/_header.html.haml +++ b/app/views/accounts/_header.html.haml @@ -2,9 +2,9 @@ - if user_signed_in? && current_account.id != account.id && !current_account.requested?(account) .controls - if current_account.following?(account) - = link_to t('accounts.unfollow'), unfollow_account_path(account), data: { method: :post }, class: 'button' + = link_to t('accounts.unfollow'), account_unfollow_path(account), data: { method: :post }, class: 'button' - else - = link_to t('accounts.follow'), follow_account_path(account), data: { method: :post }, class: 'button' + = link_to t('accounts.follow'), account_follow_path(account), data: { method: :post }, class: 'button' - elsif !user_signed_in? .controls .remote-follow @@ -24,11 +24,11 @@ = link_to short_account_url(account), class: 'u-url u-uid' do %span.counter-label= t('accounts.posts') %span.counter-number= number_with_delimiter account.statuses_count - .counter{ class: active_nav_class(following_account_url(account)) } - = link_to following_account_url(account) do + .counter{ class: active_nav_class(account_following_index_url(account)) } + = link_to account_following_index_url(account) do %span.counter-label= t('accounts.following') %span.counter-number= number_with_delimiter account.following_count - .counter{ class: active_nav_class(followers_account_url(account)) } - = link_to followers_account_url(account) do + .counter{ class: active_nav_class(account_followers_url(account)) } + = link_to account_followers_url(account) do %span.counter-label= t('accounts.followers') %span.counter-number= number_with_delimiter account.followers_count diff --git a/app/views/follower_accounts/index.html.haml b/app/views/follower_accounts/index.html.haml new file mode 100644 index 000000000..c30d601e6 --- /dev/null +++ b/app/views/follower_accounts/index.html.haml @@ -0,0 +1,6 @@ +- content_for :page_title do + = t('accounts.people_who_follow', name: display_name(@account)) + += render 'accounts/header', account: @account + += render 'accounts/follow_grid', accounts: @accounts diff --git a/app/views/following_accounts/index.html.haml b/app/views/following_accounts/index.html.haml new file mode 100644 index 000000000..cd3737591 --- /dev/null +++ b/app/views/following_accounts/index.html.haml @@ -0,0 +1,6 @@ +- content_for :page_title do + = t('accounts.people_followed_by', name: display_name(@account)) + += render 'accounts/header', account: @account + += render 'accounts/follow_grid', accounts: @accounts -- cgit