From c404e7967854d490ae7b57214c689103c4b2480b Mon Sep 17 00:00:00 2001 From: Marko Djordjevic Date: Tue, 17 Feb 2026 20:02:14 +0100 Subject: [PATCH] fix: normalize span annotation timestamps to Unix epoch seconds in all API responses --- src/app/api/span-annotations/[id]/route.ts | 8 +++++++- src/app/api/span-annotations/route.ts | 17 +++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/app/api/span-annotations/[id]/route.ts b/src/app/api/span-annotations/[id]/route.ts index cbff156..9d64d32 100644 --- a/src/app/api/span-annotations/[id]/route.ts +++ b/src/app/api/span-annotations/[id]/route.ts @@ -42,7 +42,13 @@ export async function PATCH( .where(eq(spanAnnotations.id, parseInt(id))) .returning(); - return NextResponse.json(result[0]); + const s = result[0]; + return NextResponse.json({ + ...s, + start_time: s.start_time instanceof Date ? Math.floor(s.start_time.getTime() / 1000) : s.start_time, + end_time: s.end_time instanceof Date ? Math.floor(s.end_time.getTime() / 1000) : s.end_time, + created_at: s.created_at instanceof Date ? Math.floor(s.created_at.getTime() / 1000) : s.created_at, + }); } catch (error: any) { console.error('Error updating span annotation:', error); return NextResponse.json( diff --git a/src/app/api/span-annotations/route.ts b/src/app/api/span-annotations/route.ts index df0c1b3..81d37bd 100644 --- a/src/app/api/span-annotations/route.ts +++ b/src/app/api/span-annotations/route.ts @@ -22,7 +22,14 @@ export async function GET(request: NextRequest) { .where(eq(spanAnnotations.chart_id, parseInt(chartId))) .orderBy(desc(spanAnnotations.start_time)); - return NextResponse.json(spans); + const normalized = spans.map((s) => ({ + ...s, + start_time: s.start_time instanceof Date ? Math.floor(s.start_time.getTime() / 1000) : s.start_time, + end_time: s.end_time instanceof Date ? Math.floor(s.end_time.getTime() / 1000) : s.end_time, + created_at: s.created_at instanceof Date ? Math.floor(s.created_at.getTime() / 1000) : s.created_at, + })); + + return NextResponse.json(normalized); } catch (error) { console.error('Error fetching span annotations:', error); return NextResponse.json( @@ -78,7 +85,13 @@ export async function POST(request: NextRequest) { }) .returning(); - return NextResponse.json(result[0], { status: 201 }); + const s = result[0]; + return NextResponse.json({ + ...s, + start_time: s.start_time instanceof Date ? Math.floor(s.start_time.getTime() / 1000) : s.start_time, + end_time: s.end_time instanceof Date ? Math.floor(s.end_time.getTime() / 1000) : s.end_time, + created_at: s.created_at instanceof Date ? Math.floor(s.created_at.getTime() / 1000) : s.created_at, + }, { status: 201 }); } catch (error: any) { console.error('Error creating span annotation:', error); return NextResponse.json(