117 lines
4.2 KiB
TypeScript
117 lines
4.2 KiB
TypeScript
import crypto from "node:crypto";
|
|
import { and, asc, eq, inArray } from "drizzle-orm";
|
|
import { db } from "../client.js";
|
|
import { circuitDeviceRows } from "../schema/circuit-device-rows.js";
|
|
import { circuitLists } from "../schema/circuit-lists.js";
|
|
import { circuits } from "../schema/circuits.js";
|
|
import { distributionBoards } from "../schema/distribution-boards.js";
|
|
import {
|
|
toCircuitDeviceRowCreateValues,
|
|
toCircuitDeviceRowUpdateValues,
|
|
type CircuitDeviceRowCreateInput,
|
|
type CircuitDeviceRowUpdateInput,
|
|
} from "./circuit-device-row.persistence.js";
|
|
export type {
|
|
CircuitDeviceRowCreateInput,
|
|
CircuitDeviceRowUpdateInput,
|
|
} from "./circuit-device-row.persistence.js";
|
|
export { toCircuitDeviceRowCreateValues } from "./circuit-device-row.persistence.js";
|
|
|
|
export class CircuitDeviceRowRepository {
|
|
async findById(rowId: string) {
|
|
const [row] = await db.select().from(circuitDeviceRows).where(eq(circuitDeviceRows.id, rowId)).limit(1);
|
|
return row ?? null;
|
|
}
|
|
|
|
async countByCircuit(circuitId: string) {
|
|
const rows = await db.select({ id: circuitDeviceRows.id }).from(circuitDeviceRows).where(eq(circuitDeviceRows.circuitId, circuitId));
|
|
return rows.length;
|
|
}
|
|
|
|
async listByCircuitList(circuitIds: string[]) {
|
|
if (!circuitIds.length) {
|
|
return [];
|
|
}
|
|
return db
|
|
.select()
|
|
.from(circuitDeviceRows)
|
|
.where(inArray(circuitDeviceRows.circuitId, circuitIds))
|
|
.orderBy(asc(circuitDeviceRows.sortOrder));
|
|
}
|
|
|
|
async listLinkedByProjectDevice(projectId: string, projectDeviceId: string) {
|
|
return db
|
|
.select({
|
|
id: circuitDeviceRows.id,
|
|
circuitId: circuitDeviceRows.circuitId,
|
|
linkedProjectDeviceId: circuitDeviceRows.linkedProjectDeviceId,
|
|
legacyConsumerId: circuitDeviceRows.legacyConsumerId,
|
|
sortOrder: circuitDeviceRows.sortOrder,
|
|
name: circuitDeviceRows.name,
|
|
displayName: circuitDeviceRows.displayName,
|
|
phaseType: circuitDeviceRows.phaseType,
|
|
connectionKind: circuitDeviceRows.connectionKind,
|
|
costGroup: circuitDeviceRows.costGroup,
|
|
category: circuitDeviceRows.category,
|
|
level: circuitDeviceRows.level,
|
|
roomId: circuitDeviceRows.roomId,
|
|
roomNumberSnapshot: circuitDeviceRows.roomNumberSnapshot,
|
|
roomNameSnapshot: circuitDeviceRows.roomNameSnapshot,
|
|
quantity: circuitDeviceRows.quantity,
|
|
powerPerUnit: circuitDeviceRows.powerPerUnit,
|
|
simultaneityFactor: circuitDeviceRows.simultaneityFactor,
|
|
cosPhi: circuitDeviceRows.cosPhi,
|
|
remark: circuitDeviceRows.remark,
|
|
overriddenFields: circuitDeviceRows.overriddenFields,
|
|
equipmentIdentifier: circuits.equipmentIdentifier,
|
|
circuitDisplayName: circuits.displayName,
|
|
circuitListId: circuitLists.id,
|
|
circuitListName: circuitLists.name,
|
|
distributionBoardId: distributionBoards.id,
|
|
distributionBoardName: distributionBoards.name,
|
|
})
|
|
.from(circuitDeviceRows)
|
|
.innerJoin(circuits, eq(circuitDeviceRows.circuitId, circuits.id))
|
|
.innerJoin(circuitLists, eq(circuits.circuitListId, circuitLists.id))
|
|
.innerJoin(distributionBoards, eq(circuitLists.distributionBoardId, distributionBoards.id))
|
|
.where(
|
|
and(
|
|
eq(circuitDeviceRows.linkedProjectDeviceId, projectDeviceId),
|
|
eq(circuitLists.projectId, projectId)
|
|
)
|
|
)
|
|
.orderBy(asc(distributionBoards.name), asc(circuits.equipmentIdentifier), asc(circuitDeviceRows.sortOrder));
|
|
}
|
|
|
|
async create(input: CircuitDeviceRowCreateInput) {
|
|
const id = crypto.randomUUID();
|
|
await db.insert(circuitDeviceRows).values(toCircuitDeviceRowCreateValues(id, input));
|
|
return id;
|
|
}
|
|
|
|
async update(
|
|
rowId: string,
|
|
input: CircuitDeviceRowUpdateInput
|
|
) {
|
|
await db
|
|
.update(circuitDeviceRows)
|
|
.set(toCircuitDeviceRowUpdateValues(input))
|
|
.where(eq(circuitDeviceRows.id, rowId));
|
|
}
|
|
|
|
async delete(rowId: string) {
|
|
await db.delete(circuitDeviceRows).where(eq(circuitDeviceRows.id, rowId));
|
|
}
|
|
|
|
async moveToCircuit(rowId: string, targetCircuitId: string, sortOrder: number) {
|
|
await db
|
|
.update(circuitDeviceRows)
|
|
.set({
|
|
circuitId: targetCircuitId,
|
|
sortOrder,
|
|
})
|
|
.where(eq(circuitDeviceRows.id, rowId));
|
|
}
|
|
|
|
}
|