fix(api): сохранять большие идентификаторы серверов без округления
This commit is contained in:
1 parent
90e6c7be25
commit
d3d8afaa0c
13 files changed
+1086
-19
No files matched your search
@@ -24,7 +24,7 @@
|
||||
"test:users": "tsx src/modules/users/iface-type.test.ts && tsx src/modules/users/bindings.test.ts && tsx src/modules/users/interface-inventory.test.ts && tsx src/routes/users-catalog.test.ts",
|
||||
"test:pg": "tsx src/db/sql-bind.test.ts && tsx src/db/sqlite-json.test.ts && tsx src/db/traffic-flags.test.ts && tsx src/db/pg-schema.test.ts && tsx src/services/config-revisions.test.ts",
|
||||
"test:recursive-routes": "tsx src/routes/recursive-routes.test.ts && tsx src/services/recursive-route-catalog.test.ts && tsx src/services/recursive-apply.test.ts",
|
||||
"test:config-sync": "tsx src/services/config-apply-plan.test.ts && tsx src/services/entity-snapshots.test.ts && tsx src/services/gre-ipv6.test.ts && tsx src/routes/gre-ipv6-validation.test.ts && tsx src/services/network-disabled-server.test.ts",
|
||||
"test:config-sync": "tsx src/utils/server-id.test.ts && tsx src/services/config-apply-plan.test.ts && tsx src/services/entity-snapshots.test.ts && tsx src/services/gre-ipv6.test.ts && tsx src/routes/gre-ipv6-validation.test.ts && tsx src/services/network-disabled-server.test.ts",
|
||||
"test:ros-file": "tsx src/services/ros-file-contents.test.ts && tsx src/services/mikrotik-response.test.ts",
|
||||
"test:scheduler": "tsx src/services/scheduler-running.test.ts && tsx src/services/scheduler-recorded-run.test.ts && tsx src/routes/scheduler.test.ts",
|
||||
"test:backups": "tsx src/services/backup-scheduler-run.test.ts && tsx src/services/backup-restore.test.ts && tsx src/services/backup-deletion.test.ts && tsx src/services/backup-dto.test.ts && tsx src/services/backup-storage-update.test.ts && tsx src/services/backup-job-execution.test.ts && tsx src/routes/backups-operations.test.ts && tsx src/services/s3-backup-client.test.ts",
|
||||
|
||||
@@ -6,10 +6,10 @@ import { initDatabase } from "../db/bootstrap.js"
|
||||
import { buildApp } from "../index.js"
|
||||
|
||||
try {
|
||||
for (const id of ["srv1", "1abc", "", "0", "-1", "1.5", "9007199254740993", "2147483648"]) assert.equal(await getEnabledServerById(id), null)
|
||||
for (const id of ["srv1", "1abc", "", "0", "-1", "1.5", "9007199254740993", "9007199254740992"]) assert.equal(await getEnabledServerById(id), null)
|
||||
const own = process.env.MMAPP_OWN_TEST_DB
|
||||
if (own) {
|
||||
assert(/^mm_accept_152_\d+$/.test(own))
|
||||
assert(/^mm_accept_(152|156)_\d+$/.test(own))
|
||||
assert.equal((await pool.query("SELECT current_database() AS name")).rows[0].name, own)
|
||||
await initDatabase()
|
||||
const id = Number((await pool.query("INSERT INTO servers (name,host,enabled) VALUES ('disabled-network-fixture','127.0.0.1',false) RETURNING id")).rows[0].id)
|
||||
@@ -50,7 +50,13 @@ try {
|
||||
assert.equal(contacts, 0)
|
||||
await pool.query("UPDATE servers SET enabled=true WHERE id=$1", [id])
|
||||
assert.equal((await getEnabledServerById(id))?.id, id)
|
||||
for (const largeId of [2147483648, Number.MAX_SAFE_INTEGER]) {
|
||||
await pool.query("INSERT INTO servers (id,name,host,enabled) VALUES ($1,'large-id-fixture','127.0.0.1',true)", [largeId])
|
||||
assert.equal((await getEnabledServerById(String(largeId)))?.id, largeId)
|
||||
}
|
||||
assert.equal(contacts, 0)
|
||||
console.log("network-disabled-server.test.ts: 33 API/SQL checks for three types, zero RouterOS contacts, enabled positive control passed")
|
||||
console.log("network-disabled-server.test.ts: real bigint IDs above int32 and MAX_SAFE_INTEGER passed without rounding")
|
||||
} finally { MikrotikClient.fromServer = original; await app.close() }
|
||||
} else console.log("network-disabled-server.test.ts: invalid IDs passed; own SQL/disabled API checks skipped (MMAPP_OWN_TEST_DB required)")
|
||||
} finally { await closePool() }
|
||||
@@ -264,7 +264,7 @@ export async function listWireGuardInterfaces(opts?: {
|
||||
let serverRows: ServerRow[]
|
||||
if (opts?.serverId) {
|
||||
const id = parseDbServerId(opts.serverId)
|
||||
if (id === null || !Number.isSafeInteger(id) || id > 2147483647) {
|
||||
if (id === null) {
|
||||
return { interfaces: [], failures: [{ serverId: String(opts.serverId), error: "Некорректный serverId" }] }
|
||||
}
|
||||
const row = (await db.select().from(servers).where(and(eq(servers.id, id), eq(servers.enabled, true))).limit(1))[0]
|
||||
@@ -295,7 +295,7 @@ export async function countWireGuardInterfaces():Promise<number|undefined>{retur
|
||||
|
||||
export async function getEnabledServerById(serverId: string | number) {
|
||||
const id = parseDbServerId(serverId)
|
||||
if (id === null || !Number.isSafeInteger(id) || id > 2147483647) return null
|
||||
if (id === null) return null
|
||||
return (await db.select().from(servers).where(and(eq(servers.id, id), eq(servers.enabled, true))).limit(1))[0] ?? null
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
import assert from "node:assert/strict"
|
||||
import { parseDbServerId } from "./server-id.js"
|
||||
for (const id of [1, "1", "001", " 1 ", 2147483648, "2147483648", Number.MAX_SAFE_INTEGER, String(Number.MAX_SAFE_INTEGER)]) assert.equal(parseDbServerId(id), Number(id))
|
||||
for (const id of [undefined, null, false, {}, "", "srv1", "1abc", "1.5", "1e3", "-1", "0", NaN, Infinity, "9007199254740992", "9007199254740993", 9007199254740992, "9223372036854775807"]) assert.equal(parseDbServerId(id), null)
|
||||
console.log("server-id: bigint/safe integer IDs preserved; malformed and unsafe IDs rejected without rounding")
|
||||
@@ -6,5 +6,5 @@ export function parseDbServerId(raw: unknown): number | null {
|
||||
const s = String(raw ?? "").trim()
|
||||
if (!/^\d+$/.test(s)) return null
|
||||
const n = Number.parseInt(s, 10)
|
||||
return Number.isFinite(n) && n >= 1 ? n : null
|
||||
return Number.isSafeInteger(n) && n >= 1 ? n : null
|
||||
}
|
||||
Reference in new issue
Block a user