From 3146109b084026133c92137f57ed9e74ad9f7246 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 30 Jul 2025 08:57:51 -0400 Subject: [PATCH] Add `MediaAttachment.combined_media_file_size` method (#35570) --- app/lib/admin/metrics/dimension/space_usage_dimension.rb | 2 +- .../metrics/measure/instance_media_attachments_measure.rb | 8 ++++++-- app/models/media_attachment.rb | 4 ++++ lib/mastodon/cli/media.rb | 4 +--- spec/models/media_attachment_spec.rb | 6 ++++++ 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/app/lib/admin/metrics/dimension/space_usage_dimension.rb b/app/lib/admin/metrics/dimension/space_usage_dimension.rb index 3fd8d86856e..c03464ecaa9 100644 --- a/app/lib/admin/metrics/dimension/space_usage_dimension.rb +++ b/app/lib/admin/metrics/dimension/space_usage_dimension.rb @@ -40,7 +40,7 @@ class Admin::Metrics::Dimension::SpaceUsageDimension < Admin::Metrics::Dimension def media_size value = [ - MediaAttachment.sum(Arel.sql('COALESCE(file_file_size, 0) + COALESCE(thumbnail_file_size, 0)')), + MediaAttachment.sum(MediaAttachment.combined_media_file_size), CustomEmoji.sum(:image_file_size), PreviewCard.sum(:image_file_size), Account.sum(Arel.sql('COALESCE(avatar_file_size, 0) + COALESCE(header_file_size, 0)')), diff --git a/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb b/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb index 996ca52e0bb..00836191f1d 100644 --- a/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb +++ b/app/lib/admin/metrics/measure/instance_media_attachments_measure.rb @@ -29,7 +29,7 @@ class Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure < Admin::Metrics: def perform_total_query domain = params[:domain] domain = Instance.by_domain_and_subdomains(params[:domain]).select(:domain) if params[:include_subdomains] - MediaAttachment.joins(:account).merge(Account.where(domain: domain)).sum('COALESCE(file_file_size, 0) + COALESCE(thumbnail_file_size, 0)') + MediaAttachment.joins(:account).merge(Account.where(domain: domain)).sum(MediaAttachment.combined_media_file_size) end def perform_previous_total_query @@ -44,7 +44,7 @@ class Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure < Admin::Metrics: <<~SQL.squish SELECT axis.*, ( WITH new_media_attachments AS ( - SELECT COALESCE(media_attachments.file_file_size, 0) + COALESCE(media_attachments.thumbnail_file_size, 0) AS size + SELECT #{media_size_total} AS size FROM media_attachments INNER JOIN accounts ON accounts.id = media_attachments.account_id WHERE date_trunc('day', media_attachments.created_at)::date = axis.period @@ -58,6 +58,10 @@ class Admin::Metrics::Measure::InstanceMediaAttachmentsMeasure < Admin::Metrics: SQL end + def media_size_total + MediaAttachment.combined_media_file_size.to_sql + end + def params @params.permit(:domain, :include_subdomains) end diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index 2e60f732b81..13ca0d7e3ab 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -298,6 +298,10 @@ class MediaAttachment < ApplicationRecord IMAGE_FILE_EXTENSIONS + VIDEO_FILE_EXTENSIONS + AUDIO_FILE_EXTENSIONS end + def combined_media_file_size + arel_table.coalesce(arel_table[:file_file_size], 0) + arel_table.coalesce(arel_table[:thumbnail_file_size], 0) + end + private def file_styles(attachment) diff --git a/lib/mastodon/cli/media.rb b/lib/mastodon/cli/media.rb index 1059eb60660..02c9894c36d 100644 --- a/lib/mastodon/cli/media.rb +++ b/lib/mastodon/cli/media.rb @@ -313,9 +313,7 @@ module Mastodon::CLI end def combined_media_sum - Arel.sql(<<~SQL.squish) - COALESCE(file_file_size, 0) + COALESCE(thumbnail_file_size, 0) - SQL + MediaAttachment.combined_media_file_size end def preload_records_from_mixed_objects(objects) diff --git a/spec/models/media_attachment_spec.rb b/spec/models/media_attachment_spec.rb index 910eac4e9a4..a712cdde1dc 100644 --- a/spec/models/media_attachment_spec.rb +++ b/spec/models/media_attachment_spec.rb @@ -313,6 +313,12 @@ RSpec.describe MediaAttachment, :attachment_processing do end end + describe '.combined_media_file_size' do + subject { described_class.combined_media_file_size } + + it { is_expected.to be_an(Arel::Nodes::Grouping) } + end + private def media_metadata