commit 82c1c20d8b21965c7ef685e428a83e693626fb86 Author: aggie Date: Fri Nov 14 16:57:46 2025 -0500 fljn diff --git a/routes.rb b/routes.rb new file mode 100644 index 0000000..2798273 --- /dev/null +++ b/routes.rb @@ -0,0 +1,717 @@ +Rails.application.routes.draw do + devise_scope :admin do + get "admin/logout" => "admin/sessions#confirm_logout" + + # Rails emulates some HTTP methods over POST, so password resets (PUT /admin/password) + # look the same as password reset requests (POST /admin/password). + # + # To rate limit them differently at nginx, we set up an alias for + # the first request type. + put "admin/password/reset" => "admin/passwords#update" + end + + devise_for :admin, + module: "admin", + only: [:sessions, :passwords], + controllers: { + sessions: "admin/sessions", + passwords: "admin/passwords" + }, + path_names: { + sign_in: "login", + sign_out: "logout" + } + + devise_scope :user do + get "signup(/:invitation_token)" => "users/registrations#new", as: "signup" + get "users/logout" => "users/sessions#confirm_logout" + + # Rails emulate some HTTP methods over POST, so password resets (PUT /users/password) + # look the same as password reset requests (POST /users/password). + # + # To rate limit them differently at nginx, we set up an alias for + # the first request type. + put "users/password/reset" => "users/passwords#update" + end + + devise_for :users, + module: "users", + controllers: { + sessions: "users/sessions", + registrations: "users/registrations", + passwords: "users/passwords" + }, + path_names: { + sign_in: "login", + sign_out: "logout" + } + + #### ERRORS #### + + get '/403', to: 'errors#403' + get '/404', to: 'errors#404' + get '/422', to: 'errors#422' + get '/500', to: 'errors#500' + get '/auth_error', to: 'errors#auth_error' + get "/timeout_error", to: "errors#timeout_error" + get '/statuses', to: 'statuses#redirect_to_current_user' + get '/statuses/new', to: 'statuses#redirect_to_current_user_new' #### DOWNLOADS #### + + get 'downloads/:id/:download_title.:format' => 'downloads#show', as: 'download' + + #### OPEN DOORS #### + namespace :opendoors do + resources :tools, only: [:index] do + collection do + post :url_update + end + end + resources :external_authors do + member do + post :forward + end + end + end + + #### INVITATIONS #### + + resources :invitations + resources :user_invite_requests + resources :invite_requests, only: [:index, :create, :destroy] do + collection do + get :manage + get :status + post :resend + end + end + + get 'claim/:invitation_token' => 'external_authors#claim', as: 'claim' + post 'complete_claim/:invitation_token' => 'external_authors#complete_claim', as: 'complete_claim' + + #### TAGS #### + + resources :media do + resources :fandoms + end + resources :fandoms do + collection do + get :unassigned + end + get :show + end + resources :tag_wranglings do + collection do + post :wrangle + end + end + resources :tag_wranglers do + member do + get :report_csv + end + end + resources :unsorted_tags do + collection do + post :mass_update + end + end + resources :tags do + member do + get :feed + post :mass_update + get :remove_association + get :wrangle + end + collection do + get :show_hidden + get :search + end + resources :works + resources :bookmarks + resources :comments + resource :troubleshooting, controller: :troubleshooting, only: [:show, :update] + end + + resources :tag_sets, controller: 'owned_tag_sets' do + resources :nominations, controller: 'tag_set_nominations' do + collection do + put :update_multiple + delete :destroy_multiple + get :confirm_destroy_multiple + end + member do + get :confirm_delete + end + end + resources :associations, controller: 'tag_set_associations', only: [:index] do + collection do + put :update_multiple + end + end + member do + get :batch_load + put :do_batch_load + get :confirm_delete + end + collection do + get :show_options + end + end + resources :tag_nominations, only: [:update] + + resources :tag_wrangling_requests, only: [:index] do + collection do + patch :update_multiple + end + end + + #### ADMIN #### + resources :admin_posts do + resources :comments do + collection do + get :unreviewed + put :review_all + end + end + end + + namespace :admin do + resources :activities, only: [:index, :show] + resources :banners do + member do + get :confirm_delete + end + end + resources :blacklisted_emails, only: [:index, :create, :destroy] + resources :settings + resources :skins do + collection do + get :index_rejected + get :index_approved + end + end + resources :spam, only: [:index] do + collection do + post :bulk_update + end + end + resources :user_creations, only: [:destroy] do + member do + put :hide + put :set_spam + get :confirm_remove_pseud + put :remove_pseud + end + end + resources :users, controller: "admin_users", only: [:index, :show] do + member do + get :confirm_delete_user_creations + post :destroy_user_creations + post :activate + get :check_user + get :creations + end + collection do + get :bulk_search + post :bulk_search + post :update + post :update_status + post :update_next_of_kin + end + end + resources :invitations, controller: 'admin_invitations' do + collection do + post :invite_from_queue + post :grant_invites_to_users + get :find + end + end + resources :api + end + resources :admins, only: [:index] + + post '/admin/api/new', to: 'admin/api#create' + + #### USERS #### + + resources :people, only: [:index] do + collection do + get :search + end + end + + # When adding new nested resources, please keep them in alphabetical order + resources :users, except: [:new, :create] do + member do + get :change_email + put :confirm_change_email + post :changed_email + get :change_password + post :changed_password + get :change_username + post :changed_username + post :end_first_login + post :end_banner + post :end_tos_prompt + get :reconfirm_email + end + resources :assignments, controller: "challenge_assignments", only: [:index] + resources :claims, controller: "challenge_claims", only: [:index] + resources :bookmarks + resources :collection_items, only: [:index, :update] do + collection do + patch :update_multiple + end + end + resources :collections, only: [:index] + resources :comments do + member do + put :approve + put :reject + end + end + resource :creatorships, controller: "creatorships", only: [:show, :update] + resources :external_authors do + resources :external_author_names + end + resources :favorite_tags, only: [:create, :destroy] + resources :gifts, only: [:index] + resource :inbox, controller: "inbox" do + member do + get :reply + post :delete + end + end + resources :invitations do + collection do + post :invite_friend + end + collection do + get :manage + end + end + resources :nominations, controller: "tag_set_nominations", only: [:index] + resources :preferences, only: [:index, :update] + resource :profile, only: [:show], controller: "profile" do + collection do + get :pseuds + end + end + resources :pseuds do + resources :works + resources :series + resources :bookmarks + end + resources :readings do + collection do + post :clear + end + end + resources :related_works + resources :series do + member do + get :manage + end + resources :serial_works + end + resources :signups, controller: "challenge_signups", only: [:index] + resources :skins, only: [:index] + resources :stats, only: [:index] + resources :statuses + resources :subscriptions, only: [:index, :create, :destroy] do + collection do + get :confirm_delete_all + post :delete_all + end + end + resources :tag_sets, controller: "owned_tag_sets", only: [:index] + resources :works do + collection do + get :drafts + get :collected + get :show_multiple + post :edit_multiple + patch :update_multiple + post :delete_multiple + end + end + namespace :blocked do + resources :users, only: [:index, :create, :destroy] do + collection do + get :confirm_block + end + member do + get :confirm_unblock + end + end + end + namespace :muted do + resources :users, only: [:index, :create, :destroy] do + collection do + get :confirm_mute + end + member do + get :confirm_unmute + end + end + end + end + + #### WORKS #### + + resources :works do + collection do + post :import + get :search + end + member do + get :preview + post :post + put :post_draft + get :navigate + get :edit_tags + get :preview_tags + patch :update_tags + get :mark_for_later + get :mark_as_read + get :confirm_delete + get :share + end + resources :bookmarks + resources :chapters do + collection do + get :manage + post :update_positions + end + member do + get :preview + post :post + get :confirm_delete + end + resources :comments + end + resources :collections + resources :collection_items + resources :comments do + member do + put :approve + put :reject + end + collection do + get :unreviewed + put :review_all + end + end + resource :hit_count, controller: :hit_count, only: [:create] + resources :kudos, only: [:index] + resource :troubleshooting, controller: :troubleshooting, only: [:show, :update] + end + + resources :chapters do + member do + get :preview + post :post + end + resources :comments + end + + resources :external_works do + collection do + get :fetch + end + resources :bookmarks + resources :related_works + end + + resources :related_works + resources :serial_works + resources :series do + member do + get :confirm_delete + get :manage + post :update_positions + end + resources :bookmarks + end + + #### COLLECTIONS #### + + resources :gifts, only: [:index] do + member do + post :toggle_rejected + end + end + + resources :collections do + collection do + get :list_challenges + get :list_ge_challenges + get :list_pm_challenges + end + member do + get :confirm_delete + end + resource :profile, controller: "collection_profile" + resources :collections + resources :works + resources :gifts + resources :bookmarks + resources :media + resources :fandoms + resources :people + resources :prompts + resources :tags do + resources :works + end + resources :participants, controller: "collection_participants", only: [:index, :update, :destroy] do + collection do + get :add + get :join + end + end + resources :items, controller: "collection_items" do + collection do + patch :update_multiple + end + end + resources :signups, controller: "challenge_signups" do + collection do + get :summary + end + member do + get :confirm_delete + end + end + resources :assignments, controller: "challenge_assignments", only: [:index, :show] do + collection do + get :confirm_purge + get :generate + put :set + post :purge + get :send_out + put :update_multiple + get :default_all + end + member do + get :default + end + end + resources :claims, controller: "challenge_claims" do + collection do + patch :set + get :purge + end + end + resources :potential_matches do + collection do + get :generate + get :cancel_generate + get :regenerate_for_signup + end + end + resources :requests, controller: "challenge_requests" + # challenge types + resource :gift_exchange, controller: "challenge/gift_exchange" do + member do + get :confirm_delete + end + end + resource :prompt_meme, controller: "challenge/prompt_meme" do + member do + get :confirm_delete + end + end + end + + #### I18N #### + + # should stay below the main works mapping + resources :languages, except: [:show] do + resources :works + resources :admin_posts + end + get "/languages/:id", to: redirect("/languages/%{id}/works", status: 302) + resources :locales, except: :destroy + + #### API #### + + namespace :api do + namespace :v2 do + resources :bookmarks, only: [:create], defaults: { format: :json } + resources :works, only: [:create], defaults: { format: :json } + post 'bookmarks/search', to: 'bookmarks#search' + post 'works/search', to: 'works#search' + end + end + + #### MISC #### + + resources :comments do + member do + put :approve + put :freeze + put :hide + put :reject + put :review + put :unfreeze + put :unhide + end + collection do + get :hide_comments + get :show_comments + get :add_comment_reply + get :cancel_comment_reply + get :cancel_comment_edit + get :delete_comment + get :cancel_comment_delete + end + resources :comments + end + resources :bookmarks do + collection do + get :search + end + member do + get :confirm_delete + get :share + end + resources :collection_items + end + + resources :kudos, only: [:create] + + resources :skins do + member do + get :preview + get :set + get :confirm_delete + end + collection do + get :unset + end + end + resources :known_issues + resources :archive_faqs, path: "faq" do + member do + get :confirm_delete + end + collection do + get :manage + post :update_positions + end + resources :questions do + collection do + get :manage + post :update_positions + end + end + end + resources :wrangling_guidelines do + member do + get :confirm_delete + end + collection do + get :manage + post :update_positions + end + end + + resource :redirect, controller: "redirect", only: [:show] do + member do + get :do_redirect + end + end + + resources :abuse_reports, only: [:new, :create] + resources :external_authors do + resources :external_author_names + end + resources :orphans, only: [:index, :new, :create] + + get 'search' => 'works#search' + post 'support' => 'feedbacks#create', as: 'feedbacks' + get 'support' => 'feedbacks#new', as: 'new_feedback_report' + get "content" => "home#content" + get "privacy" => "home#privacy" + get "tos" => "home#tos" + get "tos_faq" => "home#tos_faq" + get 'unicorn_test' => 'home#unicorn_test' + get 'dmca' => 'home#dmca' + get 'diversity' => 'home#diversity' + get 'site_map' => 'home#site_map' + get 'site_pages' => 'home#site_pages' + get 'first_login_help' => 'home#first_login_help' + get 'token_dispenser' => 'home#token_dispenser' + get 'delete_confirmation' => 'users#delete_confirmation' + get 'activate/:id' => 'users#activate', as: 'activate' + get 'devmode' => 'devmode#index' + get 'donate' => 'home#donate' + get 'lost_cookie' => 'home#lost_cookie' + get 'about' => 'home#about' + get 'menu/browse' => 'menu#browse' + get 'menu/fandoms' => 'menu#fandoms' + get 'menu/search' => 'menu#search' + get 'menu/about' => 'menu#about' + + # The priority is based upon order of creation: + # first created -> highest priority. + root to: "home#index" + + # See how all your routes lay out with "rake routes" + + # These are allowlisted routes that are proven to be used throughout the + # application, which previously relied on a deprecated catch-all route definition + # (`get ':controller(/:action(/:id(.:format)))'`) to work. + # + # They are generally not RESTful and in some cases are *almost* duplicates of + # existing routes defined above, but due to how extensively they are used + # throughout the application must exist until forms, controllers, and tests + # can be refactored to not rely on their existence. + # + # Note written on August 1, 2017 during upgrade to Rails 5.1. + get '/invite_requests/show' => 'invite_requests#show', as: :show_invite_request + get '/user_invite_requests/update' => 'user_invite_requests#update' + + patch '/admin/skins/update' => 'admin_skins#update', as: :update_admin_skin + + get "/admin/admin_users/troubleshoot/:id" => "admin/admin_users#troubleshoot", as: :troubleshoot_admin_user + + # TODO: rewrite the autocomplete controller to deal with the fact that + # there are 21 different actions going on in there + %w[ + pseud + tag + fandom + character + relationship + freeform + character_in_fandom + relationship_in_fandom + tags_in_sets + associated_tags + noncanonical_tag + collection_fullname + open_collection_names + collection_parent_name + external_work + potential_offers + potential_requests + owned_tag_sets + site_skins + admin_posts + admin_post_tags + ].each do |action| + get "/autocomplete/#{action}" => "autocomplete##{action}" + end + get 'timeline', to: 'statuses#timeline', as: :timeline + get '/challenges/no_collection' => 'challenges#no_collection' + get '/challenges/no_challenge' => 'challenges#no_challenge' + + get '/works/clean_work_search_params' => 'works#clean_work_search_params' + get '/works/collected' => 'works#collected' + get '/works/drafts' => 'works#drafts' + + post '/works/edit_multiple/:id' => 'works#edit_multiple' + post '/works/confirm_delete_multiple/:id' => 'works#confirm_delete_multiple' + post '/works/delete_multiple/:id' => 'works#delete_multiple' + put '/works/update_multiple' => 'works#update_multiple' +end