introduce zod schemas

This commit is contained in:
Fran Jurmanović
2025-09-24 20:07:57 +02:00
parent 0cbc6935db
commit 996f1a1385
43 changed files with 798 additions and 559 deletions

View File

@@ -3,6 +3,7 @@
import { redirect } from 'next/navigation';
import { loginUser, getOpenToken } from '@/lib/api/server/auth';
import { login, logout } from '@/lib/auth/server';
import { loginSchema, loginResponseSchema } from '../schemas';
export type LoginResult = {
success: boolean;
@@ -14,18 +15,19 @@ export async function loginAction(prevState: LoginResult, formData: FormData) {
const username = formData.get('username') as string;
const password = formData.get('password') as string;
if (!username || !password) {
const loginData = loginSchema.safeParse({ username, password });
if (!loginData.success) {
return {
success: false,
message: 'Username and password are required'
message: loginData.error.message
};
}
const result = await loginUser(username, password);
const result = loginResponseSchema.safeParse(await loginUser(loginData.data));
if (result.token && result.user) {
const openToken = await getOpenToken(result.token);
await login(result.token, result.user, openToken);
if (result.success) {
const openToken = await getOpenToken(result.data.token);
await login(result.data.token, result.data.user, openToken);
} else {
return {
success: false,

View File

@@ -3,14 +3,20 @@
import { revalidatePath } from 'next/cache';
import { requireAuth } from '@/lib/auth/server';
import { updateServerConfiguration } from '@/lib/api/server/configuration';
import { ConfigFile } from '@/lib/types/config';
import {
assistRulesSchema,
ConfigFile,
eventConfigSchema,
eventRulesSchema,
serverSettingsSchema
} from '@/lib/schemas/config';
import type {
Configuration,
AssistRules,
EventConfig,
EventRules,
ServerSettings
} from '@/lib/types/config';
} from '@/lib/schemas/config';
export async function updateConfigurationAction(serverId: string, formData: FormData) {
try {
@@ -49,7 +55,7 @@ export async function updateAssistRulesAction(serverId: string, formData: FormDa
const session = await requireAuth();
const restart = formData.get('restart') === 'on';
const config: AssistRules = {
const rawConfig: AssistRules = {
stabilityControlLevelMax: parseInt(formData.get('stabilityControlLevelMax') as string),
disableAutosteer: parseInt(formData.get('disableAutosteer') as string),
disableAutoLights: parseInt(formData.get('disableAutoLights') as string),
@@ -61,11 +67,16 @@ export async function updateAssistRulesAction(serverId: string, formData: FormDa
disableIdealLine: parseInt(formData.get('disableIdealLine') as string)
};
const config = assistRulesSchema.safeParse(rawConfig);
if (!config.success) {
return { success: false, message: config.error.message };
}
await updateServerConfiguration(
session.token!,
serverId,
ConfigFile.assistRules,
config,
config.data,
restart
);
revalidatePath(`/dashboard/server/${serverId}`);
@@ -84,7 +95,7 @@ export async function updateServerSettingsAction(serverId: string, formData: For
const session = await requireAuth();
const restart = formData.get('restart') === 'on';
const config: ServerSettings = {
const rawConfig: ServerSettings = {
serverName: formData.get('serverName') as string,
adminPassword: formData.get('adminPassword') as string,
carGroup: formData.get('carGroup') as string,
@@ -103,8 +114,18 @@ export async function updateServerSettingsAction(serverId: string, formData: For
formationLapType: parseInt(formData.get('formationLapType') as string),
ignorePrematureDisconnects: parseInt(formData.get('ignorePrematureDisconnects') as string)
};
const config = serverSettingsSchema.safeParse(rawConfig);
if (!config.success) {
return { success: false, message: config.error.message };
}
await updateServerConfiguration(session.token!, serverId, ConfigFile.settings, config, restart);
await updateServerConfiguration(
session.token!,
serverId,
ConfigFile.settings,
config.data,
restart
);
revalidatePath(`/dashboard/server/${serverId}`);
return { success: true, message: 'Server settings updated successfully' };
@@ -124,7 +145,7 @@ export async function updateEventConfigAction(serverId: string, formData: FormDa
const sessionsData = formData.get('sessions') as string;
const sessions = sessionsData ? JSON.parse(sessionsData) : [];
const config: EventConfig = {
const rawConfig: EventConfig = {
track: formData.get('track') as string,
preRaceWaitingTimeSeconds: parseInt(formData.get('preRaceWaitingTimeSeconds') as string),
sessionOverTimeSeconds: parseInt(formData.get('sessionOverTimeSeconds') as string),
@@ -140,8 +161,18 @@ export async function updateEventConfigAction(serverId: string, formData: FormDa
),
sessions
};
const config = eventConfigSchema.safeParse(rawConfig);
if (!config.success) {
return { success: false, message: config.error.message };
}
await updateServerConfiguration(session.token!, serverId, ConfigFile.event, config, restart);
await updateServerConfiguration(
session.token!,
serverId,
ConfigFile.event,
config.data,
restart
);
revalidatePath(`/dashboard/server/${serverId}`);
return {
@@ -161,7 +192,7 @@ export async function updateEventRulesAction(serverId: string, formData: FormDat
const session = await requireAuth();
const restart = formData.get('restart') === 'on';
const config: EventRules = {
const rawConfig: EventRules = {
qualifyStandingType: parseInt(formData.get('qualifyStandingType') as string),
pitWindowLengthSec: parseInt(formData.get('pitWindowLengthSec') as string),
driverStintTimeSec: parseInt(formData.get('driverStintTimeSec') as string),
@@ -178,11 +209,16 @@ export async function updateEventRulesAction(serverId: string, formData: FormDat
tyreSetCount: parseInt(formData.get('tyreSetCount') as string)
};
const config = eventRulesSchema.safeParse(rawConfig);
if (!config.success) {
return { success: false, message: config.error.message };
}
await updateServerConfiguration(
session.token!,
serverId,
ConfigFile.eventRules,
config,
config.data,
restart
);
revalidatePath(`/dashboard/server/${serverId}`);

View File

@@ -3,6 +3,7 @@
import { revalidatePath } from 'next/cache';
import { requireAuth } from '@/lib/auth/server';
import { createUser, deleteUser } from '@/lib/api/server/membership';
import { userCreateSchema } from '../schemas';
export async function createUserAction(formData: FormData) {
try {
@@ -11,7 +12,13 @@ export async function createUserAction(formData: FormData) {
const password = formData.get('password') as string;
const role = formData.get('role') as string;
await createUser(session.token!, { username, password, role });
const rawData = { username, password, role };
const data = userCreateSchema.safeParse(rawData);
if (!data.success) {
return { success: false, message: data.error.message };
}
await createUser(session.token!, data.data);
revalidatePath('/dashboard/membership');
return { success: true, message: 'User created successfully' };