69 lines
2.6 KiB
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;
|