Docker images / prepare-release (push) Successful in 12s
Docker images / backend-test (push) Successful in 4m9s
Docker images / frontend-image (push) Successful in 4m28s
Docker images / updater-image (push) Successful in 58s
Docker images / backend-image (push) Successful in 2m49s
Docker images / notify-webhook (push) Skipped
Docker images / publish-release (push) Successful in 11s
При старте backend накатывает схему PostgreSQL 18 и, если база пустая, один раз импортирует mikrotik.db с тома. Повторный старт не копирует данные. Бэкап в UI идёт через pg_dump. Co-authored-by: Cursor <[email protected]>
44 lines
1.1 KiB
TypeScript
44 lines
1.1 KiB
TypeScript
/** JSONB from node-pg may already be an object; SQLite leftovers may be strings. */
|
|
|
|
export function parseJsonObject(value: unknown): Record<string, unknown> {
|
|
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
return value as Record<string, unknown>
|
|
}
|
|
if (typeof value === "string" && value.trim()) {
|
|
try {
|
|
const parsed = JSON.parse(value) as unknown
|
|
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
return parsed as Record<string, unknown>
|
|
}
|
|
} catch {
|
|
/* ignore */
|
|
}
|
|
}
|
|
return {}
|
|
}
|
|
|
|
export function parseJsonArray(value: unknown): unknown[] {
|
|
if (Array.isArray(value)) return value
|
|
if (typeof value === "string" && value.trim()) {
|
|
try {
|
|
const parsed = JSON.parse(value) as unknown
|
|
if (Array.isArray(parsed)) return parsed
|
|
} catch {
|
|
/* ignore */
|
|
}
|
|
}
|
|
return []
|
|
}
|
|
|
|
export function toJsonb(value: unknown): unknown {
|
|
if (value == null) return null
|
|
if (typeof value === "string") {
|
|
try {
|
|
return JSON.parse(value) as unknown
|
|
} catch {
|
|
return value
|
|
}
|
|
}
|
|
return value
|
|
}
|