feat(kol): add sqlc queries for all KOL tables
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
-- name: CreateKolAssistTask :exec
|
||||
INSERT INTO kol_assist_tasks (id, tenant_id, kol_profile_id, prompt_id,
|
||||
operator_id, task_type, status, request_json)
|
||||
VALUES (sqlc.arg(id), sqlc.arg(tenant_id)::bigint, sqlc.arg(kol_profile_id),
|
||||
sqlc.arg(prompt_id), sqlc.arg(operator_id),
|
||||
sqlc.arg(task_type), 'queued', sqlc.arg(request_json)::jsonb);
|
||||
|
||||
-- name: GetKolAssistTask :one
|
||||
SELECT id, tenant_id, kol_profile_id, prompt_id, operator_id, task_type,
|
||||
status, request_json, result_json, error_message,
|
||||
started_at, completed_at, created_at, updated_at
|
||||
FROM kol_assist_tasks
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
|
||||
-- name: MarkKolAssistStarted :exec
|
||||
UPDATE kol_assist_tasks
|
||||
SET status = 'running', started_at = NOW(), updated_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
|
||||
-- name: MarkKolAssistCompleted :exec
|
||||
UPDATE kol_assist_tasks
|
||||
SET status = 'completed', result_json = sqlc.arg(result_json)::jsonb,
|
||||
completed_at = NOW(), updated_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
|
||||
-- name: MarkKolAssistFailed :exec
|
||||
UPDATE kol_assist_tasks
|
||||
SET status = 'failed', error_message = sqlc.arg(error_message),
|
||||
completed_at = NOW(), updated_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
@@ -0,0 +1,46 @@
|
||||
-- name: ListPublishedKolPackages :many
|
||||
-- Cross-tenant read: marketplace intentionally spans tenants.
|
||||
-- tenant_id appears via kol_profiles.tenant_id join only, so this file is exempt from check_tenant_scope.sh.
|
||||
SELECT kp.id, kp.tenant_id, kp.kol_profile_id, kp.name, kp.description,
|
||||
kp.cover_url, kp.industry, kp.tags, kp.price_note, kp.status,
|
||||
kp.created_at, kp.updated_at,
|
||||
pf.display_name AS kol_display_name, pf.avatar_url AS kol_avatar_url,
|
||||
(SELECT COUNT(*) FROM kol_prompts p
|
||||
WHERE p.package_id = kp.id AND p.status = 'active' AND p.deleted_at IS NULL) AS prompt_count,
|
||||
(SELECT COUNT(*) FROM kol_subscriptions s
|
||||
WHERE s.package_id = kp.id AND s.status = 'active') AS subscriber_count
|
||||
FROM kol_packages kp
|
||||
JOIN kol_profiles pf ON pf.id = kp.kol_profile_id
|
||||
AND pf.status = 'active'
|
||||
AND pf.market_enabled = TRUE
|
||||
AND pf.deleted_at IS NULL
|
||||
WHERE kp.status = 'published'
|
||||
AND kp.deleted_at IS NULL
|
||||
AND (sqlc.narg('industry')::text IS NULL OR kp.industry = sqlc.narg('industry'))
|
||||
AND (sqlc.narg('keyword')::text IS NULL OR kp.name ILIKE '%' || sqlc.narg('keyword') || '%')
|
||||
ORDER BY kp.updated_at DESC
|
||||
LIMIT sqlc.arg('limit') OFFSET sqlc.arg('offset');
|
||||
|
||||
-- name: GetPublishedKolPackage :one
|
||||
SELECT kp.id, kp.tenant_id, kp.kol_profile_id, kp.name, kp.description,
|
||||
kp.cover_url, kp.industry, kp.tags, kp.price_note, kp.status,
|
||||
kp.created_at, kp.updated_at,
|
||||
pf.display_name AS kol_display_name, pf.avatar_url AS kol_avatar_url, pf.bio AS kol_bio
|
||||
FROM kol_packages kp
|
||||
JOIN kol_profiles pf ON pf.id = kp.kol_profile_id
|
||||
AND pf.status = 'active'
|
||||
AND pf.market_enabled = TRUE
|
||||
AND pf.deleted_at IS NULL
|
||||
WHERE kp.id = sqlc.arg(id)
|
||||
AND kp.status = 'published'
|
||||
AND kp.deleted_at IS NULL;
|
||||
|
||||
-- name: ListPublicPromptsForPackage :many
|
||||
SELECT p.id, p.name, p.platform_hint, p.status,
|
||||
p.published_revision_no, p.created_at
|
||||
FROM kol_prompts p
|
||||
WHERE p.package_id = sqlc.arg(package_id)
|
||||
AND p.status = 'active'
|
||||
AND p.published_revision_no IS NOT NULL
|
||||
AND p.deleted_at IS NULL
|
||||
ORDER BY p.sort_order ASC;
|
||||
@@ -0,0 +1,58 @@
|
||||
-- name: CreateKolPackage :one
|
||||
INSERT INTO kol_packages (tenant_id, kol_profile_id, name, description, cover_url, industry, tags, price_note, status)
|
||||
VALUES (sqlc.arg(tenant_id)::bigint, sqlc.arg(kol_profile_id), sqlc.arg(name),
|
||||
sqlc.arg(description), sqlc.arg(cover_url), sqlc.arg(industry),
|
||||
sqlc.arg(tags)::jsonb, sqlc.arg(price_note), 'draft')
|
||||
RETURNING id, tenant_id, kol_profile_id, name, description, cover_url,
|
||||
industry, tags, price_note, status, created_at, updated_at;
|
||||
|
||||
-- name: GetKolPackageByID :one
|
||||
SELECT id, tenant_id, kol_profile_id, name, description, cover_url,
|
||||
industry, tags, price_note, status, created_at, updated_at
|
||||
FROM kol_packages
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL;
|
||||
|
||||
-- name: ListKolPackagesByProfile :many
|
||||
SELECT id, tenant_id, kol_profile_id, name, description, cover_url,
|
||||
industry, tags, price_note, status, created_at, updated_at
|
||||
FROM kol_packages
|
||||
WHERE kol_profile_id = sqlc.arg(kol_profile_id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL
|
||||
ORDER BY created_at DESC;
|
||||
|
||||
-- name: ListKolPackageIDsByProfile :many
|
||||
SELECT id
|
||||
FROM kol_packages
|
||||
WHERE kol_profile_id = sqlc.arg(kol_profile_id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL;
|
||||
|
||||
-- name: UpdateKolPackage :exec
|
||||
UPDATE kol_packages
|
||||
SET name = sqlc.arg(name),
|
||||
description = sqlc.arg(description),
|
||||
cover_url = sqlc.arg(cover_url),
|
||||
industry = sqlc.arg(industry),
|
||||
tags = sqlc.arg(tags)::jsonb,
|
||||
price_note = sqlc.arg(price_note),
|
||||
updated_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL;
|
||||
|
||||
-- name: UpdateKolPackageStatus :exec
|
||||
UPDATE kol_packages
|
||||
SET status = sqlc.arg(status),
|
||||
updated_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL;
|
||||
|
||||
-- name: SoftDeleteKolPackage :exec
|
||||
UPDATE kol_packages SET deleted_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL;
|
||||
@@ -0,0 +1,23 @@
|
||||
-- name: GetKolProfileByUser :one
|
||||
SELECT id, tenant_id, user_id, display_name, bio, avatar_url,
|
||||
market_enabled, status, created_at, updated_at
|
||||
FROM kol_profiles
|
||||
WHERE user_id = sqlc.arg(user_id)::bigint
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL;
|
||||
|
||||
-- name: GetKolProfileByID :one
|
||||
SELECT id, tenant_id, user_id, display_name, bio, avatar_url,
|
||||
market_enabled, status, created_at, updated_at
|
||||
FROM kol_profiles
|
||||
WHERE id = sqlc.arg(id) AND deleted_at IS NULL;
|
||||
|
||||
-- name: UpdateKolProfile :exec
|
||||
UPDATE kol_profiles
|
||||
SET display_name = sqlc.arg(display_name),
|
||||
bio = sqlc.arg(bio),
|
||||
avatar_url = sqlc.arg(avatar_url),
|
||||
updated_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL;
|
||||
@@ -0,0 +1,105 @@
|
||||
-- name: CreateKolPrompt :one
|
||||
INSERT INTO kol_prompts (tenant_id, package_id, name, platform_hint, sort_order, created_by, updated_by)
|
||||
VALUES (sqlc.arg(tenant_id)::bigint, sqlc.arg(package_id), sqlc.arg(name),
|
||||
sqlc.arg(platform_hint), sqlc.arg(sort_order),
|
||||
sqlc.arg(created_by), sqlc.arg(created_by))
|
||||
RETURNING id, tenant_id, package_id, name, platform_hint, status, sort_order,
|
||||
published_revision_no, draft_revision_no, created_by, updated_by,
|
||||
created_at, updated_at;
|
||||
|
||||
-- name: GetKolPromptByID :one
|
||||
SELECT id, tenant_id, package_id, name, platform_hint, status, sort_order,
|
||||
published_revision_no, draft_revision_no, created_by, updated_by,
|
||||
created_at, updated_at
|
||||
FROM kol_prompts
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL;
|
||||
|
||||
-- name: ListKolPromptsByPackage :many
|
||||
SELECT id, tenant_id, package_id, name, platform_hint, status, sort_order,
|
||||
published_revision_no, draft_revision_no, created_by, updated_by,
|
||||
created_at, updated_at
|
||||
FROM kol_prompts
|
||||
WHERE package_id = sqlc.arg(package_id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL
|
||||
ORDER BY sort_order ASC, created_at ASC;
|
||||
|
||||
-- name: ListActiveKolPromptsByPackage :many
|
||||
SELECT id, tenant_id, package_id, published_revision_no
|
||||
FROM kol_prompts
|
||||
WHERE package_id = sqlc.arg(package_id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND status = 'active'
|
||||
AND published_revision_no IS NOT NULL
|
||||
AND deleted_at IS NULL
|
||||
ORDER BY sort_order ASC;
|
||||
|
||||
-- name: UpdateKolPromptMetadata :exec
|
||||
UPDATE kol_prompts
|
||||
SET name = sqlc.arg(name),
|
||||
platform_hint = sqlc.arg(platform_hint),
|
||||
sort_order = sqlc.arg(sort_order),
|
||||
updated_by = sqlc.arg(updated_by),
|
||||
updated_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL;
|
||||
|
||||
-- name: UpdateKolPromptPublishedRevision :exec
|
||||
UPDATE kol_prompts
|
||||
SET published_revision_no = sqlc.arg(revision_no),
|
||||
status = 'active',
|
||||
updated_by = sqlc.arg(updated_by),
|
||||
updated_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL;
|
||||
|
||||
-- name: UpdateKolPromptDraftRevision :exec
|
||||
UPDATE kol_prompts
|
||||
SET draft_revision_no = sqlc.arg(revision_no),
|
||||
updated_by = sqlc.arg(updated_by),
|
||||
updated_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL;
|
||||
|
||||
-- name: UpdateKolPromptStatus :exec
|
||||
UPDATE kol_prompts
|
||||
SET status = sqlc.arg(status),
|
||||
updated_by = sqlc.arg(updated_by),
|
||||
updated_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL;
|
||||
|
||||
-- name: SoftDeleteKolPrompt :exec
|
||||
UPDATE kol_prompts SET deleted_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND deleted_at IS NULL;
|
||||
|
||||
-- name: CreateKolPromptRevision :one
|
||||
INSERT INTO kol_prompt_revisions (tenant_id, prompt_id, revision_no, prompt_asset_key,
|
||||
schema_json, card_config_json, created_by)
|
||||
VALUES (sqlc.arg(tenant_id)::bigint, sqlc.arg(prompt_id), sqlc.arg(revision_no),
|
||||
sqlc.arg(prompt_asset_key), sqlc.arg(schema_json)::jsonb,
|
||||
sqlc.arg(card_config_json)::jsonb, sqlc.arg(created_by))
|
||||
RETURNING id, prompt_id, revision_no, prompt_asset_key, schema_json,
|
||||
card_config_json, created_by, created_at;
|
||||
|
||||
-- name: GetKolPromptRevision :one
|
||||
SELECT id, prompt_id, revision_no, prompt_asset_key, schema_json,
|
||||
card_config_json, created_by, created_at
|
||||
FROM kol_prompt_revisions
|
||||
WHERE prompt_id = sqlc.arg(prompt_id)
|
||||
AND revision_no = sqlc.arg(revision_no)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
|
||||
-- name: NextKolPromptRevisionNo :one
|
||||
SELECT COALESCE(MAX(revision_no), 0) + 1 AS next_revision_no
|
||||
FROM kol_prompt_revisions
|
||||
WHERE prompt_id = sqlc.arg(prompt_id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
@@ -0,0 +1,90 @@
|
||||
-- name: CreateKolSubscription :one
|
||||
INSERT INTO kol_subscriptions (tenant_id, package_id, status)
|
||||
VALUES (sqlc.arg(tenant_id)::bigint, sqlc.arg(package_id), 'pending')
|
||||
RETURNING id, tenant_id, package_id, status, approved_by, start_at, end_at, created_at, updated_at;
|
||||
|
||||
-- name: GetKolSubscriptionByID :one
|
||||
SELECT id, tenant_id, package_id, status, approved_by, start_at, end_at, created_at, updated_at
|
||||
FROM kol_subscriptions
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
|
||||
-- name: GetActiveKolSubscription :one
|
||||
SELECT id, tenant_id, package_id, status, approved_by, start_at, end_at, created_at, updated_at
|
||||
FROM kol_subscriptions
|
||||
WHERE tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND package_id = sqlc.arg(package_id)
|
||||
AND status IN ('pending', 'active');
|
||||
|
||||
-- name: ListKolSubscriptions :many
|
||||
SELECT id, tenant_id, package_id, status, approved_by, start_at, end_at, created_at, updated_at
|
||||
FROM kol_subscriptions
|
||||
WHERE tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
ORDER BY created_at DESC;
|
||||
|
||||
-- name: ListActiveSubscribersForPackage :many
|
||||
SELECT id, tenant_id, package_id, status, approved_by, start_at, end_at, created_at, updated_at
|
||||
FROM kol_subscriptions
|
||||
WHERE package_id = sqlc.arg(package_id)
|
||||
AND tenant_id IS NOT NULL
|
||||
AND status = 'active';
|
||||
|
||||
-- name: ApproveKolSubscription :exec
|
||||
UPDATE kol_subscriptions
|
||||
SET status = 'active',
|
||||
approved_by = sqlc.arg(approved_by),
|
||||
start_at = NOW(),
|
||||
end_at = sqlc.arg(end_at),
|
||||
updated_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
|
||||
-- name: RevokeKolSubscription :exec
|
||||
UPDATE kol_subscriptions
|
||||
SET status = 'revoked', updated_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
|
||||
-- name: CreateSubscriptionPrompt :exec
|
||||
INSERT INTO kol_subscription_prompts (tenant_id, subscription_id, package_id, prompt_id, status)
|
||||
VALUES (sqlc.arg(tenant_id)::bigint, sqlc.arg(subscription_id),
|
||||
sqlc.arg(package_id), sqlc.arg(prompt_id), 'active')
|
||||
ON CONFLICT (subscription_id, prompt_id) DO NOTHING;
|
||||
|
||||
-- name: ListSubscriptionPromptsByTenant :many
|
||||
SELECT sp.id, sp.tenant_id, sp.subscription_id, sp.package_id, sp.prompt_id,
|
||||
sp.status, sp.granted_at, sp.revoked_at,
|
||||
p.name AS prompt_name, p.platform_hint, p.published_revision_no,
|
||||
k.name AS package_name
|
||||
FROM kol_subscription_prompts sp
|
||||
JOIN kol_prompts p ON p.id = sp.prompt_id AND p.deleted_at IS NULL
|
||||
JOIN kol_packages k ON k.id = sp.package_id AND k.deleted_at IS NULL
|
||||
WHERE sp.tenant_id = sqlc.arg(tenant_id)::bigint
|
||||
AND sp.status = 'active'
|
||||
ORDER BY sp.granted_at DESC;
|
||||
|
||||
-- name: GetSubscriptionPromptByID :one
|
||||
SELECT sp.id, sp.tenant_id, sp.subscription_id, sp.package_id, sp.prompt_id,
|
||||
sp.status, sp.granted_at, sp.revoked_at,
|
||||
s.status AS subscription_status, s.end_at AS subscription_end_at,
|
||||
p.name AS prompt_name, p.platform_hint, p.status AS prompt_status,
|
||||
p.published_revision_no,
|
||||
k.name AS package_name, k.status AS package_status
|
||||
FROM kol_subscription_prompts sp
|
||||
JOIN kol_subscriptions s ON s.id = sp.subscription_id
|
||||
JOIN kol_prompts p ON p.id = sp.prompt_id AND p.deleted_at IS NULL
|
||||
JOIN kol_packages k ON k.id = sp.package_id AND k.deleted_at IS NULL
|
||||
WHERE sp.id = sqlc.arg(id)
|
||||
AND sp.tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
|
||||
-- name: RevokeSubscriptionPromptsBySubscription :exec
|
||||
UPDATE kol_subscription_prompts
|
||||
SET status = 'revoked', revoked_at = NOW(), updated_at = NOW()
|
||||
WHERE subscription_id = sqlc.arg(subscription_id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
|
||||
-- name: RevokeSubscriptionPromptsByPrompt :exec
|
||||
UPDATE kol_subscription_prompts
|
||||
SET status = 'revoked', revoked_at = NOW(), updated_at = NOW()
|
||||
WHERE prompt_id = sqlc.arg(prompt_id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
@@ -0,0 +1,84 @@
|
||||
-- name: CreateKolUsageLog :one
|
||||
INSERT INTO kol_usage_logs (tenant_id, subscription_id, subscription_prompt_id,
|
||||
package_id, prompt_id, prompt_revision_no,
|
||||
generation_task_id, status, variables_snapshot,
|
||||
schema_snapshot, rendered_prompt_hash)
|
||||
VALUES (sqlc.arg(tenant_id)::bigint, sqlc.arg(subscription_id),
|
||||
sqlc.arg(subscription_prompt_id), sqlc.arg(package_id),
|
||||
sqlc.arg(prompt_id), sqlc.arg(prompt_revision_no),
|
||||
sqlc.arg(generation_task_id), 'pending',
|
||||
sqlc.arg(variables_snapshot)::jsonb, sqlc.arg(schema_snapshot)::jsonb,
|
||||
sqlc.arg(rendered_prompt_hash))
|
||||
RETURNING id, tenant_id, generation_task_id, status, created_at;
|
||||
|
||||
-- name: MarkKolUsageCompleted :exec
|
||||
UPDATE kol_usage_logs
|
||||
SET status = 'completed', article_id = sqlc.arg(article_id),
|
||||
finished_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
|
||||
-- name: MarkKolUsageFailed :exec
|
||||
UPDATE kol_usage_logs
|
||||
SET status = 'failed', error_message = sqlc.arg(error_message),
|
||||
finished_at = NOW()
|
||||
WHERE id = sqlc.arg(id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
|
||||
-- name: MarkKolUsageCompletedByTask :exec
|
||||
UPDATE kol_usage_logs
|
||||
SET status = 'completed', article_id = sqlc.arg(article_id), finished_at = NOW()
|
||||
WHERE generation_task_id = sqlc.arg(generation_task_id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
|
||||
-- name: MarkKolUsageFailedByTask :exec
|
||||
UPDATE kol_usage_logs
|
||||
SET status = 'failed', error_message = sqlc.arg(error_message), finished_at = NOW()
|
||||
WHERE generation_task_id = sqlc.arg(generation_task_id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
|
||||
-- name: GetKolUsageByGenerationTask :one
|
||||
SELECT id, tenant_id, package_id, prompt_id, status, created_at
|
||||
FROM kol_usage_logs
|
||||
WHERE generation_task_id = sqlc.arg(generation_task_id)
|
||||
AND tenant_id = sqlc.arg(tenant_id)::bigint;
|
||||
|
||||
-- name: KolDashboardOverview :one
|
||||
SELECT
|
||||
(SELECT COUNT(DISTINCT s.tenant_id) FROM kol_subscriptions s
|
||||
WHERE s.package_id = ANY(sqlc.arg(package_ids)::bigint[]) AND s.status='active'
|
||||
AND (s.end_at IS NULL OR s.end_at > NOW())) AS total_subs,
|
||||
(SELECT COUNT(*) FROM kol_subscriptions s
|
||||
WHERE s.package_id = ANY(sqlc.arg(package_ids)::bigint[])
|
||||
AND s.status='active'
|
||||
AND s.created_at >= date_trunc('month', NOW())) AS month_subs,
|
||||
(SELECT COUNT(*) FROM kol_usage_logs u
|
||||
WHERE u.package_id = ANY(sqlc.arg(package_ids)::bigint[])
|
||||
AND u.tenant_id IS NOT NULL) AS total_usage,
|
||||
(SELECT COUNT(*) FROM kol_usage_logs u
|
||||
WHERE u.package_id = ANY(sqlc.arg(package_ids)::bigint[])
|
||||
AND u.tenant_id IS NOT NULL
|
||||
AND u.created_at >= date_trunc('month', NOW())) AS month_usage,
|
||||
(SELECT COUNT(*) FROM kol_usage_logs u
|
||||
WHERE u.package_id = ANY(sqlc.arg(package_ids)::bigint[])
|
||||
AND u.tenant_id IS NOT NULL
|
||||
AND u.status='failed') AS failure_count;
|
||||
|
||||
-- name: KolDashboardTrend :many
|
||||
SELECT date_trunc('day', u.created_at)::date AS d,
|
||||
COUNT(*) FILTER (WHERE u.status='completed') AS usages
|
||||
FROM kol_usage_logs u
|
||||
WHERE u.package_id = ANY(sqlc.arg(package_ids)::bigint[])
|
||||
AND u.tenant_id IS NOT NULL
|
||||
AND u.created_at >= NOW() - sqlc.arg(period_days)::int * INTERVAL '1 day'
|
||||
GROUP BY d
|
||||
ORDER BY d ASC;
|
||||
|
||||
-- name: KolUsageCountByPackage :many
|
||||
SELECT package_id, COUNT(*) AS total,
|
||||
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS completed,
|
||||
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) AS failed
|
||||
FROM kol_usage_logs
|
||||
WHERE package_id = ANY(sqlc.arg(package_ids)::bigint[])
|
||||
AND tenant_id IS NOT NULL
|
||||
GROUP BY package_id;
|
||||
Reference in New Issue
Block a user