szabadpalya/api/internal/store/queries/campaigns.sql

69 lines
2.6 KiB
SQL

-- Queries behind the public campaign pages.
--
-- The raised amount and the backer count are derived from the pledge rows on
-- every read and stored nowhere, which is why each of these carries the
-- counted-status list as a parameter rather than reading a column.
-- name: ListCampaigns :many
SELECT c.slug, c.title, c.category, c.summary, c.art,
o.name, o.initials, o.location, o.blurb,
COALESCE(o.avatar_url, '') AS avatar_url,
c.goal_amount, c.ends_at, c.status::text AS status,
COALESCE(p.total, 0)::int AS raised,
COALESCE(p.backers, 0)::int AS backers
FROM campaigns c
JOIN owners o ON o.id = c.owner_id
LEFT JOIN (
SELECT campaign_id, SUM(amount) AS total, COUNT(*) AS backers
FROM pledges
WHERE status = ANY(@counted::pledge_status[])
GROUP BY campaign_id
) p ON p.campaign_id = c.id
WHERE c.status = ANY(@public::campaign_status[])
ORDER BY c.status ASC, c.ends_at ASC;
-- name: GetCampaignBySlug :one
SELECT c.id, c.slug, c.title, c.category, c.summary, c.art,
o.name, o.initials, o.location, o.blurb,
COALESCE(o.avatar_url, '') AS avatar_url,
c.goal_amount, c.ends_at, c.status::text AS status,
COALESCE(p.total, 0)::int AS raised,
COALESCE(p.backers, 0)::int AS backers,
(SELECT COUNT(*) FROM campaign_updates u WHERE u.campaign_id = c.id)::int AS updates,
(SELECT COUNT(*) FROM comments m WHERE m.campaign_id = c.id)::int AS comments
FROM campaigns c
JOIN owners o ON o.id = c.owner_id
LEFT JOIN (
SELECT campaign_id, SUM(amount) AS total, COUNT(*) AS backers
FROM pledges
WHERE status = ANY(@counted::pledge_status[])
GROUP BY campaign_id
) p ON p.campaign_id = c.id
WHERE c.slug = @slug AND c.status = ANY(@public::campaign_status[]);
-- name: ListTiers :many
SELECT t.id, t.type::text AS type, t.price, t.list_price, t.title, t.includes,
t.inventory_limit, t.estimated_delivery, t.featured,
COALESCE(p.backers, 0)::int AS backers
FROM reward_tiers t
LEFT JOIN (
SELECT pl.tier_id, COUNT(*) AS backers
FROM pledges pl
WHERE pl.campaign_id = @campaign_id
AND pl.status = ANY(@counted::pledge_status[])
GROUP BY pl.tier_id
) p ON p.tier_id = t.id
WHERE t.campaign_id = @campaign_id
ORDER BY t.position ASC;
-- name: ListStorySections :many
SELECT heading, body
FROM story_sections
WHERE campaign_id = @campaign_id
ORDER BY position ASC;
-- name: PlatformStats :one
SELECT (SELECT COUNT(*) FROM campaigns WHERE status = 'AKTIV')::int AS active_count,
(SELECT COUNT(*) FROM pledges
WHERE status = ANY(@counted::pledge_status[]))::int AS backers;