coryd.dev/queries/views/feeds/all_activity.sql

117 lines
2.2 KiB
SQL

CREATE OR REPLACE VIEW optimized_all_activity AS
WITH
feed_data AS (
SELECT
json_build_object(
'title',
p.title,
'url',
p.url,
'description',
p.content,
'date',
p.date,
'type',
'article',
'label',
'Post',
'content',
p.content
) AS feed
FROM
optimized_posts p
UNION ALL
SELECT
json_build_object(
'title',
CONCAT(l.title, ' via ', l.author ->> 'name'),
'url',
l.link,
'description',
l.description,
'date',
l.date,
'type',
'link',
'label',
'Link',
'author',
l.author
) AS feed
FROM
optimized_links l
UNION ALL
SELECT
CASE
WHEN LOWER(b.status) = 'finished' THEN json_build_object(
'title',
CONCAT(
b.title,
' by ',
b.author,
CASE
WHEN b.rating IS NOT NULL THEN CONCAT(' (', b.rating, ')')
ELSE ''
END
),
'url',
b.url,
'description',
COALESCE(b.review, b.description),
'date',
b.date_finished,
'type',
'books',
'label',
'Book',
'image',
b.image,
'rating',
b.rating
)
ELSE NULL
END AS feed
FROM
optimized_books b
UNION ALL
SELECT
CASE
WHEN m.last_watched IS NOT NULL THEN json_build_object(
'title',
CONCAT(
m.title,
CASE
WHEN m.rating IS NOT NULL THEN CONCAT(' (', m.rating, ')')
ELSE ''
END
),
'url',
m.url,
'description',
COALESCE(m.review, m.description),
'date',
m.last_watched,
'type',
'movies',
'label',
'Movie',
'image',
m.image,
'rating',
m.rating
)
ELSE NULL
END AS feed
FROM
optimized_movies m
)
SELECT
feed
FROM
feed_data
WHERE
feed IS NOT NULL
ORDER BY
(feed ->> 'date')::timestamp DESC
LIMIT
20;