diff --git a/Gemfile.lock b/Gemfile.lock index 3fc78635..323175f3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -651,4 +651,4 @@ DEPENDENCIES webpacker (~> 5.2) BUNDLED WITH - 2.1.4 + 2.3.18 diff --git a/app/helpers/application_helper/graph_methods.rb b/app/helpers/application_helper/graph_methods.rb index 52ad96ea..cde48656 100644 --- a/app/helpers/application_helper/graph_methods.rb +++ b/app/helpers/application_helper/graph_methods.rb @@ -19,7 +19,7 @@ module ApplicationHelper::GraphMethods "og:title": user.profile.safe_name, "og:type": "profile", "og:image": full_profile_picture_url(user), - "og:url": show_user_profile_url(user.screen_name), + "og:url": user_url(user), "og:description": user.profile.description, "og:site_name": APP_CONFIG["site_name"], "profile:username": user.screen_name @@ -43,7 +43,7 @@ module ApplicationHelper::GraphMethods "og:title": "#{answer.user.profile.safe_name} answered: #{answer.question.content}", "og:type": "article", "og:image": full_profile_picture_url(answer.user), - "og:url": show_user_answer_url(answer.user.screen_name, answer.id), + "og:url": answer_url(answer.user.screen_name, answer.id), "og:description": answer.content, "og:site_name": APP_CONFIG["site_name"] }) diff --git a/app/helpers/moderation_helper.rb b/app/helpers/moderation_helper.rb index 4610f798..b573cc1b 100644 --- a/app/helpers/moderation_helper.rb +++ b/app/helpers/moderation_helper.rb @@ -1,18 +1,20 @@ +# frozen_string_literal: true + module ModerationHelper # @param report [Report] def content_url(report) target = report.target case report.type - when 'Reports::Answer' - show_user_answer_path target.user.screen_name, target.id - when 'Reports::Comment' - show_user_answer_path target.answer.user.screen_name, target.answer.id - when 'Reports::Question' - show_user_question_path 'user', target.id - when 'Reports::User' - show_user_profile_path target.screen_name - else - '#' + when "Reports::Answer" + answer_path target.user.screen_name, target.id + when "Reports::Comment" + answer_path target.answer.user.screen_name, target.answer.id + when "Reports::Question" + question_path "user", target.id + when "Reports::User" + user_path target + else + "#" end end end diff --git a/app/helpers/social_helper/tumblr_methods.rb b/app/helpers/social_helper/tumblr_methods.rb index 16fde405..868f31d3 100644 --- a/app/helpers/social_helper/tumblr_methods.rb +++ b/app/helpers/social_helper/tumblr_methods.rb @@ -12,7 +12,7 @@ module SocialHelper::TumblrMethods end def tumblr_body(answer) - answer_url = show_user_answer_url( + answer_url = answer_url( id: answer.id, username: answer.user.screen_name, host: APP_CONFIG['hostname'], @@ -23,7 +23,7 @@ module SocialHelper::TumblrMethods end def tumblr_share_url(answer) - answer_url = show_user_answer_url( + answer_url = answer_url( id: answer.id, username: answer.user.screen_name, host: APP_CONFIG['hostname'], @@ -32,4 +32,4 @@ module SocialHelper::TumblrMethods "https://www.tumblr.com/widgets/share/tool?shareSource=legacy&posttype=text&title=#{CGI.escape(tumblr_title(answer))}&url=#{CGI.escape(answer_url)}&caption=&content=#{CGI.escape(tumblr_body(answer))}" end -end \ No newline at end of file +end diff --git a/app/helpers/social_helper/twitter_methods.rb b/app/helpers/social_helper/twitter_methods.rb index ce0b605d..7f025f71 100644 --- a/app/helpers/social_helper/twitter_methods.rb +++ b/app/helpers/social_helper/twitter_methods.rb @@ -8,7 +8,7 @@ module SocialHelper::TwitterMethods original_question_length = question_content.length answer_content = twitter_markdown answer.content original_answer_length = answer_content.length - answer_url = show_user_answer_url( + answer_url = answer_url( id: answer.id, username: answer.user.screen_name, host: APP_CONFIG['hostname'], @@ -42,4 +42,4 @@ module SocialHelper::TwitterMethods def twitter_share_url(answer) "https://twitter.com/intent/tweet?text=#{CGI.escape(prepare_tweet(answer))}" end -end \ No newline at end of file +end diff --git a/app/helpers/user_helper.rb b/app/helpers/user_helper.rb index 9c940856..b0532faf 100644 --- a/app/helpers/user_helper.rb +++ b/app/helpers/user_helper.rb @@ -10,7 +10,7 @@ module UserHelper return anonymous_name(context_user) if anonymous?(user, author_identifier.present?) if url - return show_user_profile_path(user.screen_name) if link_only + return user_path(user) if link_only return profile_link(user) end @@ -24,7 +24,7 @@ module UserHelper private def profile_link(user) - link_to(user.profile.safe_name, show_user_profile_path(user.screen_name), class: ("user--banned" if user.banned?).to_s) + link_to(user.profile.safe_name, user_path(user), class: ("user--banned" if user.banned?).to_s) end def should_unmask?(author_identifier) diff --git a/app/models/user.rb b/app/models/user.rb index 84d8fb9d..a12c8248 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -81,6 +81,9 @@ class User < ApplicationRecord Profile.create(user_id: id) if Profile.where(user_id: id).count.zero? end + # use the screen name as parameter for url helpers + def to_param = screen_name + def login=(login) @login = login end diff --git a/app/services/flavored_markdown.rb b/app/services/flavored_markdown.rb index 781438c9..a6ecde56 100644 --- a/app/services/flavored_markdown.rb +++ b/app/services/flavored_markdown.rb @@ -10,7 +10,7 @@ class FlavoredMarkdown < Redcarpet::Render::HTML def wrap_mentions(text) text.gsub(/(^|\s)(@[a-zA-Z0-9_]{1,16})/) do - "#{$1}[#{$2}](#{show_user_profile_path $2.tr('@', '')})" + "#{$1}[#{$2}](#{user_path $2.tr('@', '')})" end end diff --git a/app/views/answerbox/_comments.haml b/app/views/answerbox/_comments.haml index 43b196f0..8cf39e72 100644 --- a/app/views/answerbox/_comments.haml +++ b/app/views/answerbox/_comments.haml @@ -7,7 +7,7 @@ %div{ style: "height: 0; width: 0" }= render "modal/comment_smiles", comment: comment .media .pull-left - %a{ href: show_user_profile_path(username: comment.user.screen_name) } + %a{ href: user_path(comment.user) } %img.comment__user-avatar.avatar-sm{ src: comment.user.profile_picture.url(:medium) } .media-body %h6.media-heading.comment__user diff --git a/app/views/answerbox/_header.haml b/app/views/answerbox/_header.haml index 8dda7f0c..055593fa 100644 --- a/app/views/answerbox/_header.haml +++ b/app/views/answerbox/_header.haml @@ -1,7 +1,7 @@ .card-header .media - unless a.question.author_is_anonymous - %a.pull-left{ href: show_user_profile_path(a.question.user.screen_name) } + %a.pull-left{ href: user_path(a.question.user) } %img.answerbox__question-user-avatar.avatar-md{ src: a.question.user.profile_picture.url(:medium) } .media-body - if user_signed_in? @@ -28,7 +28,7 @@ = raw t('views.answerbox.asked', user: user_screen_name(a.question.user, context_user: a.user, author_identifier: a.question.author_is_anonymous ? a.question.author_identifier: nil), time: time_tooltip(a.question)) - if !a.question.author_is_anonymous && !a.question.direct · - %a{ href: show_user_question_path(a.question.user.screen_name, a.question.id) } + %a{ href: question_path(a.question.user.screen_name, a.question.id) } = pluralize(a.question.answer_count, t('views.general.answer')) .answerbox__question-text = question_markdown a.question.content diff --git a/app/views/answerbox/_smiles.haml b/app/views/answerbox/_smiles.haml index ea6ac6ce..3dd5f96b 100644 --- a/app/views/answerbox/_smiles.haml +++ b/app/views/answerbox/_smiles.haml @@ -6,7 +6,7 @@ = t 'views.answerbox.no_smile' - else - a.smiles.all.each do |smile| - %a{ href: show_user_profile_path(smile.user.screen_name), + %a{ href: user_path(smile.user), title: user_screen_name(smile.user, url: false), data: { toggle: :tooltip, placement: :top, smile_id: smile.id } } %img.avatar-xs{ src: smile.user.profile_picture.url(:medium) } diff --git a/app/views/application/_answerbox.haml b/app/views/application/_answerbox.haml index c9e435bf..70ba3408 100644 --- a/app/views/application/_answerbox.haml +++ b/app/views/application/_answerbox.haml @@ -9,7 +9,7 @@ - if a.content.length > 640 [...] %p - %a.btn.btn-primary{ href: show_user_answer_path(a.user.screen_name, a.id) } + %a.btn.btn-primary{ href: answer_path(a.user.screen_name, a.id) } = t 'views.answerbox.read' - else .answerbox__answer-text @@ -19,20 +19,20 @@ .col-sm-6.text-left.text-muted .media .pull-left - %a{ href: show_user_profile_path(a.user.screen_name) } + %a{ href: user_path(a.user) } %img.answerbox__answer-user-avatar.avatar-sm{ src: a.user.profile_picture.url(:medium) } .media-body %h6.media-heading.answerbox__answer-user = raw t('views.answerbox.answered', hide: hidespan(t('views.answerbox.hide'), 'd-none d-sm-inline'), user: user_screen_name(a.user)) .answerbox__answer-date - = link_to(raw(t('views.answerbox.time', time: time_tooltip(a))), show_user_answer_path(a.user.screen_name, a.id)) + = link_to(raw(t('views.answerbox.time', time: time_tooltip(a))), answer_path(a.user.screen_name, a.id)) .col-md-6.d-flex.d-md-block.answerbox__actions = render 'answerbox/actions', a: a, display_all: display_all - else .row .col-md-6.text-left.text-muted %i.fa.fa-clock-o - = link_to(raw(t('views.answerbox.time', time: time_tooltip(a))), show_user_answer_path(a.user.screen_name, a.id), class: 'answerbox__permalink') + = link_to(raw(t('views.answerbox.time', time: time_tooltip(a))), answer_path(a.user.screen_name, a.id), class: 'answerbox__permalink') .col-md-6.d-md-flex.answerbox__actions = render 'answerbox/actions', a: a, display_all: display_all .card-footer{ id: "ab-comments-section-#{a.id}", class: display_all.nil? ? 'd-none' : nil } diff --git a/app/views/discover/_userbox.haml b/app/views/discover/_userbox.haml index a34869a5..15f94ba1 100644 --- a/app/views/discover/_userbox.haml +++ b/app/views/discover/_userbox.haml @@ -2,15 +2,15 @@ .card-body .media .pull-left - %a{ href: show_user_profile_path(u.screen_name) } + %a{ href: user_path(u) } %img.avatar-md.mr-2{ src: u.profile_picture.url(:medium) } .media-body %h6.media-heading.answerbox__question-user - if u.profile.display_name.blank? - %a{ href: show_user_profile_path(u.screen_name) } + %a{ href: user_path(u) } = u.screen_name - else - %a{ href: show_user_profile_path(u.screen_name) } + %a{ href: user_path(u) } = u.profile.display_name %span.text-muted= u.screen_name %p.answerbox__question-text diff --git a/app/views/inbox/_entry.haml b/app/views/inbox/_entry.haml index 6e314e63..3aee1e3e 100644 --- a/app/views/inbox/_entry.haml +++ b/app/views/inbox/_entry.haml @@ -2,7 +2,7 @@ .card-header .media - unless i.question.author_is_anonymous - %a.pull-left{ href: show_user_profile_path(i.question.user.screen_name) } + %a.pull-left{ href: user_path(i.question.user) } %img.answerbox__question-user-avatar.avatar-md{ src: i.question.user.profile_picture.url(:medium) } .media-body %h6.text-muted.media-heading.answerbox__question-user @@ -11,7 +11,7 @@ = t(".asked_html", user: user_screen_name(i.question.user, context_user: i.user, author_identifier: i.question.author_is_anonymous ? i.question.author_identifier : nil), time: time_tooltip(i.question)) - if !i.question.author_is_anonymous && i.question.answer_count.positive? · - %a{ href: show_user_question_path(i.question.user.screen_name, i.question.id) } + %a{ href: question_path(i.question.user.screen_name, i.question.id) } = t(".answers", count: i.question.answer_count) .answerbox__question-text= question_markdown i.question.content - if i.question.user_id != current_user.id || current_user.has_role?(:administrator) diff --git a/app/views/inbox/_sidebar.haml b/app/views/inbox/_sidebar.haml index c195159c..afaf9ee7 100644 --- a/app/views/inbox/_sidebar.haml +++ b/app/views/inbox/_sidebar.haml @@ -6,11 +6,11 @@ .card-header= t(".share.heading") .card-body %a.btn.btn-block.btn-primary{ target: "_blank", - href: "https://twitter.com/intent/tweet?text=Ask%20me%20anything%21&url=#{show_user_profile_url(current_user.screen_name)}" } + href: "https://twitter.com/intent/tweet?text=Ask%20me%20anything%21&url=#{user_url(current_user)}" } %i.fa.fa-fw.fa-twitter = t(".share.button", service: "Twitter") %a.btn.btn-block.btn-primary{ target: "_blank", - href: "https://www.tumblr.com/share/link?url=#{show_user_profile_url(current_user.screen_name)}&name=Ask%20me%20anything%21" } + href: "https://www.tumblr.com/share/link?url=#{user_url(current_user)}&name=Ask%20me%20anything%21" } %i.fa.fa-fw.fa-tumblr = t(".share.button", service: "Tumblr") .card diff --git a/app/views/modal/_comment_smiles.haml b/app/views/modal/_comment_smiles.haml index 1ce14d22..3d009a62 100644 --- a/app/views/modal/_comment_smiles.haml +++ b/app/views/modal/_comment_smiles.haml @@ -13,6 +13,6 @@ %ul.smiles__user-list - comment.smiles.all.each do |smile| %li.smiles__user-list-entry - %a{ href: show_user_profile_path(smile.user.screen_name) } + %a{ href: user_path(smile.user) } %img{ src: smile.user.profile_picture.url(:small), alt: user_screen_name(smile.user, url: false) } %span= user_screen_name(smile.user, url: false) diff --git a/app/views/moderation/_moderationbox.haml b/app/views/moderation/_moderationbox.haml index 5624ab94..ddcc5656 100644 --- a/app/views/moderation/_moderationbox.haml +++ b/app/views/moderation/_moderationbox.haml @@ -26,7 +26,7 @@ %a.btn.btn-primary{ href: content_url(report) } = t('views.moderation.moderationbox.view', content: report.type.sub('Reports::', '')) - if report.target.respond_to?(:user) && report.target.user - %a.btn.btn-primary{ href: show_user_profile_path(report.target.user.screen_name) } + %a.btn.btn-primary{ href: user_path(report.target.user) } = t('views.moderation.moderationbox.view', content: t('views.general.user')) .col-md-4.col-sm-4.col-xs-4.text-right %button.btn.btn-default.btn-sm{ type: :button, name: 'mod-delete-report', data: { id: report.id } } diff --git a/app/views/moderation/inbox/_header.haml b/app/views/moderation/inbox/_header.haml index 54ca1cd6..94f53fce 100644 --- a/app/views/moderation/inbox/_header.haml +++ b/app/views/moderation/inbox/_header.haml @@ -2,7 +2,7 @@ .container .card-body .media - %a.pull-left{ href: show_user_profile_path(user.screen_name) } + %a.pull-left{ href: user_path(user) } %img.answerbox__question-user-avatar.avatar-md{ src: user.profile_picture.url(:medium) } .media-body - = t(".title_html", screen_name: user.screen_name, user_id: user.id) \ No newline at end of file + = t(".title_html", screen_name: user.screen_name, user_id: user.id) diff --git a/app/views/navigation/dropdown/_profile.haml b/app/views/navigation/dropdown/_profile.haml index 1a17383c..298608c1 100644 --- a/app/views/navigation/dropdown/_profile.haml +++ b/app/views/navigation/dropdown/_profile.haml @@ -1,6 +1,6 @@ .dropdown-menu.profile-dropdown{ id: "rs-#{size}-nav-profile" } %h6.dropdown-header.d-none.d-sm-block= current_user.screen_name - %a.dropdown-item{ href: show_user_profile_path(current_user.screen_name) } + %a.dropdown-item{ href: user_path(current_user) } %i.fa.fa-fw.fa-user = t("views.navigation.show") %a.dropdown-item{ href: edit_user_registration_path } diff --git a/app/views/notifications/type/_answer.haml b/app/views/notifications/type/_answer.haml index 147c25fb..d20de6d5 100644 --- a/app/views/notifications/type/_answer.haml +++ b/app/views/notifications/type/_answer.haml @@ -6,7 +6,7 @@ %img.avatar-xs{ src: notification.target.user.profile_picture.url(:small) } = t(".heading_html", user: user_screen_name(notification.target.user), - question: link_to(t(".link_text"), show_user_answer_path(username: notification.target.user.screen_name, id: notification.target.id)), + question: link_to(t(".link_text"), answer_path(username: notification.target.user.screen_name, id: notification.target.id)), time: time_tooltip(notification.target)) .list-group .list-group-item diff --git a/app/views/notifications/type/_comment.haml b/app/views/notifications/type/_comment.haml index 0ef75b85..1e9cc4ca 100644 --- a/app/views/notifications/type/_comment.haml +++ b/app/views/notifications/type/_comment.haml @@ -7,17 +7,17 @@ - if notification.target.answer.user == current_user = t(".heading_html", user: user_screen_name(notification.target.user), - answer: link_to(t(".active.link_text"), show_user_answer_path(username: notification.target.user.screen_name, id: notification.target.answer.id)), + answer: link_to(t(".active.link_text"), answer_path(username: notification.target.user.screen_name, id: notification.target.answer.id)), time: time_tooltip(notification.target)) - elsif notification.target.user == notification.target.answer.user = t(".heading_html", user: user_screen_name(notification.target.user), - answer: link_to(t(".passive.link_text"), show_user_answer_path(username: notification.target.user.screen_name, id: notification.target.answer.id)), + answer: link_to(t(".passive.link_text"), answer_path(username: notification.target.user.screen_name, id: notification.target.answer.id)), time: time_tooltip(notification.target)) - else = t(".heading_html", user: user_screen_name(notification.target.user), - answer: link_to(t(".other.link_text_html", user: user_screen_name(notification.target.answer.user)), show_user_answer_path(username: notification.target.user.screen_name, id: notification.target.answer.id)), + answer: link_to(t(".other.link_text_html", user: user_screen_name(notification.target.answer.user)), answer_path(username: notification.target.user.screen_name, id: notification.target.answer.id)), time: time_tooltip(notification.target)) .list-group .list-group-item diff --git a/app/views/notifications/type/_reaction.haml b/app/views/notifications/type/_reaction.haml index e28f0d8b..156d867d 100644 --- a/app/views/notifications/type/_reaction.haml +++ b/app/views/notifications/type/_reaction.haml @@ -7,12 +7,12 @@ - if notification.target.parent_type == 'Answer' = t(".heading_html", user: user_screen_name(notification.target.user), - type: link_to(t(".#{notification.target.parent_type.downcase}.link_text"), show_user_answer_path(username: notification.target.user.screen_name, id: notification.target.parent.id)), + type: link_to(t(".#{notification.target.parent_type.downcase}.link_text"), answer_path(username: notification.target.user.screen_name, id: notification.target.parent.id)), time: time_tooltip(notification.target)) - elsif notification.target.parent_type == 'Comment' = t(".heading_html", user: user_screen_name(notification.target.user), - type: link_to(t(".#{notification.target.parent_type.downcase}.link_text"), show_user_answer_path(username: notification.target.user.screen_name, id: notification.target.parent.answer.id)), + type: link_to(t(".#{notification.target.parent_type.downcase}.link_text"), answer_path(username: notification.target.user.screen_name, id: notification.target.parent.answer.id)), time: time_tooltip(notification.target)) .list-group .list-group-item diff --git a/app/views/question/_question.haml b/app/views/question/_question.haml index 89449dea..924570d9 100644 --- a/app/views/question/_question.haml +++ b/app/views/question/_question.haml @@ -3,7 +3,7 @@ .card-body .media - unless question.author_is_anonymous - %a.pull-left{ href: unless hidden then show_user_profile_path(question.user.screen_name) end } + %a.pull-left{ href: unless hidden then user_path(question.user) end } %img.answerbox__question-user-avatar.avatar-md{ src: question.user.profile_picture.url(:medium) } .media-body - if user_signed_in? diff --git a/app/views/shared/_question.haml b/app/views/shared/_question.haml index cfebe94a..9ead4027 100644 --- a/app/views/shared/_question.haml +++ b/app/views/shared/_question.haml @@ -25,7 +25,7 @@ = raw t('views.answerbox.asked', user: user_screen_name(q.user), time: time_tooltip(q)) - if q.answer_count > 1 · - %a{ href: show_user_question_path(q.user.screen_name, q.id) } + %a{ href: question_path(q.user.screen_name, q.id) } = pluralize(q.answer_count, t('views.general.answer')) %p.answerbox__question-text = q.content diff --git a/app/views/shared/_sidebar.haml b/app/views/shared/_sidebar.haml index 508bfb87..7d76746c 100644 --- a/app/views/shared/_sidebar.haml +++ b/app/views/shared/_sidebar.haml @@ -15,7 +15,7 @@ - if @list.members.empty? %p.text-muted No members yet. - @list.members.each do |member| - %a{ href: show_user_profile_path(member.user.screen_name), title: member.user.screen_name, data: { toggle: :tooltip, placement: :top } } + %a{ href: user_path(member.user), title: member.user.screen_name, data: { toggle: :tooltip, placement: :top } } %img.avatar-xs{ src: member.user.profile_picture.url(:medium) } = render 'shared/links' diff --git a/app/views/shared/_userbox.haml b/app/views/shared/_userbox.haml index 8ae9e144..43e882ea 100644 --- a/app/views/shared/_userbox.haml +++ b/app/views/shared/_userbox.haml @@ -3,7 +3,7 @@ %img.userbox__header{ src: user.profile_header.url(:mobile) } .card-body %img.userbox__avatar{ src: user.profile_picture.url(:small) } - %a.profile__name{ href: show_user_profile_path(user.screen_name) } + %a.profile__name{ href: user_path(user) } - unless user.profile.display_name.blank? .profile__display-name = user.profile.display_name diff --git a/app/views/tabs/_profile.haml b/app/views/tabs/_profile.haml index 5df6f699..d8d758a3 100644 --- a/app/views/tabs/_profile.haml +++ b/app/views/tabs/_profile.haml @@ -1,6 +1,6 @@ .card .list-group.list-group-horizontal-sm.text-center - = list_group_item 'Answers', show_user_profile_path(user.screen_name), badge: user.answered_count + = list_group_item 'Answers', user_path(user), badge: user.answered_count = list_group_item 'Questions', show_user_questions_path(user.screen_name), badge: user.asked_count = list_group_item 'Followers', show_user_followers_path(user.screen_name), badge: user.followers.count = list_group_item 'Following', show_user_followings_path(user.screen_name), badge: user.followings.count diff --git a/config/routes.rb b/config/routes.rb index bb853e03..e484097a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,169 +1,171 @@ -require 'sidekiq/web' +# frozen_string_literal: true + +require "sidekiq/web" Rails.application.routes.draw do - start = Time.now + start = Time.zone.now # Routes only accessible by admins (admin panels, sidekiq, pghero) authenticate :user, ->(user) { user.has_role?(:administrator) } do # Admin panel - mount RailsAdmin::Engine => "/justask_admin", as: "rails_admin" + mount RailsAdmin::Engine => "/justask_admin", :as => "rails_admin" mount Sidekiq::Web, at: "/sidekiq" mount PgHero::Engine, at: "/pghero", as: "pghero" - match "/admin/announcements", to: "announcement#index", via: :get, as: :announcement_index - match "/admin/announcements", to: "announcement#create", via: :post, as: :announcement_create - match "/admin/announcements/new", to: "announcement#new", via: :get, as: :announcement_new - match "/admin/announcements/:id/edit", to: "announcement#edit", via: :get, as: :announcement_edit - match "/admin/announcements/:id", to: "announcement#update", via: :patch, as: :announcement_update - match "/admin/announcements/:id", to: "announcement#destroy", via: :delete, as: :announcement_destroy + get "/admin/announcements", to: "announcement#index", as: :announcement_index + post "/admin/announcements", to: "announcement#create", as: :announcement_create + get "/admin/announcements/new", to: "announcement#new", as: :announcement_new + get "/admin/announcements/:id/edit", to: "announcement#edit", as: :announcement_edit + patch "/admin/announcements/:id", to: "announcement#update", as: :announcement_update + delete "/admin/announcements/:id", to: "announcement#destroy", as: :announcement_destroy end # Routes only accessible by moderators (moderation panel) authenticate :user, ->(user) { user.mod? } do - match '/moderation/unmask', to: 'moderation#toggle_unmask', via: :post, as: :moderation_toggle_unmask - match '/moderation(/:type)', to: 'moderation#index', via: :get, as: :moderation, defaults: {type: 'all'} - match '/moderation/inbox/:user', to: 'moderation/inbox#index', via: :get, as: :mod_inbox_index + post "/moderation/unmask", to: "moderation#toggle_unmask", as: :moderation_toggle_unmask + get "/moderation(/:type)", to: "moderation#index", as: :moderation, defaults: { type: "all" } + get "/moderation/inbox/:user", to: "moderation/inbox#index", as: :mod_inbox_index namespace :ajax do - match '/mod/destroy_report', to: 'moderation#destroy_report', via: :post, as: :mod_destroy_report - match '/mod/privilege', to: 'moderation#privilege', via: :post, as: :mod_privilege - match '/mod/ban', to: 'moderation#ban', via: :post, as: :mod_ban + post "/mod/destroy_report", to: "moderation#destroy_report", as: :mod_destroy_report + post "/mod/privilege", to: "moderation#privilege", as: :mod_privilege + post "/mod/ban", to: "moderation#ban", as: :mod_ban end end unauthenticated :user do - root to: 'about#index' + root to: "about#index" end authenticate :user do - root to: 'timeline#index', as: :timeline + root to: "timeline#index", as: :timeline end - match '/about', to: 'about#about', via: 'get' - match '/privacy', to: 'about#privacy_policy', via: 'get', as: :privacy_policy - match '/terms', to: 'about#terms', via: 'get', as: :terms - match '/linkfilter', to: 'link_filter#index', via: 'get', as: :linkfilter - match '/manifest.json', to: 'manifests#show', via: 'get', as: :webapp_manifest + get "/about", to: "about#about" + get "/privacy", to: "about#privacy_policy", as: :privacy_policy + get "/terms", to: "about#terms", as: :terms + get "/linkfilter", to: "link_filter#index", as: :linkfilter + get "/manifest.json", to: "manifests#show", as: :webapp_manifest # Devise routes - devise_for :users, path: 'user', skip: [:sessions, :registrations] + devise_for :users, path: "user", skip: %i[sessions registrations] as :user do # :sessions - get 'sign_in' => 'user/sessions#new', as: :new_user_session - post 'sign_in' => 'user/sessions#create', as: :user_session - delete 'sign_out' => 'devise/sessions#destroy', as: :destroy_user_session + get "sign_in" => "user/sessions#new", :as => :new_user_session + post "sign_in" => "user/sessions#create", :as => :user_session + delete "sign_out" => "devise/sessions#destroy", :as => :destroy_user_session # :registrations - get 'settings/delete_account' => 'devise/registrations#cancel', as: :cancel_user_registration - post '/user/create' => 'user/registrations#create', as: :user_registration - get '/sign_up' => 'devise/registrations#new', as: :new_user_registration - get '/settings/account' => 'devise/registrations#edit', as: :edit_user_registration - patch '/settings/account' => 'devise/registrations#update', as: :update_user_registration - put '/settings/account' => 'devise/registrations#update' - delete '/settings/account' => 'user/registrations#destroy' + get "settings/delete_account" => "devise/registrations#cancel", :as => :cancel_user_registration + post "/user/create" => "user/registrations#create", :as => :user_registration + get "/sign_up" => "devise/registrations#new", :as => :new_user_registration + get "/settings/account" => "devise/registrations#edit", :as => :edit_user_registration + patch "/settings/account" => "devise/registrations#update", :as => :update_user_registration + put "/settings/account" => "devise/registrations#update" + delete "/settings/account" => "user/registrations#destroy" end namespace :settings do - get :theme, to: redirect('/settings/theme/edit') + get :theme, to: redirect("/settings/theme/edit") resource :theme, controller: :theme, only: %i[edit update destroy] - get :profile, to: redirect('/settings/profile/edit') + get :profile, to: redirect("/settings/profile/edit") resource :profile, controller: :profile, only: %i[edit update] resource :profile_picture, controller: :profile_picture, only: %i[update] - get :privacy, to: redirect('/settings/privacy/edit') + get :privacy, to: redirect("/settings/privacy/edit") resource :privacy, controller: :privacy, only: %i[edit update] - get :export, to: 'export#index' - post :export, to: 'export#create' + get :export, to: "export#index" + post :export, to: "export#create" - get :muted, to: 'mutes#index' + get :muted, to: "mutes#index" - get :blocks, to: 'blocks#index' + get :blocks, to: "blocks#index" - get :data, to: 'data#index' + get :data, to: "data#index" namespace :two_factor_authentication do - get :otp_authentication, to: 'otp_authentication#index' - patch :otp_authentication, to: 'otp_authentication#update' - delete :otp_authentication, to: 'otp_authentication#destroy' - match 'otp_authentication/reset', to: 'otp_authentication#reset', via: :delete + get :otp_authentication, to: "otp_authentication#index" + patch :otp_authentication, to: "otp_authentication#update" + delete :otp_authentication, to: "otp_authentication#destroy" + delete "otp_authentication/reset", to: "otp_authentication#reset" end end - resolve('Theme') { [:settings_theme] } # to make link_to/form_for work nicely when passing a `Theme` object to it, see also: https://api.rubyonrails.org/v6.1.5.1/classes/ActionDispatch/Routing/Mapper/CustomUrls.html#method-i-resolve - resolve('Profile') { [:settings_profile] } + resolve("Theme") { [:settings_theme] } # to make link_to/form_for work nicely when passing a `Theme` object to it, see also: https://api.rubyonrails.org/v6.1.5.1/classes/ActionDispatch/Routing/Mapper/CustomUrls.html#method-i-resolve + resolve("Profile") { [:settings_profile] } # resources :services, only: [:index, :destroy] - match '/settings/services', to: 'services#index', via: 'get', as: :services - match '/settings/services/:id', to: 'services#update', via: 'patch', as: :update_service - match '/settings/services/:id', to: 'services#destroy', via: 'delete', as: :service + get "/settings/services", to: "services#index", as: :services + patch "/settings/services/:id", to: "services#update", as: :update_service + delete "/settings/services/:id", to: "services#destroy", as: :service controller :services do scope "/auth", as: "auth" do - get ':provider/callback' => :create + get ":provider/callback" => :create get :failure end end namespace :ajax do - match '/ask', to: 'question#create', via: :post, as: :ask - match '/destroy_question', to: 'question#destroy', via: :post, as: :destroy_question - match '/generate_question', to: 'inbox#create', via: :post, as: :generate_question - match '/delete_inbox', to: 'inbox#remove', via: :post, as: :delete_inbox - match '/delete_all_inbox', to: 'inbox#remove_all', via: :post, as: :delete_all_inbox - match '/delete_all_inbox/:author', to: 'inbox#remove_all_author', via: :post, as: :delete_all_author - match '/answer', to: 'answer#create', via: :post, as: :answer - match '/destroy_answer', to: 'answer#destroy', via: :post, as: :destroy_answer - match '/create_relationship', to: 'relationship#create', via: :post, as: :create_relationship - match '/destroy_relationship', to: 'relationship#destroy', via: :post, as: :destroy_relationship - match '/create_smile', to: 'smile#create', via: :post, as: :create_smile - match '/destroy_smile', to: 'smile#destroy', via: :post, as: :destroy_smile - match '/create_comment_smile', to: 'smile#create_comment', via: :post, as: :create_comment_smile - match '/destroy_comment_smile', to: 'smile#destroy_comment', via: :post, as: :destroy_comment_smile - match '/create_comment', to: 'comment#create', via: :post, as: :create_comment - match '/destroy_comment', to: 'comment#destroy', via: :post, as: :destroy_comment - match '/report', to: 'report#create', via: :post, as: :report - match '/create_list', to: 'list#create', via: :post, as: :create_list - match '/destroy_list', to: 'list#destroy', via: :post, as: :destroy_list - match '/list_membership', to: 'list#membership', via: :post, as: :list_membership - match '/subscribe', to: 'subscription#subscribe', via: :post, as: :subscribe_answer - match '/unsubscribe', to: 'subscription#unsubscribe', via: :post, as: :unsubscribe_answer - match '/mute', to: 'mute_rule#create', via: :post, as: :create_mute_rule - match '/mute/:id', to: 'mute_rule#update', via: :post, as: :update_mute_rule - match '/mute/:id', to: 'mute_rule#destroy', via: :delete, as: :delete_mute_rule - match '/block_anon', to: 'anonymous_block#create', via: :post, as: :block_anon - match '/block_anon/:id', to: 'anonymous_block#destroy', via: :delete, as: :unblock_anon + post "/ask", to: "question#create", as: :ask + post "/destroy_question", to: "question#destroy", as: :destroy_question + post "/generate_question", to: "inbox#create", as: :generate_question + post "/delete_inbox", to: "inbox#remove", as: :delete_inbox + post "/delete_all_inbox", to: "inbox#remove_all", as: :delete_all_inbox + post "/delete_all_inbox/:author", to: "inbox#remove_all_author", as: :delete_all_author + post "/answer", to: "answer#create", as: :answer + post "/destroy_answer", to: "answer#destroy", as: :destroy_answer + post "/create_relationship", to: "relationship#create", as: :create_relationship + post "/destroy_relationship", to: "relationship#destroy", as: :destroy_relationship + post "/create_smile", to: "smile#create", as: :create_smile + post "/destroy_smile", to: "smile#destroy", as: :destroy_smile + post "/create_comment_smile", to: "smile#create_comment", as: :create_comment_smile + post "/destroy_comment_smile", to: "smile#destroy_comment", as: :destroy_comment_smile + post "/create_comment", to: "comment#create", as: :create_comment + post "/destroy_comment", to: "comment#destroy", as: :destroy_comment + post "/report", to: "report#create", as: :report + post "/create_list", to: "list#create", as: :create_list + post "/destroy_list", to: "list#destroy", as: :destroy_list + post "/list_membership", to: "list#membership", as: :list_membership + post "/subscribe", to: "subscription#subscribe", as: :subscribe_answer + post "/unsubscribe", to: "subscription#unsubscribe", as: :unsubscribe_answer + post "/mute", to: "mute_rule#create", as: :create_mute_rule + post "/mute/:id", to: "mute_rule#update", as: :update_mute_rule + delete "/mute/:id", to: "mute_rule#destroy", as: :delete_mute_rule + post "/block_anon", to: "anonymous_block#create", as: :block_anon + delete "/block_anon/:id", to: "anonymous_block#destroy", as: :unblock_anon end - match '/discover', to: 'discover#index', via: :get, as: :discover - match '/public', to: 'timeline#public', via: :get, as: :public_timeline if APP_CONFIG.dig(:features, :public, :enabled) - match '/list/:list_name', to: 'timeline#list', via: :get, as: :list_timeline + get "/discover", to: "discover#index", as: :discover + get "/public", to: "timeline#public", as: :public_timeline if APP_CONFIG.dig(:features, :public, :enabled) + get "/list/:list_name", to: "timeline#list", as: :list_timeline - match '/notifications(/:type)', to: 'notifications#index', via: :get, as: :notifications, defaults: {type: 'new'} + get "/notifications(/:type)", to: "notifications#index", as: :notifications, defaults: { type: "new" } - match '/inbox', to: 'inbox#show', via: 'get' - match '/inbox/:author', to: 'inbox#show', via: 'get' + get "/inbox", to: "inbox#show" + get "/inbox/:author", to: "inbox#show" - match '/user/:username(/p/:page)', to: 'user#show', via: 'get', defaults: {page: 1} - match '/@:username(/p/:page)', to: 'user#show', via: 'get', as: :show_user_profile, defaults: {page: 1} - match '/@:username/a/:id', to: 'answer#show', via: 'get', as: :show_user_answer - match '/@:username/q/:id', to: 'question#show', via: 'get', as: :show_user_question - match '/@:username/followers(/p/:page)', to: 'user#followers', via: 'get', as: :show_user_followers, defaults: {page: 1} - match '/@:username/followings(/p/:page)', to: 'user#followings', via: 'get', as: :show_user_followings, defaults: {page: 1} - match '/@:username/friends(/p/:page)', to: redirect('/@%{username}/followings/p/%{page}'), via: 'get', defaults: {page: 1} - match '/@:username/questions(/p/:page)', to: 'user#questions', via: 'get', as: :show_user_questions, defaults: {page: 1} - match '/:username(/p/:page)', to: 'user#show', via: 'get', as: :show_user_profile_alt, defaults: {page: 1} - match '/:username/a/:id', to: 'answer#show', via: 'get', as: :show_user_answer_alt - match '/:username/q/:id', to: 'question#show', via: 'get', as: :show_user_question_alt - match '/:username/followers(/p/:page)', to: 'user#followers', via: 'get', as: :show_user_followers_alt, defaults: {page: 1} - match '/:username/followings(/p/:page)', to: 'user#followings', via: 'get', as: :show_user_followings_alt, defaults: {page: 1} - match '/:username/friends(/p/:page)', to: redirect('/%{username}/followings/p/%{page}'), via: 'get', defaults: {page: 1} - match '/:username/questions(/p/:page)', to: 'user#questions', via: 'get', as: :show_user_questions_alt, defaults: {page: 1} + get "/user/:username(/p/:page)", to: "user#show", defaults: { page: 1 } + get "/@:username(/p/:page)", to: "user#show", as: :user, defaults: { page: 1 } + get "/@:username/a/:id", to: "answer#show", via: "get", as: :answer + get "/@:username/q/:id", to: "question#show", via: "get", as: :question + get "/@:username/followers(/p/:page)", to: "user#followers", as: :show_user_followers, defaults: { page: 1 } + get "/@:username/followings(/p/:page)", to: "user#followings", as: :show_user_followings, defaults: { page: 1 } + get "/@:username/friends(/p/:page)", to: redirect("/@%{username}/followings/p/%{page}"), defaults: { page: 1 } + get "/@:username/questions(/p/:page)", to: "user#questions", as: :show_user_questions, defaults: { page: 1 } + get "/:username(/p/:page)", to: "user#show", as: :user_alt, defaults: { page: 1 } + get "/:username/a/:id", to: "answer#show", as: :answer_alt + get "/:username/q/:id", to: "question#show", as: :question_alt + get "/:username/followers(/p/:page)", to: "user#followers", as: :show_user_followers_alt, defaults: { page: 1 } + get "/:username/followings(/p/:page)", to: "user#followings", as: :show_user_followings_alt, defaults: { page: 1 } + get "/:username/friends(/p/:page)", to: redirect("/%{username}/followings/p/%{page}"), defaults: { page: 1 } + get "/:username/questions(/p/:page)", to: "user#questions", as: :show_user_questions_alt, defaults: { page: 1 } - match '/feedback/consent', to: 'feedback#consent', via: 'get', as: 'feedback_consent' - match '/feedback/consent/update', to: 'feedback#update', via: 'post', as: 'feedback_consent_update' - match '/feedback/bugs(/*any)', to: 'feedback#bugs', via: 'get', as: 'feedback_bugs' - match '/feedback/feature_requests(/*any)', to: 'feedback#features', via: 'get', as: 'feedback_features' + get "/feedback/consent", to: "feedback#consent", as: "feedback_consent" + post "/feedback/consent/update", to: "feedback#update", as: "feedback_consent_update" + get "/feedback/bugs(/*any)", to: "feedback#bugs", as: "feedback_bugs" + get "/feedback/feature_requests(/*any)", to: "feedback#features", as: "feedback_features" - get '/.well-known/change-password', to: redirect('/settings/account') + get "/.well-known/change-password", to: redirect("/settings/account") - puts 'processing time of routes.rb: ' + "#{(Time.now - start).round(3).to_s.ljust(5, '0')}s".light_green + puts "processing time of routes.rb: #{"#{(Time.zone.now - start).round(3).to_s.ljust(5, '0')}s".light_green}" end diff --git a/spec/helpers/user_helper_spec.rb b/spec/helpers/user_helper_spec.rb index ea822735..1187070a 100644 --- a/spec/helpers/user_helper_spec.rb +++ b/spec/helpers/user_helper_spec.rb @@ -37,7 +37,7 @@ describe UserHelper, type: :helper do context "user is not banned" do it "unmasks the author" do - expect(subject).to eq(link_to(user.profile.safe_name, show_user_profile_path(user.screen_name), class: "")) + expect(subject).to eq(link_to(user.profile.safe_name, user_path(user), class: "")) end end @@ -47,7 +47,7 @@ describe UserHelper, type: :helper do end it "unmasks the author" do - expect(subject).to eq(link_to(user.profile.safe_name, show_user_profile_path(user.screen_name), class: "user--banned")) + expect(subject).to eq(link_to(user.profile.safe_name, user_path(user), class: "user--banned")) end end end @@ -114,7 +114,7 @@ describe UserHelper, type: :helper do let(:link_only) { true } it "returns the url to the user's profile" do - expect(subject).to eq(show_user_profile_path(user.screen_name)) + expect(subject).to eq(user_path(user)) end end @@ -123,7 +123,7 @@ describe UserHelper, type: :helper do context "user is not banned" do it "returns a link tag to the user's profile" do - expect(subject).to eq(link_to(user.profile.safe_name, show_user_profile_path(user.screen_name), class: "")) + expect(subject).to eq(link_to(user.profile.safe_name, user_path(user), class: "")) end end @@ -133,7 +133,7 @@ describe UserHelper, type: :helper do end it "returns a link tag to the user's profile" do - expect(subject).to eq(link_to(user.profile.safe_name, show_user_profile_path(user.screen_name), class: "user--banned")) + expect(subject).to eq(link_to(user.profile.safe_name, user_path(user), class: "user--banned")) end end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index cd8be3e0..f1bb145e 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -103,6 +103,12 @@ RSpec.describe User, type: :model do include_examples "invalid email", "fritz.fantom@protonmail" end + describe "#to_param" do + subject { me.to_param } + + it { is_expected.to eq me.screen_name } + end + # -- User::TimelineMethods -- shared_examples_for "result is blank" do