Skip to content

Commit 3509dad

Browse files
committed
feat: 添加 lastSyncAt 字段到概览数据,优化数据获取逻辑
1 parent 694db35 commit 3509dad

3 files changed

Lines changed: 21 additions & 6 deletions

File tree

app/api/overview/route.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ type CachedOverview = {
1111
empty: boolean;
1212
days: number;
1313
timezone: string;
14+
lastSyncAt: string | null;
1415
meta?: Awaited<ReturnType<typeof getOverview>>["meta"];
1516
filters?: Awaited<ReturnType<typeof getOverview>>["filters"];
1617
};
@@ -84,7 +85,7 @@ export async function GET(request: Request) {
8485
}
8586
}
8687

87-
const { overview, empty, days: appliedDays, meta, filters, timezone } = await getOverview(days, {
88+
const { overview, empty, days: appliedDays, meta, filters, timezone, lastSyncAt } = await getOverview(days, {
8889
model: model || undefined,
8990
route: route || undefined,
9091
source: source || undefined,
@@ -96,7 +97,7 @@ export async function GET(request: Request) {
9697
timezone: config.timezone
9798
});
9899

99-
const payload = { overview, empty, days: appliedDays, meta, filters, timezone };
100+
const payload = { overview, empty, days: appliedDays, meta, filters, timezone, lastSyncAt };
100101
setCached(cacheKey, payload);
101102
return NextResponse.json(payload, { status: 200 });
102103
} catch (error) {

app/page.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type OverviewAPIResponse = {
2727
empty: boolean;
2828
days: number;
2929
timezone?: string;
30+
lastSyncAt?: string | null;
3031
meta?: OverviewMeta;
3132
filters?: { models: string[]; routes: string[]; names: string[] };
3233
};
@@ -815,6 +816,12 @@ export default function DashboardPage() {
815816
setRouteOptions(Array.from(new Set(data.filters?.routes ?? [])));
816817
setNameOptions(Array.from(new Set(data.filters?.names ?? [])));
817818
setAppliedDays(data.days ?? rangeDays);
819+
if (data.lastSyncAt) {
820+
const dbTime = new Date(data.lastSyncAt);
821+
if (Number.isFinite(dbTime.getTime())) {
822+
setLastSyncTime((prev) => (!prev || dbTime > prev ? dbTime : prev));
823+
}
824+
}
818825
} catch (err) {
819826
if (!active) return;
820827
const error = err as Error;

lib/queries/overview.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ function normalizePageSize(value?: number | null) {
8585
export async function getOverview(
8686
daysInput?: number,
8787
opts?: { model?: string | null; route?: string | null; source?: string | null; name?: string | null; page?: number | null; pageSize?: number | null; start?: string | Date | null; end?: string | Date | null; timezone?: string | null }
88-
): Promise<{ overview: UsageOverview; empty: boolean; days: number; meta: OverviewMeta; filters: { models: string[]; routes: string[]; sources: string[]; names: string[] }; timezone: string }> {
88+
): Promise<{ overview: UsageOverview; empty: boolean; days: number; meta: OverviewMeta; filters: { models: string[]; routes: string[]; sources: string[]; names: string[] }; timezone: string; lastSyncAt: string | null }> {
8989
const startDate = parseDateInput(opts?.start);
9090
const endDate = parseDateInput(opts?.end);
9191
const hasCustomRange = startDate && endDate && endDate >= startDate;
@@ -236,6 +236,10 @@ export async function getOverview(
236236
.groupBy(credentialNameExpr)
237237
.orderBy(credentialNameExpr);
238238

239+
const lastSyncAtPromise: Promise<{ v: Date | null }[]> = db
240+
.select({ v: sql<Date | null>`max(${usageRecords.syncedAt})` })
241+
.from(usageRecords);
242+
239243
const [
240244
totalsRowResult,
241245
priceRows,
@@ -247,7 +251,8 @@ export async function getOverview(
247251
availableModelsRows,
248252
availableRoutesRows,
249253
availableSourcesRows,
250-
availableNamesRows
254+
availableNamesRows,
255+
lastSyncAtRows
251256
] = await Promise.all([
252257
totalsPromise,
253258
pricePromise,
@@ -259,7 +264,8 @@ export async function getOverview(
259264
availableModelsPromise,
260265
availableRoutesPromise,
261266
availableSourcesPromise,
262-
availableNamesPromise
267+
availableNamesPromise,
268+
lastSyncAtPromise
263269
]);
264270

265271
const totalsRow =
@@ -371,6 +377,7 @@ export async function getOverview(
371377
days,
372378
meta: { page, pageSize, totalModels, totalPages },
373379
filters,
374-
timezone: tz
380+
timezone: tz,
381+
lastSyncAt: (() => { const d = lastSyncAtRows[0]?.v; return d ? new Date(d).toISOString() : null; })()
375382
};
376383
}

0 commit comments

Comments
 (0)