()
| 4 | import { sql } from 'drizzle-orm' |
| 5 | |
| 6 | async function calculateDAU() { |
| 7 | console.log('Calculating DAU for the last 7 days...\n') |
| 8 | |
| 9 | // Get daily active users for the last 7 complete days |
| 10 | const dailyStats = await db |
| 11 | .select({ |
| 12 | date: sql<string>`DATE(${schema.message.finished_at})`, |
| 13 | uniqueUsers: sql<string>`COUNT(DISTINCT ${schema.message.user_id})`, |
| 14 | }) |
| 15 | .from(schema.message) |
| 16 | .where( |
| 17 | sql`DATE(${schema.message.finished_at}) >= CURRENT_DATE - INTERVAL '7 days' AND DATE(${schema.message.finished_at}) < CURRENT_DATE`, |
| 18 | ) |
| 19 | .groupBy(sql`DATE(${schema.message.finished_at})`) |
| 20 | .orderBy(sql`DATE(${schema.message.finished_at})`) |
| 21 | |
| 22 | let totalUsers = 0 |
| 23 | |
| 24 | // Print daily stats |
| 25 | dailyStats.forEach((stat) => { |
| 26 | const users = parseInt(stat.uniqueUsers) |
| 27 | totalUsers += users |
| 28 | console.log(`${stat.date}: ${pluralize(users, 'user')}`) |
| 29 | }) |
| 30 | |
| 31 | // Calculate and print average |
| 32 | const avgUsers = Math.round(totalUsers / dailyStats.length) |
| 33 | console.log(`\nAverage DAU over last ${dailyStats.length} days: ${avgUsers}`) |
| 34 | } |
| 35 | |
| 36 | // Run the script |
| 37 | calculateDAU() |
no test coverage detected