Introduces the DB-backed connection config for the uo-link sidecar (the
HTTP + WebSocket bridge to the ServUO shard) and a never-throw REST client,
mirroring the existing Discord-bot integration:
- uo_link_config singleton table (base/ws URL, AES-256-GCM-encrypted shared
token, protocol pin, enabled, and last-known status/plugin_connected/
last_event_at/boot_id mirrors for the admin panel).
- model/uoLinkConfig: getSafe (never returns the token — only hasToken),
getWithToken (server-side decrypt), save (blank token = unchanged),
recordStatus (mirror the sidecar's reported state).
- utils/uoLinkClient: never-throw fetch client returning {ok,data,status,
error}; Bearer token + X-UOLink-Version on every call; brief config cache;
helpers for health/char/roster/vendors/history/economy/link/towncrier.
- .env.example: UOLINK_BASE_URL/WS_URL/PROTOCOL defaults (token stays
admin-managed in the DB, never an env var).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011qPmpmVH1xGCiZoz9m9vW3
29 lines
1.1 KiB
JavaScript
29 lines
1.1 KiB
JavaScript
const { query } = require('../../utils/db')
|
|
|
|
const COLS =
|
|
'id, base_url, ws_url, auth_token_enc, protocol, enabled, status, status_detail, plugin_connected, last_event_at, boot_id, updated_by, created_at, updated_at'
|
|
|
|
// Singleton row (id = 1). Returns null until the admin saves it for the first time.
|
|
async function get() {
|
|
const rows = await query(`SELECT ${COLS} FROM uo_link_config WHERE id = 1 LIMIT 1`)
|
|
return rows[0] || null
|
|
}
|
|
|
|
// Upsert the singleton row. `fields` are column values already prepared by the
|
|
// model (token pre-encrypted). Only the provided columns are written/updated.
|
|
async function upsert(fields) {
|
|
const cols = Object.keys(fields)
|
|
const vals = cols.map((c) => fields[c])
|
|
const insertCols = ['id', ...cols].map((c) => `\`${c}\``).join(', ')
|
|
const placeholders = ['1', ...cols.map(() => '?')].join(', ')
|
|
const updates = cols.map((c) => `\`${c}\` = VALUES(\`${c}\`)`).join(', ')
|
|
await query(
|
|
`INSERT INTO uo_link_config (${insertCols}) VALUES (${placeholders})
|
|
ON DUPLICATE KEY UPDATE ${updates}`,
|
|
vals,
|
|
)
|
|
return get()
|
|
}
|
|
|
|
module.exports = { get, upsert }
|