From 3992a9436b24b97717b3fc26dcb9cc7814fc4335 Mon Sep 17 00:00:00 2001 From: acazares Date: Tue, 9 Dec 2025 09:08:17 -0600 Subject: [PATCH] feat: Implement server-side loading for exchange rates with authentication and error handling --- .../exchange-rate/+page.server.ts | 36 +++++++++++++++++++ .../exchange-rate/+page.svelte | 10 +++--- 2 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.server.ts diff --git a/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.server.ts b/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.server.ts new file mode 100644 index 00000000..e1cccc48 --- /dev/null +++ b/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.server.ts @@ -0,0 +1,36 @@ +import type { PageServerLoad } from './$types'; +import { getAuthTokens, authenticatedFetch } from '$lib/server/api'; + +export const load: PageServerLoad = async ({ cookies, fetch, url, parent }) => { + await parent(); + const { accessToken } = getAuthTokens(cookies); + + if (!accessToken) { + return { error: 'No authenticated', exchangeRates: { items: [], total: 0, page: 1, page_size: 50, pages: 0 } }; + } + + try { + const page = Number(url.searchParams.get('page')) || 1; + const pageSize = Number(url.searchParams.get('pageSize')) || 50; + const filters: Record = {}; + const date = url.searchParams.get('date'); + const localCurrency = url.searchParams.get('local_currency'); + const foreignCurrency = url.searchParams.get('foreign_currency'); + + if (date) filters.date = date; + if (localCurrency) filters.local_currency = localCurrency; + if (foreignCurrency) filters.foreign_currency = foreignCurrency; + + const queryParams = new URLSearchParams({ page: page.toString(), page_size: pageSize.toString(), ...filters }); + const response = await authenticatedFetch(`v1/a76/exchange-rate?${queryParams.toString()}`, { method: 'GET' }, cookies, fetch); + + if (!response.ok) { + return { error: 'Failed to load', exchangeRates: { items: [], total: 0, page, page_size: pageSize, pages: 0 } }; + } + + return { exchangeRates: await response.json() }; + } catch (error) { + console.error('Error loading exchange rates:', error); + return { error: 'Error loading', exchangeRates: { items: [], total: 0, page: 1, page_size: 50, pages: 0 } }; + } +}; diff --git a/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.svelte index 84023744..84c1b278 100644 --- a/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/exchange-rate/+page.svelte @@ -13,9 +13,11 @@ import { getExchangeRates } from '$lib/api/dashboard/a76/general_catalogs/exchange-rate'; import { companyStore } from '$lib/stores/company.svelte'; - let allItems = $state([]); + let { data } = $props(); + + let allItems = $state(data.exchangeRates?.items || []); let loading = $state(false); - let error = $state(null); + let error = $state(data.error || null); let currentPage = $state(1); const pageSize = 50; @@ -97,9 +99,9 @@ const response = await getExchangeRates(companyId, filters); if (page === 1) { - allItems = response.data.items; + allItems = response.items; } else { - allItems = [...allItems, ...response.data.items]; + allItems = [...allItems, ...response.items]; } currentPage = page;