From 45f092a49d317182741886c806c296085a9a8a91 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 3 Sep 2018 09:51:35 +0800 Subject: [PATCH] Extract `badge_posts` view management logic into a service object. * Avoid defininig a global constant and method. Fixes https://github.com/discourse/discourse/pull/6318 --- db/fixtures/000_delayed_drops.rb | 36 +++-------------------------- lib/badge_posts_view_manager.rb | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 33 deletions(-) create mode 100644 lib/badge_posts_view_manager.rb diff --git a/db/fixtures/000_delayed_drops.rb b/db/fixtures/000_delayed_drops.rb index 5b976a7bdb1..a46bfed42ea 100644 --- a/db/fixtures/000_delayed_drops.rb +++ b/db/fixtures/000_delayed_drops.rb @@ -2,6 +2,7 @@ require 'migration/table_dropper' require 'migration/column_dropper' +require 'badge_posts_view_manager' Migration::ColumnDropper.drop( table: 'user_profiles', @@ -74,20 +75,6 @@ Migration::ColumnDropper.drop( } ) -VIEW_NAME = "badge_posts".freeze - -def badge_posts_view_exists? - sql = <<~SQL - SELECT 1 - FROM pg_catalog.pg_views - WHERE schemaname - IN ('public') - AND viewname = '#{VIEW_NAME}'; - SQL - - DB.exec(sql) == 1 -end - Migration::ColumnDropper.drop( table: 'posts', after_migration: 'DropVoteCountFromTopicsAndPosts', @@ -96,27 +83,10 @@ Migration::ColumnDropper.drop( }, on_drop: ->() { STDERR.puts "Removing superflous post columns!" - - DB.exec("DROP VIEW #{VIEW_NAME}") - raise "Failed to drop '#{VIEW_NAME}' view" if badge_posts_view_exists? + BadgePostsViewManager.drop! }, after_drop: -> () { - sql = <<~SQL - CREATE VIEW #{VIEW_NAME} AS - SELECT p.* - FROM posts p - JOIN topics t ON t.id = p.topic_id - JOIN categories c ON c.id = t.category_id - WHERE c.allow_badges AND - p.deleted_at IS NULL AND - t.deleted_at IS NULL AND - NOT c.read_restricted AND - t.visible AND - p.post_type IN (1,2,3) - SQL - - DB.exec(sql) - raise "Failed to create '#{VIEW_NAME}' view" unless badge_posts_view_exists? + BadgePostsViewManager.create! } ) diff --git a/lib/badge_posts_view_manager.rb b/lib/badge_posts_view_manager.rb new file mode 100644 index 00000000000..8ec2138f9fd --- /dev/null +++ b/lib/badge_posts_view_manager.rb @@ -0,0 +1,39 @@ +class BadgePostsViewManager + VIEW_NAME = "badge_posts".freeze + + def self.create! + sql = <<~SQL + CREATE VIEW #{VIEW_NAME} AS + SELECT p.* + FROM posts p + JOIN topics t ON t.id = p.topic_id + JOIN categories c ON c.id = t.category_id + WHERE c.allow_badges AND + p.deleted_at IS NULL AND + t.deleted_at IS NULL AND + NOT c.read_restricted AND + t.visible AND + p.post_type IN (1,2,3) + SQL + + DB.exec(sql) + raise "Failed to create '#{VIEW_NAME}' view" unless badge_posts_view_exists? + end + + def self.drop! + DB.exec("DROP VIEW #{VIEW_NAME}") + raise "Failed to drop '#{VIEW_NAME}' view" if badge_posts_view_exists? + end + + def self.badge_posts_view_exists? + sql = <<~SQL + SELECT 1 + FROM pg_catalog.pg_views + WHERE schemaname + IN ('public') + AND viewname = '#{VIEW_NAME}'; + SQL + + DB.exec(sql) == 1 + end +end