diff --git a/package-lock.json b/package-lock.json index 7fe9a7f..7bf4e88 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,8 @@ "@supabase/ssr": "^0.6.1", "@supabase/supabase-js": "^2.50.0", "@sveltejs/adapter-node": "^5.2.12", - "googleapis": "^150.0.1" + "googleapis": "^150.0.1", + "papaparse": "^5.5.3" }, "devDependencies": { "@sveltejs/kit": "^2.16.0", @@ -2497,6 +2498,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/papaparse": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz", + "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==", + "license": "MIT" + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", diff --git a/package.json b/package.json index bb5447b..d856c29 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "@supabase/ssr": "^0.6.1", "@supabase/supabase-js": "^2.50.0", "@sveltejs/adapter-node": "^5.2.12", - "googleapis": "^150.0.1" + "googleapis": "^150.0.1", + "papaparse": "^5.5.3" } } diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 0447531..3d640c9 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,22 +1,11 @@
diff --git a/src/routes/auth/signout/+page.svelte b/src/routes/auth/signout/+page.svelte deleted file mode 100644 index dceffee..0000000 --- a/src/routes/auth/signout/+page.svelte +++ /dev/null @@ -1,11 +0,0 @@ - - -Signing out...
diff --git a/src/routes/auth/signout/+server.ts b/src/routes/auth/signout/+server.ts index 25340c9..e863937 100644 --- a/src/routes/auth/signout/+server.ts +++ b/src/routes/auth/signout/+server.ts @@ -1,9 +1,11 @@ import type { RequestHandler } from './$types'; -import { redirect } from '@sveltejs/kit'; - -export const GET: RequestHandler = async ({ locals }) => { - // If using supabase-js client on the server, you can sign out here - if (locals.supabase) { +export const GET: RequestHandler = async ({ locals}) => { await locals.supabase.auth.signOut(); - } -}; + + const html = ` + `; + return new Response(html, { headers: { 'Content-Type': 'text/html' } }); +}; \ No newline at end of file diff --git a/src/routes/login/+page.svelte b/src/routes/login/+page.svelte deleted file mode 100644 index e69de29..0000000 diff --git a/src/routes/private/api/gmail/+server.ts b/src/routes/private/api/gmail/+server.ts index aa76b34..8cd7ce3 100644 --- a/src/routes/private/api/gmail/+server.ts +++ b/src/routes/private/api/gmail/+server.ts @@ -60,5 +60,20 @@ export const POST: RequestHandler = async ({ request }) => { } } + /* validate token */ + if (action === 'validate') { + if (!refreshToken) { + return json({ valid: false }); + } + try { + const oAuth2Client = getOAuthClient(); + oAuth2Client.setCredentials({ refresh_token: refreshToken }); + await oAuth2Client.getAccessToken(); // This will throw if invalid + return json({ valid: true }); + } catch (err) { + return json({ valid: false, error: (err as Error).message }); + } + } + return new Response('Bad request', { status: 400 }); }; diff --git a/src/routes/private/creator/+page.server.ts b/src/routes/private/creator/+page.server.ts new file mode 100644 index 0000000..f324d97 --- /dev/null +++ b/src/routes/private/creator/+page.server.ts @@ -0,0 +1,61 @@ +import type { Actions } from './$types'; +import { error as kitError } from '@sveltejs/kit'; +import Papa from 'papaparse'; +import { fail } from '@sveltejs/kit'; + +export async function load({ locals }) { + console.log("▶️ fetching events…"); + + const { data: events, error } = await locals.supabase + .from('events') + .select('*') + .order('date', { ascending: true }); + + if (error) { + console.error('❌ supabase error:', error); + // optional: throw to render SvelteKit error page + throw kitError(500, 'Could not load events'); + } + + return { events }; +} + +export const actions = { + create: async (event) => { + const formData = await event.request.formData(); + console.log(Array.from(formData.entries())); + console.log('create_event date', formData.get("date"), formData.get("name"), formData.get("description")); + let { data: new_event, error } = await event.locals.supabase.rpc("create_event", + { + "p_name": formData.get('name'), + "p_date": formData.get('date'), + "p_description": formData.get('description'), + }); + return { + new_event, + error + } + }, + participants: async (event) => { + const formData = await event.request.formData(); + const file = formData.get('participants') as File; + + let csvText = await file.text(); + + const { data: parsedRows, errors } = Papa.parse(csvText, { + skipEmptyLines: true, + header: false + }); + + // Map each row to an object with keys: name, surname, email + const participants = parsedRows.map((row: string[]) => ({ + name: row[0], + surname: row[1], + email: row[2] + })); + + return { + participants, + } + } +} satisfies Actions; \ No newline at end of file diff --git a/src/routes/private/creator/+page.svelte b/src/routes/private/creator/+page.svelte index 42a156a..83681d0 100644 --- a/src/routes/private/creator/+page.svelte +++ b/src/routes/private/creator/+page.svelte @@ -1,63 +1,67 @@ -{#if !authorized} -You haven’t connected your Google account yet.
- -You haven’t connected your Google account yet.
+ +{JSON.stringify(events)}
+ + + +{JSON.stringify(new_event)}
\ No newline at end of file diff --git a/src/routes/private/creator/steps/StepOverview.svelte b/src/routes/private/creator/steps/StepOverview.svelte new file mode 100644 index 0000000..f961fb8 --- /dev/null +++ b/src/routes/private/creator/steps/StepOverview.svelte @@ -0,0 +1,11 @@ + + +New event:
+{JSON.stringify(new_event)} + + +Participants
+{JSON.stringify(participants)} \ No newline at end of file diff --git a/src/routes/private/creator/steps/StepUploadFiles.svelte b/src/routes/private/creator/steps/StepUploadFiles.svelte new file mode 100644 index 0000000..1858ed3 --- /dev/null +++ b/src/routes/private/creator/steps/StepUploadFiles.svelte @@ -0,0 +1,34 @@ + + + + +{JSON.stringify(participants)} + +{#if participants.length === 0} +No participants added yet.
+{/if} + +{#if participants.length > 0} +