fix(ui): сохранять контекст и источник сертификатов
This commit is contained in:
1 parent
b184922f61
commit
adb6589816
11 files changed
+138
-13
No files matched your search
@@ -0,0 +1,14 @@
|
||||
import assert from "node:assert/strict"
|
||||
import { test } from "node:test"
|
||||
import { readCertificatesUrl, patchCertificatesUrl } from "./certificates-url-state"
|
||||
test("invalid and duplicate context is rejected", () => {
|
||||
for (const query of ["server=bad", "server=0", "server=-1", "server=1.5", "server=9007199254740992", "server=1&server=2", "status=bad", "status=valid&status=unknown", "q=a&q=b", "q=" + "x".repeat(201)]) assert.ok(readCertificatesUrl(new URLSearchParams(query)).error, query)
|
||||
})
|
||||
test("known context, mock identifier and empty defaults", () => {
|
||||
assert.deepEqual(readCertificatesUrl(new URLSearchParams("server=2&status=unknown&q=test")), { server: "2", status: "unknown", search: "test", error: null })
|
||||
assert.equal(readCertificatesUrl(new URLSearchParams("server=srv1")).error, null)
|
||||
assert.deepEqual(readCertificatesUrl(new URLSearchParams()), { server: "all", status: "all", search: "", error: null })
|
||||
})
|
||||
test("patch preserves unrelated parameters and removes filters", () => {
|
||||
assert.equal(patchCertificatesUrl(new URLSearchParams("server=1&status=valid&ref=map"), { server: null, status: null }), "/certificates?ref=map")
|
||||
})
|
||||
@@ -0,0 +1,16 @@
|
||||
export type CertificateStatusFilter = "all" | "valid" | "expired" | "revoked" | "unknown"
|
||||
const statuses = ["valid", "expired", "revoked", "unknown"]
|
||||
export function readCertificatesUrl(params: URLSearchParams) {
|
||||
const server = params.get("server"), status = params.get("status"), search = params.get("q") ?? ""
|
||||
let error: string | null = null
|
||||
if (["server", "status", "q"].some(key => params.getAll(key).length > 1)) error = "Параметры контекста сертификатов повторяются."
|
||||
if (server !== null && !(/^[1-9][0-9]*$/.test(server) && Number.isSafeInteger(Number(server))) && !/^srv[1-9][0-9]*$/.test(server)) error = "В ссылке указан неверный сервер."
|
||||
if (status !== null && !statuses.includes(status)) error = "В ссылке указан неизвестный статус."
|
||||
if (search.length > 200) error = "Поиск в ссылке слишком длинный."
|
||||
return { server: server ?? "all", status: (status ?? "all") as CertificateStatusFilter, search, error }
|
||||
}
|
||||
export function patchCertificatesUrl(params: URLSearchParams, changes: Record<string, string | null>) {
|
||||
const next = new URLSearchParams(params)
|
||||
for (const [key, value] of Object.entries(changes)) if (value === null || value === "") next.delete(key); else next.set(key, value)
|
||||
return "/certificates" + (next.size ? "?" + next.toString() : "")
|
||||
}
|
||||
Reference in new issue
Block a user