discourse/app/models/upload_reference.rb
Martin Brennan 0924f874bd
DEV: Use UploadReference instead of ChatUpload in chat (#19947)
We've had the UploadReference table for some time now in core,
but it was added after ChatUpload was and chat was just never
moved over to this new system.

This commit changes all chat code dealing with uploads to create/
update/delete/query UploadReference records instead of ChatUpload
records for consistency. At a later date we will drop the ChatUpload
table, but for now keeping it for data backup.

The migration + post migration are the same, we need both in case
any chat uploads are added/removed during deploy.
2023-01-24 13:28:21 +10:00

67 lines
1.7 KiB
Ruby

# frozen_string_literal: true
class UploadReference < ActiveRecord::Base
belongs_to :upload
belongs_to :target, polymorphic: true
delegate :to_markdown, to: :upload
def self.ensure_exist!(upload_ids: [], target: nil, target_type: nil, target_id: nil)
if !target && !(target_type && target_id)
raise "target OR target_type and target_id are required"
end
if target.present?
target_type = target.class
target_id = target.id
end
upload_ids = upload_ids.uniq.reject(&:blank?)
target_type = target_type.to_s
if upload_ids.empty?
UploadReference.where(target_type: target_type, target_id: target_id).delete_all
return
end
rows =
upload_ids.map do |upload_id|
{
upload_id: upload_id,
target_type: target_type,
target_id: target_id,
created_at: Time.zone.now,
updated_at: Time.zone.now,
}
end
UploadReference.transaction do |transaction|
UploadReference
.where(target_type: target_type, target_id: target_id)
.where.not(upload_id: upload_ids)
.delete_all
UploadReference.insert_all(rows)
end
end
end
# == Schema Information
#
# Table name: upload_references
#
# id :bigint not null, primary key
# upload_id :bigint not null
# target_type :string not null
# target_id :bigint not null
# created_at :datetime not null
# updated_at :datetime not null
#
# Indexes
#
# index_upload_references_on_target (target_type,target_id)
# index_upload_references_on_upload_and_target (upload_id,target_type,target_id) UNIQUE
# index_upload_references_on_upload_id (upload_id)
#