78 lines
2.1 KiB
TypeScript
78 lines
2.1 KiB
TypeScript
import { NextResponse } from 'next/server';
|
|
import { getLocationsDb } from '@/lib/db';
|
|
|
|
/**
|
|
* GET /api/locations/stats
|
|
*
|
|
* Get detailed database statistics
|
|
*/
|
|
export async function GET() {
|
|
try {
|
|
const db = getLocationsDb();
|
|
|
|
// Overall stats
|
|
const totalCount = db.prepare('SELECT COUNT(*) as count FROM Location').get() as { count: number };
|
|
|
|
// Time range
|
|
const timeRange = db.prepare(
|
|
'SELECT MIN(timestamp) as oldest, MAX(timestamp) as newest FROM Location'
|
|
).get() as { oldest: string | null; newest: string | null };
|
|
|
|
// Database size
|
|
const dbSize = db.prepare(
|
|
"SELECT page_count * page_size / 1024 / 1024.0 as sizeMB FROM pragma_page_count(), pragma_page_size()"
|
|
).get() as { sizeMB: number };
|
|
|
|
// WAL mode check
|
|
const walMode = db.prepare("PRAGMA journal_mode").get() as { journal_mode: string };
|
|
|
|
// Locations per device
|
|
const perDevice = db.prepare(`
|
|
SELECT username, COUNT(*) as count
|
|
FROM Location
|
|
WHERE user_id = 0
|
|
GROUP BY username
|
|
ORDER BY count DESC
|
|
`).all() as Array<{ username: string; count: number }>;
|
|
|
|
// Locations per day (last 7 days)
|
|
const perDay = db.prepare(`
|
|
SELECT
|
|
DATE(timestamp) as date,
|
|
COUNT(*) as count
|
|
FROM Location
|
|
WHERE timestamp >= datetime('now', '-7 days')
|
|
GROUP BY DATE(timestamp)
|
|
ORDER BY date DESC
|
|
`).all() as Array<{ date: string; count: number }>;
|
|
|
|
// Average locations per day
|
|
const avgPerDay = perDay.length > 0
|
|
? Math.round(perDay.reduce((sum, day) => sum + day.count, 0) / perDay.length)
|
|
: 0;
|
|
|
|
db.close();
|
|
|
|
return NextResponse.json({
|
|
total: totalCount.count,
|
|
oldest: timeRange.oldest,
|
|
newest: timeRange.newest,
|
|
sizeMB: Math.round(dbSize.sizeMB * 100) / 100,
|
|
walMode: walMode.journal_mode,
|
|
perDevice,
|
|
perDay,
|
|
avgPerDay,
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('Stats error:', error);
|
|
return NextResponse.json(
|
|
{
|
|
error: 'Failed to get database stats',
|
|
details: error instanceof Error ? error.message : 'Unknown error'
|
|
},
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|