From aed8dc68fc469ddf9a77dbd41721a2ce4823126a Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 8 Aug 2025 21:10:00 +0200 Subject: [PATCH] fixes recaptcha --- nuxt.config.ts | 9 ++++++- pages/signup.vue | 16 +++++++---- server/api/recaptcha-config.get.ts | 31 ++++++++++++++++++++++ server/api/registration-config.get.ts | 38 +++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 server/api/recaptcha-config.get.ts create mode 100644 server/api/registration-config.get.ts diff --git a/nuxt.config.ts b/nuxt.config.ts index 5f6c348..08bbc89 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -75,12 +75,19 @@ export default defineNuxtConfig({ title: "MonacoUSA Portal", meta: [ { property: "og:title", content: "MonacoUSA Portal" }, - { property: "og:image", content: "/og-image.png" }, + { property: "og:image", content: "/MONACOUSA-Flags_376x376.png" }, { name: "twitter:card", content: "summary_large_image" }, { name: "viewport", content: "width=device-width, initial-scale=1" }, { name: "apple-mobile-web-app-capable", content: "yes" }, { name: "apple-mobile-web-app-status-bar-style", content: "default" }, { name: "apple-mobile-web-app-title", content: "MonacoUSA Portal" }, + { name: "theme-color", content: "#a31515" }, + ], + link: [ + { rel: "icon", type: "image/png", sizes: "32x32", href: "/favicon-32x32.png" }, + { rel: "icon", type: "image/png", sizes: "192x192", href: "/icon-192x192.png" }, + { rel: "apple-touch-icon", sizes: "180x180", href: "/apple-touch-icon.png" }, + { rel: "shortcut icon", href: "/favicon-32x32.png" }, ], htmlAttrs: { lang: "en", diff --git a/pages/signup.vue b/pages/signup.vue index d908424..0f3b69c 100644 --- a/pages/signup.vue +++ b/pages/signup.vue @@ -386,19 +386,25 @@ async function submitRegistration() { // Load configurations on mount onMounted(async () => { try { - // Load reCAPTCHA config (public endpoint) - const recaptchaResponse = await $fetch('/api/admin/recaptcha-config') as any; + // Load reCAPTCHA config (public endpoint - no authentication required) + const recaptchaResponse = await $fetch('/api/recaptcha-config') as any; if (recaptchaResponse?.success && recaptchaResponse?.data?.siteKey) { recaptchaConfig.value.siteKey = recaptchaResponse.data.siteKey; + console.log('✅ reCAPTCHA site key loaded successfully'); + } else { + console.warn('❌ reCAPTCHA not configured or failed to load'); } - // Load registration config (public endpoint) - const registrationResponse = await $fetch('/api/admin/registration-config') as any; + // Load registration config (public endpoint - no authentication required) + const registrationResponse = await $fetch('/api/registration-config') as any; if (registrationResponse?.success) { registrationConfig.value = registrationResponse.data; + console.log('✅ Registration config loaded successfully'); + } else { + console.warn('❌ Registration config failed to load'); } } catch (error) { - console.warn('Failed to load configuration:', error); + console.error('Failed to load configuration:', error); // Page will still work with default values } }); diff --git a/server/api/recaptcha-config.get.ts b/server/api/recaptcha-config.get.ts new file mode 100644 index 0000000..d53b039 --- /dev/null +++ b/server/api/recaptcha-config.get.ts @@ -0,0 +1,31 @@ +export default defineEventHandler(async (event) => { + console.log('[api/recaptcha-config.get] ========================='); + console.log('[api/recaptcha-config.get] GET /api/recaptcha-config - Get public reCAPTCHA configuration'); + + try { + // Get reCAPTCHA configuration (public access - only return site key) + const { getRecaptchaConfig } = await import('~/server/utils/admin-config'); + const config = getRecaptchaConfig(); + + console.log('[api/recaptcha-config.get] Returning site key:', config.siteKey ? 'configured' : 'not configured'); + + return { + success: true, + data: { + siteKey: config.siteKey || '', + // Don't return secret key for public access + } + }; + + } catch (error: any) { + console.error('[api/recaptcha-config.get] ❌ Error getting public reCAPTCHA config:', error); + + return { + success: false, + error: 'Failed to get reCAPTCHA configuration', + data: { + siteKey: '' + } + }; + } +}); diff --git a/server/api/registration-config.get.ts b/server/api/registration-config.get.ts new file mode 100644 index 0000000..3d263b9 --- /dev/null +++ b/server/api/registration-config.get.ts @@ -0,0 +1,38 @@ +export default defineEventHandler(async (event) => { + console.log('[api/registration-config.get] ========================='); + console.log('[api/registration-config.get] GET /api/registration-config - Get public registration configuration'); + + try { + // Get registration configuration (public access - safe to expose) + const { getRegistrationConfig } = await import('~/server/utils/admin-config'); + const config = getRegistrationConfig(); + + console.log('[api/registration-config.get] Returning registration config:', { + membershipFee: config.membershipFee, + hasIban: !!config.iban, + hasAccountHolder: !!config.accountHolder + }); + + return { + success: true, + data: { + membershipFee: config.membershipFee || 50, + iban: config.iban || '', + accountHolder: config.accountHolder || '' + } + }; + + } catch (error: any) { + console.error('[api/registration-config.get] ❌ Error getting public registration config:', error); + + return { + success: false, + error: 'Failed to get registration configuration', + data: { + membershipFee: 50, + iban: '', + accountHolder: '' + } + }; + } +});