Files
MikrotikManager/backend/src/services/traffic-flow-server-source.ts
T

17 lines
1.2 KiB
TypeScript

import { getTableColumns } from "drizzle-orm"
import { servers } from "../db/schema.js"
import { pool } from "../db/index.js"
import { readBoundedFlowSql } from "./traffic-flow-bounded-sql.js"
type ServerRow=typeof servers.$inferSelect
const columns=Object.entries(getTableColumns(servers))
const quote=(value:string)=>'"'+value.replaceAll('"','""')+'"'
export async function readBoundedFlowServerRows(ids:readonly number[]):Promise<ServerRow[]> {
if(ids.some(id=>!Number.isSafeInteger(id)||id<=0)||ids.length>1000)throw Error("Некорректная область серверов NetFlow")
if(!ids.length)return []
// Timestamp strings retain the normal Drizzle text parser behavior.
const projection=columns.map(([key,column])=>quote(column.name)+(column.columnType==="PgTimestampString"?"::text":"")+" AS "+quote(key)).join(",")
const rows=await readBoundedFlowSql(pool,"SELECT "+projection+" FROM servers WHERE id=ANY($1::bigint[]) ORDER BY id",[[...ids]],{maxRows:1000,maxEncodedBytes:4194304})
return rows.map(row=>Object.fromEntries(columns.map(([key,column])=>[key,row[key]===null?null:column.mapFromDriverValue(row[key])])) as ServerRow)
}
export async function getBoundedFlowServerRowById(id:number){return(await readBoundedFlowServerRows([id]))[0]}