95 lines
2.4 KiB
TypeScript
95 lines
2.4 KiB
TypeScript
import {
|
|
updateConfig,
|
|
getConfigFiles,
|
|
getServerById,
|
|
getStateHistory,
|
|
getStateHistoryStats
|
|
} from '$api/serverService';
|
|
import type { Actions } from './$types';
|
|
import { checkAuth } from '$api/authService';
|
|
import { getTracks } from '$api/lookupService';
|
|
import { redirect } from '@sveltejs/kit';
|
|
import type { RequestEvent } from '@sveltejs/kit';
|
|
import { configFile, type Config, type Session } from '$models/config';
|
|
import { set } from 'lodash-es';
|
|
import { subDays, formatISO } from 'date-fns';
|
|
import { UTCDate } from '@date-fns/utc';
|
|
|
|
export const load = async (event: RequestEvent) => {
|
|
const isAuth = await checkAuth(event);
|
|
if (!isAuth) return redirect(308, '/login');
|
|
if (!event.params.id) return redirect(308, '/dashboard');
|
|
const today = new UTCDate();
|
|
const endDate = formatISO(today);
|
|
const startDate = formatISO(subDays(today, 30));
|
|
|
|
const [server, configs, tracks, statistics] = await Promise.all([
|
|
getServerById(event, event.params.id),
|
|
getConfigFiles(event, event.params.id),
|
|
getTracks(event),
|
|
getStateHistoryStats(event, event.params.id, startDate, endDate)
|
|
]);
|
|
return {
|
|
id: event.params.id,
|
|
configs,
|
|
tracks,
|
|
server,
|
|
statistics
|
|
};
|
|
};
|
|
|
|
type SessionField =
|
|
| 'sessionDurationMinutes'
|
|
| 'sessionType'
|
|
| 'timeMultiplier'
|
|
| 'dayOfWeekend'
|
|
| 'hourOfDay';
|
|
|
|
export const actions = {
|
|
update: async (event: RequestEvent) => {
|
|
const { id, restart, file, data } = await destructureFormData(event);
|
|
|
|
const sessions: Array<Record<SessionField, string | number>> = [];
|
|
|
|
await updateConfig(event, id, file, data, true, restart);
|
|
}
|
|
} satisfies Actions;
|
|
|
|
async function destructureFormData(
|
|
event: RequestEvent
|
|
): Promise<{ id: string; restart: boolean; data: Config; file: configFile }> {
|
|
const formData = await event.request.formData();
|
|
const id = formData.get('id') as string;
|
|
const restart = formData.get('restart');
|
|
const file = formData.get('file') as configFile;
|
|
const object: any = {};
|
|
formData.forEach((value, key) => {
|
|
switch (key) {
|
|
case 'id':
|
|
case 'restart':
|
|
case 'file':
|
|
return;
|
|
default:
|
|
set(object, key, parseFormField(value));
|
|
}
|
|
});
|
|
return {
|
|
id,
|
|
restart: restart == 'on' || restart == 'true',
|
|
data: object,
|
|
file
|
|
};
|
|
}
|
|
|
|
function parseFormField(value: FormDataEntryValue): string | number {
|
|
return value !== '' && !Number.isNaN(+value) ? +value : (value as string);
|
|
}
|
|
|
|
function tryParse(str: string) {
|
|
try {
|
|
return JSON.parse(str);
|
|
} catch {
|
|
return str;
|
|
}
|
|
}
|