52 lines
1.9 KiB
Ruby
52 lines
1.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class ChangeSelectableAvatarsSiteSetting < ActiveRecord::Migration[6.0]
|
|
def up
|
|
selectable_avatars = execute("SELECT value FROM site_settings WHERE name = 'selectable_avatars'")
|
|
return if selectable_avatars.cmd_tuples == 0
|
|
|
|
# Keep old site setting value as a backup
|
|
execute <<~SQL
|
|
UPDATE site_settings
|
|
SET name = 'selectable_avatars_urls'
|
|
WHERE name = 'selectable_avatars'
|
|
SQL
|
|
|
|
# Extract SHA1s from URLs and then use them for upload ID lookups
|
|
urls = []
|
|
sha1s = []
|
|
selectable_avatars.first["value"].split("\n").each do |url|
|
|
match = url.match(/(\/original\/\dX[\/\.\w]*\/(\h+)[\.\w]*)/)
|
|
if match.present?
|
|
urls << match[1]
|
|
sha1s << match[2]
|
|
else
|
|
STDERR.puts "Could not extract a SHA1 from #{url}"
|
|
end
|
|
end
|
|
|
|
# Ensure at least one URL or SHA1 exists so the query below can be valid
|
|
return if urls.size == 0 && sha1s.size == 0
|
|
|
|
uploads_query = []
|
|
uploads_query << "url IN (#{urls.map { |url| ActiveRecord::Base.connection.quote(url) }.join(',')})" if urls.size > 0
|
|
uploads_query << "sha1 IN (#{sha1s.map { |sha1| ActiveRecord::Base.connection.quote(sha1) }.join(',')})" if sha1s.size > 0
|
|
uploads_query = "SELECT DISTINCT id FROM uploads WHERE #{uploads_query.join(" OR ")}"
|
|
|
|
upload_ids = execute(uploads_query).map { |row| row["id"] }
|
|
return if upload_ids.size == 0
|
|
|
|
execute <<~SQL
|
|
INSERT INTO site_settings(name, data_type, value, created_at, updated_at)
|
|
SELECT 'selectable_avatars', data_type, '#{upload_ids.join("|")}', created_at, NOW()
|
|
FROM site_settings
|
|
WHERE name = 'selectable_avatars_urls'
|
|
SQL
|
|
end
|
|
|
|
def down
|
|
execute("DELETE FROM site_settings WHERE name = 'selectable_avatars'")
|
|
execute("UPDATE site_settings SET name = 'selectable_avatars' WHERE name = 'selectable_avatars_urls'")
|
|
end
|
|
end
|