# frozen_string_literal: true class InsertCommunityToSidebarSections < ActiveRecord::Migration[7.0] COMMUNITY_SECTION_LINKS = [ { name: "Everything", path: "/latest", icon: "layer-group", segment: 0 }, { name: "My Posts", path: "/my/activity", icon: "user", segment: 0 }, { name: "Review", path: "/review", icon: "flag", segment: 0 }, { name: "Admin", path: "/admin", icon: "wrench", segment: 0 }, { name: "Users", path: "/u", icon: "users", segment: 1 }, { name: "About", path: "/about", icon: "info-circle", segment: 1 }, { name: "FAQ", path: "/faq", icon: "question-circle", segment: 1 }, { name: "Groups", path: "/g", icon: "user-friends", segment: 1 }, { name: "Badges", path: "/badges", icon: "certificate", segment: 1 }, ] def up result = DB.query <<~SQL INSERT INTO sidebar_sections(user_id, title, public, section_type, created_at, updated_at) VALUES (-1, 'Community', true, 0, now(), now()) RETURNING sidebar_sections.id SQL community_section_id = result.last&.id sidebar_urls = COMMUNITY_SECTION_LINKS.map do |url_data| "('#{url_data[:name]}', '#{url_data[:path]}', '#{url_data[:icon]}', '#{url_data[:segment]}', false, now(), now())" end result = DB.query <<~SQL INSERT INTO sidebar_urls(name, value, icon, segment, external, created_at, updated_at) VALUES #{sidebar_urls.join(",")} RETURNING sidebar_urls.id SQL sidebar_section_links = result.map.with_index do |url, index| "(-1, #{url.id}, 'SidebarUrl', #{community_section_id}, #{index}, now(), now())" end result = DB.query <<~SQL INSERT INTO sidebar_section_links(user_id, linkable_id, linkable_type, sidebar_section_id, position, created_at, updated_at) VALUES #{sidebar_section_links.join(",")} SQL end def down result = DB.query <<~SQL DELETE FROM sidebar_sections WHERE section_type = 0 RETURNING sidebar_sections.id SQL community_section_id = result.last&.id return true if !community_section_id result = DB.query <<~SQL DELETE FROM sidebar_section_links WHERE sidebar_section_id = #{community_section_id} RETURNING sidebar_section_links.linkable_id SQL sidebar_url_ids = result.map(&:linkable_id) DB.query <<~SQL DELETE FROM sidebar_urls WHERE id IN (#{sidebar_url_ids.join(",")}) SQL end end