import { and, eq } from "drizzle-orm"; import type { CircuitDeviceRowSnapshot } from "../../domain/models/circuit-device-row-structure-project-command.model.js"; import type { AppDatabase } from "../database-context.js"; import { circuitDeviceRows } from "../schema/circuit-device-rows.js"; import { projectDevices } from "../schema/project-devices.js"; import { rooms } from "../schema/rooms.js"; export function assertCircuitDeviceRowReferencesInProject( database: AppDatabase, projectId: string, row: CircuitDeviceRowSnapshot ) { if (row.linkedProjectDeviceId !== null) { const device = database .select({ id: projectDevices.id }) .from(projectDevices) .where( and( eq(projectDevices.id, row.linkedProjectDeviceId), eq(projectDevices.projectId, projectId) ) ) .get(); if (!device) { throw new Error("Invalid linked project device id."); } } if (row.roomId !== null) { const room = database .select({ id: rooms.id }) .from(rooms) .where( and( eq(rooms.id, row.roomId), eq(rooms.projectId, projectId) ) ) .get(); if (!room) { throw new Error("Invalid room id."); } } } export function toCircuitDeviceRowSnapshot( row: typeof circuitDeviceRows.$inferSelect ): CircuitDeviceRowSnapshot { return { id: row.id, circuitId: row.circuitId, linkedProjectDeviceId: row.linkedProjectDeviceId, legacyConsumerId: row.legacyConsumerId, sortOrder: row.sortOrder, name: row.name, displayName: row.displayName, phaseType: row.phaseType, connectionKind: row.connectionKind, costGroup: row.costGroup, category: row.category, level: row.level, roomId: row.roomId, roomNumberSnapshot: row.roomNumberSnapshot, roomNameSnapshot: row.roomNameSnapshot, quantity: row.quantity, powerPerUnit: row.powerPerUnit, simultaneityFactor: row.simultaneityFactor, cosPhi: row.cosPhi, remark: row.remark, overriddenFields: row.overriddenFields, }; }