doe/fe/src/routes/(app)/groups/[groupId]/+page.ts
2025-03-30 19:42:32 +02:00

55 lines
2.3 KiB
TypeScript

// src/routes/(app)/groups/[groupId]/+page.ts
import { error } from '@sveltejs/kit';
import { apiClient, ApiClientError } from '$lib/apiClient';
import type { GroupPublic } from '$lib/schemas/group';
import type { PageLoad } from './$types'; // SvelteKit's type for load functions
// Define the expected shape of the data returned
export interface GroupDetailPageLoadData {
group: GroupPublic; // The fetched group data
}
export const load: PageLoad<GroupDetailPageLoadData> = async ({ params, fetch }) => {
const groupId = params.groupId; // Get groupId from the URL parameter
console.log(`Group Detail page load: Fetching data for group ID: ${groupId}`);
// Basic validation (optional but good)
if (!groupId || isNaN(parseInt(groupId, 10))) {
throw error(400, 'Invalid Group ID'); // Use SvelteKit's error helper
}
try {
// Fetch the specific group details using the apiClient
// The backend endpoint GET /api/v1/groups/{group_id} should include members
const groupData = await apiClient.get<GroupPublic>(`/v1/groups/${groupId}`);
if (!groupData) {
// Should not happen if API call was successful, but check defensively
throw error(404, 'Group not found');
}
console.log('Group Detail page load: Data fetched successfully', groupData);
return {
group: groupData
};
} catch (err) {
console.error(`Group Detail page load: Failed to fetch group ${groupId}:`, err);
if (err instanceof ApiClientError) {
if (err.status === 404) {
throw error(404, 'Group not found');
}
if (err.status === 403) {
// User is authenticated (layout guard passed) but not member of this group
throw error(403, 'Forbidden: You are not a member of this group');
}
// For other API errors (like 500)
throw error(err.status || 500, `API Error: ${err.message}`);
} else if (err instanceof Error) {
// Network or other client errors
throw error(500, `Failed to load group data: ${err.message}`);
} else {
// Unknown error
throw error(500, 'An unexpected error occurred while loading group data.');
}
}
};