Files
danbooru/config/routes.rb
evazion 075199cd1e Remove /ip_addresses page.
Remove the /ip_addresses page. This page allowed moderators to search
users by IP, and to see recent activity tied to an IP. However, it was
limited to IPs tied to uploads, comments, dmails, artist edits, note
edits, and wiki edits.

Remove this page because it was limited in scope and because there are
better ways of doing what it did. The /user_events page is better at
catching sockpuppets because it tracks IPs for every login, not just for
certain types of edits. And the /user_actions page is better at
monitoring user activity because it shows all activity associated with
an account, not just for certain types of edits.

Removing this allows us to drop IP addresses from all tables besides the
user_events table. This is good because these IPs are no longer necessary
for any purpose, and because storing them forever is a liability.
2022-09-17 21:32:26 -05:00

364 lines
13 KiB
Ruby

# This file contains configuration for Danbooru's URL routes. It defines all the
# URL endpoints and HTTP redirects used by Danbooru.
#
# A list of routes can be found at http://localhost:3000/rails/info/routes when
# running the server in development mode. You can also run `bin/rails routes` to
# produce a list of routes.
#
# @see https://guides.rubyonrails.org/routing.html
# @see http://localhost:3000/rails/info/routes
Rails.application.routes.draw do
resources :posts, only: [:index, :show, :update, :destroy, :new, :create] do
get :random, on: :collection
end
resources :autocomplete, only: [:index]
# XXX This comes *after* defining posts above because otherwise the paginator
# generates `/?page=2` instead of `/posts?page=2` on the posts#index page.
root "posts#index"
namespace :admin do
resources :users, :only => [:edit, :update]
end
namespace :moderator do
resource :dashboard, :only => [:show]
namespace :post do
resources :posts, :only => [:delete, :expunge, :confirm_delete] do
member do
post :expunge
get :confirm_move_favorites
post :move_favorites
post :ban
post :unban
end
end
end
end
namespace :explore do
resources :posts, :only => [] do
collection do
get :popular
get :curated
get :viewed
get :searches
get :missed_searches
end
end
end
namespace :maintenance do
namespace :user do
resource :count_fixes, only: [:new, :create]
resource :email_notification, :only => [:show, :destroy]
resource :deletion, :only => [:show, :destroy]
end
end
resources :api_keys, only: [:new, :create, :edit, :update, :index, :destroy]
resources :artists do
member do
put :revert
put :ban
put :unban
end
collection do
get :show_or_new
get :banned
end
end
resources :artist_urls, only: [:index]
resources :artist_versions, :only => [:index, :show] do
collection do
get :search
end
end
resources :bans
resources :bulk_update_requests do
member do
post :approve
end
end
resources :comment_votes, only: [:index, :show, :destroy]
resources :comments do
resource :votes, controller: "comment_votes", only: [:create, :destroy], as: "comment_votes" do
get "/", action: :index
end
collection do
get :search
end
member do
post :undelete
end
end
resources :counts do
collection do
get :posts
end
end
resources :jobs, only: [:index, :destroy] do
member do
put :run
put :retry
put :cancel
end
end
resources :dmails, :only => [:new, :create, :update, :index, :show] do
collection do
post :mark_all_as_read
end
end
resource :dtext_preview, :only => [:create]
resources :dtext_links, only: [:index]
resources :emails, only: [:index, :show]
resources :favorites, :only => [:index, :create, :destroy]
resources :favorite_groups do
member do
put :add_post
put :remove_post
end
resource :order, :only => [:edit], :controller => "favorite_group_orders"
end
resources :forum_posts do
member do
post :undelete
end
collection do
get :search
end
end
resources :forum_post_votes, only: [:index, :show, :create, :destroy]
resources :forum_topics do
member do
post :undelete
end
collection do
post :mark_all_as_read
end
end
resources :forum_topic_visits, only: [:index]
resources :ip_bans, only: [:index, :new, :create, :update]
resources :ip_addresses, only: [:show], id: /.+?(?=\.json|\.xml|\.html)|.+/
resources :ip_geolocations, only: [:index]
resource :iqdb_queries, :only => [:show, :create] do
collection do
get :preview
get :check, to: redirect {|path_params, req| "/iqdb_queries?#{req.query_string}"}
end
end
resources :media_assets, only: [:index, :show]
resources :media_metadata, only: [:index]
resources :ai_tags, only: [:index]
put "/ai_tags/:media_asset_id/:tag_id/tag", to: "ai_tags#tag", as: "tag_ai_tag"
resources :mod_actions
resources :moderation_reports, only: [:new, :create, :index, :show, :update]
resources :modqueue, only: [:index]
resources :news_updates
resources :notes do
member do
put :revert
end
end
resources :note_versions, :only => [:index, :show]
resource :note_previews, only: [:create, :show]
resource :password_reset, only: [:create, :show]
resources :pixiv_ugoira_frame_data, only: [:index]
resources :pools do
member do
put :revert
post :undelete
end
collection do
get :gallery
end
resource :order, :only => [:edit], :controller => "pool_orders"
end
resource :pool_element, :only => [:create]
resources :pool_versions, :only => [:index] do
member do
get :diff
end
collection do
get :search
end
end
resources :post_regenerations, :only => [:create]
resources :post_replacements, :only => [:index, :new, :create, :update]
resources :post_votes, only: [:index, :show, :create, :destroy]
# XXX Use `only: []` to avoid redefining post routes defined at top of file.
resources :posts, only: [] do
resources :events, :only => [:index], :controller => "post_events"
resources :favorites, only: [:index, :create, :destroy]
resources :replacements, :only => [:index, :new, :create], :controller => "post_replacements"
resource :artist_commentary, only: [:show] do
collection { put :create_or_update }
member { put :revert }
end
resource :votes, controller: "post_votes", only: [:create, :destroy], as: "post_votes"
member do
put :revert
put :copy_notes
get :show_seq
put :mark_as_translated
end
get :similar, :to => "iqdb_queries#index"
end
resources :post_appeals
resources :post_flags
resources :post_approvals, only: [:create, :index]
resources :post_disapprovals
resources :post_versions, :only => [:index, :search] do
member do
put :undo
end
collection do
get :search
end
end
resources :artist_commentaries, :only => [:index, :show] do
collection do
put :create_or_update
end
member do
put :revert
end
end
resources :artist_commentary_versions, :only => [:index, :show]
resources :rate_limits, only: [:index]
resource :related_tag, :only => [:show, :update]
resources :recommended_posts, only: [:index]
resources :robots, only: [:index]
resources :saved_searches, :except => [:show]
resource :session, only: [:new, :create, :destroy] do
get :confirm_password, on: :collection
get :sign_out, on: :collection
end
resource :source, :only => [:show]
resource :status, only: [:show], controller: "status"
resources :tags
resources :tag_aliases, only: [:show, :index, :destroy]
resources :tag_implications, only: [:show, :index, :destroy]
resources :tag_versions, only: [:index, :show]
get "/redeem", to: "upgrade_codes#redeem", as: "redeem_upgrade_codes"
resources :upgrade_codes, only: [:create, :index] do
get :redeem, on: :collection
post :upgrade, on: :collection
end
resources :uploads do
collection do
get :batch, to: redirect(path: "/uploads/new")
end
resources :upload_media_assets, only: [:show, :index], path: "assets"
end
resources :upload_media_assets, only: [:show, :index]
resources :user_actions, only: [:index, :show]
resources :users do
resources :actions, only: [:index]
resources :favorites, only: [:index, :create, :destroy]
resources :favorite_groups, controller: "favorite_groups", only: [:index], as: "favorite_groups"
resource :email, only: [:show, :edit, :update] do
get :verify
post :send_confirmation
end
resource :password, only: [:edit, :update]
resources :api_keys, only: [:new, :create, :edit, :update, :index, :destroy]
resources :uploads, only: [:index]
collection do
get :custom_style
end
end
get "/upgrade", to: "user_upgrades#new", as: "new_user_upgrade"
get "/user_upgrades/new", to: redirect("/upgrade")
resources :user_upgrades, only: [:new, :create, :show, :index] do
get :receipt, on: :member
get :payment, on: :member
put :refund, on: :member
end
resources :user_events, only: [:index]
resources :user_feedbacks, except: [:destroy]
resources :user_sessions, only: [:index]
resources :user_name_change_requests, only: [:new, :create, :show, :index]
resources :webhooks do
post :receive, on: :collection
post :authorize_net, on: :collection
end
resources :wiki_pages, id: /.+?(?=\.json|\.xml|\.html)|.+/ do
put :revert, on: :member
get :show_or_new, on: :collection
end
resources :wiki_page_versions, :only => [:index, :show, :diff] do
collection do
get :diff
end
end
# Legacy Danbooru 1 API endpoints
get "/tag/index.xml", :controller => "legacy", :action => "tags", :format => "xml"
get "/tag/index.json", :controller => "legacy", :action => "tags", :format => "json"
get "/post/index.xml", :controller => "legacy", :action => "posts", :format => "xml"
get "/post/index.json", :controller => "legacy", :action => "posts", :format => "json"
# Legacy Danbooru 1 redirects.
get "/artist" => redirect {|params, req| "/artists?page=#{req.params[:page]}&search[name]=#{CGI.escape(req.params[:name].to_s)}"}
get "/artist/show/:id" => redirect("/artists/%{id}")
get "/artist/show" => redirect {|params, req| "/artists?name=#{CGI.escape(req.params[:name].to_s)}"}
get "/forum" => redirect {|params, req| "/forum_topics?page=#{req.params[:page]}"}
get "/forum/show/:id" => redirect {|params, req| "/forum_posts/#{req.params[:id]}?page=#{req.params[:page]}"}
get "/pool/show/:id" => redirect("/pools/%{id}")
get "/post/index" => redirect {|params, req| "/posts?tags=#{CGI.escape(req.params[:tags].to_s)}&page=#{req.params[:page]}"}
get "/post/atom" => redirect {|params, req| "/posts.atom?tags=#{CGI.escape(req.params[:tags].to_s)}"}
get "/post/show/:id/:tag_title" => redirect("/posts/%{id}")
get "/post/show/:id" => redirect("/posts/%{id}")
get "/tag" => redirect {|params, req| "/tags?page=#{req.params[:page]}&search[name_matches]=#{CGI.escape(req.params[:name].to_s)}&search[order]=#{req.params[:order]}&search[category]=#{req.params[:type]}"}
get "/tag/index" => redirect {|params, req| "/tags?page=#{req.params[:page]}&search[name_matches]=#{CGI.escape(req.params[:name].to_s)}&search[order]=#{req.params[:order]}"}
get "/user/show/:id" => redirect("/users/%{id}")
get "/wiki/show" => redirect {|params, req| "/wiki_pages?title=#{CGI.escape(req.params[:title].to_s)}"}
get "/help/:title" => redirect {|params, req| "/wiki_pages?title=#{CGI.escape('help:' + req.params[:title])}"}
get "/login", to: "sessions#new", as: :login
get "/logout", to: "sessions#sign_out", as: :logout
get "/profile", to: "users#profile", as: :profile
get "/settings", to: "users#settings", as: :settings
get "/sitemap" => "static#sitemap_index"
get "/opensearch" => "static#opensearch", :as => "opensearch"
get "/privacy" => "static#privacy_policy", :as => "privacy_policy"
get "/terms_of_service" => "static#terms_of_service", :as => "terms_of_service"
get "/404" => "static#not_found", :as => "not_found"
get "/2257" => "static#2257", :as => "usc_2257"
get "/contact" => "static#contact", :as => "contact"
get "/static/keyboard_shortcuts" => "static#keyboard_shortcuts", :as => "keyboard_shortcuts"
get "/static/bookmarklet" => "static#bookmarklet", :as => "bookmarklet"
get "/static/site_map" => "static#site_map", :as => "site_map"
get "/static/colors" => "static#colors", :as => "colors"
get "/static/dtext_help" => "static#dtext_help", :as => "dtext_help"
get "/static/terms_of_service", to: redirect("/terms_of_service")
get "/static/contact", to: redirect("/contact")
get "/user_upgrade/new", to: redirect("/upgrade")
get "/delayed_jobs", to: redirect("/jobs")
get "/mock/recommender/recommend/:user_id" => "mock_services#recommender_recommend", as: "mock_recommender_recommend"
get "/mock/recommender/similiar/:post_id" => "mock_services#recommender_similar", as: "mock_recommender_similar"
get "/mock/reportbooru/missed_searches" => "mock_services#reportbooru_missed_searches", as: "mock_reportbooru_missed_searches"
get "/mock/reportbooru/post_searches/rank" => "mock_services#reportbooru_post_searches", as: "mock_reportbooru_post_searches"
get "/mock/reportbooru/post_views/rank" => "mock_services#reportbooru_post_views", as: "mock_reportbooru_post_views"
get "/mock/iqdb/query" => "mock_services#iqdb_query", as: "mock_iqdb_query"
post "/mock/iqdb/query" => "mock_services#iqdb_query"
get "/mock/autotagger/evaluate" => "mock_services#autotagger_evaluate", as: "mock_autotagger_evaluate"
match "*other", to: "static#not_found", via: :all
end