mirror of
https://github.com/discourse/discourse.git
synced 2024-12-16 16:43:44 +08:00
30990006a9
This reduces chances of errors where consumers of strings mutate inputs and reduces memory usage of the app. Test suite passes now, but there may be some stuff left, so we will run a few sites on a branch prior to merging
42 lines
933 B
Ruby
42 lines
933 B
Ruby
# frozen_string_literal: true
|
|
|
|
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
|