From 63b3503bfc30b3d86f7f835c11496b2dea77ca60 Mon Sep 17 00:00:00 2001 From: BrokenEagle Date: Wed, 12 Feb 2020 23:46:36 +0000 Subject: [PATCH] Add ability to use nested only parameter - The only string works much the same as before with its comma separation -- Nested includes are indicated with square brackets "[ ]" -- The nested include is the value immediately preceding the square brackets -- The only string is the comma separated string inside those brackets - Default includes are split between format types when necessary -- This prevents unnecessary includes from being added on page load - Available includes are those items which are allowed to be accessible to the user -- Some aren't because they are sensitive, such as the creator of a flag -- Some aren't because the number of associated items is too large - The amount of times the same model can be included to prevent recursions -- One exception is the root model may include the same model once --- e.g. the user model can include the inviter which is also the user model -- Another exception is if the include is a has_many association --- e.g. artist urls can include the artist, and then artist urls again --- app/controllers/application_controller.rb | 19 +++++++ .../artist_commentaries_controller.rb | 10 +++- .../artist_commentary_versions_controller.rb | 12 ++++- app/controllers/artist_urls_controller.rb | 27 ++++++++-- app/controllers/artist_versions_controller.rb | 12 ++++- app/controllers/artists_controller.rb | 13 +++-- app/controllers/bans_controller.rb | 14 ++++-- .../bulk_update_requests_controller.rb | 10 +++- app/controllers/comment_votes_controller.rb | 12 ++++- app/controllers/comments_controller.rb | 22 ++++++--- app/controllers/dmails_controller.rb | 10 +++- app/controllers/dtext_links_controller.rb | 12 ++++- app/controllers/favorite_groups_controller.rb | 10 +++- .../forum_post_votes_controller.rb | 10 +++- app/controllers/forum_posts_controller.rb | 10 +++- app/controllers/forum_topics_controller.rb | 15 ++++-- app/controllers/ip_addresses_controller.rb | 22 +++++++-- app/controllers/ip_bans_controller.rb | 10 +++- app/controllers/legacy_controller.rb | 1 + app/controllers/mod_actions_controller.rb | 12 ++++- .../moderation_reports_controller.rb | 10 +++- .../moderator/post/disapprovals_controller.rb | 14 +++++- app/controllers/note_versions_controller.rb | 13 ++++- app/controllers/notes_controller.rb | 11 ++++- app/controllers/pool_versions_controller.rb | 14 +++++- app/controllers/pools_controller.rb | 6 ++- app/controllers/post_appeals_controller.rb | 10 +++- app/controllers/post_approvals_controller.rb | 12 ++++- app/controllers/post_flags_controller.rb | 12 ++++- .../post_replacements_controller.rb | 10 +++- app/controllers/post_versions_controller.rb | 14 +++++- app/controllers/post_votes_controller.rb | 12 ++++- app/controllers/posts_controller.rb | 10 +++- app/controllers/saved_searches_controller.rb | 2 +- app/controllers/tag_aliases_controller.rb | 10 +++- .../tag_implications_controller.rb | 10 +++- app/controllers/tags_controller.rb | 2 +- app/controllers/uploads_controller.rb | 10 +++- app/controllers/user_feedbacks_controller.rb | 10 +++- app/controllers/users_controller.rb | 10 +++- .../wiki_page_versions_controller.rb | 12 ++++- app/controllers/wiki_pages_controller.rb | 2 +- app/logical/application_responder.rb | 2 +- app/logical/post_sets/post.rb | 10 ++-- app/models/application_record.rb | 49 +++++++++++++------ app/models/artist.rb | 4 ++ app/models/artist_commentary.rb | 4 ++ app/models/artist_commentary_version.rb | 4 ++ app/models/artist_url.rb | 4 ++ app/models/artist_version.rb | 4 ++ app/models/ban.rb | 4 ++ app/models/bulk_update_request.rb | 4 ++ app/models/comment.rb | 6 +++ app/models/comment_vote.rb | 4 ++ app/models/dmail.rb | 6 +++ app/models/dtext_link.rb | 8 +++ app/models/favorite_group.rb | 4 ++ app/models/forum_post.rb | 6 +++ app/models/forum_post_vote.rb | 4 ++ app/models/forum_topic.rb | 6 +++ app/models/ip_address.rb | 4 ++ app/models/ip_ban.rb | 4 ++ app/models/mod_action.rb | 4 ++ app/models/moderation_report.rb | 8 +++ app/models/note.rb | 4 ++ app/models/note_version.rb | 4 ++ app/models/pool.rb | 4 ++ app/models/pool_archive.rb | 4 ++ app/models/post.rb | 7 +++ app/models/post_appeal.rb | 4 ++ app/models/post_approval.rb | 4 ++ app/models/post_archive.rb | 4 ++ app/models/post_disapproval.rb | 4 ++ app/models/post_flag.rb | 6 +++ app/models/post_replacement.rb | 4 ++ app/models/post_vote.rb | 4 ++ app/models/saved_search.rb | 4 ++ app/models/tag.rb | 4 ++ app/models/tag_relationship.rb | 4 ++ app/models/upload.rb | 4 ++ app/models/user.rb | 4 ++ app/models/user_feedback.rb | 4 ++ app/models/wiki_page.rb | 4 ++ app/models/wiki_page_version.rb | 4 ++ app/views/favorite_groups/index.html.erb | 2 +- 85 files changed, 634 insertions(+), 85 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 08eda01a2..d4280030d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -34,6 +34,25 @@ class ApplicationController < ActionController::Base end end + def model_includes(params, model = nil) + if params[:only] && ["json", "xml"].include?(params[:format]) + includes_array = ParameterBuilder.includes_parameters(params[:only], model_name) + elsif params[:action] == "index" + includes_array = default_includes(params) + else + includes_array = [] + end + includes_array + end + + def default_includes(*) + [] + end + + def model_name + controller_name.classify + end + def redirect_to_show(items) redirect_to send("#{controller_path.singularize}_path", items.first, format: request.format.symbol) end diff --git a/app/controllers/artist_commentaries_controller.rb b/app/controllers/artist_commentaries_controller.rb index 055aa0c8e..5308325ff 100644 --- a/app/controllers/artist_commentaries_controller.rb +++ b/app/controllers/artist_commentaries_controller.rb @@ -3,7 +3,7 @@ class ArtistCommentariesController < ApplicationController before_action :member_only, only: [:create_or_update, :revert] def index - @commentaries = ArtistCommentary.paginated_search(params) + @commentaries = ArtistCommentary.paginated_search(params).includes(model_includes(params)) respond_with(@commentaries) end @@ -36,6 +36,14 @@ class ArtistCommentariesController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [{post: [:uploader]}] + end + end + def commentary_params params.fetch(:artist_commentary, {}).except(:post_id).permit(%i[ original_description original_title translated_description translated_title diff --git a/app/controllers/artist_commentary_versions_controller.rb b/app/controllers/artist_commentary_versions_controller.rb index aa43669a3..170e339aa 100644 --- a/app/controllers/artist_commentary_versions_controller.rb +++ b/app/controllers/artist_commentary_versions_controller.rb @@ -2,7 +2,7 @@ class ArtistCommentaryVersionsController < ApplicationController respond_to :html, :xml, :json def index - @commentary_versions = ArtistCommentaryVersion.paginated_search(params) + @commentary_versions = ArtistCommentaryVersion.paginated_search(params).includes(model_includes(params)) respond_with(@commentary_versions) end @@ -12,4 +12,14 @@ class ArtistCommentaryVersionsController < ApplicationController format.html { redirect_to artist_commentary_versions_path(search: { post_id: @commentary_version.post_id }) } end end + + private + + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [{post: [:uploader]}, :updater] + end + end end diff --git a/app/controllers/artist_urls_controller.rb b/app/controllers/artist_urls_controller.rb index eb4228214..b11ebc229 100644 --- a/app/controllers/artist_urls_controller.rb +++ b/app/controllers/artist_urls_controller.rb @@ -3,10 +3,10 @@ class ArtistUrlsController < ApplicationController before_action :member_only, except: [:index] def index - @artist_urls = ArtistUrl.includes(:artist).paginated_search(params) + @artist_urls = ArtistUrl.paginated_search(params).includes(model_includes(params)) respond_with(@artist_urls) do |format| - format.json { render json: @artist_urls.to_json(include: "artist") } - format.xml { render xml: @artist_urls.to_xml(include: "artist", root: "artist-urls") } + format.json { render json: @artist_urls.to_json(format_params) } + format.xml { render xml: @artist_urls.to_xml(format_params) } end end @@ -18,6 +18,27 @@ class ArtistUrlsController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [{artist: [:urls]}] + else + [:artist] + end + end + + def format_params + param_hash = {} + if params[:only] + param_hash[:only] = params[:only] + else + param_hash[:include] = [:artist] + end + if request.format.symbol == :xml + param_hash[:root] = "artist-urls" + end + param_hash + end + def artist_url_params permitted_params = %i[is_active] diff --git a/app/controllers/artist_versions_controller.rb b/app/controllers/artist_versions_controller.rb index 7780cbf73..4fbef5fc0 100644 --- a/app/controllers/artist_versions_controller.rb +++ b/app/controllers/artist_versions_controller.rb @@ -2,7 +2,7 @@ class ArtistVersionsController < ApplicationController respond_to :html, :xml, :json def index - @artist_versions = ArtistVersion.includes(:updater).paginated_search(params) + @artist_versions = ArtistVersion.paginated_search(params).includes(model_includes(params)) respond_with(@artist_versions) end @@ -12,4 +12,14 @@ class ArtistVersionsController < ApplicationController format.html { redirect_to artist_versions_path(search: { artist_id: @artist_version.artist_id }) } end end + + private + + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:updater, {artist: [:urls]}] + end + end end diff --git a/app/controllers/artists_controller.rb b/app/controllers/artists_controller.rb index c42eef561..9224d8a82 100644 --- a/app/controllers/artists_controller.rb +++ b/app/controllers/artists_controller.rb @@ -31,10 +31,7 @@ class ArtistsController < ApplicationController # XXX params[:search][:name] = params.delete(:name) if params[:name] - @artists = Artist.includes(:urls).paginated_search(params) - @artists = @artists.includes(:tag) if request.format.html? - @artists = @artists.includes(:urls) if !request.format.html? - + @artists = Artist.paginated_search(params).includes(model_includes(params)) respond_with(@artists) end @@ -81,6 +78,14 @@ class ArtistsController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [:urls] + else + [:urls, :tag] + end + end + def item_matches_params(artist) if params[:search][:any_name_or_url_matches] artist.name == Artist.normalize_name(params[:search][:any_name_or_url_matches]) diff --git a/app/controllers/bans_controller.rb b/app/controllers/bans_controller.rb index 3a8b1645e..9b59c9e6e 100644 --- a/app/controllers/bans_controller.rb +++ b/app/controllers/bans_controller.rb @@ -12,10 +12,8 @@ class BansController < ApplicationController end def index - @bans = Ban.paginated_search(params, count_pages: true) - respond_with(@bans) do |fmt| - fmt.html { @bans = @bans.includes(:user, :banner) } - end + @bans = Ban.paginated_search(params, count_pages: true).includes(model_includes(params)) + respond_with(@bans) end def show @@ -50,6 +48,14 @@ class BansController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:user, :banner] + end + end + def ban_params(context) permitted_params = %i[reason duration expires_at] permitted_params += %i[user_id user_name] if context == :create diff --git a/app/controllers/bulk_update_requests_controller.rb b/app/controllers/bulk_update_requests_controller.rb index 9b8ad9b1b..34e0d03b2 100644 --- a/app/controllers/bulk_update_requests_controller.rb +++ b/app/controllers/bulk_update_requests_controller.rb @@ -42,12 +42,20 @@ class BulkUpdateRequestsController < ApplicationController end def index - @bulk_update_requests = BulkUpdateRequest.includes(:user, :approver, :forum_topic, forum_post: [:votes]).paginated_search(params, count_pages: true) + @bulk_update_requests = BulkUpdateRequest.paginated_search(params, count_pages: true).includes(model_includes(params)) respond_with(@bulk_update_requests) end private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:user, :approver, :forum_topic, {forum_post: [:votes]}] + end + end + def load_bulk_update_request @bulk_update_request = BulkUpdateRequest.find(params[:id]) end diff --git a/app/controllers/comment_votes_controller.rb b/app/controllers/comment_votes_controller.rb index fc84f3000..98ce24d29 100644 --- a/app/controllers/comment_votes_controller.rb +++ b/app/controllers/comment_votes_controller.rb @@ -5,7 +5,7 @@ class CommentVotesController < ApplicationController rescue_with CommentVote::Error, ActiveRecord::RecordInvalid, status: 422 def index - @comment_votes = CommentVote.includes(:user, comment: [:creator, :post]).paginated_search(params, count_pages: true) + @comment_votes = CommentVote.paginated_search(params, count_pages: true).includes(model_includes(params)) respond_with(@comment_votes) end @@ -20,4 +20,14 @@ class CommentVotesController < ApplicationController @comment.unvote! respond_with(@comment) end + + private + + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:user, {comment: [:creator, {post: [:uploader]}]}] + end + end end diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 42f72367c..3f51ffb30 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -1,5 +1,5 @@ class CommentsController < ApplicationController - respond_to :html, :xml, :json + respond_to :html, :xml, :json, :atom respond_to :js, only: [:new, :destroy, :undelete] before_action :member_only, :except => [:index, :search, :show] skip_before_action :api_check @@ -74,6 +74,18 @@ class CommentsController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [:creator, :updater] + elsif params[:format] == "atom" + [:creator, :post] + else + includes_array = [:creator, :updater, {post: [:uploader]}] + includes_array << :votes if CurrentUser.is_member? + includes_array + end + end + def index_for_post @post = Post.find(params[:post_id]) @comments = @post.comments @@ -90,12 +102,8 @@ class CommentsController < ApplicationController end def index_by_comment - @comments = Comment.includes(:creator, :updater).paginated_search(params) - respond_with(@comments) do |format| - format.atom do - @comments = @comments.includes(:post, :creator).load - end - end + @comments = Comment.paginated_search(params).includes(model_includes(params)) + respond_with(@comments) end def check_privilege(comment) diff --git a/app/controllers/dmails_controller.rb b/app/controllers/dmails_controller.rb index c1e8814a8..0b3af5812 100644 --- a/app/controllers/dmails_controller.rb +++ b/app/controllers/dmails_controller.rb @@ -15,7 +15,7 @@ class DmailsController < ApplicationController end def index - @dmails = Dmail.visible.paginated_search(params, defaults: { folder: "received" }, count_pages: true) + @dmails = Dmail.visible.paginated_search(params, defaults: { folder: "received" }, count_pages: true).includes(model_includes(params)) respond_with(@dmails) end @@ -51,6 +51,14 @@ class DmailsController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:owner, :to, :from] + end + end + def check_show_privilege(dmail) raise User::PrivilegeError unless dmail.visible_to?(CurrentUser.user, params[:key]) end diff --git a/app/controllers/dtext_links_controller.rb b/app/controllers/dtext_links_controller.rb index 79a50a0d7..503777c57 100644 --- a/app/controllers/dtext_links_controller.rb +++ b/app/controllers/dtext_links_controller.rb @@ -2,7 +2,17 @@ class DtextLinksController < ApplicationController respond_to :html, :xml, :json def index - @dtext_links = DtextLink.includes(:model).paginated_search(params) + @dtext_links = DtextLink.paginated_search(params).includes(model_includes(params)) respond_with(@dtext_links) end + + private + + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:model] + end + end end diff --git a/app/controllers/favorite_groups_controller.rb b/app/controllers/favorite_groups_controller.rb index a66a93d95..b870e73f7 100644 --- a/app/controllers/favorite_groups_controller.rb +++ b/app/controllers/favorite_groups_controller.rb @@ -4,7 +4,7 @@ class FavoriteGroupsController < ApplicationController def index params[:search][:creator_id] ||= params[:user_id] - @favorite_groups = FavoriteGroup.paginated_search(params) + @favorite_groups = FavoriteGroup.paginated_search(params).includes(model_includes(params)) respond_with(@favorite_groups) end @@ -61,6 +61,14 @@ class FavoriteGroupsController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:creator] + end + end + def check_write_privilege(favgroup) raise User::PrivilegeError unless favgroup.editable_by?(CurrentUser.user) end diff --git a/app/controllers/forum_post_votes_controller.rb b/app/controllers/forum_post_votes_controller.rb index c00a40ca5..b95561c5e 100644 --- a/app/controllers/forum_post_votes_controller.rb +++ b/app/controllers/forum_post_votes_controller.rb @@ -3,7 +3,7 @@ class ForumPostVotesController < ApplicationController before_action :member_only, only: [:create, :destroy] def index - @forum_post_votes = ForumPostVote.includes(creator: [], forum_post: [:topic]).paginated_search(params, count_pages: true) + @forum_post_votes = ForumPostVote.paginated_search(params, count_pages: true).includes(model_includes(params)) respond_with(@forum_post_votes) end @@ -21,6 +21,14 @@ class ForumPostVotesController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:creator, {forum_post: [:topic]}] + end + end + def forum_post_vote_params params.fetch(:forum_post_vote, {}).permit(:score) end diff --git a/app/controllers/forum_posts_controller.rb b/app/controllers/forum_posts_controller.rb index 9d44bb969..d307dbb60 100644 --- a/app/controllers/forum_posts_controller.rb +++ b/app/controllers/forum_posts_controller.rb @@ -24,7 +24,7 @@ class ForumPostsController < ApplicationController end def index - @forum_posts = ForumPost.paginated_search(params).includes(:topic) + @forum_posts = ForumPost.paginated_search(params).includes(model_includes(params)) respond_with(@forum_posts) end @@ -68,6 +68,14 @@ class ForumPostsController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:topic, :creator] + end + end + def load_post @forum_post = ForumPost.find(params[:id]) @forum_topic = @forum_post.topic diff --git a/app/controllers/forum_topics_controller.rb b/app/controllers/forum_topics_controller.rb index 92462e30c..04b00e9f0 100644 --- a/app/controllers/forum_topics_controller.rb +++ b/app/controllers/forum_topics_controller.rb @@ -23,10 +23,7 @@ class ForumTopicsController < ApplicationController params[:search][:order] ||= "sticky" if request.format == Mime::Type.lookup("text/html") params[:limit] ||= 40 - @forum_topics = ForumTopic.paginated_search(params) - - @forum_topics = @forum_topics.includes(:creator, :updater, :forum_topic_visit_by_current_user).load if request.format.html? - @forum_topics = @forum_topics.includes(:creator, :original_post).load if request.format.atom? + @forum_topics = ForumTopic.paginated_search(params).includes(model_includes(params)) respond_with(@forum_topics) end @@ -80,6 +77,16 @@ class ForumTopicsController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + elsif params[:format] == "atom" + [:creator, :original_post] + else + [:creator, :updater, :forum_topic_visit_by_current_user] + end + end + def normalize_search if params[:title_matches] params[:search] ||= {} diff --git a/app/controllers/ip_addresses_controller.rb b/app/controllers/ip_addresses_controller.rb index d111f7946..be9f67c87 100644 --- a/app/controllers/ip_addresses_controller.rb +++ b/app/controllers/ip_addresses_controller.rb @@ -3,16 +3,30 @@ class IpAddressesController < ApplicationController before_action :moderator_only def index - @ip_addresses = IpAddress.visible(CurrentUser.user).paginated_search(params) + @ip_addresses = IpAddress.visible(CurrentUser.user).paginated_search(params).includes(model_includes(params)) if search_params[:group_by] == "ip_addr" @ip_addresses = @ip_addresses.group_by_ip_addr(search_params[:ipv4_masklen], search_params[:ipv6_masklen]) elsif search_params[:group_by] == "user" - @ip_addresses = @ip_addresses.group_by_user.includes(:user) - else - @ip_addresses = @ip_addresses.includes(:user, :model) + @ip_addresses = @ip_addresses.group_by_user end respond_with(@ip_addresses) end + + private + + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + if params[:search][:group_by] == "user" + [:user] + elsif params[:search][:group_by] == "ip_addr" + [] + else + [:user, :model] + end + end + end end diff --git a/app/controllers/ip_bans_controller.rb b/app/controllers/ip_bans_controller.rb index 7854c718e..0c3d072b3 100644 --- a/app/controllers/ip_bans_controller.rb +++ b/app/controllers/ip_bans_controller.rb @@ -12,7 +12,7 @@ class IpBansController < ApplicationController end def index - @ip_bans = IpBan.includes(:creator).paginated_search(params, count_pages: true) + @ip_bans = IpBan.paginated_search(params, count_pages: true).includes(model_includes(params)) respond_with(@ip_bans) end @@ -24,6 +24,14 @@ class IpBansController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:creator] + end + end + def ip_ban_params params.fetch(:ip_ban, {}).permit(%i[ip_addr reason]) end diff --git a/app/controllers/legacy_controller.rb b/app/controllers/legacy_controller.rb index 3cd6f8c8d..96220d1d0 100644 --- a/app/controllers/legacy_controller.rb +++ b/app/controllers/legacy_controller.rb @@ -3,6 +3,7 @@ class LegacyController < ApplicationController def posts @post_set = PostSets::Post.new(tag_query, params[:page], params[:limit], format: "json") + @post_set.posts = @post_set.posts.includes(:uploader) @posts = @post_set.posts.map(&:legacy_attributes) respond_with(@posts) do |format| diff --git a/app/controllers/mod_actions_controller.rb b/app/controllers/mod_actions_controller.rb index af314605d..40ebcc018 100644 --- a/app/controllers/mod_actions_controller.rb +++ b/app/controllers/mod_actions_controller.rb @@ -2,7 +2,7 @@ class ModActionsController < ApplicationController respond_to :html, :xml, :json def index - @mod_actions = ModAction.includes(:creator).paginated_search(params) + @mod_actions = ModAction.paginated_search(params).includes(model_includes(params)) respond_with(@mod_actions) end @@ -12,4 +12,14 @@ class ModActionsController < ApplicationController fmt.html { redirect_to mod_actions_path(search: { id: @mod_action.id }) } end end + + private + + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:creator] + end + end end diff --git a/app/controllers/moderation_reports_controller.rb b/app/controllers/moderation_reports_controller.rb index 5a1524b64..c5f0f77e1 100644 --- a/app/controllers/moderation_reports_controller.rb +++ b/app/controllers/moderation_reports_controller.rb @@ -10,7 +10,7 @@ class ModerationReportsController < ApplicationController end def index - @moderation_reports = ModerationReport.paginated_search(params, count_pages: true).includes(:creator, :model) + @moderation_reports = ModerationReport.paginated_search(params, count_pages: true).includes(model_includes(params)) respond_with(@moderation_reports) end @@ -29,6 +29,14 @@ class ModerationReportsController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:creator, :model] + end + end + def model_type params.fetch(:moderation_report, {}).fetch(:model_type) end diff --git a/app/controllers/moderator/post/disapprovals_controller.rb b/app/controllers/moderator/post/disapprovals_controller.rb index 53dc28895..36a3ac8e4 100644 --- a/app/controllers/moderator/post/disapprovals_controller.rb +++ b/app/controllers/moderator/post/disapprovals_controller.rb @@ -12,12 +12,24 @@ module Moderator end def index - @post_disapprovals = PostDisapproval.includes(:user).paginated_search(params) + @post_disapprovals = PostDisapproval.paginated_search(params).includes(model_includes(params)) respond_with(@post_disapprovals) end private + def model_name + "PostDisapproval" + end + + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:user] + end + end + def post_disapproval_params params.require(:post_disapproval).permit(%i[post_id reason message]) end diff --git a/app/controllers/note_versions_controller.rb b/app/controllers/note_versions_controller.rb index 0cfa7a2cc..d1d58cbbd 100644 --- a/app/controllers/note_versions_controller.rb +++ b/app/controllers/note_versions_controller.rb @@ -2,8 +2,7 @@ class NoteVersionsController < ApplicationController respond_to :html, :xml, :json def index - @note_versions = NoteVersion.paginated_search(params) - @note_versions = @note_versions.includes(:updater) if request.format.html? + @note_versions = NoteVersion.paginated_search(params).includes(model_includes(params)) respond_with(@note_versions) end @@ -13,4 +12,14 @@ class NoteVersionsController < ApplicationController format.html { redirect_to note_versions_path(search: { note_id: @note_version.note_id }) } end end + + private + + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:updater] + end + end end diff --git a/app/controllers/notes_controller.rb b/app/controllers/notes_controller.rb index 5f45be061..2f33151f8 100644 --- a/app/controllers/notes_controller.rb +++ b/app/controllers/notes_controller.rb @@ -6,8 +6,7 @@ class NotesController < ApplicationController end def index - @notes = Note.includes(:creator).paginated_search(params) - @notes = @notes.includes(:creator) if request.format.html? + @notes = Note.paginated_search(params).includes(model_includes(params)) respond_with(@notes) end @@ -60,6 +59,14 @@ class NotesController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [:creator] + else + [:creator, :post] + end + end + def note_params(context) permitted_params = %i[x y width height body] permitted_params += %i[post_id html_id] if context == :create diff --git a/app/controllers/pool_versions_controller.rb b/app/controllers/pool_versions_controller.rb index 1a3fad07d..3d5d2b173 100644 --- a/app/controllers/pool_versions_controller.rb +++ b/app/controllers/pool_versions_controller.rb @@ -8,7 +8,7 @@ class PoolVersionsController < ApplicationController @pool = Pool.find(params[:search][:pool_id]) end - @pool_versions = PoolArchive.paginated_search(params).includes(:updater, :pool) + @pool_versions = PoolArchive.paginated_search(params).includes(model_includes(params)) respond_with(@pool_versions) end @@ -27,6 +27,18 @@ class PoolVersionsController < ApplicationController private + def model_name + "PoolArchive" + end + + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:updater, :pool] + end + end + def set_timeout PoolArchive.connection.execute("SET statement_timeout = #{CurrentUser.user.statement_timeout}") yield diff --git a/app/controllers/pools_controller.rb b/app/controllers/pools_controller.rb index 322806873..e0b4b6e57 100644 --- a/app/controllers/pools_controller.rb +++ b/app/controllers/pools_controller.rb @@ -17,7 +17,7 @@ class PoolsController < ApplicationController end def index - @pools = Pool.includes(:creator).paginated_search(params, count_pages: true) + @pools = Pool.paginated_search(params, count_pages: true).includes(model_includes(params)) respond_with(@pools) end @@ -90,6 +90,10 @@ class PoolsController < ApplicationController private + def default_includes(params) + [:creator] + end + def item_matches_params(pool) if params[:search][:name_matches] Pool.normalize_name_for_search(pool.name) == Pool.normalize_name_for_search(params[:search][:name_matches]) diff --git a/app/controllers/post_appeals_controller.rb b/app/controllers/post_appeals_controller.rb index 0f7058a72..75bae9aa3 100644 --- a/app/controllers/post_appeals_controller.rb +++ b/app/controllers/post_appeals_controller.rb @@ -8,7 +8,7 @@ class PostAppealsController < ApplicationController end def index - @post_appeals = PostAppeal.includes(:creator).paginated_search(params).includes(post: [:appeals, :uploader, :approver]) + @post_appeals = PostAppeal.paginated_search(params).includes(model_includes(params)) respond_with(@post_appeals) end @@ -26,6 +26,14 @@ class PostAppealsController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [:post] + else + [:creator, {post: [:appeals, :uploader, :approver]}] + end + end + def post_appeal_params params.fetch(:post_appeal, {}).permit(%i[post_id reason]) end diff --git a/app/controllers/post_approvals_controller.rb b/app/controllers/post_approvals_controller.rb index 51e453a03..d01749e97 100644 --- a/app/controllers/post_approvals_controller.rb +++ b/app/controllers/post_approvals_controller.rb @@ -2,7 +2,17 @@ class PostApprovalsController < ApplicationController respond_to :html, :xml, :json def index - @post_approvals = PostApproval.includes(:post, :user).paginated_search(params) + @post_approvals = PostApproval.paginated_search(params).includes(model_includes(params)) respond_with(@post_approvals) end + + private + + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:user, {post: [:uploader]}] + end + end end diff --git a/app/controllers/post_flags_controller.rb b/app/controllers/post_flags_controller.rb index eefb6c8ca..44a9e8c96 100644 --- a/app/controllers/post_flags_controller.rb +++ b/app/controllers/post_flags_controller.rb @@ -8,7 +8,7 @@ class PostFlagsController < ApplicationController end def index - @post_flags = PostFlag.paginated_search(params).includes(:creator, post: [:flags, :uploader, :approver]) + @post_flags = PostFlag.paginated_search(params).includes(model_includes(params)) respond_with(@post_flags) end @@ -26,6 +26,16 @@ class PostFlagsController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [:post] + else + includes_array = [{post: [:flags, :uploader, :approver]}] + includes_array << :creator if CurrentUser.is_moderator? + includes_array + end + end + def post_flag_params params.fetch(:post_flag, {}).permit(%i[post_id reason]) end diff --git a/app/controllers/post_replacements_controller.rb b/app/controllers/post_replacements_controller.rb index 31a7e0696..cbc2ec7a4 100644 --- a/app/controllers/post_replacements_controller.rb +++ b/app/controllers/post_replacements_controller.rb @@ -24,13 +24,21 @@ class PostReplacementsController < ApplicationController def index params[:search][:post_id] = params.delete(:post_id) if params.key?(:post_id) - @post_replacements = PostReplacement.paginated_search(params) + @post_replacements = PostReplacement.paginated_search(params).includes(model_includes(params)) respond_with(@post_replacements) end private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:creator, {post: [:uploader]}] + end + end + def create_params params.require(:post_replacement).permit(:replacement_url, :replacement_file, :final_source, :tags) end diff --git a/app/controllers/post_versions_controller.rb b/app/controllers/post_versions_controller.rb index 0d0f8ef1c..fac3cabd3 100644 --- a/app/controllers/post_versions_controller.rb +++ b/app/controllers/post_versions_controller.rb @@ -6,7 +6,7 @@ class PostVersionsController < ApplicationController respond_to :js, only: [:undo] def index - @post_versions = PostArchive.includes(:updater, post: [:versions]).paginated_search(params) + @post_versions = PostArchive.paginated_search(params).includes(model_includes(params)) respond_with(@post_versions) end @@ -22,6 +22,18 @@ class PostVersionsController < ApplicationController private + def model_name + "PostArchive" + end + + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [:updater, {post: [:versions]}] + else + [:updater, {post: [:uploader, :versions]}] + end + end + def set_timeout PostArchive.connection.execute("SET statement_timeout = #{CurrentUser.user.statement_timeout}") yield diff --git a/app/controllers/post_votes_controller.rb b/app/controllers/post_votes_controller.rb index 816973002..222dddb29 100644 --- a/app/controllers/post_votes_controller.rb +++ b/app/controllers/post_votes_controller.rb @@ -5,7 +5,7 @@ class PostVotesController < ApplicationController rescue_with PostVote::Error, status: 422 def index - @post_votes = PostVote.includes(:user, post: [:uploader]).paginated_search(params, count_pages: true) + @post_votes = PostVote.paginated_search(params, count_pages: true).includes(model_includes(params)) respond_with(@post_votes) end @@ -22,4 +22,14 @@ class PostVotesController < ApplicationController respond_with(@post) end + + private + + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:user, {post: [:uploader]}] + end + end end diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 6e116b276..065aa0978 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -11,7 +11,7 @@ class PostsController < ApplicationController end else @post_set = PostSets::Post.new(tag_query, params[:page], params[:limit], raw: params[:raw], random: params[:random], format: params[:format]) - @posts = @post_set.posts + @posts = @post_set.posts = @post_set.posts.includes(model_includes(params)) if !@post_set.is_random? respond_with(@posts) do |format| format.atom end @@ -96,6 +96,14 @@ class PostsController < ApplicationController private + def default_includes(params) + if ["json", "xml", "atom"].include?(params[:format]) + [:uploader] + else + (CurrentUser.user.is_moderator? ? [:uploader] : []) + end + end + def tag_query params[:tags] || (params[:post] && params[:post][:tags]) end diff --git a/app/controllers/saved_searches_controller.rb b/app/controllers/saved_searches_controller.rb index 716d21d73..90bb97976 100644 --- a/app/controllers/saved_searches_controller.rb +++ b/app/controllers/saved_searches_controller.rb @@ -2,7 +2,7 @@ class SavedSearchesController < ApplicationController respond_to :html, :xml, :json, :js def index - @saved_searches = saved_searches.paginated_search(params, count_pages: true) + @saved_searches = saved_searches.paginated_search(params, count_pages: true).includes(model_includes(params)) respond_with(@saved_searches) end diff --git a/app/controllers/tag_aliases_controller.rb b/app/controllers/tag_aliases_controller.rb index acc86b969..b2ac5e2c3 100644 --- a/app/controllers/tag_aliases_controller.rb +++ b/app/controllers/tag_aliases_controller.rb @@ -22,7 +22,7 @@ class TagAliasesController < ApplicationController end def index - @tag_aliases = TagAlias.includes(:antecedent_tag, :consequent_tag, :approver).paginated_search(params, count_pages: true) + @tag_aliases = TagAlias.paginated_search(params, count_pages: true).includes(model_includes(params)) respond_with(@tag_aliases) end @@ -42,6 +42,14 @@ class TagAliasesController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:antecedent_tag, :consequent_tag, :approver] + end + end + def tag_alias_params params.require(:tag_alias).permit(%i[antecedent_name consequent_name forum_topic_id skip_secondary_validations]) end diff --git a/app/controllers/tag_implications_controller.rb b/app/controllers/tag_implications_controller.rb index 0b3f1f077..d70bd6226 100644 --- a/app/controllers/tag_implications_controller.rb +++ b/app/controllers/tag_implications_controller.rb @@ -22,7 +22,7 @@ class TagImplicationsController < ApplicationController end def index - @tag_implications = TagImplication.includes(:antecedent_tag, :consequent_tag, :approver).paginated_search(params, count_pages: true) + @tag_implications = TagImplication.paginated_search(params, count_pages: true).includes(model_includes(params)) respond_with(@tag_implications) end @@ -42,6 +42,14 @@ class TagImplicationsController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:antecedent_tag, :consequent_tag, :approver] + end + end + def tag_implication_params params.require(:tag_implication).permit(%i[antecedent_name consequent_name forum_topic_id skip_secondary_validations]) end diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index 4a3cd5665..619f04470 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -9,7 +9,7 @@ class TagsController < ApplicationController end def index - @tags = Tag.paginated_search(params) + @tags = Tag.paginated_search(params).includes(model_includes(params)) respond_with(@tags) end diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb index eff7fefa3..66e527ea6 100644 --- a/app/controllers/uploads_controller.rb +++ b/app/controllers/uploads_controller.rb @@ -23,7 +23,7 @@ class UploadsController < ApplicationController end def index - @uploads = Upload.paginated_search(params, count_pages: true).includes(:post, :uploader) + @uploads = Upload.paginated_search(params, count_pages: true).includes(model_includes(params)) respond_with(@uploads) end @@ -58,6 +58,14 @@ class UploadsController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [:uploader] + else + [:uploader, {post: [:uploader]}] + end + end + def upload_params permitted_params = %i[ file source tag_string rating status parent_id artist_commentary_title diff --git a/app/controllers/user_feedbacks_controller.rb b/app/controllers/user_feedbacks_controller.rb index 2c2ee5dc6..b7bbcf70a 100644 --- a/app/controllers/user_feedbacks_controller.rb +++ b/app/controllers/user_feedbacks_controller.rb @@ -19,7 +19,7 @@ class UserFeedbacksController < ApplicationController end def index - @user_feedbacks = UserFeedback.includes(:user, :creator).paginated_search(params, count_pages: true) + @user_feedbacks = UserFeedback.paginated_search(params, count_pages: true).includes(model_includes(params)) respond_with(@user_feedbacks) end @@ -37,6 +37,14 @@ class UserFeedbacksController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:user, :creator] + end + end + def check_privilege(user_feedback) raise User::PrivilegeError unless user_feedback.editable_by?(CurrentUser.user) end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 42728b7cc..1851c776e 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -31,7 +31,7 @@ class UsersController < ApplicationController return end - @users = User.paginated_search(params) + @users = User.paginated_search(params).includes(model_includes(params)) respond_with(@users) end @@ -94,6 +94,14 @@ class UsersController < ApplicationController private + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:inviter] + end + end + def item_matches_params(user) if params[:search][:name_matches] User.normalize_name(user.name) == User.normalize_name(params[:search][:name_matches]) diff --git a/app/controllers/wiki_page_versions_controller.rb b/app/controllers/wiki_page_versions_controller.rb index eb5084002..83890cb5c 100644 --- a/app/controllers/wiki_page_versions_controller.rb +++ b/app/controllers/wiki_page_versions_controller.rb @@ -3,7 +3,7 @@ class WikiPageVersionsController < ApplicationController layout "sidebar" def index - @wiki_page_versions = WikiPageVersion.paginated_search(params) + @wiki_page_versions = WikiPageVersion.paginated_search(params).includes(model_includes(params)) respond_with(@wiki_page_versions) end @@ -27,4 +27,14 @@ class WikiPageVersionsController < ApplicationController respond_with([@thispage, @otherpage]) end + + private + + def default_includes(params) + if ["json", "xml"].include?(params[:format]) + [] + else + [:updater] + end + end end diff --git a/app/controllers/wiki_pages_controller.rb b/app/controllers/wiki_pages_controller.rb index a3ed76e0d..e2cba2ad0 100644 --- a/app/controllers/wiki_pages_controller.rb +++ b/app/controllers/wiki_pages_controller.rb @@ -15,7 +15,7 @@ class WikiPagesController < ApplicationController end def index - @wiki_pages = WikiPage.paginated_search(params) + @wiki_pages = WikiPage.paginated_search(params).includes(model_includes(params)) respond_with(@wiki_pages) end diff --git a/app/logical/application_responder.rb b/app/logical/application_responder.rb index eb9baac34..8e29aa7b2 100644 --- a/app/logical/application_responder.rb +++ b/app/logical/application_responder.rb @@ -17,7 +17,7 @@ class ApplicationResponder < ActionController::Responder options[:root] ||= resource.table_name.dasherize if resource.respond_to?(:table_name) end - options[:only] ||= params["only"].scan(/\w+/) if params["only"] + options[:only] ||= params["only"] if params["only"] super end diff --git a/app/logical/post_sets/post.rb b/app/logical/post_sets/post.rb index 43230b9b4..d6b88b783 100644 --- a/app/logical/post_sets/post.rb +++ b/app/logical/post_sets/post.rb @@ -109,15 +109,13 @@ module PostSets else temp = ::Post.tag_match(tag_string).where("true /* PostSets::Post#posts:2 */").paginate(page, :count => post_count, :limit => per_page) end - - # HACK: uploader_name is needed in api responses and in data-uploader attribs (visible to mods only). - temp = temp.includes(:uploader) if !is_random? && (format.to_sym != :html || CurrentUser.is_moderator?) - - temp.each # hack to force rails to eager load - temp end end + def posts=(set_posts) + @posts = set_posts + end + def unknown_post_count? post_count == Danbooru.config.blank_tag_search_fast_count end diff --git a/app/models/application_record.rb b/app/models/application_record.rb index 376daa5bc..f7ff31df8 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -322,6 +322,26 @@ class ApplicationRecord < ActiveRecord::Base @api_attributes += including @api_attributes end + + def available_includes + [] + end + + def multiple_includes + reflections.reject { |k,v| v.macro != :has_many }.keys.map(&:to_sym) + end + + def associated_models(name) + if reflections[name].options[:polymorphic] + associated_models = reflections[name].active_record.try(:model_types) || [] + else + associated_models = [reflections[name].class_name] + end + end + end + + def available_includes + self.class.available_includes end def api_attributes @@ -338,25 +358,24 @@ class ApplicationRecord < ActiveRecord::Base def serializable_hash(options = {}) options ||= {} - options[:only] ||= [] - options[:include] ||= [] - options[:methods] ||= [] + if options[:only] && options[:only].is_a?(String) + options.delete(:methods) + options.delete(:include) + options.merge!(ParameterBuilder.serial_parameters(options[:only], self)) + else + options[:methods] ||= [] + attributes, methods = api_attributes.partition { |attr| has_attribute?(attr) } + methods += options[:methods] + options[:only] ||= attributes + methods - options[:only] = options[:only].map(&:to_sym) - - attributes, methods = api_attributes.partition { |attr| has_attribute?(attr) } - methods += options[:methods] - includes = options[:include] - - if options[:only].present? attributes &= options[:only] methods &= options[:only] - includes &= options[:only] - end - options[:only] = attributes - options[:methods] = methods - options[:include] = includes + options[:only] = attributes + options[:methods] = methods + + options.delete(:methods) if options[:methods].empty? + end hash = super(options) hash.transform_keys { |key| key.delete("?") } diff --git a/app/models/artist.rb b/app/models/artist.rb index 2c70a6573..cdf6dae4a 100644 --- a/app/models/artist.rb +++ b/app/models/artist.rb @@ -508,4 +508,8 @@ class Artist < ApplicationRecord "Deleted" end end + + def self.available_includes + [:creator, :members, :urls, :wiki_page, :tag_alias, :tag] + end end diff --git a/app/models/artist_commentary.rb b/app/models/artist_commentary.rb index baacaf34d..3b1c62d1f 100644 --- a/app/models/artist_commentary.rb +++ b/app/models/artist_commentary.rb @@ -144,4 +144,8 @@ class ArtistCommentary < ApplicationRecord extend SearchMethods include VersionMethods + + def self.available_includes + [:post] + end end diff --git a/app/models/artist_commentary_version.rb b/app/models/artist_commentary_version.rb index e362821cb..1fab760bb 100644 --- a/app/models/artist_commentary_version.rb +++ b/app/models/artist_commentary_version.rb @@ -27,4 +27,8 @@ class ArtistCommentaryVersion < ApplicationRecord def unchanged_empty?(field) self[field].strip.empty? && (previous.nil? || previous[field].strip.empty?) end + + def self.available_includes + [:post, :updater] + end end diff --git a/app/models/artist_url.rb b/app/models/artist_url.rb index 02a62ebb2..e39d3db65 100644 --- a/app/models/artist_url.rb +++ b/app/models/artist_url.rb @@ -126,4 +126,8 @@ class ArtistUrl < ApplicationRecord rescue Addressable::URI::InvalidURIError => error errors[:url] << "'#{uri}' is malformed: #{error}" end + + def self.available_includes + [:artist] + end end diff --git a/app/models/artist_version.rb b/app/models/artist_version.rb index d8486cae3..74c37ad19 100644 --- a/app/models/artist_version.rb +++ b/app/models/artist_version.rb @@ -66,4 +66,8 @@ class ArtistVersion < ApplicationRecord def was_unbanned !is_banned && previous.is_banned end + + def self.available_includes + [:updater, :artist] + end end diff --git a/app/models/ban.rb b/app/models/ban.rb index d3b0ae34b..7b4e9dc6e 100644 --- a/app/models/ban.rb +++ b/app/models/ban.rb @@ -115,4 +115,8 @@ class Ban < ApplicationRecord def create_unban_mod_action ModAction.log(%{Unbanned <@#{user_name}>}, :user_unban) end + + def self.available_includes + [:user, :banner] + end end diff --git a/app/models/bulk_update_request.rb b/app/models/bulk_update_request.rb index fea7992bf..82ba4257f 100644 --- a/app/models/bulk_update_request.rb +++ b/app/models/bulk_update_request.rb @@ -216,4 +216,8 @@ class BulkUpdateRequest < ApplicationRecord forum_topic_id ) end + + def self.available_includes + [:user, :forum_topic, :forum_post, :approver] + end end diff --git a/app/models/comment.rb b/app/models/comment.rb index 92240d757..b72f65995 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -174,4 +174,10 @@ class Comment < ApplicationRecord def quoted_response DText.quote(body, creator.name) end + + def self.available_includes + includes_array = [:post, :creator, :updater] + includes_array << :moderation_reports if CurrentUser.is_moderator? + includes_array + end end diff --git a/app/models/comment_vote.rb b/app/models/comment_vote.rb index 379d082ef..ea7ffeeff 100644 --- a/app/models/comment_vote.rb +++ b/app/models/comment_vote.rb @@ -51,4 +51,8 @@ class CommentVote < ApplicationRecord def initialize_user self.user_id = CurrentUser.user.id end + + def self.available_includes + [:comment, :user] + end end diff --git a/app/models/dmail.rb b/app/models/dmail.rb index a85035704..74e733558 100644 --- a/app/models/dmail.rb +++ b/app/models/dmail.rb @@ -195,4 +195,10 @@ class Dmail < ApplicationRecord def dtext_shortlink(key: false, **options) key ? "dmail ##{id}/#{self.key}" : "dmail ##{id}" end + + def self.available_includes + includes_array = [:owner, :to, :from] + includes_array << :moderation_reports if CurrentUser.is_moderator? + includes_array + end end diff --git a/app/models/dtext_link.rb b/app/models/dtext_link.rb index f77a844c6..c922aae8b 100644 --- a/app/models/dtext_link.rb +++ b/app/models/dtext_link.rb @@ -8,6 +8,10 @@ class DtextLink < ApplicationRecord scope :wiki_page, -> { where(model_type: "WikiPage") } scope :forum_post, -> { where(model_type: "ForumPost") } + def self.model_types + %w[WikiPage ForumPost] + end + def self.new_from_dtext(dtext) links = [] @@ -71,4 +75,8 @@ class DtextLink < ApplicationRecord # because it can't index values that take up more than 1/3 of an 8kb page. self.link_target = self.link_target.truncate(2048, omission: "") end + + def self.available_includes + [:model] + end end diff --git a/app/models/favorite_group.rb b/app/models/favorite_group.rb index 331ef580c..a74c136f2 100644 --- a/app/models/favorite_group.rb +++ b/app/models/favorite_group.rb @@ -168,4 +168,8 @@ class FavoriteGroup < ApplicationRecord def viewable_by?(user) creator_id == user.id || is_public end + + def self.available_includes + [:creator] + end end diff --git a/app/models/forum_post.rb b/app/models/forum_post.rb index af3f26e03..cd1db9e30 100644 --- a/app/models/forum_post.rb +++ b/app/models/forum_post.rb @@ -223,4 +223,10 @@ class ForumPost < ApplicationRecord def dtext_shortlink "forum ##{id}" end + + def self.available_includes + includes_array = [:creator, :updater, :topic, :dtext_links, :votes, :tag_alias, :tag_implication, :bulk_update_request] + includes_array << :moderation_reports if CurrentUser.is_moderator? + includes_array + end end diff --git a/app/models/forum_post_vote.rb b/app/models/forum_post_vote.rb index b7aae81d0..886de7900 100644 --- a/app/models/forum_post_vote.rb +++ b/app/models/forum_post_vote.rb @@ -53,4 +53,8 @@ class ForumPostVote < ApplicationRecord raise end end + + def self.available_includes + [:creator] + end end diff --git a/app/models/forum_topic.rb b/app/models/forum_topic.rb index bd0288604..93d256bbc 100644 --- a/app/models/forum_topic.rb +++ b/app/models/forum_topic.rb @@ -177,4 +177,10 @@ class ForumTopic < ApplicationRecord def update_orignal_post original_post&.update_columns(:updater_id => updater.id, :updated_at => Time.now) end + + def self.available_includes + includes_array = [:creator, :updater, :original_post] + includes_array << :moderation_reports if CurrentUser.is_moderator? + includes_array + end end diff --git a/app/models/ip_address.rb b/app/models/ip_address.rb index e64226712..7506f5a54 100644 --- a/app/models/ip_address.rb +++ b/app/models/ip_address.rb @@ -49,4 +49,8 @@ class IpAddress < ApplicationRecord def html_data_attributes super & attributes.keys.map(&:to_sym) end + + def self.available_includes + [:user, :model] + end end diff --git a/app/models/ip_ban.rb b/app/models/ip_ban.rb index cb6fd96ee..9d1d027d4 100644 --- a/app/models/ip_ban.rb +++ b/app/models/ip_ban.rb @@ -42,4 +42,8 @@ class IpBan < ApplicationRecord str += "/" + ip_addr.prefix.to_s if has_subnet? str end + + def self.available_includes + [:creator] + end end diff --git a/app/models/mod_action.rb b/app/models/mod_action.rb index fc4534b49..4da9db28d 100644 --- a/app/models/mod_action.rb +++ b/app/models/mod_action.rb @@ -83,4 +83,8 @@ class ModAction < ApplicationRecord def initialize_creator self.creator_id = CurrentUser.id end + + def self.available_includes + [:creator] + end end diff --git a/app/models/moderation_report.rb b/app/models/moderation_report.rb index 02d55c76a..ff975f2cc 100644 --- a/app/models/moderation_report.rb +++ b/app/models/moderation_report.rb @@ -19,6 +19,10 @@ class ModerationReport < ApplicationRecord !Rails.env.production? end + def self.model_types + %w[User Dmail Comment ForumPost] + end + def forum_topic_title "Reports requiring moderation" end @@ -83,4 +87,8 @@ class ModerationReport < ApplicationRecord q.apply_default_order(params) end + + def self.available_includes + [:creator, :model] + end end diff --git a/app/models/note.rb b/app/models/note.rb index 65f7c9c34..d5e3c2e5f 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -158,4 +158,8 @@ class Note < ApplicationRecord end end end + + def self.available_includes + [:creator, :post] + end end diff --git a/app/models/note_version.rb b/app/models/note_version.rb index 0e65e5738..5d1f19f6c 100644 --- a/app/models/note_version.rb +++ b/app/models/note_version.rb @@ -44,4 +44,8 @@ class NoteVersion < ApplicationRecord def was_undeleted is_active && !previous.is_active end + + def self.available_includes + [:updater, :note, :post] + end end diff --git a/app/models/pool.rb b/app/models/pool.rb index 32d6744d9..989c4c313 100644 --- a/app/models/pool.rb +++ b/app/models/pool.rb @@ -312,4 +312,8 @@ class Pool < ApplicationRecord errors[:base] << "You cannot removes posts from pools within the first week of sign up" end end + + def self.available_includes + [:creator] + end end diff --git a/app/models/pool_archive.rb b/app/models/pool_archive.rb index f2fe3b031..93920c264 100644 --- a/app/models/pool_archive.rb +++ b/app/models/pool_archive.rb @@ -148,4 +148,8 @@ class PoolArchive < ApplicationRecord def pretty_name name.tr("_", " ") end + + def self.available_includes + [:updater, :pool] + end end diff --git a/app/models/post.rb b/app/models/post.rb index 01fc2c887..84ec90cc9 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -1787,4 +1787,11 @@ class Post < ApplicationRecord save end + + def self.available_includes + includes_array = [:uploader, :updater, :approver, :parent, :upload, :artist_commentary, :flags, :appeals, :notes, :comments, :children, :approvals, :replacements] + includes_array << :moderation_reports if CurrentUser.is_moderator? + includes_array << :disapprovals if CurrentUser.user.is_approver? + includes_array + end end diff --git a/app/models/post_appeal.rb b/app/models/post_appeal.rb index 29e7f8102..5d2b2a17d 100644 --- a/app/models/post_appeal.rb +++ b/app/models/post_appeal.rb @@ -62,4 +62,8 @@ class PostAppeal < ApplicationRecord def appeal_count_for_creator creator.post_appeals.recent.count end + + def self.available_includes + [:creator, :post] + end end diff --git a/app/models/post_approval.rb b/app/models/post_approval.rb index ddf658a7e..e5764115d 100644 --- a/app/models/post_approval.rb +++ b/app/models/post_approval.rb @@ -40,4 +40,8 @@ class PostApproval < ApplicationRecord q = q.search_attributes(params, :user, :post) q.apply_default_order(params) end + + def self.available_includes + [:user, :post] + end end diff --git a/app/models/post_archive.rb b/app/models/post_archive.rb index 454475ca8..615d5dae2 100644 --- a/app/models/post_archive.rb +++ b/app/models/post_archive.rb @@ -274,5 +274,9 @@ class PostArchive < ApplicationRecord super + [:obsolete_added_tags, :obsolete_removed_tags, :unchanged_tags, :updater_name] end + def self.available_includes + [:updater, :post] + end + memoize :previous, :tag_array, :changes, :added_tags_with_fields, :removed_tags_with_fields, :obsolete_removed_tags, :obsolete_added_tags, :unchanged_tags end diff --git a/app/models/post_disapproval.rb b/app/models/post_disapproval.rb index ba5cf035d..d1a2887b4 100644 --- a/app/models/post_disapproval.rb +++ b/app/models/post_disapproval.rb @@ -67,4 +67,8 @@ class PostDisapproval < ApplicationRecord end end end + + def self.available_includes + [:user, :post] + end end diff --git a/app/models/post_flag.rb b/app/models/post_flag.rb index 709eb5f54..12d8835ce 100644 --- a/app/models/post_flag.rb +++ b/app/models/post_flag.rb @@ -161,4 +161,10 @@ class PostFlag < ApplicationRecord def not_uploaded_by?(userid) uploader_id != userid end + + def self.available_includes + includes_array = [:post] + includes_array << :creator if CurrentUser.user.is_moderator? + includes_array + end end diff --git a/app/models/post_replacement.rb b/app/models/post_replacement.rb index 49323bccc..7eb9bcc69 100644 --- a/app/models/post_replacement.rb +++ b/app/models/post_replacement.rb @@ -33,4 +33,8 @@ class PostReplacement < ApplicationRecord tags = tags.map { |tag| "-#{tag}" } tags.join(" ") end + + def self.available_includes + [:creator, :post] + end end diff --git a/app/models/post_vote.rb b/app/models/post_vote.rb index a62a62340..859925074 100644 --- a/app/models/post_vote.rb +++ b/app/models/post_vote.rb @@ -68,4 +68,8 @@ class PostVote < ApplicationRecord 1 end end + + def self.available_includes + [:user, :post] + end end diff --git a/app/models/saved_search.rb b/app/models/saved_search.rb index 87b093000..22f6c6151 100644 --- a/app/models/saved_search.rb +++ b/app/models/saved_search.rb @@ -171,4 +171,8 @@ class SavedSearch < ApplicationRecord def disable_labels=(value) CurrentUser.update(disable_categorized_saved_searches: true) if value.to_s.truthy? end + + def self.available_includes + [:user] + end end diff --git a/app/models/tag.rb b/app/models/tag.rb index 0bf82bb48..6c04deb30 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -918,6 +918,10 @@ class Tag < ApplicationRecord Post.tag_match(name) end + def self.available_includes + [:wiki_page, :artist, :antecedent_alias, :consequent_aliases, :antecedent_implications, :consequent_implications] + end + include ApiMethods include CountMethods include CategoryMethods diff --git a/app/models/tag_relationship.rb b/app/models/tag_relationship.rb index 4e082db94..0b596960e 100644 --- a/app/models/tag_relationship.rb +++ b/app/models/tag_relationship.rb @@ -219,6 +219,10 @@ class TagRelationship < ApplicationRecord ) end + def self.available_includes + [:creator, :approver, :forum_post, :forum_topic, :antecedent_tag, :consequent_tag, :antecedent_wiki, :consequent_wiki] + end + extend SearchMethods include MessageMethods end diff --git a/app/models/upload.rb b/app/models/upload.rb index 9d0f0bcc4..ecba2de14 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -247,4 +247,8 @@ class Upload < ApplicationRecord def upload_as_pending? as_pending.to_s.truthy? end + + def self.available_includes + [:uploader, :post] + end end diff --git a/app/models/user.rb b/app/models/user.rb index 3ac8087ff..60c76cbd7 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -754,4 +754,8 @@ class User < ApplicationRecord def dtext_shortlink(**options) "<@#{name}>" end + + def self.available_includes + [:inviter] + end end diff --git a/app/models/user_feedback.rb b/app/models/user_feedback.rb index be2a3f609..8601975e3 100644 --- a/app/models/user_feedback.rb +++ b/app/models/user_feedback.rb @@ -85,4 +85,8 @@ class UserFeedback < ApplicationRecord def editable_by?(editor) (editor.is_moderator? && editor != user) || (creator == editor && !is_deleted?) end + + def self.available_includes + [:creator, :user] + end end diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index a153bb8b2..abb69fb94 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -250,4 +250,8 @@ class WikiPage < ApplicationRecord title end end + + def self.available_includes + [:tag, :artist, :dtext_links] + end end diff --git a/app/models/wiki_page_version.rb b/app/models/wiki_page_version.rb index e5d03ccfd..c5f6302f8 100644 --- a/app/models/wiki_page_version.rb +++ b/app/models/wiki_page_version.rb @@ -54,4 +54,8 @@ class WikiPageVersion < ApplicationRecord def category_name Tag.category_for(title) end + + def self.available_includes + [:updater, :wiki_page, :artist] + end end diff --git a/app/views/favorite_groups/index.html.erb b/app/views/favorite_groups/index.html.erb index 2cf211525..69f127d98 100644 --- a/app/views/favorite_groups/index.html.erb +++ b/app/views/favorite_groups/index.html.erb @@ -7,7 +7,7 @@ <%= f.submit "Search" %> <% end %> - <%= table_for @favorite_groups.includes(:creator), width: "100%" do |t| %> + <%= table_for @favorite_groups, width: "100%" do |t| %> <% t.column "Name", {width: "60%"} do |favgroup| %> <%= link_to favgroup.pretty_name, favorite_group_path(favgroup) %> <% if favgroup.post_count > CurrentUser.user.per_page %>