53 lines
1.6 KiB
TypeScript
53 lines
1.6 KiB
TypeScript
import { eq } from "drizzle-orm";
|
|||
|
|
import { db } from "@/lib/db/client";
|
||
|
|
import { devices, type DeviceCapabilities } from "@/lib/db/schema";
|
||
|
|
|
||
|
|
export async function listDevices() {
|
||
|
|
return db.select().from(devices).orderBy(devices.lastConnectedAt);
|
||
|
|
}
|
||
|
|
|
||
|
|
export async function getDevice(id: number) {
|
||
|
|
const [row] = await db.select().from(devices).where(eq(devices.id, id));
|
||
|
|
return row;
|
||
|
|
}
|
||
|
|
|
||
|
|
/** Upserts by advertised BLE name - the only stable-ish identity Web Bluetooth exposes. */
|
||
|
|
export async function upsertDeviceByBleName(input: {
|
||
|
|
bleName: string;
|
||
|
|
deviceClass?: string | null;
|
||
|
|
capabilities?: DeviceCapabilities;
|
||
|
|
}): Promise<typeof devices.$inferSelect> {
|
||
|
|
const now = Date.now();
|
||
|
|
const [existing] = await db.select().from(devices).where(eq(devices.bleName, input.bleName));
|
||
|
|
|
||
|
|
if (existing) {
|
||
|
|
const [updated] = await db
|
||
|
|
.update(devices)
|
||
|
|
.set({
|
||
|
|
lastConnectedAt: now,
|
||
|
|
deviceClass: input.deviceClass ?? existing.deviceClass,
|
||
|
|
capabilities: input.capabilities ?? existing.capabilities,
|
||
|
|
})
|
||
|
|
.where(eq(devices.id, existing.id))
|
||
|
|
.returning();
|
||
|
|
return updated;
|
||
|
|
}
|
||
|
|
|
||
|
|
const [created] = await db
|
||
|
|
.insert(devices)
|
||
|
|
.values({
|
||
|
|
bleName: input.bleName,
|
||
|
|
deviceClass: input.deviceClass,
|
||
|
|
capabilities: input.capabilities,
|
||
|
|
createdAt: now,
|
||
|
|
lastConnectedAt: now,
|
||
|
|
})
|
||
|
|
.returning();
|
||
|
|
return created;
|
||
|
|
}
|
||
|
|
|
||
|
|
export async function renameDevice(id: number, displayName: string) {
|
||
|
|
const [updated] = await db.update(devices).set({ displayName }).where(eq(devices.id, id)).returning();
|
||
|
|
return updated;
|
||
|
|
}
|