diff --git a/src/routes/api/auth/refresh/+server.ts b/src/routes/api/auth/refresh/+server.ts new file mode 100644 index 0000000..83eecbb --- /dev/null +++ b/src/routes/api/auth/refresh/+server.ts @@ -0,0 +1,30 @@ +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { authServer } from '$lib/google/index.js'; + +export const POST: RequestHandler = async ({ request }) => { + try { + const { refreshToken } = await request.json(); + + if (!refreshToken) { + return json({ error: 'Refresh token is required' }, { status: 400 }); + } + + const oauth = authServer.getOAuthClient(); + oauth.setCredentials({ refresh_token: refreshToken }); + + const { credentials } = await oauth.refreshAccessToken(); + + if (!credentials.access_token) { + return json({ error: 'Failed to refresh token' }, { status: 500 }); + } + + return json({ + accessToken: credentials.access_token, + expiresIn: credentials.expiry_date + }); + } catch (error) { + console.error('Error refreshing access token:', error); + return json({ error: 'Failed to refresh access token' }, { status: 500 }); + } +}; diff --git a/src/routes/api/events/+server.ts b/src/routes/api/events/+server.ts new file mode 100644 index 0000000..a352d1f --- /dev/null +++ b/src/routes/api/events/+server.ts @@ -0,0 +1,21 @@ +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; + +export const GET: RequestHandler = async ({ locals }) => { + try { + const { data: events, error } = await locals.supabase + .from('events') + .select('*') + .order('date', { ascending: false }); + + if (error) { + console.error('Error fetching events:', error); + return json({ error: error.message }, { status: 500 }); + } + + return json({ events }); + } catch (err) { + console.error('Error in events API:', err); + return json({ error: 'Internal server error' }, { status: 500 }); + } +}; diff --git a/src/routes/api/sheets/[sheetId]/data/+server.ts b/src/routes/api/sheets/[sheetId]/data/+server.ts new file mode 100644 index 0000000..e87c1ff --- /dev/null +++ b/src/routes/api/sheets/[sheetId]/data/+server.ts @@ -0,0 +1,22 @@ +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { sheets } from '$lib/google/index.js'; + +export const GET: RequestHandler = async ({ params, request }) => { + try { + const { sheetId } = params; + const authHeader = request.headers.get('authorization'); + + if (!authHeader?.startsWith('Bearer ')) { + return json({ error: 'Missing or invalid authorization header' }, { status: 401 }); + } + + const refreshToken = authHeader.slice(7); + const sheetData = await sheets.getSpreadsheetData(refreshToken, sheetId, 'A1:Z10'); + + return json(sheetData); + } catch (error) { + console.error('Error fetching spreadsheet data:', error); + return json({ error: 'Failed to fetch spreadsheet data' }, { status: 500 }); + } +}; diff --git a/src/routes/api/sheets/recent/+server.ts b/src/routes/api/sheets/recent/+server.ts new file mode 100644 index 0000000..ed01813 --- /dev/null +++ b/src/routes/api/sheets/recent/+server.ts @@ -0,0 +1,20 @@ +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { sheets } from '$lib/google/index.js'; + +export const GET: RequestHandler = async ({ request }) => { + try { + const authHeader = request.headers.get('authorization'); + if (!authHeader?.startsWith('Bearer ')) { + return json({ error: 'Missing or invalid authorization header' }, { status: 401 }); + } + + const refreshToken = authHeader.slice(7); + const spreadsheets = await sheets.getRecentSpreadsheets(refreshToken, 20); + + return json(spreadsheets); + } catch (error) { + console.error('Error fetching recent spreadsheets:', error); + return json({ error: 'Failed to fetch spreadsheets' }, { status: 500 }); + } +}; diff --git a/src/routes/private/events/+page.server.ts b/src/routes/private/events/+page.server.ts deleted file mode 100644 index be0d7a9..0000000 --- a/src/routes/private/events/+page.server.ts +++ /dev/null @@ -1,7 +0,0 @@ -export async function load({ locals }) { - const { data: events, error } = await locals.supabase - .from('events') - .select('*') - .order('date', { ascending: false }); - return { events }; -} \ No newline at end of file diff --git a/src/routes/private/events/+page.svelte b/src/routes/private/events/+page.svelte index 01b0edc..ad261e2 100644 --- a/src/routes/private/events/+page.svelte +++ b/src/routes/private/events/+page.svelte @@ -1,20 +1,81 @@

All Events

- {#each data.events as event} - -
- {event.name} - {event.date} + {#if loading} + + {#each Array(4) as _} +
+
+
+
+
-
- {/each} + {/each} + {:else if error} + +
+ {error} + +
+ {:else if events.length === 0} + +
+ No events found +
+ {:else} + + {#each events as event} + +
+ {event.name} + {event.date} +
+
+ {/each} + {/if}