// ── Admin · Rust · Visibility — the handlers ────────────────────────────── const core = require('../../core') const clans = require('../../model/clans/clans.model') const visibility = require('../../model/visibility/visibility.model') const log = core.logger('visibility') /** * The page's whole state: both settings, and each server's clan board beside * the roster setting. The board is where "this server runs the uMod Clans * plugin, whose clans are not Teams" (D47) and "this server is at the game's * 100-clan ceiling" (D55) come from. */ async function describe() { const [settings, boards] = await Promise.all([visibility.describe(), clans.boardsForAdmin()]) return { ...settings, clans: { ...settings.clans, servers: boards } } } async function read(req, res) { try { res.json(await describe()) } catch (err) { log.error('failed to read visibility settings', { error: err.message }) res.status(500).json({ message: 'Failed to read the visibility settings' }) } } async function update(req, res) { try { const { fleet, servers, clanRoster } = req.body || {} const result = await visibility.update({ fleet, servers, clanRoster }, req.user) if (!result.ok) { res.status(result.status || 400).json({ message: result.message }) return } // One row per save, naming everything it changed. Widening who may see the // roll call is exactly the kind of change somebody later needs to trace to a // person and a time. await core.activity.log({ req, action: 'rust.visibility.save', detail: result.changed }) res.json(await describe()) } catch (err) { log.error('failed to save visibility settings', { error: err.message }) res.status(500).json({ message: 'Failed to save the visibility settings' }) } } module.exports = { read, update }