-- 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;