import { useDrizzle } from '@/lib/db.js' import { chargePoint } from '@/db/schema.js' import type { BootNotificationRequest, BootNotificationResponse, OcppConnectionContext, } from '../types.ts' const DEFAULT_HEARTBEAT_INTERVAL = 60 export async function handleBootNotification( payload: BootNotificationRequest, ctx: OcppConnectionContext, ): Promise { const db = useDrizzle() await db .insert(chargePoint) .values({ id: crypto.randomUUID(), chargePointIdentifier: ctx.chargePointIdentifier, chargePointVendor: payload.chargePointVendor, chargePointModel: payload.chargePointModel, chargePointSerialNumber: payload.chargePointSerialNumber ?? null, firmwareVersion: payload.firmwareVersion ?? null, iccid: payload.iccid ?? null, imsi: payload.imsi ?? null, meterType: payload.meterType ?? null, meterSerialNumber: payload.meterSerialNumber ?? null, registrationStatus: 'Accepted', heartbeatInterval: DEFAULT_HEARTBEAT_INTERVAL, lastBootNotificationAt: new Date(), }) .onConflictDoUpdate({ target: chargePoint.chargePointIdentifier, set: { chargePointVendor: payload.chargePointVendor, chargePointModel: payload.chargePointModel, chargePointSerialNumber: payload.chargePointSerialNumber ?? null, firmwareVersion: payload.firmwareVersion ?? null, iccid: payload.iccid ?? null, imsi: payload.imsi ?? null, meterType: payload.meterType ?? null, meterSerialNumber: payload.meterSerialNumber ?? null, registrationStatus: 'Accepted', heartbeatInterval: DEFAULT_HEARTBEAT_INTERVAL, lastBootNotificationAt: new Date(), updatedAt: new Date(), }, }) ctx.isRegistered = true console.log(`[OCPP] BootNotification accepted: ${ctx.chargePointIdentifier}`) return { currentTime: new Date().toISOString(), interval: DEFAULT_HEARTBEAT_INTERVAL, status: 'Accepted', } }