2026-08-25 07:51:38 +02:00
|
|
|
import { asc, eq } from "drizzle-orm";
|
|
|
|
|
import { db, sqlite } from "@/lib/db/client";
|
|
|
|
|
import { sessionEvents } from "@/lib/db/schema";
|
|
|
|
|
|
|
|
|
|
export interface IncomingEvent {
|
|
|
|
|
sessionDeviceId: number;
|
|
|
|
|
tsMs: number;
|
|
|
|
|
commandType: "vibrate" | "rotate" | "linear" | "stop";
|
|
|
|
|
featureIndex: number;
|
|
|
|
|
value: number;
|
|
|
|
|
durationMs?: number;
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-27 21:38:51 +02:00
|
|
|
export async function insertEvents(sessionId: number, events: IncomingEvent[]): Promise<void> {
|
2026-08-25 07:51:38 +02:00
|
|
|
if (events.length === 0) return;
|
|
|
|
|
|
|
|
|
|
const insertMany = sqlite.transaction((rows: IncomingEvent[]) => {
|
|
|
|
|
for (const row of rows) {
|
|
|
|
|
db.insert(sessionEvents)
|
|
|
|
|
.values({
|
2026-08-27 21:38:51 +02:00
|
|
|
sessionId,
|
2026-08-25 07:51:38 +02:00
|
|
|
sessionDeviceId: row.sessionDeviceId,
|
|
|
|
|
tsMs: row.tsMs,
|
|
|
|
|
commandType: row.commandType,
|
|
|
|
|
featureIndex: row.featureIndex,
|
|
|
|
|
value: row.value,
|
|
|
|
|
durationMs: row.durationMs,
|
|
|
|
|
})
|
|
|
|
|
.run();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
insertMany(events);
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-27 21:38:51 +02:00
|
|
|
export async function getEventsForSession(sessionId: number) {
|
2026-08-25 07:51:38 +02:00
|
|
|
return db
|
|
|
|
|
.select()
|
|
|
|
|
.from(sessionEvents)
|
2026-08-27 21:38:51 +02:00
|
|
|
.where(eq(sessionEvents.sessionId, sessionId))
|
2026-08-25 07:51:38 +02:00
|
|
|
.orderBy(asc(sessionEvents.tsMs));
|
|
|
|
|
}
|