fix metrics queries (#880)

<!--

Make sure you've read the CONTRIBUTING.md guidelines:
https://github.com/stack-auth/stack-auth/blob/dev/CONTRIBUTING.md

-->

<!-- ELLIPSIS_HIDDEN -->

----

> [!IMPORTANT]
> Fixes handling of `isAnonymous` field in metrics queries by using
`COALESCE` to default null values to 'false' in `route.tsx`.
> 
>   - **Behavior**:
> - Fixes handling of `isAnonymous` field in metrics queries by using
`COALESCE` to default null values to 'false'.
> - Affects `loadUsersByCountry`, `loadDailyActiveUsers`, and
`loadRecentlyActiveUsers` functions in `route.tsx`.
>   - **Functions**:
> - `loadUsersByCountry`: Updates query condition to use `COALESCE` for
`isAnonymous`.
> - `loadDailyActiveUsers`: Updates query condition to use `COALESCE`
for `isAnonymous`.
> - `loadRecentlyActiveUsers`: Updates query condition to use `COALESCE`
for `isAnonymous`.
> 
> <sup>This description was created by </sup>[<img alt="Ellipsis"
src="https://img.shields.io/badge/Ellipsis-blue?color=175173">](https://www.ellipsis.dev?ref=stack-auth%2Fstack-auth&utm_source=github&utm_medium=referral)<sup>
for b3ad219430. You can
[customize](https://app.ellipsis.dev/stack-auth/settings/summaries) this
summary. It will automatically update as commits are pushed.</sup>

<!-- ELLIPSIS_HIDDEN -->

<!-- RECURSEML_SUMMARY:START -->
## Review by RecurseML

_🔍 Review performed on
[9318e2b..b3ad219](9318e2b6ce...b3ad219430)_

 No bugs found, your code is sparkling clean

<details>
<summary> Files analyzed, no issues (1)</summary>

  • `apps/backend/src/app/api/latest/internal/metrics/route.tsx`
</details>

[![Need help? Join our
Discord](https://img.shields.io/badge/Need%20help%3F%20Join%20our%20Discord-5865F2?style=plastic&logo=discord&logoColor=white)](https://discord.gg/n3SsVDAW6U)
<!-- RECURSEML_SUMMARY:END -->

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Corrected handling of anonymous users in analytics: records missing an
isAnonymous flag are now treated as non-anonymous when anonymous users
are excluded.
* Impacts country breakdown, daily active users, and recently active
metrics; overall total users unchanged.
* Expect slightly higher non-anonymous counts and more consistent
reporting across these metrics.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Konsti Wohlwend <n2d4xc@gmail.com>
This commit is contained in:
BilalG1 2025-09-09 19:22:02 -07:00 committed by GitHub
parent 4409996381
commit 3b6f9ee4fe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -27,7 +27,7 @@ async function loadUsersByCountry(tenancy: Tenancy, includeAnonymous: boolean =
ON "Event"."endUserIpInfoGuessId" = eip.id
WHERE '$user-activity' = ANY("systemEventTypeIds"::text[])
AND "data"->>'projectId' = ${tenancy.project.id}
AND (${includeAnonymous} OR NOT "data"->>'isAnonymous' = 'true')
AND (${includeAnonymous} OR COALESCE("data"->>'isAnonymous', 'false') != 'true')
AND COALESCE("data"->>'branchId', 'main') = ${tenancy.branchId}
AND "countryCode" IS NOT NULL
ORDER BY "userId", "eventStartedAt" DESC
@ -87,7 +87,7 @@ async function loadDailyActiveUsers(tenancy: Tenancy, now: Date, includeAnonymou
daily_users AS (
SELECT
DATE_TRUNC('day', "eventStartedAt") AS "day",
COUNT(DISTINCT CASE WHEN (${includeAnonymous} OR "data"->>'isAnonymous' = 'false') THEN "data"->'userId' ELSE NULL END) AS "dau"
COUNT(DISTINCT CASE WHEN (${includeAnonymous} OR COALESCE("data"->>'isAnonymous', 'false') != 'true') THEN "data"->'userId' ELSE NULL END) AS "dau"
FROM "Event"
WHERE "eventStartedAt" >= ${now}::date - INTERVAL '30 days'
AND '$user-activity' = ANY("systemEventTypeIds"::text[])
@ -146,7 +146,7 @@ async function loadRecentlyActiveUsers(tenancy: Tenancy, includeAnonymous: boole
) as rn
FROM "Event"
WHERE "data"->>'projectId' = ${tenancy.project.id}
AND (${includeAnonymous} OR NOT "data"->>'isAnonymous' = 'true')
AND (${includeAnonymous} OR COALESCE("data"->>'isAnonymous', 'false') != 'true')
AND COALESCE("data"->>'branchId', 'main') = ${tenancy.branchId}
AND '$user-activity' = ANY("systemEventTypeIds"::text[])
)