diff --git a/cwd-api/src/api/admin/getStats.spec.ts b/cwd-api/src/api/admin/getStats.spec.ts new file mode 100644 index 0000000..b6000e4 --- /dev/null +++ b/cwd-api/src/api/admin/getStats.spec.ts @@ -0,0 +1,92 @@ +import { describe, it, expect, vi } from 'vitest'; +import { getStats } from './getStats'; + +describe('getStats siteId filtering behavior', () => { + const createMockContext = (rows: any[], siteId?: string) => { + const allMock = vi.fn().mockResolvedValue({ results: rows }); + const prepareMock = vi.fn().mockReturnValue({ + all: allMock + }); + + const c = { + req: { + query: (key: string) => { + if (key === 'siteId') return siteId; + return undefined; + } + }, + env: { + CWD_DB: { + prepare: prepareMock + } + }, + json: vi.fn() + } as any; + + return { c, prepareMock, allMock }; + }; + + it('returns global domains while summary is filtered by siteId', async () => { + const now = Date.now(); + const baseDay = new Date(now); + baseDay.setUTCHours(0, 0, 0, 0); + const today = baseDay.getTime(); + + const rows = [ + { + created: today, + status: 'approved', + site_id: 'blog' + }, + { + created: today, + status: 'pending', + site_id: 'docs' + }, + { + created: today, + status: 'rejected', + site_id: '' + } + ]; + + const { c } = createMockContext(rows, 'blog'); + + await getStats(c); + + expect(c.json).toHaveBeenCalledTimes(1); + const response = (c.json as any).mock.calls[0][0]; + + expect(response.summary).toEqual({ + total: 1, + approved: 1, + pending: 0, + rejected: 0 + }); + + expect(response.domains).toEqual([ + { + domain: 'blog', + total: 1, + approved: 1, + pending: 0, + rejected: 0 + }, + { + domain: 'docs', + total: 1, + approved: 0, + pending: 1, + rejected: 0 + }, + { + domain: 'default', + total: 1, + approved: 0, + pending: 0, + rejected: 1 + } + ]); + }); +}); + diff --git a/cwd-api/src/api/admin/getStats.ts b/cwd-api/src/api/admin/getStats.ts index a0f23a5..0c36d59 100644 --- a/cwd-api/src/api/admin/getStats.ts +++ b/cwd-api/src/api/admin/getStats.ts @@ -17,15 +17,9 @@ export const getStats = async (c: Context<{ Bindings: Bindings }>) => { const rawSiteId = c.req.query('siteId'); const siteId = rawSiteId && rawSiteId !== 'default' ? rawSiteId : null; - let sql = 'SELECT created, status, site_id FROM Comment'; - const params: any[] = []; - - if (siteId) { - sql += ' WHERE site_id = ?'; - params.push(siteId); - } - - const { results } = await c.env.CWD_DB.prepare(sql).bind(...params).all<{ + const { results } = await c.env.CWD_DB.prepare( + 'SELECT created, status, site_id FROM Comment' + ).all<{ created: number; status: string; site_id: string | null; @@ -65,7 +59,16 @@ export const getStats = async (c: Context<{ Bindings: Bindings }>) => { } else if (row.status === 'rejected') { counts.rejected += 1; } + } + const rowsForSummary = siteId + ? results.filter((row) => { + const key = row.site_id && row.site_id.trim() ? row.site_id.trim() : 'default'; + return key === siteId; + }) + : results; + + for (const row of rowsForSummary) { summary.total += 1; if (row.status === 'approved') { summary.approved += 1;