docbrown/app/workers/migrate_user_settings_worker.rb
Jamie Gaskins 32a1ac6185
Put the user id filter inside the CTEs (#13856)
* Put the user id filter inside the CTEs

One thing I forgot about Postgres CTEs is that they materialize the
entire CTE and the top-level query filters _that_.

* Use the correct column name
2021-05-25 18:11:36 -04:00

83 lines
3.3 KiB
Ruby

class MigrateUserSettingsWorker
include Sidekiq::Worker
SQL = <<~SQL.freeze
WITH settings_data AS (
SELECT
data ->> 'brand_color1' AS brand_color1,
data ->> 'brand_color2' AS brand_color2,
CASE WHEN config_font='default' THEN 0
WHEN config_font='comic_sans' THEN 1
WHEN config_font='monospace' THEN 2
WHEN config_font='open_dyslexic' THEN 3
WHEN config_font='sans_serif' THEN 4
WHEN config_font='serif' THEN 5
ELSE 0
END
config_font,
CASE WHEN config_navbar='default_navbar' THEN 0
WHEN config_navbar='static_navbar' THEN 1
ELSE 0
END
config_navbar,
CASE WHEN config_theme='default_theme' THEN 0
WHEN config_theme='minimal_light_theme' THEN 1
WHEN config_theme='night_theme' THEN 2
WHEN config_theme='pink_theme' THEN 3
WHEN config_theme='ten_x_hacker_theme' THEN 4
ELSE 0
END
config_theme,
COALESCE(display_announcements, true),
COALESCE((data ->> 'display_email_on_profile')::boolean, false) as display_email_on_profile,
COALESCE(display_sponsors, true),
CASE WHEN editor_version='v2' THEN 0
WHEN editor_version='v1' THEN 1
ELSE 0
END
editor_version,
experience_level,
COALESCE(feed_mark_canonical, false),
COALESCE(feed_referential_link, true),
feed_url,
inbox_guidelines,
CASE WHEN inbox_type='private' THEN 0
WHEN inbox_type='open' THEN 1
ELSE 0
END
inbox_type,
COALESCE(permit_adjacent_sponsors, true),
users.id AS user_id,
NOW(),
NOW()
FROM users
JOIN profiles
ON profiles.user_id = users.id
WHERE users.id = $1
)
INSERT INTO users_settings (brand_color1, brand_color2, config_font, config_navbar, config_theme, display_announcements, display_email_on_profile, display_sponsors, editor_version, experience_level, feed_mark_canonical, feed_referential_link, feed_url, inbox_guidelines, inbox_type, permit_adjacent_sponsors, user_id, created_at, updated_at)
SELECT * FROM settings_data
ON CONFLICT (user_id) DO UPDATE
SET brand_color1 = EXCLUDED.brand_color1,
brand_color2 = EXCLUDED.brand_color2,
config_font = EXCLUDED.config_font,
config_navbar = EXCLUDED.config_navbar,
config_theme = EXCLUDED.config_theme,
display_announcements = EXCLUDED.display_announcements,
display_email_on_profile = EXCLUDED.display_email_on_profile,
display_sponsors = EXCLUDED.display_sponsors,
editor_version = EXCLUDED.editor_version,
experience_level = EXCLUDED.experience_level,
feed_mark_canonical = EXCLUDED.feed_mark_canonical,
feed_referential_link = EXCLUDED.feed_referential_link,
feed_url = EXCLUDED.feed_url,
inbox_guidelines = EXCLUDED.inbox_guidelines,
inbox_type = EXCLUDED.inbox_type,
permit_adjacent_sponsors = EXCLUDED.permit_adjacent_sponsors,
updated_at = NOW()
SQL
def perform(user_id)
Users::Setting.connection.exec_insert SQL, nil, [user_id]
end
end