import { fail } from '@sveltejs/kit'; import { randomUUID } from 'node:crypto'; import { getSessionUser } from '$lib/server/auth/session'; import { requireDataView, requirePermission } from '$lib/server/auth/authorization'; import { getDatabase } from '$lib/server/database'; import { recordIsacAudit } from '$lib/server/audit'; import type { Actions, PageServerLoad } from './$types'; export const load: PageServerLoad = async ({ cookies }) => { await requireDataView(await getSessionUser(cookies)); const ranges = await (await (await getDatabase()).prepare('SELECT * FROM core_attribute_tier_ranges ORDER BY tier')).all(); return { ranges }; }; export const actions: Actions = { saveCoreRanges: async ({ cookies, request }) => { const operator = await requirePermission(await getSessionUser(cookies), 'data.manage'); const form = await request.formData(); const ranges = [0, 1, 2].map((tier) => ({ tier, min: Number(form.get(`tier${tier}Min`)), max: Number(form.get(`tier${tier}Max`)) })); if (ranges.some((range) => !Number.isFinite(range.min) || !Number.isFinite(range.max) || range.min < 0 || range.max < range.min)) { return fail(400, { configurationError: 'Every tier requires a valid nominal minimum and maximum.' }); } const database = await getDatabase(); const before = await (await database.prepare('SELECT * FROM core_attribute_tier_ranges ORDER BY tier')).all(); const now = new Date().toISOString(); for (const range of ranges) { await (await database.prepare(`INSERT INTO core_attribute_tier_ranges(tier,nominal_min,nominal_max,reference_level,updated_at) VALUES(?,?,?,50,?) ON CONFLICT(tier) DO UPDATE SET nominal_min=excluded.nominal_min,nominal_max=excluded.nominal_max,updated_at=excluded.updated_at`)) .run(range.tier, range.min, range.max, now); } const after = await (await database.prepare('SELECT * FROM core_attribute_tier_ranges ORDER BY tier')).all(); await recordIsacAudit({ actorId: operator.id, category: 'game_data', action: 'configuration.core_ranges_updated', entityId: 'core-attribute-tier-ranges', before, after }); return { configurationSaved: true, resultToken: randomUUID() }; } };