feat(stats): allow 365d trends range in HTTP route

This commit is contained in:
2026-04-09 00:42:11 -07:00
parent 409a3964d2
commit 76547bb96e
3 changed files with 21 additions and 3 deletions

View File

@@ -601,6 +601,22 @@ describe('stats server API routes', () => {
assert.deepEqual(body.animePerDay.watchTime, TRENDS_DASHBOARD.animePerDay.watchTime); assert.deepEqual(body.animePerDay.watchTime, TRENDS_DASHBOARD.animePerDay.watchTime);
}); });
it('GET /api/stats/trends/dashboard accepts 365d range', async () => {
let seenArgs: unknown[] = [];
const app = createStatsApp(
createMockTracker({
getTrendsDashboard: async (...args: unknown[]) => {
seenArgs = args;
return TRENDS_DASHBOARD;
},
}),
);
const res = await app.request('/api/stats/trends/dashboard?range=365d&groupBy=month');
assert.equal(res.status, 200);
assert.deepEqual(seenArgs, ['365d', 'month']);
});
it('GET /api/stats/trends/dashboard falls back to safe defaults for invalid params', async () => { it('GET /api/stats/trends/dashboard falls back to safe defaults for invalid params', async () => {
let seenArgs: unknown[] = []; let seenArgs: unknown[] = [];
const app = createStatsApp( const app = createStatsApp(

View File

@@ -488,7 +488,7 @@ export class ImmersionTrackerService {
} }
async getTrendsDashboard( async getTrendsDashboard(
range: '7d' | '30d' | '90d' | 'all' = '30d', range: '7d' | '30d' | '90d' | '365d' | 'all' = '30d',
groupBy: 'day' | 'month' = 'day', groupBy: 'day' | 'month' = 'day',
): Promise<unknown> { ): Promise<unknown> {
return getTrendsDashboard(this.db, range, groupBy); return getTrendsDashboard(this.db, range, groupBy);

View File

@@ -30,8 +30,10 @@ function parseIntQuery(raw: string | undefined, fallback: number, maxLimit?: num
return maxLimit === undefined ? parsed : Math.min(parsed, maxLimit); return maxLimit === undefined ? parsed : Math.min(parsed, maxLimit);
} }
function parseTrendRange(raw: string | undefined): '7d' | '30d' | '90d' | 'all' { function parseTrendRange(raw: string | undefined): '7d' | '30d' | '90d' | '365d' | 'all' {
return raw === '7d' || raw === '30d' || raw === '90d' || raw === 'all' ? raw : '30d'; return raw === '7d' || raw === '30d' || raw === '90d' || raw === '365d' || raw === 'all'
? raw
: '30d';
} }
function parseTrendGroupBy(raw: string | undefined): 'day' | 'month' { function parseTrendGroupBy(raw: string | undefined): 'day' | 'month' {