AI-News/backend/app/db/queries/sql/articles.sql
2025-12-04 10:04:21 +08:00

117 lines
2.8 KiB
SQL

-- name: add-article-to-favorites!
INSERT INTO favorites (user_id, article_id)
VALUES ((SELECT id FROM users WHERE username = :username),
(SELECT id FROM articles WHERE slug = :slug))
ON CONFLICT DO NOTHING;
-- name: remove-article-from-favorites!
DELETE
FROM favorites
WHERE user_id = (SELECT id FROM users WHERE username = :username)
AND article_id = (SELECT id FROM articles WHERE slug = :slug);
-- name: is-article-in-favorites^
SELECT CASE WHEN count(user_id) > 0 THEN TRUE ELSE FALSE END AS favorited
FROM favorites
WHERE user_id = (SELECT id FROM users WHERE username = :username)
AND article_id = (SELECT id FROM articles WHERE slug = :slug);
-- name: get-favorites-count-for-article^
SELECT count(*) as favorites_count
FROM favorites
WHERE article_id = (SELECT id FROM articles WHERE slug = :slug);
-- name: get-tags-for-article-by-slug
SELECT t.tag
FROM tags t
INNER JOIN articles_to_tags att ON
t.tag = att.tag
AND
att.article_id = (SELECT id FROM articles WHERE slug = :slug);
-- name: get-article-by-slug^
SELECT id,
slug,
title,
description,
body,
created_at,
updated_at,
(SELECT username FROM users WHERE id = author_id) AS author_username
FROM articles
WHERE slug = :slug
LIMIT 1;
-- name: create-new-article<!
WITH author_subquery AS (
SELECT id, username
FROM users
WHERE username = :author_username
)
INSERT
INTO articles (slug, title, description, body, author_id)
VALUES (:slug, :title, :description, :body, (SELECT id FROM author_subquery))
RETURNING
id,
slug,
title,
description,
body,
(SELECT username FROM author_subquery) as author_username,
created_at,
updated_at;
-- name: add-tags-to-article*!
INSERT INTO articles_to_tags (article_id, tag)
VALUES ((SELECT id FROM articles WHERE slug = :slug),
(SELECT tag FROM tags WHERE tag = :tag))
ON CONFLICT DO NOTHING;
-- name: update-article<!
UPDATE articles
SET slug = :new_slug,
title = :new_title,
body = :new_body,
description = :new_description
WHERE slug = :slug
AND author_id = (SELECT id FROM users WHERE username = :author_username)
RETURNING updated_at;
-- name: delete-article!
DELETE
FROM articles
WHERE slug = :slug
AND author_id = (SELECT id FROM users WHERE username = :author_username);
-- name: get-articles-for-feed
SELECT a.id,
a.slug,
a.title,
a.description,
a.body,
a.created_at,
a.updated_at,
(
SELECT username
FROM users
WHERE id = a.author_id
) AS author_username
FROM articles a
INNER JOIN followers_to_followings f ON
f.following_id = a.author_id AND
f.follower_id = (SELECT id FROM users WHERE username = :follower_username)
ORDER BY a.created_at
LIMIT :limit
OFFSET
:offset;