feat: add config preset manager

This commit is contained in:
2026-03-26 22:09:01 +01:00
parent 1dad80e557
commit e8cb877497
11 changed files with 587 additions and 29 deletions

View File

@@ -19,7 +19,7 @@ export async function loginAction(prevState: LoginResult, formData: FormData) {
if (!loginData.success) {
return {
success: false,
message: loginData.error.message
message: loginData.error.issues[0]?.message ?? 'Validation failed'
};
}

View File

@@ -2,7 +2,7 @@
import { revalidatePath } from 'next/cache';
import { requireAuth } from '@/lib/auth/server';
import { updateServerConfiguration, bulkUpdateServerConfigurations } from '@/lib/api/server/configuration';
import { getServerConfigurations, updateServerConfiguration, bulkUpdateServerConfigurations } from '@/lib/api/server/configuration';
import {
assistRulesSchema,
ConfigFile,
@@ -19,6 +19,21 @@ import type {
EventRules,
ServerSettings
} from '@/lib/schemas/config';
export async function getConfigurationsAction(
serverId: string
): Promise<{ success: true; data: Configurations } | { success: false; message: string }> {
try {
const session = await requireAuth();
const data = await getServerConfigurations(session.token!, serverId);
return { success: true, data };
} catch (error) {
return {
success: false,
message: error instanceof Error ? error.message : 'Failed to fetch configurations'
};
}
}
import { boolToInt } from '@/lib/utils';
export async function updateConfigurationAction(serverId: string, formData: FormData) {
@@ -72,7 +87,7 @@ export async function updateAssistRulesAction(serverId: string, formData: FormDa
const config = assistRulesSchema.safeParse(rawConfig);
if (!config.success) {
return { success: false, message: config.error.message };
return { success: false, message: config.error.issues[0]?.message ?? 'Validation failed' };
}
await updateServerConfiguration(
@@ -120,7 +135,7 @@ export async function updateServerSettingsAction(serverId: string, formData: For
};
const config = serverSettingsSchema.safeParse(rawConfig);
if (!config.success) {
return { success: false, message: config.error.message };
return { success: false, message: config.error.issues[0]?.message ?? 'Validation failed' };
}
await updateServerConfiguration(
@@ -167,7 +182,7 @@ export async function updateEventConfigAction(serverId: string, formData: FormDa
};
const config = eventConfigSchema.safeParse(rawConfig);
if (!config.success) {
return { success: false, message: config.error.message };
return { success: false, message: config.error.issues[0]?.message ?? 'Validation failed' };
}
await updateServerConfiguration(
@@ -216,7 +231,7 @@ export async function updateEventRulesAction(serverId: string, formData: FormDat
const config = eventRulesSchema.safeParse(rawConfig);
if (!config.success) {
return { success: false, message: config.error.message };
return { success: false, message: config.error.issues[0]?.message ?? 'Validation failed' };
}
await updateServerConfiguration(
@@ -247,7 +262,7 @@ export async function bulkUpdateConfigurationsAction(
const validated = configurationsSchema.partial().safeParse(configs);
if (!validated.success) {
return { success: false, message: validated.error.message };
return { success: false, message: validated.error.issues[0]?.message ?? 'Validation failed' };
}
await bulkUpdateServerConfigurations(session.token!, serverId, validated.data, restart);

View File

@@ -10,7 +10,7 @@ export async function saveLeaderboardAction(serverId: string, data: Leaderboard)
const session = await requireAuth();
const validated = leaderboardSchema.safeParse(data);
if (!validated.success) {
return { success: false, message: validated.error.message };
return { success: false, message: validated.error.issues[0]?.message ?? 'Validation failed' };
}
await fetchServerAPI(`/server/${serverId}/leaderboard`, session.token!, 'PUT', validated.data);
revalidatePath(`/dashboard/server/${serverId}`);

View File

@@ -15,7 +15,7 @@ export async function createUserAction(formData: FormData) {
const rawData = { username, password, role };
const data = userCreateSchema.safeParse(rawData);
if (!data.success) {
return { success: false, message: data.error.message };
return { success: false, message: data.error.issues[0]?.message ?? 'Validation failed' };
}
await createUser(session.token!, data.data);

View File

@@ -0,0 +1,54 @@
'use server';
import { revalidatePath } from 'next/cache';
import { requireAuth } from '@/lib/auth/server';
import { listPresets, createPreset, applyPreset, type ConfigPresetCreateRequest } from '@/lib/api/server/presets';
import type { ConfigPreset } from '@/lib/schemas/preset';
export async function listPresetsAction(
name?: string
): Promise<{ success: true; data: ConfigPreset[] } | { success: false; message: string }> {
try {
const session = await requireAuth();
const data = await listPresets(session.token!, name);
return { success: true, data };
} catch (error) {
return {
success: false,
message: error instanceof Error ? error.message : 'Failed to fetch presets'
};
}
}
export async function createPresetAction(
data: ConfigPresetCreateRequest
): Promise<{ success: true; data: ConfigPreset } | { success: false; message: string }> {
try {
const session = await requireAuth();
const preset = await createPreset(session.token!, data);
return { success: true, data: preset };
} catch (error) {
return {
success: false,
message: error instanceof Error ? error.message : 'Failed to save preset'
};
}
}
export async function applyPresetAction(
serverId: string,
presetId: string,
restart = false
): Promise<{ success: true; message: string } | { success: false; message: string }> {
try {
const session = await requireAuth();
await applyPreset(session.token!, serverId, presetId, restart);
revalidatePath(`/dashboard/server/${serverId}`);
return { success: true, message: 'Preset applied successfully' };
} catch (error) {
return {
success: false,
message: error instanceof Error ? error.message : 'Failed to apply preset'
};
}
}