mirror of
https://github.com/discourse/discourse.git
synced 2024-12-12 15:28:44 +08:00
0924f874bd
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.
67 lines
1.7 KiB
Ruby
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)
|
|
#
|