* 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
83 lines
3.3 KiB
Ruby
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
|