diff --git a/src/app/actions.ts b/src/app/actions.ts index 933c891..b0a24d5 100644 --- a/src/app/actions.ts +++ b/src/app/actions.ts @@ -19,11 +19,16 @@ export async function refetchAllData() { const lines = await getLines(); await saveLines(lines); + const allEvents = []; for (const line of lines) { const lineId = line.id; const schedule = await getScheduleForLine(lineId); - const allEvents = schedule.flatMap((day) => day.events); - await updateLineEvents(lineId, allEvents); + const dayEvents = schedule.flatMap((day) => day.events); + allEvents.push(...dayEvents); + } + await updateLineEvents(allEvents); + if (allEvents.length === 0) { + redirect("/?message=No events found to refetch."); } revalidatePath("/", "layout"); redirect("/?message=All data has been successfully refetched and saved."); diff --git a/src/db/index.ts b/src/db/index.ts index 84dbdab..6c4e9b6 100644 --- a/src/db/index.ts +++ b/src/db/index.ts @@ -1,6 +1,6 @@ import type { Event, Line } from "@/common/parser"; import "dotenv/config"; -import { and, eq, gte, inArray, like, lte, or } from "drizzle-orm"; +import { and, eq, gte, ilike, inArray, lte, or, sql } from "drizzle-orm"; import { getDbInstance } from "./getInstance"; import { eventsTable, linesTable } from "./schema"; @@ -19,12 +19,18 @@ export async function saveLines(lines: Line[]) { description: line.description, })), ) - .onConflictDoNothing(); + .onConflictDoUpdate({ + target: linesTable.id, + set: { + name: sql.raw(`excluded.${linesTable.name.name}`), + description: sql.raw(`excluded.${linesTable.description.name}`), + }, + }); } -export async function updateLineEvents(lineId: number, events: Event[]) { +export async function updateLineEvents(events: Event[]) { await db.transaction(async (tx) => { - await tx.delete(eventsTable).where(eq(eventsTable.lineId, lineId)); + await tx.delete(eventsTable); await tx.insert(eventsTable).values(events); }); }