# frozen_string_literal: true class MovePostNoticesToJson < ActiveRecord::Migration[6.0] def up execute <<~SQL INSERT INTO post_custom_fields(post_id, name, value, created_at, updated_at) SELECT posts.id, 'notice', CASE WHEN pcf_type.value = 'custom' THEN json_build_object('type', pcf_type.value, 'raw', pcf_args.value, 'cooked', pcf_args.value) WHEN pcf_type.value = 'new_user' THEN json_build_object('type', pcf_type.value) WHEN pcf_type.value = 'returning_user' THEN json_build_object('type', pcf_type.value, 'last_posted_at', pcf_args.value) END, pcf_type.created_at created_at, pcf_type.updated_at updated_at FROM posts JOIN post_custom_fields pcf_type ON posts.id = pcf_type.post_id AND pcf_type.name = 'notice_type' LEFT JOIN post_custom_fields pcf_args ON posts.id = pcf_args.post_id AND pcf_args.name = 'notice_args' SQL execute "DELETE FROM post_custom_fields WHERE name = 'notice_type' OR name = 'notice_args'" add_index :post_custom_fields, :post_id, unique: true, name: "index_post_custom_fields_on_notice", where: "name = 'notice'" remove_index :post_custom_fields, name: "index_post_custom_fields_on_notice_type" remove_index :post_custom_fields, name: "index_post_custom_fields_on_notice_args" end def down execute <<~SQL INSERT INTO post_custom_fields(post_id, name, value, created_at, updated_at) SELECT post_id, 'notice_type', value::json->>'type', created_at, updated_at FROM post_custom_fields WHERE name = 'notice' SQL execute <<~SQL INSERT INTO post_custom_fields(post_id, name, value, created_at, updated_at) SELECT post_id, 'notice_args', COALESCE(value::json->>'cooked', value::json->>'last_posted_at'), created_at, updated_at FROM post_custom_fields WHERE name = 'notice' SQL execute "DELETE FROM post_custom_fields WHERE name = 'notice'" add_index :post_custom_fields, :post_id, unique: true, name: "index_post_custom_fields_on_notice_type", where: "name = 'notice_type'" add_index :post_custom_fields, :post_id, unique: true, name: "index_post_custom_fields_on_notice_args", where: "name = 'notice_args'" remove_index :index_post_custom_fields_on_notice end end