Files
multica/server/pkg/db/queries/client_usage.sql
Multica Eve 216aee5629 [MUL-5125] Add daily Desktop/Web usage and runtime reporting (#5763)
* feat(analytics): add daily client usage reporting (MUL-5125)

Co-authored-by: multica-agent <github@multica.ai>

* fix(analytics): clarify daily usage semantics (MUL-5125)

Co-authored-by: multica-agent <github@multica.ai>

* fix(analytics): resolve usage review blockers (MUL-5125)

Co-authored-by: multica-agent <github@multica.ai>

---------

Co-authored-by: Eve <eve@multica-ai.local>
Co-authored-by: multica-agent <github@multica.ai>
2026-07-22 16:52:34 +08:00

48 lines
2.0 KiB
SQL

-- name: UpsertClientUsageDaily :one
INSERT INTO client_usage_daily (
user_id,
client_type,
install_id,
activity_date,
workspace_id,
client_version,
os,
first_active_at,
last_active_at,
runtime_probed_at,
probe_result,
runtime_count,
provider_summary,
online_count,
offline_count
) VALUES (
sqlc.arg('user_id'),
sqlc.arg('client_type'),
sqlc.arg('install_id'),
(CURRENT_TIMESTAMP AT TIME ZONE 'UTC')::date,
sqlc.narg('workspace_id'),
sqlc.arg('client_version'),
sqlc.arg('os'),
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP,
CASE WHEN sqlc.arg('has_runtime_probe')::boolean THEN CURRENT_TIMESTAMP ELSE NULL END,
sqlc.narg('probe_result'),
sqlc.narg('runtime_count'),
sqlc.narg('provider_summary'),
sqlc.narg('online_count'),
sqlc.narg('offline_count')
)
ON CONFLICT (user_id, client_type, install_id, activity_date) DO UPDATE SET
workspace_id = COALESCE(EXCLUDED.workspace_id, client_usage_daily.workspace_id),
client_version = EXCLUDED.client_version,
os = EXCLUDED.os,
last_active_at = EXCLUDED.last_active_at,
runtime_probed_at = CASE WHEN sqlc.arg('has_runtime_probe')::boolean THEN EXCLUDED.runtime_probed_at ELSE client_usage_daily.runtime_probed_at END,
probe_result = CASE WHEN sqlc.arg('has_runtime_probe')::boolean THEN EXCLUDED.probe_result ELSE client_usage_daily.probe_result END,
runtime_count = CASE WHEN sqlc.arg('has_runtime_probe')::boolean THEN EXCLUDED.runtime_count ELSE client_usage_daily.runtime_count END,
provider_summary = CASE WHEN sqlc.arg('has_runtime_probe')::boolean THEN EXCLUDED.provider_summary ELSE client_usage_daily.provider_summary END,
online_count = CASE WHEN sqlc.arg('has_runtime_probe')::boolean THEN EXCLUDED.online_count ELSE client_usage_daily.online_count END,
offline_count = CASE WHEN sqlc.arg('has_runtime_probe')::boolean THEN EXCLUDED.offline_count ELSE client_usage_daily.offline_count END,
updated_at = CURRENT_TIMESTAMP
RETURNING *;