fix: Correct column names in analytics SQL queries
Some checks failed
ParentFlow CI/CD Pipeline / Backend Tests (push) Has been cancelled
ParentFlow CI/CD Pipeline / Frontend Tests (push) Has been cancelled
ParentFlow CI/CD Pipeline / Security Scanning (push) Has been cancelled
ParentFlow CI/CD Pipeline / Build Docker Images (map[context:maternal-app/maternal-app-backend dockerfile:Dockerfile.production name:backend]) (push) Has been cancelled
ParentFlow CI/CD Pipeline / Build Docker Images (map[context:maternal-web dockerfile:Dockerfile.production name:frontend]) (push) Has been cancelled
ParentFlow CI/CD Pipeline / Deploy to Development (push) Has been cancelled
ParentFlow CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / Build Application (push) Has been cancelled
CI/CD Pipeline / Lint and Test (push) Has been cancelled
CI/CD Pipeline / E2E Tests (push) Has been cancelled

- Fixed getAgeDistribution: use CTE with sort_order to avoid column reference errors
- Fixed getEngagementPattern: changed user_id to logged_by and created_at to started_at
- Fixed getActivityByDay: changed created_at to started_at throughout

All queries now match the actual database schema.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Andrei
2025-10-08 11:06:19 +00:00
parent efa02cd1df
commit 762086f6ab

View File

@@ -131,14 +131,14 @@ export class DashboardService {
async getActivityByDay(days: number = 7) {
const result = await this.userRepository.query(
`SELECT
TO_CHAR(created_at, 'Day') as day,
TO_CHAR(started_at, 'Day') as day,
SUM(CASE WHEN type = 'feeding' THEN 1 ELSE 0 END) as feeding,
SUM(CASE WHEN type = 'sleep' THEN 1 ELSE 0 END) as sleep,
SUM(CASE WHEN type = 'diaper' THEN 1 ELSE 0 END) as diapers
FROM activities
WHERE created_at >= NOW() - INTERVAL '${days} days'
GROUP BY TO_CHAR(created_at, 'Day'), EXTRACT(DOW FROM created_at)
ORDER BY EXTRACT(DOW FROM created_at)`,
WHERE started_at >= NOW() - INTERVAL '${days} days'
GROUP BY TO_CHAR(started_at, 'Day'), EXTRACT(DOW FROM started_at)
ORDER BY EXTRACT(DOW FROM started_at)`,
);
return result.map((row: any) => ({
@@ -151,33 +151,36 @@ export class DashboardService {
async getAgeDistribution() {
const result = await this.userRepository.query(
`SELECT
CASE
WHEN age_months BETWEEN 0 AND 5 THEN '0-6 months'
WHEN age_months BETWEEN 6 AND 11 THEN '6-12 months'
WHEN age_months BETWEEN 12 AND 23 THEN '1-2 years'
WHEN age_months BETWEEN 24 AND 35 THEN '2-3 years'
WHEN age_months BETWEEN 36 AND 47 THEN '3-4 years'
WHEN age_months BETWEEN 48 AND 59 THEN '4-5 years'
ELSE '5-6 years'
END as age,
COUNT(*) as count
FROM (
SELECT EXTRACT(YEAR FROM AGE(birth_date)) * 12 + EXTRACT(MONTH FROM AGE(birth_date)) as age_months
FROM children
WHERE birth_date IS NOT NULL AND deleted_at IS NULL
) ages
GROUP BY age
ORDER BY
CASE age
WHEN '0-6 months' THEN 1
WHEN '6-12 months' THEN 2
WHEN '1-2 years' THEN 3
WHEN '2-3 years' THEN 4
WHEN '3-4 years' THEN 5
WHEN '4-5 years' THEN 6
ELSE 7
END`,
`WITH age_groups AS (
SELECT
CASE
WHEN age_months BETWEEN 0 AND 5 THEN '0-6 months'
WHEN age_months BETWEEN 6 AND 11 THEN '6-12 months'
WHEN age_months BETWEEN 12 AND 23 THEN '1-2 years'
WHEN age_months BETWEEN 24 AND 35 THEN '2-3 years'
WHEN age_months BETWEEN 36 AND 47 THEN '3-4 years'
WHEN age_months BETWEEN 48 AND 59 THEN '4-5 years'
ELSE '5-6 years'
END as age,
CASE
WHEN age_months BETWEEN 0 AND 5 THEN 1
WHEN age_months BETWEEN 6 AND 11 THEN 2
WHEN age_months BETWEEN 12 AND 23 THEN 3
WHEN age_months BETWEEN 24 AND 35 THEN 4
WHEN age_months BETWEEN 36 AND 47 THEN 5
WHEN age_months BETWEEN 48 AND 59 THEN 6
ELSE 7
END as sort_order
FROM (
SELECT EXTRACT(YEAR FROM AGE(birth_date)) * 12 + EXTRACT(MONTH FROM AGE(birth_date)) as age_months
FROM children
WHERE birth_date IS NOT NULL AND deleted_at IS NULL
) ages
)
SELECT age, COUNT(*) as count
FROM age_groups
GROUP BY age, sort_order
ORDER BY sort_order`,
);
return result.map((row: any) => ({
@@ -189,11 +192,11 @@ export class DashboardService {
async getEngagementPattern(days: number = 7) {
const result = await this.userRepository.query(
`SELECT
EXTRACT(HOUR FROM created_at) as hour,
COUNT(DISTINCT user_id) as sessions
EXTRACT(HOUR FROM started_at) as hour,
COUNT(DISTINCT logged_by) as sessions
FROM activities
WHERE created_at >= NOW() - INTERVAL '${days} days'
GROUP BY EXTRACT(HOUR FROM created_at)
WHERE started_at >= NOW() - INTERVAL '${days} days'
GROUP BY EXTRACT(HOUR FROM started_at)
ORDER BY hour`,
);