Some checks failed
CI / Unit & Component Tests (push) Successful in 2m4s
CI / Backend Unit Tests (push) Successful in 1m59s
CI / E2E Tests (push) Failing after 18m4s
CI / Unit & Component Tests (pull_request) Successful in 2m2s
CI / Backend Unit Tests (pull_request) Successful in 2m0s
CI / E2E Tests (pull_request) Failing after 16m10s
- New GET /admin/users/new page: create user with all profile fields
(login, password, firstName, lastName, birthDate, email, contact, groups)
- New GET /admin/users/[id] page: edit user profile, groups, and
optional password change without requiring current password
- New PUT /api/users/{id} backend endpoint (ADMIN_USER permission)
with AdminUpdateUserRequest DTO for admin-override user updates
- Refactored admin users tab: replaced inline editing with edit links
to dedicated routes; create button now links to /admin/users/new
- Extended CreateUserRequest with profile fields so new users can be
created with full profile data in a single request
- Added 28 component tests across 3 new spec files (TDD)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
46 lines
1.5 KiB
TypeScript
46 lines
1.5 KiB
TypeScript
import { error, fail, redirect } from '@sveltejs/kit';
|
|
import type { PageServerLoad, Actions } from './$types';
|
|
import { createApiClient } from '$lib/api.server';
|
|
import { getErrorMessage } from '$lib/errors';
|
|
|
|
export const load: PageServerLoad = async ({ fetch, locals }) => {
|
|
const user = locals.user;
|
|
const hasAdmin = user?.groups?.some((g: { permissions: string[] }) =>
|
|
g.permissions.includes('ADMIN')
|
|
);
|
|
if (!hasAdmin) throw error(403, getErrorMessage('FORBIDDEN'));
|
|
|
|
const api = createApiClient(fetch);
|
|
const groupsResult = await api.GET('/api/groups');
|
|
|
|
return { groups: groupsResult.data ?? [] };
|
|
};
|
|
|
|
export const actions: Actions = {
|
|
default: async ({ request, fetch }) => {
|
|
const data = await request.formData();
|
|
const api = createApiClient(fetch);
|
|
|
|
const birthDateRaw = data.get('birthDate') as string;
|
|
const result = await api.POST('/api/users', {
|
|
body: {
|
|
username: data.get('username') as string,
|
|
initialPassword: data.get('password') as string,
|
|
email: (data.get('email') as string) || undefined,
|
|
groupIds: data.getAll('groupIds') as string[],
|
|
firstName: (data.get('firstName') as string) || null,
|
|
lastName: (data.get('lastName') as string) || null,
|
|
birthDate: birthDateRaw || null,
|
|
contact: (data.get('contact') as string) || null
|
|
}
|
|
});
|
|
|
|
if (!result.response.ok) {
|
|
const code = (result.error as unknown as { code?: string })?.code;
|
|
return fail(result.response.status, { error: getErrorMessage(code) });
|
|
}
|
|
|
|
throw redirect(303, '/admin');
|
|
}
|
|
};
|