# frozen_string_literal: true class AddInvitesLinkToSidebar < ActiveRecord::Migration[7.1] def up community_section_id = DB.query_single(<<~SQL).first SELECT id FROM sidebar_sections WHERE section_type = 0 SQL return if !community_section_id max_position = DB.query_single(<<~SQL, section_id: community_section_id).first SELECT MAX(ssl.position) FROM sidebar_urls su JOIN sidebar_section_links ssl ON su.id = ssl.linkable_id WHERE ssl.linkable_type = 'SidebarUrl' AND ssl.sidebar_section_id = :section_id AND su.segment = 0 SQL max_position ||= (DB.query_single(<<~SQL, section_id: community_section_id).first || 0) - 1 SELECT MIN(ssl.position) FROM sidebar_urls su JOIN sidebar_section_links ssl ON su.id = ssl.linkable_id WHERE ssl.linkable_type = 'SidebarUrl' AND ssl.sidebar_section_id = :section_id AND su.segment = 1 SQL updated_rows = DB.query_hash(<<~SQL, position: max_position, section_id: community_section_id) DELETE FROM sidebar_section_links WHERE position > :position AND sidebar_section_id = :section_id AND linkable_type = 'SidebarUrl' RETURNING user_id, linkable_id, linkable_type, sidebar_section_id, position + 1 AS position, created_at, updated_at SQL updated_rows.each { |row| DB.exec(<<~SQL, **row.symbolize_keys) } INSERT INTO sidebar_section_links (user_id, linkable_id, linkable_type, sidebar_section_id, position, created_at, updated_at) VALUES (:user_id, :linkable_id, :linkable_type, :sidebar_section_id, :position, :created_at, :updated_at) SQL link_id = DB.query_single(<<~SQL).first INSERT INTO sidebar_urls (name, value, icon, external, segment, created_at, updated_at) VALUES ('Invite', '/new-invite', 'paper-plane', false, 0, now(), now()) RETURNING sidebar_urls.id SQL DB.exec(<<~SQL, link_id:, section_id: community_section_id, position: max_position + 1) INSERT INTO sidebar_section_links (user_id, linkable_id, linkable_type, sidebar_section_id, position, created_at, updated_at) VALUES (-1, :link_id, 'SidebarUrl', :section_id, :position, now(), now()) SQL end def down raise ActiveRecord::IrreversibleMigration end end