CREATE OR REPLACE VIEW optimized_all_activity AS WITH feed_data AS ( SELECT p.date AS content_date, p.title, p.description, CONCAT('https://coryd.dev', p.url) AS url, NULL AS image, NULL AS rating, p.tags, json_build_object( 'title', p.title, 'url', CONCAT('https://coryd.dev', p.url), 'description', p.description, 'date', p.date ) AS feed FROM optimized_posts p UNION ALL SELECT l.date AS content_date, l.title, l.description, l.link AS url, NULL AS image, NULL AS rating, l.tags, json_build_object( 'title', l.title, 'url', l.link, 'description', l.description, 'date', l.date ) AS feed FROM optimized_links l UNION ALL SELECT b.date_finished AS content_date, b.title, b.description, CONCAT('https://coryd.dev', b.url) AS url, b.image, b.rating, b.tags, CASE WHEN LOWER(b.status) = 'finished' THEN json_build_object( 'title', b.title, 'url', CONCAT('https://coryd.dev', b.url), 'description', b.description, 'image', b.image, 'rating', b.rating, 'date', b.date_finished ) ELSE NULL END AS feed FROM optimized_books b UNION ALL SELECT m.last_watched AS content_date, m.title, m.description, CONCAT('https://coryd.dev', m.url) AS url, m.image, m.rating, m.tags, CASE WHEN m.last_watched IS NOT NULL THEN json_build_object( 'title', m.title, 'url', CONCAT('https://coryd.dev', m.url), 'description', m.description, 'image', m.image, 'rating', m.rating, 'date', m.last_watched ) ELSE NULL END AS feed FROM optimized_movies m ) SELECT json_agg(feed_data.* ORDER BY feed_data.content_date DESC) AS feed FROM ( SELECT * FROM feed_data WHERE feed IS NOT NULL ORDER BY content_date DESC LIMIT 20 ) AS feed_data;