2019-05-03 06:17:27 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2018-09-03 09:51:35 +08:00
|
|
|
class BadgePostsViewManager
|
2020-04-30 14:48:34 +08:00
|
|
|
VIEW_NAME = "badge_posts"
|
2018-09-03 09:51:35 +08:00
|
|
|
|
|
|
|
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
|