From e7338d1a70a7be733871ae375e68865bd3e8bd66 Mon Sep 17 00:00:00 2001 From: Matt Date: Sun, 25 Jan 2026 02:19:49 +0100 Subject: [PATCH] Initial production deployment setup - Production docker-compose with nginx support - Nginx configuration for portal.monacousa.org - Deployment script with backup/restore - Gitea CI/CD workflow - Fix CountryFlag reactivity for dropdown flags Co-Authored-By: Claude Opus 4.5 --- .dockerignore | 47 + .env.example | 89 + .gitea/workflows/build.yml | 130 + .gitignore | 23 + .npmrc | 1 + ARCHITECTURE.md | 3710 ++++++++++++++ DEPLOYMENT.md | 230 + Dockerfile | 77 + README.md | 38 + build.log | 0 components.json | 17 + deploy.sh | 339 ++ dev-output.txt | 0 dev.log | 0 docker-compose.nginx.yml | 386 ++ docker-compose.prod.yml | 440 ++ docker-compose.yml | 318 ++ nginx/portal.monacousa.org.conf | 244 + nginx/portal.monacousa.org.initial.conf | 161 + npm.log | 0 package-lock.json | 4514 +++++++++++++++++ package.json | 41 + postcss.config.js | 7 + src/app.css | 263 + src/app.d.ts | 27 + src/app.html | 11 + src/hooks.server.ts | 134 + src/lib/assets/favicon.svg | 1 + .../components/EmailVerificationBanner.svelte | 92 + src/lib/components/auth/FormField.svelte | 51 + src/lib/components/auth/FormMessage.svelte | 29 + src/lib/components/auth/LoadingSpinner.svelte | 28 + src/lib/components/auth/index.ts | 3 + .../dashboard/DuesStatusCard.svelte | 113 + .../dashboard/QuickActionsCard.svelte | 97 + src/lib/components/dashboard/StatsCard.svelte | 48 + .../dashboard/UpcomingEventsCard.svelte | 107 + .../components/dashboard/WelcomeCard.svelte | 78 + src/lib/components/dashboard/index.ts | 5 + .../documents/CreateFolderModal.svelte | 142 + .../documents/DocumentPreviewModal.svelte | 246 + .../documents/FolderBreadcrumbs.svelte | 49 + .../components/documents/FolderItem.svelte | 120 + src/lib/components/documents/index.ts | 4 + src/lib/components/layout/Header.svelte | 152 + src/lib/components/layout/MobileMenu.svelte | 203 + src/lib/components/layout/MobileNav.svelte | 53 + src/lib/components/layout/Sidebar.svelte | 245 + src/lib/components/layout/index.ts | 4 + .../components/ui/AddToCalendarButton.svelte | 171 + src/lib/components/ui/CountryFlag.svelte | 40 + src/lib/components/ui/CountrySelect.svelte | 173 + src/lib/components/ui/DatePicker.svelte | 190 + .../components/ui/NationalitySelect.svelte | 198 + src/lib/components/ui/PhoneInput.svelte | 260 + src/lib/components/ui/button/button.svelte | 65 + src/lib/components/ui/button/index.ts | 15 + .../components/ui/card/card-content.svelte | 13 + .../ui/card/card-description.svelte | 13 + src/lib/components/ui/card/card-footer.svelte | 13 + src/lib/components/ui/card/card-header.svelte | 13 + src/lib/components/ui/card/card-title.svelte | 13 + src/lib/components/ui/card/card.svelte | 16 + src/lib/components/ui/card/index.ts | 21 + src/lib/components/ui/index.ts | 19 + src/lib/components/ui/input/index.ts | 3 + src/lib/components/ui/input/input.svelte | 24 + src/lib/components/ui/label/index.ts | 3 + src/lib/components/ui/label/label.svelte | 19 + src/lib/index.ts | 3 + src/lib/server/audit.ts | 233 + src/lib/server/dues.ts | 881 ++++ src/lib/server/email.ts | 394 ++ src/lib/server/event-reminders.ts | 339 ++ src/lib/server/ical.ts | 299 ++ src/lib/server/poste.ts | 303 ++ src/lib/server/storage.ts | 901 ++++ src/lib/server/supabase.ts | 42 + src/lib/supabase.ts | 11 + src/lib/types/database.ts | 806 +++ src/lib/utils/countries.ts | 262 + src/lib/utils/index.ts | 59 + src/lib/utils/phoneCountries.ts | 255 + src/routes/(app)/+error.svelte | 179 + src/routes/(app)/+layout.server.ts | 27 + src/routes/(app)/+layout.svelte | 87 + src/routes/(app)/admin/+layout.server.ts | 13 + .../(app)/admin/dashboard/+page.server.ts | 91 + src/routes/(app)/admin/dashboard/+page.svelte | 295 ++ .../admin/email-templates/+page.server.ts | 83 + .../(app)/admin/email-templates/+page.svelte | 566 +++ .../(app)/admin/email-testing/+page.server.ts | 425 ++ .../(app)/admin/email-testing/+page.svelte | 561 ++ .../(app)/admin/members/+page.server.ts | 430 ++ src/routes/(app)/admin/members/+page.svelte | 596 +++ .../(app)/admin/settings/+page.server.ts | 709 +++ src/routes/(app)/admin/settings/+page.svelte | 1703 +++++++ src/routes/(app)/board/+layout.server.ts | 13 + .../(app)/board/documents/+page.server.ts | 480 ++ src/routes/(app)/board/documents/+page.svelte | 719 +++ src/routes/(app)/board/dues/+page.server.ts | 345 ++ src/routes/(app)/board/dues/+page.svelte | 679 +++ .../(app)/board/dues/reports/+page.server.ts | 169 + .../(app)/board/dues/reports/+page.svelte | 346 ++ src/routes/(app)/board/events/+page.server.ts | 161 + src/routes/(app)/board/events/+page.svelte | 580 +++ .../events/[id]/attendees/+page.server.ts | 449 ++ .../board/events/[id]/attendees/+page.svelte | 919 ++++ .../board/events/[id]/edit/+page.server.ts | 124 + .../(app)/board/events/[id]/edit/+page.svelte | 416 ++ .../events/[id]/roll-call/+page.server.ts | 281 + .../board/events/[id]/roll-call/+page.svelte | 513 ++ .../(app)/board/members/+page.server.ts | 62 + src/routes/(app)/board/members/+page.svelte | 374 ++ .../(app)/board/reports/+page.server.ts | 141 + src/routes/(app)/board/reports/+page.svelte | 511 ++ src/routes/(app)/dashboard/+page.server.ts | 84 + src/routes/(app)/dashboard/+page.svelte | 110 + src/routes/(app)/documents/+page.server.ts | 49 + src/routes/(app)/documents/+page.svelte | 270 + src/routes/(app)/events/+page.server.ts | 31 + src/routes/(app)/events/+page.svelte | 340 ++ src/routes/(app)/events/[id]/+page.server.ts | 314 ++ src/routes/(app)/events/[id]/+page.svelte | 483 ++ src/routes/(app)/payments/+page.server.ts | 42 + src/routes/(app)/payments/+page.svelte | 286 ++ src/routes/(app)/profile/+page.server.ts | 167 + src/routes/(app)/profile/+page.svelte | 374 ++ src/routes/(app)/settings/+page.server.ts | 422 ++ src/routes/(app)/settings/+page.svelte | 1186 +++++ src/routes/(auth)/+layout.svelte | 57 + .../(auth)/forgot-password/+page.server.ts | 34 + .../(auth)/forgot-password/+page.svelte | 83 + src/routes/(auth)/login/+page.server.ts | 90 + src/routes/(auth)/login/+page.svelte | 110 + src/routes/(auth)/signup/+page.server.ts | 235 + src/routes/(auth)/signup/+page.svelte | 256 + src/routes/+error.svelte | 143 + src/routes/+layout.svelte | 22 + src/routes/+page.server.ts | 13 + src/routes/+page.svelte | 222 + .../api/auth/check-verification/+server.ts | 16 + .../api/auth/resend-verification/+server.ts | 30 + .../api/calendar/events/[id]/+server.ts | 97 + src/routes/api/calendar/feed/+server.ts | 117 + .../calendar/public/events/[id]/+server.ts | 77 + src/routes/api/cron/dues-reminders/+server.ts | 256 + .../api/cron/event-reminders/+server.ts | 158 + src/routes/auth/callback/+server.ts | 32 + .../auth/reset-password/+page.server.ts | 111 + src/routes/auth/reset-password/+page.svelte | 125 + src/routes/auth/verify/+server.ts | 66 + src/routes/join/+layout.svelte | 57 + src/routes/join/+page.server.ts | 350 ++ src/routes/join/+page.svelte | 773 +++ src/routes/logout/+server.ts | 12 + src/routes/public/events/[id]/+page.server.ts | 105 + src/routes/public/events/[id]/+page.svelte | 369 ++ static/MONACOUSA-Flags_376x376.png | Bin 0 -> 144854 bytes static/apple-touch-icon.png | Bin 0 -> 36419 bytes static/favicon-32x32.png | Bin 0 -> 2067 bytes static/flags/ad.svg | 150 + static/flags/ae.svg | 6 + static/flags/af.svg | 81 + static/flags/ag.svg | 14 + static/flags/ai.svg | 29 + static/flags/al.svg | 5 + static/flags/am.svg | 5 + static/flags/ao.svg | 13 + static/flags/aq.svg | 5 + static/flags/ar.svg | 32 + static/flags/arab.svg | 109 + static/flags/as.svg | 72 + static/flags/asean.svg | 13 + static/flags/at.svg | 4 + static/flags/au.svg | 8 + static/flags/aw.svg | 186 + static/flags/ax.svg | 18 + static/flags/az.svg | 8 + static/flags/ba.svg | 12 + static/flags/bb.svg | 6 + static/flags/bd.svg | 4 + static/flags/be.svg | 7 + static/flags/bf.svg | 7 + static/flags/bg.svg | 5 + static/flags/bh.svg | 4 + static/flags/bi.svg | 15 + static/flags/bj.svg | 14 + static/flags/bl.svg | 5 + static/flags/bm.svg | 97 + static/flags/bn.svg | 36 + static/flags/bo.svg | 673 +++ static/flags/bq.svg | 5 + static/flags/br.svg | 45 + static/flags/bs.svg | 13 + static/flags/bt.svg | 89 + static/flags/bv.svg | 13 + static/flags/bw.svg | 7 + static/flags/by.svg | 18 + static/flags/bz.svg | 145 + static/flags/ca.svg | 4 + static/flags/cc.svg | 19 + static/flags/cd.svg | 5 + static/flags/cefta.svg | 13 + static/flags/cf.svg | 15 + static/flags/cg.svg | 12 + static/flags/ch.svg | 9 + static/flags/ci.svg | 7 + static/flags/ck.svg | 9 + static/flags/cl.svg | 13 + static/flags/cm.svg | 15 + static/flags/cn.svg | 11 + static/flags/co.svg | 7 + static/flags/cp.svg | 7 + static/flags/cr.svg | 7 + static/flags/cu.svg | 13 + static/flags/cv.svg | 13 + static/flags/cw.svg | 14 + static/flags/cx.svg | 15 + static/flags/cy.svg | 6 + static/flags/cz.svg | 5 + static/flags/de.svg | 5 + static/flags/dg.svg | 130 + static/flags/dj.svg | 13 + static/flags/dk.svg | 5 + static/flags/dm.svg | 152 + static/flags/do.svg | 121 + static/flags/dz.svg | 5 + static/flags/eac.svg | 48 + static/flags/ec.svg | 138 + static/flags/ee.svg | 5 + static/flags/eg.svg | 38 + static/flags/eh.svg | 16 + static/flags/er.svg | 8 + static/flags/es-ct.svg | 4 + static/flags/es-ga.svg | 187 + static/flags/es-pv.svg | 5 + static/flags/es.svg | 544 ++ static/flags/et.svg | 14 + static/flags/eu.svg | 28 + static/flags/fi.svg | 5 + static/flags/fj.svg | 120 + static/flags/fk.svg | 90 + static/flags/fm.svg | 11 + static/flags/fo.svg | 12 + static/flags/fr.svg | 5 + static/flags/ga.svg | 7 + static/flags/gb-eng.svg | 5 + static/flags/gb-nir.svg | 132 + static/flags/gb-sct.svg | 4 + static/flags/gb-wls.svg | 9 + static/flags/gb.svg | 7 + static/flags/gd.svg | 27 + static/flags/ge.svg | 6 + static/flags/gf.svg | 5 + static/flags/gg.svg | 9 + static/flags/gh.svg | 6 + static/flags/gi.svg | 32 + static/flags/gl.svg | 4 + static/flags/gm.svg | 14 + static/flags/gn.svg | 7 + static/flags/gp.svg | 5 + static/flags/gq.svg | 23 + static/flags/gr.svg | 16 + static/flags/gs.svg | 133 + static/flags/gt.svg | 204 + static/flags/gu.svg | 19 + static/flags/gw.svg | 13 + static/flags/gy.svg | 9 + static/flags/hk.svg | 8 + static/flags/hm.svg | 8 + static/flags/hn.svg | 18 + static/flags/hr.svg | 58 + static/flags/ht.svg | 116 + static/flags/hu.svg | 7 + static/flags/ic.svg | 7 + static/flags/id.svg | 4 + static/flags/ie.svg | 7 + static/flags/il.svg | 14 + static/flags/im.svg | 36 + static/flags/in.svg | 25 + static/flags/io.svg | 130 + static/flags/iq.svg | 10 + static/flags/ir.svg | 219 + static/flags/is.svg | 12 + static/flags/it.svg | 7 + static/flags/je.svg | 62 + static/flags/jm.svg | 8 + static/flags/jo.svg | 16 + static/flags/jp.svg | 11 + static/flags/ke.svg | 23 + static/flags/kg.svg | 4 + static/flags/kh.svg | 61 + static/flags/ki.svg | 36 + static/flags/km.svg | 16 + static/flags/kn.svg | 14 + static/flags/kp.svg | 15 + static/flags/kr.svg | 24 + static/flags/kw.svg | 13 + static/flags/ky.svg | 103 + static/flags/kz.svg | 36 + static/flags/la.svg | 12 + static/flags/lb.svg | 15 + static/flags/lc.svg | 8 + static/flags/li.svg | 43 + static/flags/lk.svg | 22 + static/flags/lr.svg | 14 + static/flags/ls.svg | 8 + static/flags/lt.svg | 7 + static/flags/lu.svg | 5 + static/flags/lv.svg | 6 + static/flags/ly.svg | 13 + static/flags/ma.svg | 4 + static/flags/mc.svg | 6 + static/flags/md.svg | 70 + static/flags/me.svg | 116 + static/flags/mf.svg | 5 + static/flags/mg.svg | 7 + static/flags/mh.svg | 7 + static/flags/mk.svg | 5 + static/flags/ml.svg | 7 + static/flags/mm.svg | 12 + static/flags/mn.svg | 14 + static/flags/mo.svg | 9 + static/flags/mp.svg | 86 + static/flags/mq.svg | 5 + static/flags/mr.svg | 6 + static/flags/ms.svg | 29 + static/flags/mt.svg | 58 + static/flags/mu.svg | 8 + static/flags/mv.svg | 6 + static/flags/mw.svg | 10 + static/flags/mx.svg | 382 ++ static/flags/my.svg | 26 + static/flags/mz.svg | 21 + static/flags/na.svg | 16 + static/flags/nc.svg | 13 + static/flags/ne.svg | 6 + static/flags/nf.svg | 9 + static/flags/ng.svg | 6 + static/flags/ni.svg | 129 + static/flags/nl.svg | 5 + static/flags/no.svg | 7 + static/flags/np.svg | 13 + static/flags/nr.svg | 12 + static/flags/nu.svg | 10 + static/flags/nz.svg | 36 + static/flags/om.svg | 115 + static/flags/pa.svg | 14 + static/flags/pc.svg | 33 + static/flags/pe.svg | 4 + static/flags/pf.svg | 19 + static/flags/pg.svg | 9 + static/flags/ph.svg | 6 + static/flags/pk.svg | 15 + static/flags/pl.svg | 6 + static/flags/pm.svg | 5 + static/flags/pn.svg | 53 + static/flags/pr.svg | 13 + static/flags/ps.svg | 6 + static/flags/pt.svg | 57 + static/flags/pw.svg | 11 + static/flags/py.svg | 157 + static/flags/qa.svg | 4 + static/flags/re.svg | 5 + static/flags/ro.svg | 7 + static/flags/rs.svg | 292 ++ static/flags/ru.svg | 5 + static/flags/rw.svg | 13 + static/flags/sa.svg | 25 + static/flags/sb.svg | 13 + static/flags/sc.svg | 7 + static/flags/sd.svg | 13 + static/flags/se.svg | 4 + static/flags/sg.svg | 13 + static/flags/sh-ac.svg | 689 +++ static/flags/sh-hl.svg | 164 + static/flags/sh-ta.svg | 76 + static/flags/sh.svg | 7 + static/flags/si.svg | 18 + static/flags/sj.svg | 7 + static/flags/sk.svg | 9 + static/flags/sl.svg | 7 + static/flags/sm.svg | 75 + static/flags/sn.svg | 8 + static/flags/so.svg | 11 + static/flags/sr.svg | 6 + static/flags/ss.svg | 8 + static/flags/st.svg | 16 + static/flags/sv.svg | 593 +++ static/flags/sx.svg | 56 + static/flags/sy.svg | 6 + static/flags/sz.svg | 34 + static/flags/tc.svg | 50 + static/flags/td.svg | 7 + static/flags/tf.svg | 15 + static/flags/tg.svg | 14 + static/flags/th.svg | 7 + static/flags/tj.svg | 22 + static/flags/tk.svg | 5 + static/flags/tl.svg | 13 + static/flags/tm.svg | 204 + static/flags/tn.svg | 4 + static/flags/to.svg | 10 + static/flags/tr.svg | 8 + static/flags/tt.svg | 5 + static/flags/tv.svg | 9 + static/flags/tw.svg | 34 + static/flags/tz.svg | 13 + static/flags/ua.svg | 6 + static/flags/ug.svg | 30 + static/flags/um.svg | 9 + static/flags/un.svg | 16 + static/flags/us.svg | 9 + static/flags/uy.svg | 28 + static/flags/uz.svg | 30 + static/flags/va.svg | 190 + static/flags/vc.svg | 8 + static/flags/ve.svg | 26 + static/flags/vg.svg | 59 + static/flags/vi.svg | 28 + static/flags/vn.svg | 11 + static/flags/vu.svg | 21 + static/flags/wf.svg | 5 + static/flags/ws.svg | 7 + static/flags/xk.svg | 5 + static/flags/xx.svg | 4 + static/flags/ye.svg | 7 + static/flags/yt.svg | 5 + static/flags/za.svg | 17 + static/flags/zm.svg | 27 + static/flags/zw.svg | 21 + static/icon-192x192.png | Bin 0 -> 40917 bytes static/icon-512x512.png | Bin 0 -> 260525 bytes static/monaco_high_res.jpg | Bin 0 -> 651114 bytes static/robots.txt | 3 + supabase/docker/kong.yml | 196 + supabase/fix_rls_now.sql | 146 + supabase/migrations/001_initial_schema.sql | 786 +++ .../002_admin_integrations_settings.sql | 35 + .../003_storage_buckets_and_audit.sql | 504 ++ .../004_user_notification_preferences.sql | 102 + .../005_fix_avatars_storage_policy.sql | 37 + supabase/migrations/006_document_folders.sql | 100 + supabase/migrations/007_dues_reminders.sql | 307 ++ .../migrations/008_s3_public_endpoint.sql | 11 + supabase/migrations/009_dual_avatar_urls.sql | 22 + .../010_storage_service_role_policies.sql | 79 + .../migrations/011_fix_service_role_rls.sql | 98 + .../migrations/012_dual_document_urls.sql | 49 + .../013_email_background_images.sql | 671 +++ supabase/migrations/014_event_reminders.sql | 133 + .../015_fix_email_template_styling.sql | 192 + .../016_onboarding_payment_tracking.sql | 237 + svelte.config.js | 18 + tsconfig.json | 20 + vite.config.ts | 11 + 457 files changed, 54912 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .gitea/workflows/build.yml create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 ARCHITECTURE.md create mode 100644 DEPLOYMENT.md create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 build.log create mode 100644 components.json create mode 100644 deploy.sh create mode 100644 dev-output.txt create mode 100644 dev.log create mode 100644 docker-compose.nginx.yml create mode 100644 docker-compose.prod.yml create mode 100644 docker-compose.yml create mode 100644 nginx/portal.monacousa.org.conf create mode 100644 nginx/portal.monacousa.org.initial.conf create mode 100644 npm.log create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 src/app.css create mode 100644 src/app.d.ts create mode 100644 src/app.html create mode 100644 src/hooks.server.ts create mode 100644 src/lib/assets/favicon.svg create mode 100644 src/lib/components/EmailVerificationBanner.svelte create mode 100644 src/lib/components/auth/FormField.svelte create mode 100644 src/lib/components/auth/FormMessage.svelte create mode 100644 src/lib/components/auth/LoadingSpinner.svelte create mode 100644 src/lib/components/auth/index.ts create mode 100644 src/lib/components/dashboard/DuesStatusCard.svelte create mode 100644 src/lib/components/dashboard/QuickActionsCard.svelte create mode 100644 src/lib/components/dashboard/StatsCard.svelte create mode 100644 src/lib/components/dashboard/UpcomingEventsCard.svelte create mode 100644 src/lib/components/dashboard/WelcomeCard.svelte create mode 100644 src/lib/components/dashboard/index.ts create mode 100644 src/lib/components/documents/CreateFolderModal.svelte create mode 100644 src/lib/components/documents/DocumentPreviewModal.svelte create mode 100644 src/lib/components/documents/FolderBreadcrumbs.svelte create mode 100644 src/lib/components/documents/FolderItem.svelte create mode 100644 src/lib/components/documents/index.ts create mode 100644 src/lib/components/layout/Header.svelte create mode 100644 src/lib/components/layout/MobileMenu.svelte create mode 100644 src/lib/components/layout/MobileNav.svelte create mode 100644 src/lib/components/layout/Sidebar.svelte create mode 100644 src/lib/components/layout/index.ts create mode 100644 src/lib/components/ui/AddToCalendarButton.svelte create mode 100644 src/lib/components/ui/CountryFlag.svelte create mode 100644 src/lib/components/ui/CountrySelect.svelte create mode 100644 src/lib/components/ui/DatePicker.svelte create mode 100644 src/lib/components/ui/NationalitySelect.svelte create mode 100644 src/lib/components/ui/PhoneInput.svelte create mode 100644 src/lib/components/ui/button/button.svelte create mode 100644 src/lib/components/ui/button/index.ts create mode 100644 src/lib/components/ui/card/card-content.svelte create mode 100644 src/lib/components/ui/card/card-description.svelte create mode 100644 src/lib/components/ui/card/card-footer.svelte create mode 100644 src/lib/components/ui/card/card-header.svelte create mode 100644 src/lib/components/ui/card/card-title.svelte create mode 100644 src/lib/components/ui/card/card.svelte create mode 100644 src/lib/components/ui/card/index.ts create mode 100644 src/lib/components/ui/index.ts create mode 100644 src/lib/components/ui/input/index.ts create mode 100644 src/lib/components/ui/input/input.svelte create mode 100644 src/lib/components/ui/label/index.ts create mode 100644 src/lib/components/ui/label/label.svelte create mode 100644 src/lib/index.ts create mode 100644 src/lib/server/audit.ts create mode 100644 src/lib/server/dues.ts create mode 100644 src/lib/server/email.ts create mode 100644 src/lib/server/event-reminders.ts create mode 100644 src/lib/server/ical.ts create mode 100644 src/lib/server/poste.ts create mode 100644 src/lib/server/storage.ts create mode 100644 src/lib/server/supabase.ts create mode 100644 src/lib/supabase.ts create mode 100644 src/lib/types/database.ts create mode 100644 src/lib/utils/countries.ts create mode 100644 src/lib/utils/index.ts create mode 100644 src/lib/utils/phoneCountries.ts create mode 100644 src/routes/(app)/+error.svelte create mode 100644 src/routes/(app)/+layout.server.ts create mode 100644 src/routes/(app)/+layout.svelte create mode 100644 src/routes/(app)/admin/+layout.server.ts create mode 100644 src/routes/(app)/admin/dashboard/+page.server.ts create mode 100644 src/routes/(app)/admin/dashboard/+page.svelte create mode 100644 src/routes/(app)/admin/email-templates/+page.server.ts create mode 100644 src/routes/(app)/admin/email-templates/+page.svelte create mode 100644 src/routes/(app)/admin/email-testing/+page.server.ts create mode 100644 src/routes/(app)/admin/email-testing/+page.svelte create mode 100644 src/routes/(app)/admin/members/+page.server.ts create mode 100644 src/routes/(app)/admin/members/+page.svelte create mode 100644 src/routes/(app)/admin/settings/+page.server.ts create mode 100644 src/routes/(app)/admin/settings/+page.svelte create mode 100644 src/routes/(app)/board/+layout.server.ts create mode 100644 src/routes/(app)/board/documents/+page.server.ts create mode 100644 src/routes/(app)/board/documents/+page.svelte create mode 100644 src/routes/(app)/board/dues/+page.server.ts create mode 100644 src/routes/(app)/board/dues/+page.svelte create mode 100644 src/routes/(app)/board/dues/reports/+page.server.ts create mode 100644 src/routes/(app)/board/dues/reports/+page.svelte create mode 100644 src/routes/(app)/board/events/+page.server.ts create mode 100644 src/routes/(app)/board/events/+page.svelte create mode 100644 src/routes/(app)/board/events/[id]/attendees/+page.server.ts create mode 100644 src/routes/(app)/board/events/[id]/attendees/+page.svelte create mode 100644 src/routes/(app)/board/events/[id]/edit/+page.server.ts create mode 100644 src/routes/(app)/board/events/[id]/edit/+page.svelte create mode 100644 src/routes/(app)/board/events/[id]/roll-call/+page.server.ts create mode 100644 src/routes/(app)/board/events/[id]/roll-call/+page.svelte create mode 100644 src/routes/(app)/board/members/+page.server.ts create mode 100644 src/routes/(app)/board/members/+page.svelte create mode 100644 src/routes/(app)/board/reports/+page.server.ts create mode 100644 src/routes/(app)/board/reports/+page.svelte create mode 100644 src/routes/(app)/dashboard/+page.server.ts create mode 100644 src/routes/(app)/dashboard/+page.svelte create mode 100644 src/routes/(app)/documents/+page.server.ts create mode 100644 src/routes/(app)/documents/+page.svelte create mode 100644 src/routes/(app)/events/+page.server.ts create mode 100644 src/routes/(app)/events/+page.svelte create mode 100644 src/routes/(app)/events/[id]/+page.server.ts create mode 100644 src/routes/(app)/events/[id]/+page.svelte create mode 100644 src/routes/(app)/payments/+page.server.ts create mode 100644 src/routes/(app)/payments/+page.svelte create mode 100644 src/routes/(app)/profile/+page.server.ts create mode 100644 src/routes/(app)/profile/+page.svelte create mode 100644 src/routes/(app)/settings/+page.server.ts create mode 100644 src/routes/(app)/settings/+page.svelte create mode 100644 src/routes/(auth)/+layout.svelte create mode 100644 src/routes/(auth)/forgot-password/+page.server.ts create mode 100644 src/routes/(auth)/forgot-password/+page.svelte create mode 100644 src/routes/(auth)/login/+page.server.ts create mode 100644 src/routes/(auth)/login/+page.svelte create mode 100644 src/routes/(auth)/signup/+page.server.ts create mode 100644 src/routes/(auth)/signup/+page.svelte create mode 100644 src/routes/+error.svelte create mode 100644 src/routes/+layout.svelte create mode 100644 src/routes/+page.server.ts create mode 100644 src/routes/+page.svelte create mode 100644 src/routes/api/auth/check-verification/+server.ts create mode 100644 src/routes/api/auth/resend-verification/+server.ts create mode 100644 src/routes/api/calendar/events/[id]/+server.ts create mode 100644 src/routes/api/calendar/feed/+server.ts create mode 100644 src/routes/api/calendar/public/events/[id]/+server.ts create mode 100644 src/routes/api/cron/dues-reminders/+server.ts create mode 100644 src/routes/api/cron/event-reminders/+server.ts create mode 100644 src/routes/auth/callback/+server.ts create mode 100644 src/routes/auth/reset-password/+page.server.ts create mode 100644 src/routes/auth/reset-password/+page.svelte create mode 100644 src/routes/auth/verify/+server.ts create mode 100644 src/routes/join/+layout.svelte create mode 100644 src/routes/join/+page.server.ts create mode 100644 src/routes/join/+page.svelte create mode 100644 src/routes/logout/+server.ts create mode 100644 src/routes/public/events/[id]/+page.server.ts create mode 100644 src/routes/public/events/[id]/+page.svelte create mode 100644 static/MONACOUSA-Flags_376x376.png create mode 100644 static/apple-touch-icon.png create mode 100644 static/favicon-32x32.png create mode 100644 static/flags/ad.svg create mode 100644 static/flags/ae.svg create mode 100644 static/flags/af.svg create mode 100644 static/flags/ag.svg create mode 100644 static/flags/ai.svg create mode 100644 static/flags/al.svg create mode 100644 static/flags/am.svg create mode 100644 static/flags/ao.svg create mode 100644 static/flags/aq.svg create mode 100644 static/flags/ar.svg create mode 100644 static/flags/arab.svg create mode 100644 static/flags/as.svg create mode 100644 static/flags/asean.svg create mode 100644 static/flags/at.svg create mode 100644 static/flags/au.svg create mode 100644 static/flags/aw.svg create mode 100644 static/flags/ax.svg create mode 100644 static/flags/az.svg create mode 100644 static/flags/ba.svg create mode 100644 static/flags/bb.svg create mode 100644 static/flags/bd.svg create mode 100644 static/flags/be.svg create mode 100644 static/flags/bf.svg create mode 100644 static/flags/bg.svg create mode 100644 static/flags/bh.svg create mode 100644 static/flags/bi.svg create mode 100644 static/flags/bj.svg create mode 100644 static/flags/bl.svg create mode 100644 static/flags/bm.svg create mode 100644 static/flags/bn.svg create mode 100644 static/flags/bo.svg create mode 100644 static/flags/bq.svg create mode 100644 static/flags/br.svg create mode 100644 static/flags/bs.svg create mode 100644 static/flags/bt.svg create mode 100644 static/flags/bv.svg create mode 100644 static/flags/bw.svg create mode 100644 static/flags/by.svg create mode 100644 static/flags/bz.svg create mode 100644 static/flags/ca.svg create mode 100644 static/flags/cc.svg create mode 100644 static/flags/cd.svg create mode 100644 static/flags/cefta.svg create mode 100644 static/flags/cf.svg create mode 100644 static/flags/cg.svg create mode 100644 static/flags/ch.svg create mode 100644 static/flags/ci.svg create mode 100644 static/flags/ck.svg create mode 100644 static/flags/cl.svg create mode 100644 static/flags/cm.svg create mode 100644 static/flags/cn.svg create mode 100644 static/flags/co.svg create mode 100644 static/flags/cp.svg create mode 100644 static/flags/cr.svg create mode 100644 static/flags/cu.svg create mode 100644 static/flags/cv.svg create mode 100644 static/flags/cw.svg create mode 100644 static/flags/cx.svg create mode 100644 static/flags/cy.svg create mode 100644 static/flags/cz.svg create mode 100644 static/flags/de.svg create mode 100644 static/flags/dg.svg create mode 100644 static/flags/dj.svg create mode 100644 static/flags/dk.svg create mode 100644 static/flags/dm.svg create mode 100644 static/flags/do.svg create mode 100644 static/flags/dz.svg create mode 100644 static/flags/eac.svg create mode 100644 static/flags/ec.svg create mode 100644 static/flags/ee.svg create mode 100644 static/flags/eg.svg create mode 100644 static/flags/eh.svg create mode 100644 static/flags/er.svg create mode 100644 static/flags/es-ct.svg create mode 100644 static/flags/es-ga.svg create mode 100644 static/flags/es-pv.svg create mode 100644 static/flags/es.svg create mode 100644 static/flags/et.svg create mode 100644 static/flags/eu.svg create mode 100644 static/flags/fi.svg create mode 100644 static/flags/fj.svg create mode 100644 static/flags/fk.svg create mode 100644 static/flags/fm.svg create mode 100644 static/flags/fo.svg create mode 100644 static/flags/fr.svg create mode 100644 static/flags/ga.svg create mode 100644 static/flags/gb-eng.svg create mode 100644 static/flags/gb-nir.svg create mode 100644 static/flags/gb-sct.svg create mode 100644 static/flags/gb-wls.svg create mode 100644 static/flags/gb.svg create mode 100644 static/flags/gd.svg create mode 100644 static/flags/ge.svg create mode 100644 static/flags/gf.svg create mode 100644 static/flags/gg.svg create mode 100644 static/flags/gh.svg create mode 100644 static/flags/gi.svg create mode 100644 static/flags/gl.svg create mode 100644 static/flags/gm.svg create mode 100644 static/flags/gn.svg create mode 100644 static/flags/gp.svg create mode 100644 static/flags/gq.svg create mode 100644 static/flags/gr.svg create mode 100644 static/flags/gs.svg create mode 100644 static/flags/gt.svg create mode 100644 static/flags/gu.svg create mode 100644 static/flags/gw.svg create mode 100644 static/flags/gy.svg create mode 100644 static/flags/hk.svg create mode 100644 static/flags/hm.svg create mode 100644 static/flags/hn.svg create mode 100644 static/flags/hr.svg create mode 100644 static/flags/ht.svg create mode 100644 static/flags/hu.svg create mode 100644 static/flags/ic.svg create mode 100644 static/flags/id.svg create mode 100644 static/flags/ie.svg create mode 100644 static/flags/il.svg create mode 100644 static/flags/im.svg create mode 100644 static/flags/in.svg create mode 100644 static/flags/io.svg create mode 100644 static/flags/iq.svg create mode 100644 static/flags/ir.svg create mode 100644 static/flags/is.svg create mode 100644 static/flags/it.svg create mode 100644 static/flags/je.svg create mode 100644 static/flags/jm.svg create mode 100644 static/flags/jo.svg create mode 100644 static/flags/jp.svg create mode 100644 static/flags/ke.svg create mode 100644 static/flags/kg.svg create mode 100644 static/flags/kh.svg create mode 100644 static/flags/ki.svg create mode 100644 static/flags/km.svg create mode 100644 static/flags/kn.svg create mode 100644 static/flags/kp.svg create mode 100644 static/flags/kr.svg create mode 100644 static/flags/kw.svg create mode 100644 static/flags/ky.svg create mode 100644 static/flags/kz.svg create mode 100644 static/flags/la.svg create mode 100644 static/flags/lb.svg create mode 100644 static/flags/lc.svg create mode 100644 static/flags/li.svg create mode 100644 static/flags/lk.svg create mode 100644 static/flags/lr.svg create mode 100644 static/flags/ls.svg create mode 100644 static/flags/lt.svg create mode 100644 static/flags/lu.svg create mode 100644 static/flags/lv.svg create mode 100644 static/flags/ly.svg create mode 100644 static/flags/ma.svg create mode 100644 static/flags/mc.svg create mode 100644 static/flags/md.svg create mode 100644 static/flags/me.svg create mode 100644 static/flags/mf.svg create mode 100644 static/flags/mg.svg create mode 100644 static/flags/mh.svg create mode 100644 static/flags/mk.svg create mode 100644 static/flags/ml.svg create mode 100644 static/flags/mm.svg create mode 100644 static/flags/mn.svg create mode 100644 static/flags/mo.svg create mode 100644 static/flags/mp.svg create mode 100644 static/flags/mq.svg create mode 100644 static/flags/mr.svg create mode 100644 static/flags/ms.svg create mode 100644 static/flags/mt.svg create mode 100644 static/flags/mu.svg create mode 100644 static/flags/mv.svg create mode 100644 static/flags/mw.svg create mode 100644 static/flags/mx.svg create mode 100644 static/flags/my.svg create mode 100644 static/flags/mz.svg create mode 100644 static/flags/na.svg create mode 100644 static/flags/nc.svg create mode 100644 static/flags/ne.svg create mode 100644 static/flags/nf.svg create mode 100644 static/flags/ng.svg create mode 100644 static/flags/ni.svg create mode 100644 static/flags/nl.svg create mode 100644 static/flags/no.svg create mode 100644 static/flags/np.svg create mode 100644 static/flags/nr.svg create mode 100644 static/flags/nu.svg create mode 100644 static/flags/nz.svg create mode 100644 static/flags/om.svg create mode 100644 static/flags/pa.svg create mode 100644 static/flags/pc.svg create mode 100644 static/flags/pe.svg create mode 100644 static/flags/pf.svg create mode 100644 static/flags/pg.svg create mode 100644 static/flags/ph.svg create mode 100644 static/flags/pk.svg create mode 100644 static/flags/pl.svg create mode 100644 static/flags/pm.svg create mode 100644 static/flags/pn.svg create mode 100644 static/flags/pr.svg create mode 100644 static/flags/ps.svg create mode 100644 static/flags/pt.svg create mode 100644 static/flags/pw.svg create mode 100644 static/flags/py.svg create mode 100644 static/flags/qa.svg create mode 100644 static/flags/re.svg create mode 100644 static/flags/ro.svg create mode 100644 static/flags/rs.svg create mode 100644 static/flags/ru.svg create mode 100644 static/flags/rw.svg create mode 100644 static/flags/sa.svg create mode 100644 static/flags/sb.svg create mode 100644 static/flags/sc.svg create mode 100644 static/flags/sd.svg create mode 100644 static/flags/se.svg create mode 100644 static/flags/sg.svg create mode 100644 static/flags/sh-ac.svg create mode 100644 static/flags/sh-hl.svg create mode 100644 static/flags/sh-ta.svg create mode 100644 static/flags/sh.svg create mode 100644 static/flags/si.svg create mode 100644 static/flags/sj.svg create mode 100644 static/flags/sk.svg create mode 100644 static/flags/sl.svg create mode 100644 static/flags/sm.svg create mode 100644 static/flags/sn.svg create mode 100644 static/flags/so.svg create mode 100644 static/flags/sr.svg create mode 100644 static/flags/ss.svg create mode 100644 static/flags/st.svg create mode 100644 static/flags/sv.svg create mode 100644 static/flags/sx.svg create mode 100644 static/flags/sy.svg create mode 100644 static/flags/sz.svg create mode 100644 static/flags/tc.svg create mode 100644 static/flags/td.svg create mode 100644 static/flags/tf.svg create mode 100644 static/flags/tg.svg create mode 100644 static/flags/th.svg create mode 100644 static/flags/tj.svg create mode 100644 static/flags/tk.svg create mode 100644 static/flags/tl.svg create mode 100644 static/flags/tm.svg create mode 100644 static/flags/tn.svg create mode 100644 static/flags/to.svg create mode 100644 static/flags/tr.svg create mode 100644 static/flags/tt.svg create mode 100644 static/flags/tv.svg create mode 100644 static/flags/tw.svg create mode 100644 static/flags/tz.svg create mode 100644 static/flags/ua.svg create mode 100644 static/flags/ug.svg create mode 100644 static/flags/um.svg create mode 100644 static/flags/un.svg create mode 100644 static/flags/us.svg create mode 100644 static/flags/uy.svg create mode 100644 static/flags/uz.svg create mode 100644 static/flags/va.svg create mode 100644 static/flags/vc.svg create mode 100644 static/flags/ve.svg create mode 100644 static/flags/vg.svg create mode 100644 static/flags/vi.svg create mode 100644 static/flags/vn.svg create mode 100644 static/flags/vu.svg create mode 100644 static/flags/wf.svg create mode 100644 static/flags/ws.svg create mode 100644 static/flags/xk.svg create mode 100644 static/flags/xx.svg create mode 100644 static/flags/ye.svg create mode 100644 static/flags/yt.svg create mode 100644 static/flags/za.svg create mode 100644 static/flags/zm.svg create mode 100644 static/flags/zw.svg create mode 100644 static/icon-192x192.png create mode 100644 static/icon-512x512.png create mode 100644 static/monaco_high_res.jpg create mode 100644 static/robots.txt create mode 100644 supabase/docker/kong.yml create mode 100644 supabase/fix_rls_now.sql create mode 100644 supabase/migrations/001_initial_schema.sql create mode 100644 supabase/migrations/002_admin_integrations_settings.sql create mode 100644 supabase/migrations/003_storage_buckets_and_audit.sql create mode 100644 supabase/migrations/004_user_notification_preferences.sql create mode 100644 supabase/migrations/005_fix_avatars_storage_policy.sql create mode 100644 supabase/migrations/006_document_folders.sql create mode 100644 supabase/migrations/007_dues_reminders.sql create mode 100644 supabase/migrations/008_s3_public_endpoint.sql create mode 100644 supabase/migrations/009_dual_avatar_urls.sql create mode 100644 supabase/migrations/010_storage_service_role_policies.sql create mode 100644 supabase/migrations/011_fix_service_role_rls.sql create mode 100644 supabase/migrations/012_dual_document_urls.sql create mode 100644 supabase/migrations/013_email_background_images.sql create mode 100644 supabase/migrations/014_event_reminders.sql create mode 100644 supabase/migrations/015_fix_email_template_styling.sql create mode 100644 supabase/migrations/016_onboarding_payment_tracking.sql create mode 100644 svelte.config.js create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..10254b3 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,47 @@ +# Dependencies +node_modules +.pnpm-store + +# Build output +build +.svelte-kit + +# Environment files (we pass these at runtime) +.env +.env.* +!.env.example + +# Git +.git +.gitignore + +# IDE +.vscode +.idea +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db + +# Logs +*.log +npm-debug.log* + +# Test +coverage +.nyc_output + +# Docker +Dockerfile* +docker-compose*.yml +.dockerignore + +# Supabase local +supabase/.temp +supabase/.branches + +# Misc +*.md +LICENSE diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..2de8f49 --- /dev/null +++ b/.env.example @@ -0,0 +1,89 @@ +# Monaco USA Portal - Docker Environment Configuration +# =================================================== +# Copy this file to .env and configure your values + +# =========================================== +# POSTGRES DATABASE +# =========================================== +POSTGRES_USER=postgres +POSTGRES_PASSWORD=change-this-to-a-secure-password +POSTGRES_DB=postgres +POSTGRES_PORT=5435 + +# =========================================== +# JWT CONFIGURATION +# =========================================== +# IMPORTANT: Generate a new secret for production! +# Use: openssl rand -base64 32 +JWT_SECRET=generate-a-new-secret-at-least-32-characters +JWT_EXPIRY=3600 + +# =========================================== +# API KEYS +# =========================================== +# Generate these at: https://supabase.com/docs/guides/self-hosting#api-keys +# They must be signed with your JWT_SECRET + +# Anonymous key - for public access (limited permissions) +ANON_KEY=your-generated-anon-key + +# Service role key - for admin access (full permissions, keep secret!) +SERVICE_ROLE_KEY=your-generated-service-role-key + +# =========================================== +# URLS & PORTS +# =========================================== +KONG_HTTP_PORT=7455 +KONG_HTTPS_PORT=7456 +STUDIO_PORT=7454 +PORTAL_PORT=7453 + +SITE_URL=http://localhost:7453 +API_EXTERNAL_URL=http://localhost:7455 +SUPABASE_PUBLIC_URL=http://localhost:7455 + +PUBLIC_SUPABASE_URL=http://localhost:7455 +PUBLIC_SUPABASE_ANON_KEY=same-as-anon-key-above + +# Service role key for admin operations (server-side only) +SUPABASE_SERVICE_ROLE_KEY=same-as-service-role-key-above + +# =========================================== +# AUTH CONFIGURATION +# =========================================== +DISABLE_SIGNUP=false +ENABLE_EMAIL_AUTOCONFIRM=true +ADDITIONAL_REDIRECT_URLS=http://localhost:7453/auth/callback + +# =========================================== +# SMTP EMAIL (Optional) +# =========================================== +SMTP_HOST= +SMTP_PORT=587 +SMTP_USER= +SMTP_PASS= +SMTP_ADMIN_EMAIL=noreply@example.org +SMTP_SENDER_NAME=Monaco USA + +MAILER_URLPATHS_INVITE=/auth/verify +MAILER_URLPATHS_CONFIRMATION=/auth/verify +MAILER_URLPATHS_RECOVERY=/auth/verify +MAILER_URLPATHS_EMAIL_CHANGE=/auth/verify +RATE_LIMIT_EMAIL_SENT=100 + +# =========================================== +# REALTIME +# =========================================== +SECRET_KEY_BASE=generate-a-new-secret-key-base + +# =========================================== +# POSTGREST +# =========================================== +PGRST_DB_SCHEMAS=public,storage,graphql_public + +# =========================================== +# SVELTEKIT CONFIGURATION +# =========================================== +# Body size limit for file uploads (avatars, documents) +# 50MB = 52428800 bytes +BODY_SIZE_LIMIT=52428800 diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml new file mode 100644 index 0000000..34e88e6 --- /dev/null +++ b/.gitea/workflows/build.yml @@ -0,0 +1,130 @@ +# Gitea Actions - Monaco USA Portal Build & Deploy +# This workflow builds and optionally deploys the portal +# +# Triggers: +# - Push to main branch +# - Pull requests to main +# - Manual trigger (workflow_dispatch) +# +# Required Secrets (configure in Gitea repo settings): +# - DEPLOY_HOST: Production server hostname/IP +# - DEPLOY_USER: SSH username +# - DEPLOY_KEY: SSH private key for deployment +# - DEPLOY_PATH: Path to project on server (e.g., /opt/monacousa-portal) + +name: Build and Deploy + +on: + push: + branches: + - main + pull_request: + branches: + - main + workflow_dispatch: + inputs: + deploy: + description: 'Deploy to production' + required: false + default: 'false' + +jobs: + # ============================================= + # Build Job - Builds Docker image + # ============================================= + build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build Docker image + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + push: false + load: true + tags: monacousa-portal:${{ github.sha }} + cache-from: type=gha + cache-to: type=gha,mode=max + build-args: | + PUBLIC_SUPABASE_URL=https://api.portal.monacousa.org + PUBLIC_SUPABASE_ANON_KEY=placeholder + SUPABASE_SERVICE_ROLE_KEY=placeholder + + - name: Test Docker image starts + run: | + docker run -d --name test-portal \ + -e PUBLIC_SUPABASE_URL=https://api.portal.monacousa.org \ + -e PUBLIC_SUPABASE_ANON_KEY=placeholder \ + monacousa-portal:${{ github.sha }} + sleep 5 + docker logs test-portal + docker stop test-portal + + # ============================================= + # Lint Job - Code quality checks + # ============================================= + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci --legacy-peer-deps + + - name: Run Svelte check + run: npm run check || true + + - name: Run ESLint + run: npm run lint || true + + # ============================================= + # Deploy Job - Deploys to production server + # ============================================= + deploy: + runs-on: ubuntu-latest + needs: [build, lint] + if: | + (github.event_name == 'push' && github.ref == 'refs/heads/main') || + (github.event_name == 'workflow_dispatch' && github.event.inputs.deploy == 'true') + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Deploy to production + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ secrets.DEPLOY_HOST }} + username: ${{ secrets.DEPLOY_USER }} + key: ${{ secrets.DEPLOY_KEY }} + script: | + cd ${{ secrets.DEPLOY_PATH }} + git pull origin main + ./deploy.sh update + echo "Deployment completed at $(date)" + + - name: Notify deployment success + if: success() + run: | + echo "Successfully deployed to production!" + echo "Commit: ${{ github.sha }}" + echo "Branch: ${{ github.ref_name }}" + + - name: Notify deployment failure + if: failure() + run: | + echo "Deployment failed!" + echo "Check logs for details." + exit 1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3b462cb --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md new file mode 100644 index 0000000..6f79650 --- /dev/null +++ b/ARCHITECTURE.md @@ -0,0 +1,3710 @@ +# Monaco USA Portal 2026 - Complete Rebuild + +## Project Overview +Rebuild the Monaco USA member portal from scratch in `monacousa-portal-2026/` with modern architecture, beautiful UI, and improved functionality. + +--- + +# DETAILED FEATURE SPECIFICATIONS + +## 1. MEMBER SYSTEM (Detailed) + +### 1.1 Member ID Format +- **Format**: `MUSA-XXXX` (sequential 4-digit number) +- **Examples**: MUSA-0001, MUSA-0042, MUSA-1234 +- **Auto-generated** on member creation +- **Immutable** once assigned +- **Unique constraint** in database + +### 1.2 Membership Statuses (Admin-Configurable) +Admin can create, edit, and delete statuses via Settings. + +**Default Statuses (seeded on first run):** +| Status | Color | Description | Is Default | +|--------|-------|-------------|------------| +| `pending` | Yellow | New member, awaiting dues payment | Yes (for new signups) | +| `active` | Green | Dues paid, full access | No | +| `inactive` | Gray | Lapsed membership or suspended | No | +| `expired` | Red | Membership terminated | No | + +**Status Configuration Table:** +```sql +CREATE TABLE public.membership_statuses ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + name TEXT NOT NULL UNIQUE, + display_name TEXT NOT NULL, + color TEXT NOT NULL DEFAULT '#6b7280', -- Tailwind gray-500 + description TEXT, + is_default BOOLEAN DEFAULT FALSE, -- Used for new signups + sort_order INTEGER DEFAULT 0, + created_at TIMESTAMPTZ DEFAULT NOW() +); +``` + +### 1.3 Roles/Tiers +**Fixed 3-tier system (not configurable):** +| Role | Access Level | Capabilities | +|------|--------------|--------------| +| `member` | Basic | View own profile, events, pay dues | +| `board` | Elevated | + Member directory, record payments, manage events | +| `admin` | Full | + User management, system settings, all data | + +### 1.4 Required Member Fields +All fields marked as required during signup: + +| Field | Type | Validation | Notes | +|-------|------|------------|-------| +| `first_name` | Text | Min 2 chars | Required | +| `last_name` | Text | Min 2 chars | Required | +| `email` | Email | Valid email format | Required, unique | +| `phone` | Text | International format | Required | +| `date_of_birth` | Date | Must be 18+ years old | Required | +| `address` | Text | Min 10 chars | Required | +| `nationality` | Array | At least 1 country | Required, multiple allowed | + +### 1.5 Optional Member Fields +| Field | Type | Notes | +|-------|------|-------| +| `avatar_url` | Text | Supabase Storage path | +| `membership_type_id` | UUID | Links to membership_types table | +| `notes` | Text | Admin-only notes about member | + +### 1.6 Nationality Handling +- **Multiple nationalities allowed** +- Stored as PostgreSQL `TEXT[]` array +- Uses ISO 3166-1 alpha-2 country codes: `['FR', 'US', 'MC']` +- UI shows country flags + names +- Searchable/filterable in directory + +### 1.7 Profile Features +- **Profile photo**: Upload via Supabase Storage + - Max size: 5MB + - Formats: JPG, PNG, WebP + - Auto-resized to 256x256 + - Stored at: `avatars/{member_id}/profile.{ext}` +- **No bio field** (simplified profile) +- Members can edit: name, phone, address, nationality, photo + +### 1.8 Member Directory +**Visibility controlled by admin settings:** + +```sql +CREATE TABLE public.directory_settings ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + field_name TEXT NOT NULL UNIQUE, + visible_to_members BOOLEAN DEFAULT FALSE, + visible_to_board BOOLEAN DEFAULT TRUE, + visible_to_admin BOOLEAN DEFAULT TRUE, + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Default visibility settings +INSERT INTO directory_settings (field_name, visible_to_members, visible_to_board) VALUES + ('first_name', true, true), + ('last_name', true, true), + ('avatar_url', true, true), + ('nationality', true, true), + ('email', false, true), + ('phone', false, true), + ('address', false, true), + ('date_of_birth', false, true), + ('member_since', true, true), + ('membership_status', false, true); +``` + +### 1.9 Member Signup Flow +``` +┌─────────────┐ ┌──────────────┐ ┌─────────────┐ +│ /signup │────▶│ Create Auth │────▶│ Email Verify│ +│ Form │ │ User + Member│ │ Link Sent │ +└─────────────┘ └──────────────┘ └─────────────┘ + │ + ▼ + ┌──────────────┐ ┌─────────────┐ + │ Status = │────▶│ Wait for │ + │ 'pending' │ │ Dues Payment│ + └──────────────┘ └─────────────┘ + │ + ▼ + ┌─────────────┐ + │ Board/Admin │ + │ Records Dues│ + └─────────────┘ + │ + ▼ + ┌─────────────┐ + │ Status = │ + │ 'active' │ + └─────────────┘ +``` + +**Key Points:** +- Email verification required +- Status starts as `pending` +- Member gains `active` status ONLY when first dues payment recorded +- Pending members can log in but see limited dashboard + +### 1.10 Admin Member Management +**Two ways to add members:** + +**Option A: Direct Add** +1. Admin fills out member form +2. Admin sets temporary password OR sends password setup email +3. Member record created with chosen status +4. Member can log in immediately + +**Option B: Invite** +1. Admin enters email + basic info +2. System sends invitation email with signup link +3. Invitee completes signup form +4. Status set based on invite settings + +### 1.11 Membership Types (Admin-Configurable) +Admin can create membership tiers with different pricing: + +```sql +CREATE TABLE public.membership_types ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + name TEXT NOT NULL UNIQUE, -- 'regular', 'student', 'senior' + display_name TEXT NOT NULL, -- 'Regular Member', 'Student' + annual_dues DECIMAL(10,2) NOT NULL, -- 50.00, 25.00, etc. + description TEXT, + is_default BOOLEAN DEFAULT FALSE, -- Default for new signups + is_active BOOLEAN DEFAULT TRUE, -- Can be assigned + sort_order INTEGER DEFAULT 0, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Default membership types +INSERT INTO membership_types (name, display_name, annual_dues, is_default) VALUES + ('regular', 'Regular Member', 50.00, true), + ('student', 'Student', 25.00, false), + ('senior', 'Senior (65+)', 35.00, false), + ('family', 'Family', 75.00, false), + ('honorary', 'Honorary Member', 0.00, false); +``` + +### 1.12 Complete Member Schema + +```sql +CREATE TABLE public.members ( + -- Identity + id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE, + member_id TEXT UNIQUE NOT NULL, -- MUSA-0001 format (auto-generated) + + -- Required Personal Info + first_name TEXT NOT NULL, + last_name TEXT NOT NULL, + email TEXT UNIQUE NOT NULL, + phone TEXT NOT NULL, + date_of_birth DATE NOT NULL, + address TEXT NOT NULL, + nationality TEXT[] NOT NULL DEFAULT '{}', + + -- Membership + role TEXT NOT NULL DEFAULT 'member' + CHECK (role IN ('member', 'board', 'admin')), + membership_status_id UUID REFERENCES public.membership_statuses(id), + membership_type_id UUID REFERENCES public.membership_types(id), + member_since DATE DEFAULT CURRENT_DATE, + + -- Profile + avatar_url TEXT, + + -- Admin + notes TEXT, -- Admin-only notes + + -- Timestamps + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Auto-generate member_id trigger +CREATE OR REPLACE FUNCTION generate_member_id() +RETURNS TRIGGER AS $$ +DECLARE + next_num INTEGER; +BEGIN + SELECT COALESCE(MAX(CAST(SUBSTRING(member_id FROM 6) AS INTEGER)), 0) + 1 + INTO next_num + FROM public.members; + + NEW.member_id := 'MUSA-' || LPAD(next_num::TEXT, 4, '0'); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER set_member_id + BEFORE INSERT ON public.members + FOR EACH ROW + WHEN (NEW.member_id IS NULL) + EXECUTE FUNCTION generate_member_id(); +``` + +--- + +## 2. DUES/PAYMENTS SYSTEM (Detailed) + +### 2.1 Dues Cycle +- **Due date calculation**: Payment date + 365 days +- **Example**: Payment on Jan 15, 2026 → Due Jan 15, 2027 +- **No proration**: Full annual dues regardless of join date + +### 2.2 Payment Methods +**Bank transfer only** (no online payments): +- IBAN tracking +- Reference number for matching +- Manual recording by Board/Admin + +### 2.3 Payment Recording +**Who can record payments:** +- Board members +- Admins + +**Standard payment data tracked:** +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| `member_id` | UUID | Yes | Which member | +| `amount` | Decimal | Yes | Payment amount (€) | +| `payment_date` | Date | Yes | When payment was made | +| `due_date` | Date | Yes | When this payment period ends (auto-calculated) | +| `reference` | Text | No | Bank transfer reference | +| `payment_method` | Text | Yes | Always 'bank_transfer' for now | +| `recorded_by` | UUID | Yes | Board/Admin who recorded | +| `notes` | Text | No | Optional notes | + +### 2.4 Dues Settings (Admin-Configurable) + +```sql +CREATE TABLE public.dues_settings ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + setting_key TEXT UNIQUE NOT NULL, + setting_value TEXT NOT NULL, + description TEXT, + updated_at TIMESTAMPTZ DEFAULT NOW(), + updated_by UUID REFERENCES public.members(id) +); + +-- Default settings +INSERT INTO dues_settings (setting_key, setting_value, description) VALUES + ('reminder_days_before', '30,7', 'Days before due date to send reminders (comma-separated)'), + ('grace_period_days', '30', 'Days after due date before auto-inactive'), + ('overdue_reminder_interval', '14', 'Days between overdue reminder emails'), + ('payment_iban', 'MC58 1756 9000 0104 0050 1001 860', 'IBAN for dues payment'), + ('payment_account_holder', 'ASSOCIATION MONACO USA', 'Account holder name'), + ('payment_instructions', 'Please include your Member ID in the reference', 'Payment instructions'); +``` + +### 2.5 Automatic Reminders + +**Reminder Schedule (configurable via settings):** +1. **30 days before** due date: "Your dues are coming up" +2. **7 days before** due date: "Reminder: dues due in 1 week" +3. **On due date**: "Your dues are now due" +4. **Every 14 days overdue**: "Your dues are overdue" (until grace period ends) + +**Email Content Includes:** +- Member name +- Amount due (from membership_type) +- Due date +- IBAN and account holder +- Payment reference suggestion (Member ID) +- Link to portal + +**Technical Implementation:** +- Supabase Edge Function runs daily +- Checks all members for reminder triggers +- Logs sent emails in `email_logs` table +- Respects settings for intervals + +### 2.6 Overdue Handling + +**Grace Period Flow:** +``` +Due Date Passed + │ + ▼ +┌─────────────────────────────────────────┐ +│ GRACE PERIOD (configurable, default 30 days) │ +│ - Status remains 'active' │ +│ - Overdue reminders sent │ +│ - Flagged in dashboard │ +└─────────────────────────────────────────┘ + │ + ▼ (grace period ends) +┌─────────────────────────────────────────┐ +│ AUTO STATUS CHANGE │ +│ - Status → 'inactive' │ +│ - Final notification email │ +│ - Member loses active access │ +└─────────────────────────────────────────┘ +``` + +**Supabase Edge Function for Auto-Update:** +```typescript +// Runs daily via cron +async function updateOverdueMembers() { + const gracePeriodDays = await getSetting('grace_period_days'); + const cutoffDate = new Date(); + cutoffDate.setDate(cutoffDate.getDate() - gracePeriodDays); + + // Find members past grace period + const { data: overdueMembers } = await supabase + .from('members_with_dues') + .select('*') + .eq('membership_status', 'active') + .lt('current_due_date', cutoffDate.toISOString()); + + // Update each to inactive + for (const member of overdueMembers) { + await supabase + .from('members') + .update({ membership_status_id: inactiveStatusId }) + .eq('id', member.id); + + // Send final notification + await sendEmail(member.email, 'membership_lapsed', { ... }); + } +} +``` + +### 2.7 Payment History (Member Visible) + +Members can see their complete payment history: + +**Display includes:** +- Payment date +- Amount paid +- Due date (period covered) +- Reference number +- Payment method + +**Members CANNOT see:** +- Who recorded the payment +- Internal notes +- Other members' payments + +### 2.8 Dues Dashboard (Board/Admin) + +**Overview Stats:** +- Total members with current dues +- Members with dues due soon (next 30 days) +- Overdue members count +- Total collected this year + +**Filterable Member List:** +- Filter by: status (current, due soon, overdue, never paid) +- Sort by: due date, days overdue, member name +- Quick actions: Record payment, Send reminder + +**Individual Member View:** +- Full payment history +- Current dues status +- Quick record payment form +- Send manual reminder button + +### 2.9 Complete Dues Schema + +```sql +-- Dues payments table +CREATE TABLE public.dues_payments ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + member_id UUID NOT NULL REFERENCES public.members(id) ON DELETE CASCADE, + + amount DECIMAL(10,2) NOT NULL, + currency TEXT DEFAULT 'EUR', + payment_date DATE NOT NULL, + due_date DATE NOT NULL, -- Calculated: payment_date + 1 year + payment_method TEXT DEFAULT 'bank_transfer', + reference TEXT, -- Bank transfer reference + notes TEXT, -- Internal notes + + recorded_by UUID NOT NULL REFERENCES public.members(id), + created_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Trigger to auto-calculate due_date +CREATE OR REPLACE FUNCTION calculate_due_date() +RETURNS TRIGGER AS $$ +BEGIN + NEW.due_date := NEW.payment_date + INTERVAL '1 year'; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER set_due_date + BEFORE INSERT ON public.dues_payments + FOR EACH ROW + WHEN (NEW.due_date IS NULL) + EXECUTE FUNCTION calculate_due_date(); + +-- After payment: update member status to active +CREATE OR REPLACE FUNCTION update_member_status_on_payment() +RETURNS TRIGGER AS $$ +DECLARE + active_status_id UUID; +BEGIN + -- Get active status ID + SELECT id INTO active_status_id + FROM public.membership_statuses + WHERE name = 'active'; + + -- Update member status + UPDATE public.members + SET membership_status_id = active_status_id, + updated_at = NOW() + WHERE id = NEW.member_id; + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER activate_member_on_payment + AFTER INSERT ON public.dues_payments + FOR EACH ROW + EXECUTE FUNCTION update_member_status_on_payment(); + +-- Computed view for dues status +CREATE VIEW public.members_with_dues AS +SELECT + m.*, + ms.name as status_name, + ms.display_name as status_display_name, + ms.color as status_color, + mt.display_name as membership_type_name, + mt.annual_dues, + dp.last_payment_date, + dp.current_due_date, + CASE + WHEN dp.current_due_date IS NULL THEN 'never_paid' + WHEN dp.current_due_date < CURRENT_DATE THEN 'overdue' + WHEN dp.current_due_date < CURRENT_DATE + INTERVAL '30 days' THEN 'due_soon' + ELSE 'current' + END as dues_status, + CASE + WHEN dp.current_due_date < CURRENT_DATE + THEN (CURRENT_DATE - dp.current_due_date)::INTEGER + ELSE NULL + END as days_overdue, + CASE + WHEN dp.current_due_date >= CURRENT_DATE + THEN (dp.current_due_date - CURRENT_DATE)::INTEGER + ELSE NULL + END as days_until_due +FROM public.members m +LEFT JOIN public.membership_statuses ms ON m.membership_status_id = ms.id +LEFT JOIN public.membership_types mt ON m.membership_type_id = mt.id +LEFT JOIN LATERAL ( + SELECT + payment_date as last_payment_date, + due_date as current_due_date + FROM public.dues_payments + WHERE member_id = m.id + ORDER BY due_date DESC + LIMIT 1 +) dp ON true; +``` + +### 2.10 Email Templates for Dues + +**Types:** +1. `dues_reminder` - Upcoming dues reminder +2. `dues_due_today` - Dues due today +3. `dues_overdue` - Overdue reminder +4. `dues_lapsed` - Membership lapsed (grace period ended) +5. `dues_received` - Payment confirmation + +**Template Variables:** +- `{{member_name}}` - Full name +- `{{member_id}}` - MUSA-XXXX +- `{{amount}}` - Due amount +- `{{due_date}}` - Formatted date +- `{{days_until_due}}` or `{{days_overdue}}` +- `{{iban}}` - Payment IBAN +- `{{account_holder}}` - Account name +- `{{portal_link}}` - Link to portal + +--- + +## 3. EVENTS SYSTEM (Detailed) + +### 3.1 Event Types (Admin-Configurable) + +```sql +CREATE TABLE public.event_types ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + name TEXT NOT NULL UNIQUE, + display_name TEXT NOT NULL, + color TEXT NOT NULL DEFAULT '#3b82f6', -- Tailwind blue-500 + icon TEXT, -- Lucide icon name + description TEXT, + is_active BOOLEAN DEFAULT TRUE, + sort_order INTEGER DEFAULT 0, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Default event types +INSERT INTO event_types (name, display_name, color, icon) VALUES + ('social', 'Social Event', '#10b981', 'party-popper'), + ('meeting', 'Meeting', '#6366f1', 'users'), + ('fundraiser', 'Fundraiser', '#f59e0b', 'heart-handshake'), + ('workshop', 'Workshop', '#8b5cf6', 'graduation-cap'), + ('gala', 'Gala/Formal', '#ec4899', 'sparkles'), + ('other', 'Other', '#6b7280', 'calendar'); +``` + +### 3.2 Event Visibility + +**Visibility Options:** +| Level | Who Can See | Description | +|-------|-------------|-------------| +| `public` | Anyone | Visible on public events page (no login) | +| `members` | All logged-in members | Default for most events | +| `board` | Board + Admin only | Board meetings, internal events | +| `admin` | Admin only | Administrative events | + +### 3.3 Event Pricing + +**Pricing Model:** +- Each event can be free or paid +- Paid events have **member price** and **non-member price** +- Member pricing determined by `membership_type_id` (if tiered pricing enabled) +- Non-members pay non-member price always + +**Pricing Fields:** +```sql +is_paid BOOLEAN DEFAULT FALSE, +member_price DECIMAL(10,2) DEFAULT 0, +non_member_price DECIMAL(10,2) DEFAULT 0, +pricing_notes TEXT -- "Includes dinner and drinks" +``` + +### 3.4 Guest/+1 Handling + +**Per-Event Configuration:** +- `max_guests_per_member` - 0, 1, 2, 3, or unlimited +- Each RSVP tracks guest count and guest names +- Guests count toward total capacity +- Non-members can bring guests too (if enabled) + +### 3.5 Non-Member (Public) RSVP + +**Flow for public events:** +``` +┌─────────────────┐ ┌──────────────────┐ +│ Public Events │────▶│ Event Detail │ +│ Page (no login) │ │ (public visible) │ +└─────────────────┘ └──────────────────┘ + │ + ▼ + ┌──────────────────┐ + │ RSVP Form │ + │ (no account) │ + │ - Name │ + │ - Email │ + │ - Phone │ + │ - Guest count │ + │ - Guest names │ + └──────────────────┘ + │ + ▼ + ┌──────────────────┐ + │ Payment Info │ + │ (if paid event) │ + │ - IBAN shown │ + │ - Reference # │ + └──────────────────┘ + │ + ▼ + ┌──────────────────┐ + │ RSVP Confirmed │ + │ (pending payment)│ + │ Email sent │ + └──────────────────┘ +``` + +**Non-Member RSVP Table:** +```sql +CREATE TABLE public.event_rsvps_public ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + event_id UUID NOT NULL REFERENCES public.events(id) ON DELETE CASCADE, + + -- Contact info (required) + full_name TEXT NOT NULL, + email TEXT NOT NULL, + phone TEXT, + + -- RSVP details + status TEXT NOT NULL DEFAULT 'confirmed' + CHECK (status IN ('confirmed', 'declined', 'maybe', 'waitlist', 'cancelled')), + guest_count INTEGER DEFAULT 0, + guest_names TEXT[], + + -- Payment (for paid events) + payment_status TEXT DEFAULT 'not_required' + CHECK (payment_status IN ('not_required', 'pending', 'paid')), + payment_reference TEXT, + payment_amount DECIMAL(10,2), + + -- Attendance + attended BOOLEAN DEFAULT FALSE, + + -- Timestamps + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW(), + + UNIQUE(event_id, email) -- One RSVP per email per event +); +``` + +### 3.6 RSVP Status Options + +**For Members and Non-Members:** +| Status | Description | +|--------|-------------| +| `confirmed` | Attending the event | +| `declined` | Not attending | +| `maybe` | Tentative/undecided | +| `waitlist` | Event full, on waitlist | +| `cancelled` | Cancelled RSVP | + +### 3.7 Capacity & Waitlist + +**Capacity Management:** +- `max_attendees` - Total spots (null = unlimited) +- Includes members + guests + non-members + their guests +- When full, new RSVPs go to waitlist + +**Auto-Promote Waitlist:** +```typescript +// Trigger when RSVP is cancelled or declined +async function promoteFromWaitlist(eventId: string) { + // Get event capacity + const event = await getEvent(eventId); + const currentCount = await getCurrentAttendeeCount(eventId); + + if (event.max_attendees && currentCount >= event.max_attendees) { + return; // Still full + } + + // Get oldest waitlist entry + const waitlisted = await supabase + .from('event_rsvps') + .select('*') + .eq('event_id', eventId) + .eq('status', 'waitlist') + .order('created_at', { ascending: true }) + .limit(1) + .single(); + + if (waitlisted) { + // Promote to confirmed + await supabase + .from('event_rsvps') + .update({ status: 'confirmed' }) + .eq('id', waitlisted.id); + + // Send notification email + await sendEmail(waitlisted.member.email, 'waitlist_promoted', { + event_title: event.title, + event_date: event.start_datetime + }); + } +} +``` + +### 3.8 Attendance Tracking + +**Check-in System:** +- Board/Admin can mark attendance after event +- Checkbox per RSVP: attended yes/no +- Track attendance rate per event +- Member attendance history viewable + +```sql +-- Add to RSVPs +attended BOOLEAN DEFAULT FALSE, +checked_in_at TIMESTAMPTZ, +checked_in_by UUID REFERENCES public.members(id) +``` + +### 3.9 Calendar Views + +**Available Views:** +1. **Month** - Traditional calendar grid +2. **Week** - Weekly schedule view +3. **Day** - Single day detailed view +4. **List** - Upcoming events list + +**Using FullCalendar (SvelteKit compatible):** +```typescript +import Calendar from '@event-calendar/core'; +import TimeGrid from '@event-calendar/time-grid'; +import DayGrid from '@event-calendar/day-grid'; +import List from '@event-calendar/list'; +``` + +### 3.10 Event Schema + +```sql +CREATE TABLE public.events ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + + -- Basic Info + title TEXT NOT NULL, + description TEXT, + event_type_id UUID REFERENCES public.event_types(id), + + -- Date/Time + start_datetime TIMESTAMPTZ NOT NULL, + end_datetime TIMESTAMPTZ NOT NULL, + all_day BOOLEAN DEFAULT FALSE, + timezone TEXT DEFAULT 'Europe/Monaco', + + -- Location + location TEXT, + location_url TEXT, -- Google Maps link, etc. + + -- Capacity + max_attendees INTEGER, -- null = unlimited + max_guests_per_member INTEGER DEFAULT 1, + + -- Pricing + is_paid BOOLEAN DEFAULT FALSE, + member_price DECIMAL(10,2) DEFAULT 0, + non_member_price DECIMAL(10,2) DEFAULT 0, + pricing_notes TEXT, + + -- Visibility + visibility TEXT NOT NULL DEFAULT 'members' + CHECK (visibility IN ('public', 'members', 'board', 'admin')), + + -- Status + status TEXT NOT NULL DEFAULT 'published' + CHECK (status IN ('draft', 'published', 'cancelled', 'completed')), + + -- Media + cover_image_url TEXT, -- Event banner/cover image + + -- Meta + created_by UUID NOT NULL REFERENCES public.members(id), + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Member RSVPs +CREATE TABLE public.event_rsvps ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + event_id UUID NOT NULL REFERENCES public.events(id) ON DELETE CASCADE, + member_id UUID NOT NULL REFERENCES public.members(id) ON DELETE CASCADE, + + status TEXT NOT NULL DEFAULT 'confirmed' + CHECK (status IN ('confirmed', 'declined', 'maybe', 'waitlist', 'cancelled')), + guest_count INTEGER DEFAULT 0, + guest_names TEXT[], + notes TEXT, + + -- Payment (for paid events) + payment_status TEXT DEFAULT 'not_required' + CHECK (payment_status IN ('not_required', 'pending', 'paid')), + payment_reference TEXT, + payment_amount DECIMAL(10,2), + + -- Attendance + attended BOOLEAN DEFAULT FALSE, + checked_in_at TIMESTAMPTZ, + checked_in_by UUID REFERENCES public.members(id), + + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW(), + + UNIQUE(event_id, member_id) +); + +-- View for event with counts +CREATE VIEW public.events_with_counts AS +SELECT + e.*, + et.display_name as event_type_name, + et.color as event_type_color, + et.icon as event_type_icon, + COALESCE(member_rsvps.confirmed_count, 0) + + COALESCE(member_rsvps.guest_count, 0) + + COALESCE(public_rsvps.confirmed_count, 0) + + COALESCE(public_rsvps.guest_count, 0) as total_attendees, + COALESCE(member_rsvps.confirmed_count, 0) as member_count, + COALESCE(public_rsvps.confirmed_count, 0) as non_member_count, + COALESCE(member_rsvps.waitlist_count, 0) + + COALESCE(public_rsvps.waitlist_count, 0) as waitlist_count, + CASE + WHEN e.max_attendees IS NULL THEN FALSE + WHEN (COALESCE(member_rsvps.confirmed_count, 0) + + COALESCE(member_rsvps.guest_count, 0) + + COALESCE(public_rsvps.confirmed_count, 0) + + COALESCE(public_rsvps.guest_count, 0)) >= e.max_attendees THEN TRUE + ELSE FALSE + END as is_full +FROM public.events e +LEFT JOIN public.event_types et ON e.event_type_id = et.id +LEFT JOIN LATERAL ( + SELECT + COUNT(*) FILTER (WHERE status = 'confirmed') as confirmed_count, + COALESCE(SUM(guest_count) FILTER (WHERE status = 'confirmed'), 0) as guest_count, + COUNT(*) FILTER (WHERE status = 'waitlist') as waitlist_count + FROM public.event_rsvps + WHERE event_id = e.id +) member_rsvps ON true +LEFT JOIN LATERAL ( + SELECT + COUNT(*) FILTER (WHERE status = 'confirmed') as confirmed_count, + COALESCE(SUM(guest_count) FILTER (WHERE status = 'confirmed'), 0) as guest_count, + COUNT(*) FILTER (WHERE status = 'waitlist') as waitlist_count + FROM public.event_rsvps_public + WHERE event_id = e.id +) public_rsvps ON true; +``` + +### 3.11 Event Permissions + +| Action | Member | Board | Admin | +|--------|--------|-------|-------| +| View public events | - | - | - | +| View member events | ✓ | ✓ | ✓ | +| View board events | - | ✓ | ✓ | +| View admin events | - | - | ✓ | +| RSVP to events | ✓ | ✓ | ✓ | +| Create events | - | ✓ | ✓ | +| Edit own events | - | ✓ | ✓ | +| Edit any event | - | - | ✓ | +| Delete events | - | - | ✓ | +| Manage RSVPs | - | ✓ | ✓ | +| Track attendance | - | ✓ | ✓ | + +### 3.12 Event Email Notifications + +**Email Types:** +1. `event_created` - New event announcement (for public/member events) +2. `event_reminder` - Reminder before event (configurable: 1 day, 1 hour) +3. `event_updated` - Event details changed +4. `event_cancelled` - Event cancelled +5. `rsvp_confirmation` - RSVP received +6. `waitlist_promoted` - Promoted from waitlist +7. `event_payment_reminder` - Payment reminder for paid events + +**Template Variables:** +- `{{event_title}}`, `{{event_date}}`, `{{event_time}}` +- `{{event_location}}`, `{{event_description}}` +- `{{member_name}}`, `{{guest_count}}` +- `{{payment_amount}}`, `{{payment_iban}}` +- `{{rsvp_status}}`, `{{portal_link}}` + +--- + +## 4. AUTH & DASHBOARDS (Detailed) + +### 4.1 Authentication Method + +**Email/Password only** (no social login): +- Standard email + password signup/login +- Email verification required +- Password reset via email +- Remember me option (extended session) + +### 4.2 Login Page Design + +**Branded login with:** +- Monaco USA logo +- Association tagline +- Login form (email, password, remember me) +- Links: Forgot password, Sign up +- Glass-morphism styling +- Responsive (mobile-friendly) + +### 4.3 Auth Flow + +``` +┌──────────────────────────────────────────────────────────────┐ +│ SIGNUP FLOW │ +├──────────────────────────────────────────────────────────────┤ +│ /signup │ +│ ├── Full form (all required fields) │ +│ ├── Supabase Auth: signUp(email, password) │ +│ ├── Create member record (status: pending) │ +│ ├── Send verification email │ +│ └── Show "Check your email" message │ +│ │ +│ /auth/callback (email verification link) │ +│ ├── Verify email token │ +│ ├── Update email_verified = true │ +│ └── Redirect to /login with success message │ +└──────────────────────────────────────────────────────────────┘ + +┌──────────────────────────────────────────────────────────────┐ +│ LOGIN FLOW │ +├──────────────────────────────────────────────────────────────┤ +│ /login │ +│ ├── Email + Password form │ +│ ├── Supabase Auth: signInWithPassword() │ +│ ├── Set session cookie (via Supabase SSR) │ +│ ├── Fetch member record │ +│ └── Redirect to /dashboard │ +└──────────────────────────────────────────────────────────────┘ + +┌──────────────────────────────────────────────────────────────┐ +│ PASSWORD RESET │ +├──────────────────────────────────────────────────────────────┤ +│ /forgot-password │ +│ ├── Email input form │ +│ ├── Supabase Auth: resetPasswordForEmail() │ +│ └── Show "Check your email" message │ +│ │ +│ /auth/reset-password (from email link) │ +│ ├── New password form │ +│ ├── Supabase Auth: updateUser({ password }) │ +│ └── Redirect to /login with success │ +└──────────────────────────────────────────────────────────────┘ +``` + +### 4.4 Session Management + +**Supabase SSR Configuration:** +```typescript +// src/hooks.server.ts +export const handle: Handle = async ({ event, resolve }) => { + event.locals.supabase = createServerClient( + PUBLIC_SUPABASE_URL, + PUBLIC_SUPABASE_ANON_KEY, + { + cookies: { + getAll: () => event.cookies.getAll(), + setAll: (cookies) => cookies.forEach(({ name, value, options }) => + event.cookies.set(name, value, { ...options, path: '/' }) + ) + } + } + ); + + event.locals.safeGetSession = async () => { + const { data: { session } } = await event.locals.supabase.auth.getSession(); + if (!session) return { session: null, user: null, member: null }; + + const { data: { user } } = await event.locals.supabase.auth.getUser(); + if (!user) return { session: null, user: null, member: null }; + + // Fetch member record + const { data: member } = await event.locals.supabase + .from('members_with_dues') + .select('*') + .eq('id', user.id) + .single(); + + return { session, user, member }; + }; + + return resolve(event); +}; +``` + +### 4.5 Navigation Structure + +**Desktop: Collapsible Sidebar** +``` +┌─────────────────────────────────────────────────────┐ +│ ┌─────┐ │ +│ │ │ Dashboard │ +│ │LOGO │ ───────────────────────────────────── │ +│ │ │ │ +│ └─────┘ [Sidebar Navigation] [Content] │ +│ │ +│ 📊 Dashboard │ +│ 👤 My Profile │ +│ 📅 Events │ +│ 💳 Payments │ +│ │ +│ ── Board ──────── (if board/admin) │ +│ 👥 Members │ +│ 📋 Dues Management │ +│ 📅 Event Management │ +│ │ +│ ── Admin ──────── (if admin) │ +│ ⚙️ Settings │ +│ 👥 User Management │ +│ 📄 Documents │ +│ │ +│ ───────────────── │ +│ 🚪 Logout │ +└─────────────────────────────────────────────────────┘ +``` + +**Mobile: Bottom Navigation Bar** +``` +┌─────────────────────────────────────┐ +│ │ +│ [Main Content] │ +│ │ +│ │ +├─────────────────────────────────────┤ +│ 🏠 📅 👤 ⚙️ ☰ │ +│ Home Events Profile Settings More │ +└─────────────────────────────────────┘ +``` + +### 4.6 Unified Dashboard with Role Sections + +**Single `/dashboard` route with role-based sections:** + +```svelte + + + + + + + + + +{#if isBoard} + + + + +{/if} + + +{#if isAdmin} + + + + +{/if} +``` + +### 4.7 Member Dashboard Section + +**Components:** +1. **Welcome Card** - Greeting with name, membership status badge +2. **Dues Status Card** - Current status, next due date, quick pay info +3. **Upcoming Events Card** - Next 3-5 events with RSVP status +4. **Profile Quick View** - Photo, basic info, edit link + +**Data Loaded:** +```typescript +// routes/(app)/dashboard/+page.server.ts +export const load = async ({ locals }) => { + const { member } = await locals.safeGetSession(); + + const upcomingEvents = await getUpcomingEventsForMember(member.id, 5); + + return { + member, + upcomingEvents + }; +}; +``` + +### 4.8 Board Dashboard Section + +**Additional Components (visible to board/admin):** +1. **Member Stats Card** - Total, active, pending, inactive counts +2. **Pending Members Card** - New signups awaiting approval/payment +3. **Dues Overview Card** - Current, due soon, overdue breakdown +4. **Recent RSVPs Card** - Latest event RSVPs + +**Board Stats:** +```typescript +interface BoardStats { + totalMembers: number; + activeMembers: number; + pendingMembers: number; + inactiveMembers: number; + duesSoon: number; // Due in next 30 days + duesOverdue: number; // Past due date + upcomingEvents: number; + pendingRsvps: number; +} +``` + +### 4.9 Admin Dashboard Section + +**Additional Components (admin only):** +1. **System Health Card** - Supabase status, email status +2. **Recent Activity Card** - Latest logins, signups, payments +3. **Quick Actions Card** - Add member, create event, send broadcast +4. **Alerts Card** - Issues requiring attention + +**Admin Stats:** +```typescript +interface AdminStats extends BoardStats { + totalUsers: number; // Auth users + recentLogins: number; // Last 24 hours + failedLogins: number; // Last 24 hours + emailsSent: number; // This month + storageUsed: number; // MB +} +``` + +### 4.10 Route Protection + +**Layout-level guards using SvelteKit:** + +```typescript +// routes/(app)/+layout.server.ts +import { redirect } from '@sveltejs/kit'; + +export const load = async ({ locals }) => { + const { session, member } = await locals.safeGetSession(); + + if (!session) { + throw redirect(303, '/login'); + } + + return { member }; +}; + +// routes/(app)/board/+layout.server.ts +export const load = async ({ locals, parent }) => { + const { member } = await parent(); + + if (member.role !== 'board' && member.role !== 'admin') { + throw redirect(303, '/dashboard'); + } + + return {}; +}; + +// routes/(app)/admin/+layout.server.ts +export const load = async ({ locals, parent }) => { + const { member } = await parent(); + + if (member.role !== 'admin') { + throw redirect(303, '/dashboard'); + } + + return {}; +}; +``` + +### 4.11 Responsive Breakpoints + +| Breakpoint | Width | Layout | +|------------|-------|--------| +| Mobile | < 640px | Bottom nav, stacked cards | +| Tablet | 640-1024px | Collapsed sidebar rail, 2-column | +| Desktop | > 1024px | Full sidebar, 3-column grid | + +### 4.12 Dashboard Glass-Morphism Design + +**Glass Card Base Style:** +```css +.glass-card { + background: rgba(255, 255, 255, 0.7); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.3); + border-radius: 16px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); +} + +.glass-card-dark { + background: rgba(0, 0, 0, 0.3); + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.1); +} +``` + +**Monaco Red Accent:** +```css +:root { + --monaco-red: #dc2626; + --monaco-red-light: #fee2e2; + --monaco-red-dark: #991b1b; +} +``` + +--- + +## 5. DOCUMENT STORAGE (Detailed) + +### 5.1 Document Categories (Admin-Configurable) + +```sql +CREATE TABLE public.document_categories ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + name TEXT NOT NULL UNIQUE, + display_name TEXT NOT NULL, + description TEXT, + icon TEXT, -- Lucide icon name + sort_order INTEGER DEFAULT 0, + is_active BOOLEAN DEFAULT TRUE, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Default categories +INSERT INTO document_categories (name, display_name, icon) VALUES + ('meeting_minutes', 'Meeting Minutes', 'file-text'), + ('governance', 'Governance & Bylaws', 'scale'), + ('legal', 'Legal Documents', 'briefcase'), + ('financial', 'Financial Reports', 'dollar-sign'), + ('member_resources', 'Member Resources', 'book-open'), + ('forms', 'Forms & Templates', 'clipboard'), + ('other', 'Other Documents', 'file'); +``` + +### 5.2 Upload Permissions + +**Who can upload:** +- Board members +- Administrators + +**Members cannot upload** - they can only view documents shared with them. + +### 5.3 Document Visibility (Per-Document) + +**Visibility Options:** +| Level | Who Can View | +|-------|--------------| +| `public` | Anyone (no login required) | +| `members` | All logged-in members | +| `board` | Board + Admin only | +| `admin` | Admin only | + +**Custom permissions** can also specify specific member IDs for restricted access. + +### 5.4 Document Schema + +```sql +CREATE TABLE public.documents ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + + -- Basic Info + title TEXT NOT NULL, + description TEXT, + category_id UUID REFERENCES public.document_categories(id), + + -- File Info (Supabase Storage) + file_path TEXT NOT NULL, -- Storage path + file_name TEXT NOT NULL, -- Original filename + file_size INTEGER NOT NULL, -- Bytes + mime_type TEXT NOT NULL, -- 'application/pdf', etc. + + -- Visibility + visibility TEXT NOT NULL DEFAULT 'members' + CHECK (visibility IN ('public', 'members', 'board', 'admin')), + + -- Optional: Specific member access (for restricted docs) + allowed_member_ids UUID[], -- If set, only these members can view + + -- Version tracking + version INTEGER DEFAULT 1, + replaces_document_id UUID REFERENCES public.documents(id), + + -- Metadata + uploaded_by UUID NOT NULL REFERENCES public.members(id), + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Document access log (for audit) +CREATE TABLE public.document_access_log ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + document_id UUID NOT NULL REFERENCES public.documents(id) ON DELETE CASCADE, + accessed_by UUID REFERENCES public.members(id), -- null if public access + access_type TEXT NOT NULL CHECK (access_type IN ('view', 'download')), + ip_address TEXT, + accessed_at TIMESTAMPTZ DEFAULT NOW() +); +``` + +### 5.5 File Storage (Supabase Storage) + +**Bucket Configuration:** +```typescript +// Storage bucket: 'documents' +// Path structure: documents/{category}/{year}/{filename} + +// Example paths: +// documents/meeting_minutes/2026/board-meeting-2026-01-15.pdf +// documents/governance/bylaws-v2.pdf +// documents/financial/2025/annual-report-2025.pdf +``` + +**Upload Limits:** +- Max file size: 50MB +- Allowed types: PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT, JPG, PNG + +### 5.6 Document UI Features + +**Document Library View:** +- Filter by category +- Filter by visibility level +- Search by title/description +- Sort by date, name, category +- Grid or list view toggle + +**Document Card:** +``` +┌────────────────────────────────────────┐ +│ 📄 [Category Icon] │ +│ │ +│ Board Meeting Minutes - January 2026 │ +│ Meeting minutes from the monthly... │ +│ │ +│ 📅 Jan 15, 2026 | 📎 PDF | 1.2 MB │ +│ │ +│ [View] [Download] 👁️ Members │ +└────────────────────────────────────────┘ +``` + +**Upload Form (Board/Admin):** +- Title (required) +- Description (optional) +- Category (required, dropdown) +- Visibility (required) +- Custom access (optional, member multi-select) +- File upload (drag & drop) + +### 5.7 Document Permissions (RLS) + +```sql +-- RLS Policies for documents +ALTER TABLE public.documents ENABLE ROW LEVEL SECURITY; + +-- Public documents viewable by anyone +CREATE POLICY "Public documents are viewable" + ON public.documents FOR SELECT + USING (visibility = 'public'); + +-- Member documents viewable by authenticated users +CREATE POLICY "Member documents viewable by members" + ON public.documents FOR SELECT + TO authenticated + USING ( + visibility = 'members' + OR visibility = 'public' + OR (visibility = 'board' AND EXISTS ( + SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin') + )) + OR (visibility = 'admin' AND EXISTS ( + SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin' + )) + OR (allowed_member_ids IS NOT NULL AND auth.uid() = ANY(allowed_member_ids)) + ); + +-- Board/Admin can manage documents +CREATE POLICY "Board can upload documents" + ON public.documents FOR INSERT + TO authenticated + WITH CHECK ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin')) + ); + +CREATE POLICY "Uploader or admin can update documents" + ON public.documents FOR UPDATE + TO authenticated + USING ( + uploaded_by = auth.uid() + OR EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin') + ); + +CREATE POLICY "Admin can delete documents" + ON public.documents FOR DELETE + TO authenticated + USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin') + ); +``` + +### 5.8 Version History + +**Document versioning:** +- When replacing a document, create new record with `replaces_document_id` +- Previous versions remain accessible (archived) +- View version history for any document + +```sql +-- Get version history for a document +SELECT d.*, m.first_name, m.last_name +FROM public.documents d +JOIN public.members m ON d.uploaded_by = m.id +WHERE d.id = :document_id + OR d.replaces_document_id = :document_id + OR d.id IN ( + SELECT replaces_document_id FROM public.documents + WHERE id = :document_id + ) +ORDER BY d.version DESC; +``` + +### 5.9 Meeting Minutes Special Handling + +**For meeting minutes category:** +- Date field (meeting date) +- Attendees list (optional) +- Agenda reference (optional) +- Quick template for consistency + +```sql +-- Optional meeting minutes metadata +ALTER TABLE public.documents ADD COLUMN meeting_date DATE; +ALTER TABLE public.documents ADD COLUMN meeting_attendees UUID[]; +``` + +--- + +## 6. ADMIN SETTINGS SYSTEM (Detailed) + +### 6.1 Settings Architecture Overview + +**Centralized configuration** for all customizable aspects of the portal, accessible only to Admins via `/admin/settings`. + +**Settings Categories:** +1. **Organization** - Association branding and info +2. **Membership** - Statuses, types, and pricing +3. **Dues** - Payment settings and reminders +4. **Events** - Event types and defaults +5. **Documents** - Categories and storage +6. **Directory** - Visibility controls +7. **Email** - SMTP and template settings +8. **System** - Technical settings + +### 6.2 Settings Storage (Unified Table) + +```sql +-- Flexible key-value settings with JSON support +CREATE TABLE public.app_settings ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + category TEXT NOT NULL, -- 'organization', 'dues', 'email', etc. + setting_key TEXT NOT NULL, -- 'payment_iban', 'reminder_days', etc. + setting_value JSONB NOT NULL, -- Supports strings, numbers, arrays, objects + setting_type TEXT NOT NULL DEFAULT 'text' -- 'text', 'number', 'boolean', 'json', 'array' + CHECK (setting_type IN ('text', 'number', 'boolean', 'json', 'array')), + display_name TEXT NOT NULL, -- Human-readable label + description TEXT, -- Help text for admins + is_public BOOLEAN DEFAULT FALSE, -- If true, accessible without auth + updated_at TIMESTAMPTZ DEFAULT NOW(), + updated_by UUID REFERENCES public.members(id), + + UNIQUE(category, setting_key) +); + +-- Audit log for settings changes +CREATE TABLE public.settings_audit_log ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + setting_id UUID NOT NULL REFERENCES public.app_settings(id), + old_value JSONB, + new_value JSONB NOT NULL, + changed_by UUID NOT NULL REFERENCES public.members(id), + changed_at TIMESTAMPTZ DEFAULT NOW(), + change_reason TEXT +); + +-- RLS: Only admins can read/write settings +ALTER TABLE public.app_settings ENABLE ROW LEVEL SECURITY; + +CREATE POLICY "Only admins can manage settings" + ON public.app_settings FOR ALL + TO authenticated + USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin') + OR is_public = TRUE + ); +``` + +### 6.3 Default Settings (Seeded on First Run) + +```sql +-- Organization Settings +INSERT INTO app_settings (category, setting_key, setting_value, setting_type, display_name, description, is_public) VALUES + ('organization', 'association_name', '"Monaco USA"', 'text', 'Association Name', 'Official name of the association', true), + ('organization', 'tagline', '"Americans in Monaco"', 'text', 'Tagline', 'Association tagline shown on login', true), + ('organization', 'contact_email', '"contact@monacousa.org"', 'text', 'Contact Email', 'Public contact email address', true), + ('organization', 'address', '"Monaco"', 'text', 'Address', 'Association physical address', true), + ('organization', 'logo_url', '"/logo.png"', 'text', 'Logo URL', 'Path to association logo', true), + ('organization', 'primary_color', '"#dc2626"', 'text', 'Primary Color', 'Brand primary color (hex)', true), + +-- Dues Settings + ('dues', 'payment_iban', '"MC58 1756 9000 0104 0050 1001 860"', 'text', 'Payment IBAN', 'Bank IBAN for dues payment', false), + ('dues', 'payment_account_holder', '"ASSOCIATION MONACO USA"', 'text', 'Account Holder', 'Bank account holder name', false), + ('dues', 'payment_bank_name', '"Credit Foncier de Monaco"', 'text', 'Bank Name', 'Name of the bank', false), + ('dues', 'payment_instructions', '"Please include your Member ID (MUSA-XXXX) in the reference"', 'text', 'Payment Instructions', 'Instructions shown to members', false), + ('dues', 'reminder_days_before', '[30, 7, 1]', 'array', 'Reminder Days', 'Days before due date to send reminders', false), + ('dues', 'grace_period_days', '30', 'number', 'Grace Period', 'Days after due date before auto-inactive', false), + ('dues', 'overdue_reminder_interval', '14', 'number', 'Overdue Reminder Interval', 'Days between overdue reminder emails', false), + ('dues', 'auto_inactive_enabled', 'true', 'boolean', 'Auto Inactive', 'Automatically set members inactive after grace period', false), + +-- Event Settings + ('events', 'default_max_guests', '2', 'number', 'Default Max Guests', 'Default maximum guests per RSVP', false), + ('events', 'reminder_hours_before', '[24, 1]', 'array', 'Event Reminder Hours', 'Hours before event to send reminders', false), + ('events', 'allow_public_rsvp', 'true', 'boolean', 'Allow Public RSVP', 'Allow non-members to RSVP to public events', false), + ('events', 'auto_close_rsvp_hours', '0', 'number', 'Auto Close RSVP', 'Hours before event to close RSVP (0 = never)', false), + +-- Directory Settings + ('directory', 'member_visible_fields', '["first_name", "last_name", "avatar_url", "nationality", "member_since"]', 'array', 'Member Visible Fields', 'Fields visible to regular members', false), + ('directory', 'board_visible_fields', '["first_name", "last_name", "avatar_url", "nationality", "email", "phone", "address", "date_of_birth", "member_since", "membership_status"]', 'array', 'Board Visible Fields', 'Fields visible to board members', false), + ('directory', 'show_membership_status', 'false', 'boolean', 'Show Status to Members', 'Show membership status in directory for regular members', false), + +-- System Settings + ('system', 'maintenance_mode', 'false', 'boolean', 'Maintenance Mode', 'Put the portal in maintenance mode', false), + ('system', 'maintenance_message', '"The portal is currently undergoing maintenance. Please check back soon."', 'text', 'Maintenance Message', 'Message shown during maintenance', false), + ('system', 'session_timeout_hours', '168', 'number', 'Session Timeout', 'Hours until session expires (default: 7 days)', false), + ('system', 'max_upload_size_mb', '50', 'number', 'Max Upload Size', 'Maximum file upload size in MB', false), + ('system', 'allowed_file_types', '["pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt", "jpg", "jpeg", "png", "webp"]', 'array', 'Allowed File Types', 'Allowed file extensions for uploads', false); +``` + +### 6.4 Settings UI Layout + +**Navigation Tabs:** +``` +┌──────────────────────────────────────────────────────────────────┐ +│ ⚙️ Settings │ +├──────────────────────────────────────────────────────────────────┤ +│ [Organization] [Membership] [Dues] [Events] [Documents] │ +│ [Directory] [Email] [System] │ +├──────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ Organization Settings │ │ +│ │ ───────────────────────────────────────────────────────── │ │ +│ │ │ │ +│ │ Association Name │ │ +│ │ ┌──────────────────────────────────────────────────────┐ │ │ +│ │ │ Monaco USA │ │ │ +│ │ └──────────────────────────────────────────────────────┘ │ │ +│ │ Official name of the association │ │ +│ │ │ │ +│ │ Tagline │ │ +│ │ ┌──────────────────────────────────────────────────────┐ │ │ +│ │ │ Americans in Monaco │ │ │ +│ │ └──────────────────────────────────────────────────────┘ │ │ +│ │ Association tagline shown on login │ │ +│ │ │ │ +│ │ Primary Color │ │ +│ │ ┌────────┐ ┌──────────────────────────────────────────┐ │ │ +│ │ │ 🎨 │ │ #dc2626 │ │ │ +│ │ └────────┘ └──────────────────────────────────────────┘ │ │ +│ │ │ │ +│ │ [Save Changes] │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +└──────────────────────────────────────────────────────────────────┘ +``` + +### 6.5 Membership Settings Tab + +**Manages configurable membership statuses and types:** + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ Membership Settings │ +├──────────────────────────────────────────────────────────────────┤ +│ │ +│ MEMBERSHIP STATUSES │ +│ ───────────────────────────────────────────────────────────── │ +│ │ +│ ┌───────────┬─────────────┬──────────┬────────────┬──────────┐ │ +│ │ Name │ Display │ Color │ Is Default │ Actions │ │ +│ ├───────────┼─────────────┼──────────┼────────────┼──────────┤ │ +│ │ pending │ Pending │ 🟡 Yellow│ ✓ │ ✏️ 🗑️ │ │ +│ │ active │ Active │ 🟢 Green │ │ ✏️ 🗑️ │ │ +│ │ inactive │ Inactive │ ⚪ Gray │ │ ✏️ 🗑️ │ │ +│ │ expired │ Expired │ 🔴 Red │ │ ✏️ 🗑️ │ │ +│ └───────────┴─────────────┴──────────┴────────────┴──────────┘ │ +│ │ +│ [+ Add Status] │ +│ │ +│ ───────────────────────────────────────────────────────────── │ +│ │ +│ MEMBERSHIP TYPES │ +│ ───────────────────────────────────────────────────────────── │ +│ │ +│ ┌───────────┬───────────────┬──────────┬────────────┬────────┐ │ +│ │ Name │ Display │ Annual € │ Is Default │Actions │ │ +│ ├───────────┼───────────────┼──────────┼────────────┼────────┤ │ +│ │ regular │ Regular │ €50.00 │ ✓ │ ✏️ 🗑️ │ │ +│ │ student │ Student │ €25.00 │ │ ✏️ 🗑️ │ │ +│ │ senior │ Senior (65+) │ €35.00 │ │ ✏️ 🗑️ │ │ +│ │ family │ Family │ €75.00 │ │ ✏️ 🗑️ │ │ +│ │ honorary │ Honorary │ €0.00 │ │ ✏️ 🗑️ │ │ +│ └───────────┴───────────────┴──────────┴────────────┴────────┘ │ +│ │ +│ [+ Add Membership Type] │ +│ │ +└──────────────────────────────────────────────────────────────────┘ +``` + +### 6.6 Event Types Settings + +**Admin can manage event types with colors and icons:** + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ Event Types │ +├──────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────┬───────────────┬────────────┬────────┬────────┐ │ +│ │ Name │ Display │ Color │ Icon │Actions │ │ +│ ├─────────────┼───────────────┼────────────┼────────┼────────┤ │ +│ │ social │ Social Event │ 🟢 #10b981 │ 🎉 │ ✏️ 🗑️ │ │ +│ │ meeting │ Meeting │ 🔵 #6366f1 │ 👥 │ ✏️ 🗑️ │ │ +│ │ fundraiser │ Fundraiser │ 🟠 #f59e0b │ 💝 │ ✏️ 🗑️ │ │ +│ │ workshop │ Workshop │ 🟣 #8b5cf6 │ 🎓 │ ✏️ 🗑️ │ │ +│ │ gala │ Gala/Formal │ 🌸 #ec4899 │ ✨ │ ✏️ 🗑️ │ │ +│ │ other │ Other │ ⚫ #6b7280 │ 📅 │ ✏️ 🗑️ │ │ +│ └─────────────┴───────────────┴────────────┴────────┴────────┘ │ +│ │ +│ [+ Add Event Type] │ +│ │ +└──────────────────────────────────────────────────────────────────┘ +``` + +### 6.7 Document Categories Settings + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ Document Categories │ +├──────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────┬─────────────────────┬────────┬────────────┐ │ +│ │ Name │ Display │ Icon │ Actions │ │ +│ ├─────────────────┼─────────────────────┼────────┼────────────┤ │ +│ │ meeting_minutes │ Meeting Minutes │ 📄 │ ✏️ 🗑️ │ │ +│ │ governance │ Governance & Bylaws │ ⚖️ │ ✏️ 🗑️ │ │ +│ │ legal │ Legal Documents │ 💼 │ ✏️ 🗑️ │ │ +│ │ financial │ Financial Reports │ 💰 │ ✏️ 🗑️ │ │ +│ │ member_resources│ Member Resources │ 📚 │ ✏️ 🗑️ │ │ +│ │ forms │ Forms & Templates │ 📋 │ ✏️ 🗑️ │ │ +│ │ other │ Other Documents │ 📁 │ ✏️ 🗑️ │ │ +│ └─────────────────┴─────────────────────┴────────┴────────────┘ │ +│ │ +│ [+ Add Category] │ +│ │ +└──────────────────────────────────────────────────────────────────┘ +``` + +### 6.8 Directory Visibility Settings + +**Admin controls what fields are visible to different roles:** + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ Directory Visibility │ +├──────────────────────────────────────────────────────────────────┤ +│ │ +│ Configure which member fields are visible in the directory. │ +│ Admin always sees all fields. │ +│ │ +│ ┌─────────────────┬──────────────────┬──────────────────┐ │ +│ │ Field │ Visible to │ Visible to │ │ +│ │ │ Members │ Board │ │ +│ ├─────────────────┼──────────────────┼──────────────────┤ │ +│ │ First Name │ ☑️ Always shown │ ☑️ Always shown │ │ +│ │ Last Name │ ☑️ Always shown │ ☑️ Always shown │ │ +│ │ Profile Photo │ ☑️ │ ☑️ │ │ +│ │ Nationality │ ☑️ │ ☑️ │ │ +│ │ Email │ ☐ │ ☑️ │ │ +│ │ Phone │ ☐ │ ☑️ │ │ +│ │ Address │ ☐ │ ☑️ │ │ +│ │ Date of Birth │ ☐ │ ☑️ │ │ +│ │ Member Since │ ☑️ │ ☑️ │ │ +│ │ Status │ ☐ │ ☑️ │ │ +│ │ Membership Type │ ☐ │ ☑️ │ │ +│ └─────────────────┴──────────────────┴──────────────────┘ │ +│ │ +│ [Save Visibility Settings] │ +│ │ +└──────────────────────────────────────────────────────────────────┘ +``` + +### 6.9 System Settings Tab + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ System Settings │ +├──────────────────────────────────────────────────────────────────┤ +│ │ +│ MAINTENANCE │ +│ ───────────────────────────────────────────────────────────── │ +│ │ +│ ☐ Enable Maintenance Mode │ +│ │ +│ Maintenance Message: │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ The portal is currently undergoing maintenance. │ │ +│ │ Please check back soon. │ │ +│ └──────────────────────────────────────────────────────────┘ │ +│ │ +│ ───────────────────────────────────────────────────────────── │ +│ │ +│ SECURITY │ +│ ───────────────────────────────────────────────────────────── │ +│ │ +│ Session Timeout (hours): │ +│ ┌────────────┐ │ +│ │ 168 │ (7 days) │ +│ └────────────┘ │ +│ │ +│ ───────────────────────────────────────────────────────────── │ +│ │ +│ FILE UPLOADS │ +│ ───────────────────────────────────────────────────────────── │ +│ │ +│ Max Upload Size (MB): │ +│ ┌────────────┐ │ +│ │ 50 │ │ +│ └────────────┘ │ +│ │ +│ Allowed File Types: │ +│ [PDF] [DOC] [DOCX] [XLS] [XLSX] [PPT] [PPTX] │ +│ [TXT] [JPG] [PNG] [WEBP] [+ Add Type] │ +│ │ +│ [Save System Settings] │ +│ │ +└──────────────────────────────────────────────────────────────────┘ +``` + +### 6.10 Settings Access Pattern + +```typescript +// src/lib/server/settings.ts + +// Get a single setting with type safety +export async function getSetting( + supabase: SupabaseClient, + category: string, + key: string, + defaultValue: T +): Promise { + const { data } = await supabase + .from('app_settings') + .select('setting_value') + .eq('category', category) + .eq('setting_key', key) + .single(); + + return data?.setting_value ?? defaultValue; +} + +// Get all settings for a category +export async function getCategorySettings( + supabase: SupabaseClient, + category: string +): Promise> { + const { data } = await supabase + .from('app_settings') + .select('setting_key, setting_value') + .eq('category', category); + + return Object.fromEntries( + (data ?? []).map(s => [s.setting_key, s.setting_value]) + ); +} + +// Update a setting (admin only) +export async function updateSetting( + supabase: SupabaseClient, + category: string, + key: string, + value: any, + userId: string +): Promise { + await supabase + .from('app_settings') + .update({ + setting_value: value, + updated_at: new Date().toISOString(), + updated_by: userId + }) + .eq('category', category) + .eq('setting_key', key); +} +``` + +### 6.11 Settings Permissions + +| Action | Member | Board | Admin | +|--------|--------|-------|-------| +| View public settings | ✓ | ✓ | ✓ | +| View all settings | - | - | ✓ | +| Edit settings | - | - | ✓ | +| Manage statuses | - | - | ✓ | +| Manage membership types | - | - | ✓ | +| Manage event types | - | - | ✓ | +| Manage document categories | - | - | ✓ | +| View settings audit log | - | - | ✓ | + +--- + +## 7. EMAIL SYSTEM (Detailed) + +### 7.1 Email Architecture + +**Provider**: Supabase Edge Functions + external SMTP (Resend, SendGrid, or Mailgun) + +**Why external SMTP:** +- Supabase built-in email is limited to auth emails only +- External SMTP provides better deliverability, tracking, and templates +- Resend recommended for simplicity and modern API + +### 7.2 Email Provider Configuration + +```sql +-- Email settings (stored in app_settings) +INSERT INTO app_settings (category, setting_key, setting_value, setting_type, display_name, description) VALUES + ('email', 'provider', '"resend"', 'text', 'Email Provider', 'Email service provider (resend, sendgrid, mailgun)'), + ('email', 'api_key', '""', 'text', 'API Key', 'Email provider API key (stored securely)'), + ('email', 'from_address', '"noreply@monacousa.org"', 'text', 'From Address', 'Default sender email address'), + ('email', 'from_name', '"Monaco USA"', 'text', 'From Name', 'Default sender name'), + ('email', 'reply_to', '"contact@monacousa.org"', 'text', 'Reply-To Address', 'Reply-to email address'), + ('email', 'enable_tracking', 'true', 'boolean', 'Enable Tracking', 'Track email opens and clicks'), + ('email', 'batch_size', '50', 'number', 'Batch Size', 'Max emails per batch send'), + ('email', 'rate_limit_per_hour', '100', 'number', 'Rate Limit', 'Maximum emails per hour'); +``` + +### 7.3 Email Types & Triggers + +| Email Type | Trigger | Recipients | Automated | +|------------|---------|------------|-----------| +| `welcome` | New signup verified | New member | Yes | +| `email_verification` | Signup | New member | Yes (Supabase) | +| `password_reset` | Password reset request | Member | Yes (Supabase) | +| `dues_reminder` | X days before due | Member | Yes (cron) | +| `dues_due_today` | Due date | Member | Yes (cron) | +| `dues_overdue` | Every X days overdue | Member | Yes (cron) | +| `dues_lapsed` | Grace period ends | Member | Yes (cron) | +| `dues_received` | Payment recorded | Member | Yes | +| `event_created` | New event published | All/visibility | Optional | +| `event_reminder` | X hours before event | RSVP'd members | Yes (cron) | +| `event_updated` | Event details changed | RSVP'd members | Yes | +| `event_cancelled` | Event cancelled | RSVP'd members | Yes | +| `rsvp_confirmation` | RSVP submitted | Member | Yes | +| `waitlist_promoted` | Spot opens up | Waitlisted member | Yes | +| `member_invite` | Admin invites member | Invitee | Manual | +| `broadcast` | Admin sends message | Selected members | Manual | + +### 7.4 Email Templates Schema + +```sql +CREATE TABLE public.email_templates ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + + -- Template identification + template_key TEXT UNIQUE NOT NULL, -- 'dues_reminder', 'welcome', etc. + template_name TEXT NOT NULL, -- 'Dues Reminder Email' + category TEXT NOT NULL, -- 'dues', 'events', 'system' + + -- Template content + subject TEXT NOT NULL, -- Subject line with {{variables}} + body_html TEXT NOT NULL, -- HTML body with {{variables}} + body_text TEXT, -- Plain text fallback + + -- Settings + is_active BOOLEAN DEFAULT TRUE, + is_system BOOLEAN DEFAULT FALSE, -- System templates can't be deleted + + -- Metadata + variables_schema JSONB, -- Available variables documentation + preview_data JSONB, -- Sample data for preview + + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW(), + updated_by UUID REFERENCES public.members(id) +); + +-- Default email templates +INSERT INTO email_templates (template_key, template_name, category, subject, body_html, is_system, variables_schema) VALUES + +-- Welcome Email +('welcome', 'Welcome Email', 'system', + 'Welcome to Monaco USA, {{member_name}}!', + ' + + + +
+ Monaco USA +

Welcome to Monaco USA!

+

Dear {{member_name}},

+

Thank you for joining Monaco USA! Your Member ID is {{member_id}}.

+

To complete your membership, please pay your annual dues of €{{dues_amount}}.

+

Payment Details:

+
    +
  • Bank: {{bank_name}}
  • +
  • IBAN: {{iban}}
  • +
  • Account Holder: {{account_holder}}
  • +
  • Reference: {{member_id}}
  • +
+

Access Your Portal

+

Best regards,
Monaco USA Team

+
+ +', + TRUE, + '{"member_name":"string","member_id":"string","dues_amount":"number","bank_name":"string","iban":"string","account_holder":"string","portal_link":"string","logo_url":"string"}' +), + +-- Dues Reminder +('dues_reminder', 'Dues Reminder', 'dues', + 'Your Monaco USA dues are due in {{days_until_due}} days', + ' + + +
+

Dues Reminder

+

Dear {{member_name}},

+

This is a friendly reminder that your Monaco USA membership dues of €{{dues_amount}} are due on {{due_date}} ({{days_until_due}} days from now).

+

Payment Details:

+
    +
  • IBAN: {{iban}}
  • +
  • Account Holder: {{account_holder}}
  • +
  • Reference: {{member_id}}
  • +
+

View Payment Details

+

Thank you for being a valued member!

+
+ +', + TRUE, + '{"member_name":"string","member_id":"string","dues_amount":"number","due_date":"date","days_until_due":"number","iban":"string","account_holder":"string","portal_link":"string"}' +), + +-- Dues Overdue +('dues_overdue', 'Dues Overdue Notice', 'dues', + 'OVERDUE: Your Monaco USA dues are {{days_overdue}} days past due', + ' + + +
+

Payment Overdue

+

Dear {{member_name}},

+

Your Monaco USA membership dues of €{{dues_amount}} are now {{days_overdue}} days overdue.

+

Please make your payment as soon as possible to maintain your membership benefits.

+ {{#if grace_period_remaining}} +

Note: You have {{grace_period_remaining}} days remaining in your grace period before your membership is set to inactive.

+ {{/if}} +

Payment Details:

+
    +
  • IBAN: {{iban}}
  • +
  • Account Holder: {{account_holder}}
  • +
  • Reference: {{member_id}}
  • +
+

Pay Now

+
+ +', + TRUE, + '{"member_name":"string","member_id":"string","dues_amount":"number","days_overdue":"number","grace_period_remaining":"number","iban":"string","account_holder":"string","portal_link":"string"}' +), + +-- Dues Received +('dues_received', 'Payment Confirmation', 'dues', + 'Thank you! Your Monaco USA dues payment has been received', + ' + + +
+

Payment Received!

+

Dear {{member_name}},

+

Thank you! We have received your membership dues payment.

+

Payment Details:

+
    +
  • Amount: €{{amount_paid}}
  • +
  • Payment Date: {{payment_date}}
  • +
  • Next Due Date: {{next_due_date}}
  • +
  • Reference: {{payment_reference}}
  • +
+

Your membership is now active until {{next_due_date}}.

+

View Payment History

+
+ +', + TRUE, + '{"member_name":"string","amount_paid":"number","payment_date":"date","next_due_date":"date","payment_reference":"string","portal_link":"string"}' +), + +-- Event RSVP Confirmation +('rsvp_confirmation', 'RSVP Confirmation', 'events', + 'You''re registered: {{event_title}}', + ' + + +
+

You''re Registered!

+

Dear {{member_name}},

+

Your RSVP for {{event_title}} has been confirmed.

+

Event Details:

+
    +
  • Date: {{event_date}}
  • +
  • Time: {{event_time}}
  • +
  • Location: {{event_location}}
  • + {{#if guest_count}}
  • Additional Guests: {{guest_count}}
  • {{/if}} +
+ {{#if is_paid}} +

Payment Required:

+

Total: €{{total_amount}}

+
    +
  • IBAN: {{iban}}
  • +
  • Reference: {{payment_reference}}
  • +
+ {{/if}} +

View Event

+
+ +', + TRUE, + '{"member_name":"string","event_title":"string","event_date":"date","event_time":"string","event_location":"string","guest_count":"number","is_paid":"boolean","total_amount":"number","iban":"string","payment_reference":"string","event_id":"string","portal_link":"string"}' +), + +-- Event Reminder +('event_reminder', 'Event Reminder', 'events', + 'Reminder: {{event_title}} is {{time_until_event}}', + ' + + +
+

Event Reminder

+

Dear {{member_name}},

+

This is a reminder that {{event_title}} is {{time_until_event}}.

+

Event Details:

+
    +
  • Date: {{event_date}}
  • +
  • Time: {{event_time}}
  • +
  • Location: {{event_location}}
  • +
+ {{#if event_description}} +

{{event_description}}

+ {{/if}} +

We look forward to seeing you there!

+
+ +', + TRUE, + '{"member_name":"string","event_title":"string","event_date":"date","event_time":"string","event_location":"string","event_description":"string","time_until_event":"string"}' +); +``` + +### 7.5 Email Logging Schema + +```sql +-- Enhanced email logs with tracking +CREATE TABLE public.email_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + + -- Recipients + recipient_id UUID REFERENCES public.members(id), + recipient_email TEXT NOT NULL, + recipient_name TEXT, + + -- Email details + template_key TEXT REFERENCES public.email_templates(template_key), + subject TEXT NOT NULL, + email_type TEXT NOT NULL, + + -- Status tracking + status TEXT NOT NULL DEFAULT 'queued' + CHECK (status IN ('queued', 'sent', 'delivered', 'opened', 'clicked', 'bounced', 'failed')), + + -- Provider data + provider TEXT, -- 'resend', 'sendgrid', etc. + provider_message_id TEXT, -- External message ID for tracking + + -- Engagement tracking + opened_at TIMESTAMPTZ, + clicked_at TIMESTAMPTZ, + + -- Error handling + error_message TEXT, + retry_count INTEGER DEFAULT 0, + + -- Metadata + template_variables JSONB, -- Variables used in template + sent_by UUID REFERENCES public.members(id), -- For manual sends + + -- Timestamps + created_at TIMESTAMPTZ DEFAULT NOW(), + sent_at TIMESTAMPTZ, + delivered_at TIMESTAMPTZ +); + +-- Index for common queries +CREATE INDEX idx_email_logs_recipient ON public.email_logs(recipient_id); +CREATE INDEX idx_email_logs_status ON public.email_logs(status); +CREATE INDEX idx_email_logs_type ON public.email_logs(email_type); +CREATE INDEX idx_email_logs_created ON public.email_logs(created_at DESC); +``` + +### 7.6 Automated Email Scheduler (Supabase Edge Function) + +```typescript +// supabase/functions/email-scheduler/index.ts + +import { createClient } from '@supabase/supabase-js'; +import { Resend } from 'resend'; + +// Runs daily via pg_cron +Deno.serve(async (req) => { + const supabase = createClient( + Deno.env.get('SUPABASE_URL')!, + Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')! + ); + + const today = new Date(); + today.setHours(0, 0, 0, 0); + + // 1. Get settings + const settings = await getSettings(supabase); + const reminderDays = settings.reminder_days_before as number[]; + const gracePeriod = settings.grace_period_days as number; + + // 2. Find members needing reminders + const { data: membersWithDues } = await supabase + .from('members_with_dues') + .select('*') + .in('dues_status', ['current', 'due_soon', 'overdue']); + + for (const member of membersWithDues || []) { + const dueDate = new Date(member.current_due_date); + const daysUntil = Math.ceil((dueDate.getTime() - today.getTime()) / (1000 * 60 * 60 * 24)); + const daysOverdue = member.days_overdue || 0; + + // Check if we need to send a reminder + if (daysUntil > 0 && reminderDays.includes(daysUntil)) { + // Send upcoming reminder + await sendEmail(supabase, 'dues_reminder', member, { + days_until_due: daysUntil + }); + } else if (daysUntil === 0) { + // Due today + await sendEmail(supabase, 'dues_due_today', member, {}); + } else if (daysOverdue > 0 && daysOverdue <= gracePeriod) { + // Overdue but in grace period + if (daysOverdue % settings.overdue_reminder_interval === 0) { + await sendEmail(supabase, 'dues_overdue', member, { + days_overdue: daysOverdue, + grace_period_remaining: gracePeriod - daysOverdue + }); + } + } else if (daysOverdue === gracePeriod + 1) { + // Grace period just ended + await sendEmail(supabase, 'dues_lapsed', member, {}); + } + } + + // 3. Send event reminders + await sendEventReminders(supabase, settings); + + return new Response(JSON.stringify({ success: true }), { + headers: { 'Content-Type': 'application/json' } + }); +}); + +async function sendEmail( + supabase: any, + templateKey: string, + member: any, + extraVariables: Record +) { + // Get template + const { data: template } = await supabase + .from('email_templates') + .select('*') + .eq('template_key', templateKey) + .eq('is_active', true) + .single(); + + if (!template) return; + + // Build variables + const variables = { + member_name: `${member.first_name} ${member.last_name}`, + member_id: member.member_id, + dues_amount: member.annual_dues || 50, + due_date: member.current_due_date, + portal_link: Deno.env.get('PORTAL_URL'), + ...extraVariables + }; + + // Add payment settings + const settings = await getSettings(supabase); + variables.iban = settings.payment_iban; + variables.account_holder = settings.payment_account_holder; + variables.bank_name = settings.payment_bank_name; + + // Render template + const subject = renderTemplate(template.subject, variables); + const html = renderTemplate(template.body_html, variables); + + // Send via provider + const resend = new Resend(Deno.env.get('RESEND_API_KEY')); + const result = await resend.emails.send({ + from: `${settings.from_name} <${settings.from_address}>`, + to: member.email, + subject, + html + }); + + // Log email + await supabase.from('email_logs').insert({ + recipient_id: member.id, + recipient_email: member.email, + recipient_name: variables.member_name, + template_key: templateKey, + subject, + email_type: templateKey, + status: result.error ? 'failed' : 'sent', + provider: 'resend', + provider_message_id: result.data?.id, + error_message: result.error?.message, + template_variables: variables, + sent_at: new Date().toISOString() + }); +} +``` + +### 7.7 Email Settings UI (Admin) + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ Email Settings │ +├──────────────────────────────────────────────────────────────────┤ +│ │ +│ PROVIDER CONFIGURATION │ +│ ───────────────────────────────────────────────────────────── │ +│ │ +│ Email Provider: │ +│ ┌────────────────────────────────────────┐ │ +│ │ Resend ▼ │ │ +│ └────────────────────────────────────────┘ │ +│ │ +│ API Key: │ +│ ┌────────────────────────────────────────┐ │ +│ │ re_••••••••••••••• │ [Test Connection] │ +│ └────────────────────────────────────────┘ │ +│ │ +│ From Address: │ +│ ┌────────────────────────────────────────┐ │ +│ │ noreply@monacousa.org │ │ +│ └────────────────────────────────────────┘ │ +│ │ +│ From Name: │ +│ ┌────────────────────────────────────────┐ │ +│ │ Monaco USA │ │ +│ └────────────────────────────────────────┘ │ +│ │ +│ Reply-To: │ +│ ┌────────────────────────────────────────┐ │ +│ │ contact@monacousa.org │ │ +│ └────────────────────────────────────────┘ │ +│ │ +│ ───────────────────────────────────────────────────────────── │ +│ │ +│ TRACKING │ +│ ───────────────────────────────────────────────────────────── │ +│ │ +│ ☑️ Enable open tracking │ +│ ☑️ Enable click tracking │ +│ │ +│ [Save Email Settings] │ +│ │ +└──────────────────────────────────────────────────────────────────┘ +``` + +### 7.8 Email Templates Editor (Admin) + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ Email Templates │ +├──────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌───────────────────┬────────────────┬─────────┬──────────────┐ │ +│ │ Template │ Category │ Active │ Actions │ │ +│ ├───────────────────┼────────────────┼─────────┼──────────────┤ │ +│ │ Welcome Email │ System │ ✓ │ ✏️ 👁️ 📧 │ │ +│ │ Dues Reminder │ Dues │ ✓ │ ✏️ 👁️ 📧 │ │ +│ │ Dues Due Today │ Dues │ ✓ │ ✏️ 👁️ 📧 │ │ +│ │ Dues Overdue │ Dues │ ✓ │ ✏️ 👁️ 📧 │ │ +│ │ Dues Lapsed │ Dues │ ✓ │ ✏️ 👁️ 📧 │ │ +│ │ Dues Received │ Dues │ ✓ │ ✏️ 👁️ 📧 │ │ +│ │ RSVP Confirmation │ Events │ ✓ │ ✏️ 👁️ 📧 │ │ +│ │ Event Reminder │ Events │ ✓ │ ✏️ 👁️ 📧 │ │ +│ │ Event Cancelled │ Events │ ✓ │ ✏️ 👁️ 📧 │ │ +│ │ Waitlist Promoted │ Events │ ✓ │ ✏️ 👁️ 📧 │ │ +│ └───────────────────┴────────────────┴─────────┴──────────────┘ │ +│ │ +│ Legend: ✏️ Edit | 👁️ Preview | 📧 Send Test │ +│ │ +│ [+ Create Custom Template] │ +│ │ +└──────────────────────────────────────────────────────────────────┘ +``` + +### 7.9 Template Editor View + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ Edit Template: Dues Reminder │ +├──────────────────────────────────────────────────────────────────┤ +│ │ +│ Template Name: │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ Dues Reminder │ │ +│ └──────────────────────────────────────────────────────────┘ │ +│ │ +│ Subject Line: │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ Your Monaco USA dues are due in {{days_until_due}} days │ │ +│ └──────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌──────────────────────┬───────────────────────────────────┐ │ +│ │ HTML Editor │ Preview │ │ +│ ├──────────────────────┼───────────────────────────────────┤ │ +│ │

Dues ReminderDear {{member_nam │ ┌─────────────────────────────┐ │ │ +│ │ e}},

│ │ Dues Reminder │ │ │ +│ │

This is a friendl │ │ │ │ │ +│ │ y reminder that your │ │ Dear John Doe, │ │ │ +│ │ Monaco USA membershi │ │ │ │ │ +│ │ p dues...

│ │ This is a friendly │ │ │ +│ │ ... │ │ reminder that your Monaco │ │ │ +│ │ │ │ USA membership dues of │ │ │ +│ │ │ │ €50.00 are due on... │ │ │ +│ │ │ └─────────────────────────────┘ │ │ +│ └──────────────────────┴───────────────────────────────────┘ │ +│ │ +│ AVAILABLE VARIABLES: │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ {{member_name}} {{member_id}} {{dues_amount}} {{due_date}}│ │ +│ │ {{days_until_due}} {{iban}} {{account_holder}} │ │ +│ │ {{portal_link}} │ │ +│ └──────────────────────────────────────────────────────────┘ │ +│ │ +│ [Cancel] [Send Test Email] [Save Changes] │ +│ │ +└──────────────────────────────────────────────────────────────────┘ +``` + +### 7.10 Email Logs View (Admin) + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ Email Logs │ +├──────────────────────────────────────────────────────────────────┤ +│ │ +│ Filter: [All Types ▼] [All Status ▼] [Last 30 days ▼] [Search] │ +│ │ +│ ┌────────┬────────────────┬──────────────┬────────┬──────────┐ │ +│ │ Date │ Recipient │ Subject │ Type │ Status │ │ +│ ├────────┼────────────────┼──────────────┼────────┼──────────┤ │ +│ │ Jan 9 │ john@email.com │ Your Monaco │ dues_ │ 📬 Opened │ │ +│ │ 14:30 │ John Doe │ USA dues... │ remind │ │ │ +│ ├────────┼────────────────┼──────────────┼────────┼──────────┤ │ +│ │ Jan 9 │ jane@email.com │ You're regis │ rsvp_ │ ✅ Sent │ │ +│ │ 10:15 │ Jane Smith │ tered: Gala │ conf │ │ │ +│ ├────────┼────────────────┼──────────────┼────────┼──────────┤ │ +│ │ Jan 8 │ bob@email.com │ OVERDUE: You │ dues_ │ 🔴 Bounce │ │ +│ │ 09:00 │ Bob Wilson │ r Monaco... │ overdu │ │ │ +│ └────────┴────────────────┴──────────────┴────────┴──────────┘ │ +│ │ +│ Status Legend: │ +│ ✅ Sent | 📬 Opened | 🔗 Clicked | 🔴 Bounced | ❌ Failed │ +│ │ +│ Stats: 156 sent this month | 78% open rate | 2 bounces │ +│ │ +└──────────────────────────────────────────────────────────────────┘ +``` + +### 7.11 Manual Broadcast Feature (Admin) + +**Admin can send broadcast emails to selected members:** + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ Send Broadcast Email │ +├──────────────────────────────────────────────────────────────────┤ +│ │ +│ Recipients: │ +│ ○ All active members (45) │ +│ ○ All members (52) │ +│ ○ Board members only (5) │ +│ ● Select specific members │ +│ │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ 🔍 Search members... │ │ +│ ├──────────────────────────────────────────────────────────┤ │ +│ │ ☑️ John Doe (john@email.com) │ │ +│ │ ☑️ Jane Smith (jane@email.com) │ │ +│ │ ☐ Bob Wilson (bob@email.com) │ │ +│ │ ... │ │ +│ └──────────────────────────────────────────────────────────┘ │ +│ Selected: 2 members │ +│ │ +│ Subject: │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ Important Update from Monaco USA │ │ +│ └──────────────────────────────────────────────────────────┘ │ +│ │ +│ Message: │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ [Rich text editor with formatting options] │ │ +│ │ │ │ +│ │ Dear {{member_name}}, │ │ +│ │ │ │ +│ │ We wanted to inform you about... │ │ +│ │ │ │ +│ └──────────────────────────────────────────────────────────┘ │ +│ │ +│ [Preview] [Send Test to Myself] [Send to 2 Recipients] │ +│ │ +└──────────────────────────────────────────────────────────────────┘ +``` + +### 7.12 Email Cron Jobs (pg_cron in Supabase) + +```sql +-- Enable pg_cron extension +CREATE EXTENSION IF NOT EXISTS pg_cron; + +-- Schedule daily email checks (runs at 9 AM Monaco time) +SELECT cron.schedule( + 'daily-email-scheduler', + '0 9 * * *', -- Every day at 9:00 AM + $$ + SELECT net.http_post( + url := 'https://your-project.supabase.co/functions/v1/email-scheduler', + headers := '{"Authorization": "Bearer ' || current_setting('app.service_role_key') || '"}'::jsonb, + body := '{}'::jsonb + ); + $$ +); + +-- Schedule event reminders (runs every hour) +SELECT cron.schedule( + 'hourly-event-reminders', + '0 * * * *', -- Every hour + $$ + SELECT net.http_post( + url := 'https://your-project.supabase.co/functions/v1/event-reminders', + headers := '{"Authorization": "Bearer ' || current_setting('app.service_role_key') || '"}'::jsonb, + body := '{}'::jsonb + ); + $$ +); +``` + +### 7.13 Email Permissions + +| Action | Member | Board | Admin | +|--------|--------|-------|-------| +| Receive automated emails | ✓ | ✓ | ✓ | +| View own email history | ✓ | ✓ | ✓ | +| View all email logs | - | - | ✓ | +| Edit email templates | - | - | ✓ | +| Send broadcast emails | - | - | ✓ | +| Send manual reminders | - | ✓ | ✓ | +| Configure email settings | - | - | ✓ | +| Test email connection | - | - | ✓ | + +--- + +## Phase 1: Current System Analysis (COMPLETED) + +### Current Tech Stack +| Layer | Technology | +|-------|------------| +| Framework | Nuxt 3 (Vue 3) - SSR disabled, CSR-only | +| UI Components | Vuetify 3 + Tailwind CSS + Custom SCSS | +| Database | NocoDB (REST API over PostgreSQL) | +| Authentication | Keycloak (OAuth2/OIDC) | +| File Storage | MinIO (S3-compatible) | +| Email | Nodemailer + Handlebars templates | +| State | Vue Composition API (no Pinia) | + +### Current Features Inventory + +#### 1. Member Management +- **Data Model**: Member with 20+ fields (name, email, phone, DOB, nationality, address, etc.) +- **Member ID Format**: `MUSA-YYYY-XXXX` (auto-generated) +- **Status States**: Active, Inactive, Pending, Expired +- **Portal Tiers**: admin, board, user +- **Profile Images**: Stored in MinIO + +#### 2. Dues/Subscription System +- **Calculation**: Due 1 year after last payment +- **Fields Tracked**: `membership_date_paid`, `payment_due_date`, `current_year_dues_paid` +- **Reminders**: 30-day advance warning, overdue notifications +- **Auto-Status**: Members 1+ year overdue marked Inactive +- **Rates**: €50 regular, €25 student, €35 senior, €75 family, €200 corporate + +#### 3. Events System +- **Event Types**: meeting, social, fundraiser, workshop, board-only +- **RSVP System**: confirmed, declined, pending, waitlist +- **Guest Management**: Extra guests per RSVP +- **Pricing**: Member vs non-member pricing +- **Visibility**: public, board-only, admin-only +- **Calendar**: FullCalendar integration with iCal feed + +#### 4. Authentication & Authorization +- **Login Methods**: OAuth (Keycloak) + Direct login (ROPC) +- **Role System**: Keycloak realm roles (monaco-admin, monaco-board, monaco-user) +- **Session**: Server-side with HTTP-only cookies (7-30 days) +- **Rate Limiting**: 5 attempts/15min, 1-hour IP block +- **Signup Flow**: Form → reCAPTCHA → Keycloak user → NocoDB member → Verification email + +#### 5. Three Dashboard Types +- **Admin**: Full system control, user management, settings, all features +- **Board**: Member directory, dues management, events, meetings, governance +- **Member**: Personal profile, events, payments, resources + +### Current Pain Points (to address in rebuild) +1. CSR-only limits SEO and initial load performance +2. NocoDB adds complexity vs direct database access +3. String booleans ("true"/"false") cause type issues +4. No payment history table (only last payment tracked) +5. Vuetify + Tailwind overlap creates CSS conflicts +6. Large monolithic layout files (700-800+ lines each) + +--- + +## Phase 2: New System Requirements + +### Core Requirements (confirmed) +- [x] Beautiful, modern, responsive frontend (not generic Vue look) +- [x] Member tracking with subscription/dues management +- [x] Dues due 1 year after last payment +- [x] Event calendar with RSVP system +- [x] Board members can create/manage events +- [x] Event features: capacity, +1 guests, member/non-member pricing +- [x] Three dashboard types: Admin, Board, Member +- [x] Signup system similar to current +- [x] **Manual payment tracking only** (no Stripe integration) +- [x] **Email notifications** (dues reminders, event updates) +- [x] **Document storage** (meeting minutes, governance docs) + +### Deployment Strategy +- **Replace entirely** - Switch over when ready (no parallel systems) +- **Manual data entry** - Members will be entered manually (no migration scripts) + +--- + +## FRONTEND FRAMEWORK OPTIONS + +### Tier 1: Modern & Distinctive (Recommended) + +#### 1. **Qwik + QwikCity** ⭐ MOST INNOVATIVE +| Aspect | Details | +|--------|---------| +| **What it is** | Resumable framework - HTML loads instantly, JS loads on-demand | +| **Unique Feature** | Zero hydration - fastest possible load times | +| **Learning Curve** | Medium (JSX-like but different mental model) | +| **Ecosystem** | Growing - Auth.js, Drizzle, Modular Forms integrations | +| **Benchmark Score** | 93.8 (highest among all frameworks) | + +**Pros:** +- Blazing fast initial load (no hydration delay) +- Feels like React/JSX but with better performance model +- Built-in form handling with Zod validation +- Server functions with `"use server"` directive +- Excellent TypeScript support +- Unique - won't look like every other site + +**Cons:** +- Smaller community than React/Vue +- Fewer pre-built component libraries +- Newer framework (less battle-tested in production) +- Some patterns feel unfamiliar at first + +**Best For:** Performance-focused apps where first impression matters + +--- + +#### 2. **SolidStart (Solid.js)** ⭐ MOST PERFORMANT REACTIVITY +| Aspect | Details | +|--------|---------| +| **What it is** | Fine-grained reactive framework with meta-framework | +| **Unique Feature** | No Virtual DOM - direct DOM updates via signals | +| **Learning Curve** | Medium (React-like JSX, different reactivity) | +| **Ecosystem** | Good - Ark UI, Kobalte for components | +| **Benchmark Score** | 92.2 | + +**Pros:** +- Smallest bundle sizes in the industry +- React-like syntax (easy transition) +- True reactivity (no re-renders, just updates) +- Server functions and data loading built-in +- Growing rapidly in popularity +- Unique performance characteristics + +**Cons:** +- Smaller ecosystem than React +- Fewer tutorials and resources +- Some React patterns don't translate directly +- Component libraries less mature + +**Best For:** Highly interactive dashboards with lots of real-time updates + +--- + +#### 3. **SvelteKit** ⭐ BEST DEVELOPER EXPERIENCE +| Aspect | Details | +|--------|---------| +| **What it is** | Compiler-based framework with full-stack capabilities | +| **Unique Feature** | No virtual DOM, compiles to vanilla JS | +| **Learning Curve** | Low (closest to vanilla HTML/CSS/JS) | +| **Ecosystem** | Strong - Skeleton UI, Melt UI, Shadcn-Svelte | +| **Benchmark Score** | 91.0 | + +**Pros:** +- Simplest syntax - looks like enhanced HTML +- Smallest learning curve +- Excellent built-in animations/transitions +- Strong TypeScript integration +- Great form handling +- Active, helpful community +- Svelte 5 runes make state even simpler + +**Cons:** +- Different mental model from React/Vue +- Smaller job market (if that matters) +- Some advanced patterns less documented +- Breaking changes between Svelte 4 and 5 + +**Best For:** Clean, maintainable code with minimal boilerplate + +--- + +#### 4. **Astro + React/Vue/Svelte Islands** ⭐ MOST FLEXIBLE +| Aspect | Details | +|--------|---------| +| **What it is** | Content-focused framework with "islands" of interactivity | +| **Unique Feature** | Mix multiple frameworks, zero JS by default | +| **Learning Curve** | Low-Medium | +| **Ecosystem** | Excellent - use ANY UI library | +| **Benchmark Score** | 90.2 | + +**Pros:** +- Use React, Vue, Svelte, or Solid components together +- Zero JavaScript shipped by default +- Excellent for content + interactive sections +- Built-in image optimization +- Great Supabase integration documented +- View Transitions API support + +**Cons:** +- Not ideal for highly interactive SPAs +- Island architecture adds complexity +- More configuration for full interactivity +- Less unified than single-framework approach + +**Best For:** Marketing site + member portal hybrid + +--- + +### Tier 2: Battle-Tested Mainstream + +#### 5. **Next.js 15 (React)** +| Aspect | Details | +|--------|---------| +| **What it is** | Most popular React meta-framework | +| **Unique Feature** | App Router, Server Components, huge ecosystem | +| **Learning Curve** | Medium-High (lots of concepts) | +| **Ecosystem** | Largest - shadcn/ui, Radix, everything | +| **Benchmark Score** | N/A (didn't query) | + +**Pros:** +- Largest ecosystem and community +- Most job opportunities +- shadcn/ui provides beautiful, customizable components +- Excellent documentation +- Vercel hosting optimized + +**Cons:** +- Can feel "generic" - many sites use it +- Complex mental model (Server vs Client components) +- Heavier than alternatives +- Vercel-centric development + +--- + +#### 6. **Remix** +| Aspect | Details | +|--------|---------| +| **What it is** | Full-stack React framework focused on web standards | +| **Unique Feature** | Nested routing, progressive enhancement | +| **Learning Curve** | Medium | +| **Ecosystem** | Good - React ecosystem compatible | +| **Benchmark Score** | 89.4 | + +**Pros:** +- Web standards focused (works without JS) +- Excellent data loading patterns +- Great error handling +- Form handling is first-class +- Can deploy anywhere (not Vercel-locked) + +**Cons:** +- Smaller community than Next.js +- Less "magic" means more manual work +- Merged with React Router (transition period) + +--- + +#### 7. **TanStack Start (React)** +| Aspect | Details | +|--------|---------| +| **What it is** | New full-stack framework from TanStack team | +| **Unique Feature** | Type-safe from database to UI | +| **Learning Curve** | Medium | +| **Ecosystem** | TanStack Query, Form, Router built-in | +| **Benchmark Score** | 80.7 | + +**Pros:** +- Built by TanStack (Query, Router, Form authors) +- End-to-end type safety +- Modern patterns throughout +- Excellent data fetching built-in + +**Cons:** +- Very new (beta/early stage) +- Smaller community +- Less documentation +- Rapidly evolving API + +--- + +#### 8. **Nuxt 4 (Vue 3)** +| Aspect | Details | +|--------|---------| +| **What it is** | Latest Vue meta-framework | +| **Unique Feature** | Familiar from current system | +| **Learning Curve** | Low (you know it) | +| **Ecosystem** | Good - Nuxt UI, PrimeVue | + +**Pros:** +- Familiar - no learning curve +- Can reuse some current code/patterns +- Strong conventions +- Good TypeScript support now + +**Cons:** +- User specifically wants to avoid "generic Vue look" +- Similar limitations to current system +- Less innovative than alternatives + +--- + +#### 9. **Angular 19** +| Aspect | Details | +|--------|---------| +| **What it is** | Google's enterprise framework | +| **Unique Feature** | Signals, standalone components, full framework | +| **Learning Curve** | High | +| **Ecosystem** | Enterprise-grade | +| **Benchmark Score** | 90.3 | + +**Pros:** +- Complete framework (no decisions to make) +- Excellent for large applications +- Strong typing throughout +- Signals in Angular 19 are modern + +**Cons:** +- Steeper learning curve +- More verbose +- "Enterprise" feel may not fit small org +- Overkill for this scale + +--- + +### Tier 3: Experimental/Niche + +#### 10. **Leptos (Rust)** +| Aspect | Details | +|--------|---------| +| **What it is** | Full-stack Rust framework | +| **Unique Feature** | WASM-based, extremely fast | +| **Benchmark Score** | 89.7 | + +**Pros:** +- Blazing fast (Rust + WASM) +- Type safety at compile time +- Innovative approach + +**Cons:** +- Requires learning Rust +- Small ecosystem +- Harder to find developers +- Overkill for this use case + +--- + +#### 11. **Hono + HTMX** +| Aspect | Details | +|--------|---------| +| **What it is** | Lightweight backend + hypermedia frontend | +| **Unique Feature** | Server-rendered, minimal JS | +| **Benchmark Score** | 92.8 | + +**Pros:** +- Extremely lightweight +- Simple mental model +- Works on edge (Cloudflare Workers) +- Fast development + +**Cons:** +- Less rich interactivity +- Different paradigm (hypermedia) +- Limited complex UI patterns +- Manual work for dashboards + +--- + +## UI COMPONENT LIBRARY OPTIONS + +### For React-based Frameworks (Next.js, Remix, TanStack) + +| Library | Style | Customizable | Notes | +|---------|-------|--------------|-------| +| **shadcn/ui** | Modern, clean | Fully (copy/paste) | Most popular, highly customizable | +| **Radix Themes** | Polished | Theme-based | Beautiful defaults, less work | +| **Radix Primitives** | Unstyled | Fully | Build completely custom | +| **Ark UI** | Unstyled | Fully | Works with multiple frameworks | +| **Park UI** | Pre-styled Ark | Moderate | Ark + beautiful defaults | + +### For Solid.js + +| Library | Style | Notes | +|---------|-------|-------| +| **Kobalte** | Unstyled | Radix-like primitives for Solid | +| **Ark UI Solid** | Unstyled | Same Ark, Solid version | +| **Solid UI** | Various | Community components | + +### For Svelte + +| Library | Style | Notes | +|---------|-------|-------| +| **shadcn-svelte** | Modern | Port of shadcn for Svelte | +| **Skeleton UI** | Tailwind | Full design system | +| **Melt UI** | Unstyled | Primitives for Svelte | +| **Bits UI** | Unstyled | Headless components | + +### For Qwik + +| Library | Style | Notes | +|---------|-------|-------| +| **Qwik UI** | Official | Growing component library | +| **Custom + Tailwind** | Any | Build from scratch | + +### For Vue/Nuxt + +| Library | Style | Notes | +|---------|-------|-------| +| **shadcn-vue** | Modern | Port of shadcn for Vue | +| **Radix Vue** | Unstyled | Radix primitives for Vue | +| **Nuxt UI** | Tailwind | Official Nuxt components | +| **PrimeVue** | Various | Comprehensive but generic | + +--- + +## DATABASE OPTIONS - DETAILED COMPARISON + +### Option 1: **Supabase** ⭐ RECOMMENDED +| Aspect | Details | +|--------|---------| +| **Type** | PostgreSQL + Auth + Storage + Realtime | +| **Hosting** | Managed cloud or self-hosted | +| **Pricing** | Free tier, then $25/mo | + +**Pros:** +- All-in-one: Database + Auth + File Storage + Realtime +- PostgreSQL (industry standard, powerful) +- Row-level security built-in +- Excellent TypeScript support +- Auto-generated APIs +- Real-time subscriptions +- Built-in auth (replaces Keycloak) +- Dashboard for data management +- Can self-host if needed + +**Cons:** +- Vendor lock-in (mitigated by self-host option) +- Learning curve for RLS policies +- Free tier has limits +- Less control than raw PostgreSQL + +**Best For:** Rapid development with full-stack features + +--- + +### Option 2: **PostgreSQL + Prisma** +| Aspect | Details | +|--------|---------| +| **Type** | Direct database + Type-safe ORM | +| **Hosting** | Any PostgreSQL host (Neon, Railway, etc.) | +| **Pricing** | Database hosting costs only | + +**Pros:** +- Full control over database +- Prisma schema is very readable +- Excellent TypeScript types +- Migrations handled automatically +- Works with any PostgreSQL +- Large community + +**Cons:** +- Need separate auth solution +- Need separate file storage +- More setup work +- Prisma can be slow for complex queries + +**Best For:** Maximum control and flexibility + +--- + +### Option 3: **PostgreSQL + Drizzle ORM** +| Aspect | Details | +|--------|---------| +| **Type** | Direct database + Lightweight ORM | +| **Hosting** | Any PostgreSQL host | +| **Pricing** | Database hosting costs only | + +**Pros:** +- Closer to SQL (less abstraction) +- Faster than Prisma +- Smaller bundle size +- TypeScript-first +- Better for complex queries +- Growing rapidly + +**Cons:** +- Newer, smaller community +- Less documentation +- Need separate auth/storage +- More manual migration work + +**Best For:** Performance-critical apps, SQL-comfortable teams + +--- + +### Option 4: **PlanetScale + Drizzle** +| Aspect | Details | +|--------|---------| +| **Type** | Serverless MySQL | +| **Hosting** | Managed cloud only | +| **Pricing** | Free tier, then usage-based | + +**Pros:** +- Serverless scaling +- Branching (like git for databases) +- No connection limits +- Fast globally + +**Cons:** +- MySQL not PostgreSQL +- No foreign keys (by design) +- Vendor lock-in +- Can get expensive at scale + +**Best For:** Serverless deployments, edge functions + +--- + +### Option 5: **Keep NocoDB** +| Aspect | Details | +|--------|---------| +| **Type** | Spreadsheet-like interface over database | +| **Hosting** | Self-hosted or cloud | + +**Pros:** +- Already configured +- Non-technical users can edit data +- Flexible schema changes +- API already exists + +**Cons:** +- Adds complexity layer +- String booleans issue +- Less type safety +- Performance overhead +- Limited query capabilities + +**Best For:** Non-technical admin users need direct access + +--- + +## AUTHENTICATION OPTIONS - DETAILED COMPARISON + +### Option 1: **Supabase Auth** ⭐ IF USING SUPABASE +| Aspect | Details | +|--------|---------| +| **Type** | Built into Supabase | +| **Providers** | Email, OAuth (Google, GitHub, etc.), Magic Link | + +**Pros:** +- Integrated with Supabase (one platform) +- Row-level security integration +- Simple setup +- Built-in user management +- Social logins included +- Magic link support + +**Cons:** +- Tied to Supabase +- Less customizable than Keycloak +- No SAML/enterprise SSO on free tier + +--- + +### Option 2: **Keep Keycloak** +| Aspect | Details | +|--------|---------| +| **Type** | Self-hosted identity provider | +| **Providers** | Everything (OIDC, SAML, social, etc.) | + +**Pros:** +- Already configured and working +- Enterprise-grade features +- Full control +- SAML support +- Custom themes +- User federation + +**Cons:** +- Complex to maintain +- Heavy resource usage +- Overkill for small org +- Requires Java expertise +- Self-hosted burden + +--- + +### Option 3: **Better Auth** ⭐ MODERN CHOICE +| Aspect | Details | +|--------|---------| +| **Type** | Framework-agnostic TypeScript auth | +| **Providers** | Email, OAuth, Magic Link, Passkeys | + +**Pros:** +- Modern, TypeScript-first +- Works with any framework +- Plugin system for features +- Session management built-in +- Two-factor auth support +- Lightweight + +**Cons:** +- Newer (less battle-tested) +- Self-implemented +- Need own user storage + +--- + +### Option 4: **Auth.js (NextAuth)** +| Aspect | Details | +|--------|---------| +| **Type** | Framework-agnostic auth library | +| **Providers** | 50+ OAuth providers | + +**Pros:** +- Massive provider support +- Well documented +- Active development +- Works with Qwik, SvelteKit, etc. + +**Cons:** +- Complex configuration +- Database adapter setup +- v5 migration issues +- Can be finicky + +--- + +### Option 5: **Clerk** +| Aspect | Details | +|--------|---------| +| **Type** | Auth-as-a-service | +| **Providers** | Everything + beautiful UI | + +**Pros:** +- Beautiful pre-built components +- Zero config setup +- Great DX +- Organizations/teams built-in + +**Cons:** +- Expensive at scale +- Vendor lock-in +- Less control +- Monthly costs + +--- + +### Option 6: **Lucia Auth** +| Aspect | Details | +|--------|---------| +| **Type** | Low-level auth library | +| **Note** | Being deprecated in favor of guides | + +**Pros:** +- Full control +- Lightweight +- Educational + +**Cons:** +- Being sunset +- More DIY work + +--- + +## CHOSEN STACK (FINAL) + +| Layer | Technology | Rationale | +|-------|------------|-----------| +| **Framework** | SvelteKit 2 | Best DX, simple syntax, excellent performance | +| **UI Components** | shadcn-svelte + Bits UI | Beautiful, customizable, accessible | +| **Styling** | Tailwind CSS 4 | Utility-first, works great with shadcn | +| **Database** | Supabase (PostgreSQL) | All-in-one, managed, real-time capable | +| **Auth** | Supabase Auth | Integrated with database, simple setup | +| **File Storage** | Supabase Storage | Profile images, documents | +| **Design** | Glass-morphism (evolved) | Modern, distinctive, refined | +| **Language** | TypeScript | Type safety throughout | + +--- + +## Phase 3: Architecture Design + +### Project Structure + +``` +monacousa-portal-2026/ +├── src/ +│ ├── lib/ +│ │ ├── components/ # Reusable UI components +│ │ │ ├── ui/ # shadcn-svelte base components +│ │ │ ├── dashboard/ # Dashboard widgets +│ │ │ ├── members/ # Member-related components +│ │ │ ├── events/ # Event components +│ │ │ └── layout/ # Layout components (sidebar, header) +│ │ ├── server/ # Server-only utilities +│ │ │ ├── supabase.ts # Supabase server client +│ │ │ └── auth.ts # Auth helpers +│ │ ├── stores/ # Svelte stores for state +│ │ ├── utils/ # Shared utilities +│ │ │ ├── types.ts # TypeScript types +│ │ │ ├── constants.ts # App constants +│ │ │ └── helpers.ts # Helper functions +│ │ └── supabase.ts # Supabase client (browser) +│ │ +│ ├── routes/ +│ │ ├── +layout.svelte # Root layout +│ │ ├── +layout.server.ts # Root server load (auth) +│ │ ├── +page.svelte # Landing page +│ │ │ +│ │ ├── (auth)/ # Auth group (guest only) +│ │ │ ├── login/ +│ │ │ ├── signup/ +│ │ │ ├── forgot-password/ +│ │ │ └── callback/ # OAuth callback +│ │ │ +│ │ ├── (app)/ # Protected app group +│ │ │ ├── +layout.svelte # App layout with sidebar +│ │ │ ├── +layout.server.ts # Auth guard +│ │ │ │ +│ │ │ ├── dashboard/ # User dashboard +│ │ │ ├── profile/ # User profile +│ │ │ ├── events/ # Events calendar/list +│ │ │ ├── payments/ # Dues/payments view +│ │ │ │ +│ │ │ ├── board/ # Board-only routes +│ │ │ │ ├── +layout.server.ts # Board guard +│ │ │ │ ├── dashboard/ +│ │ │ │ ├── members/ +│ │ │ │ ├── events/ # Event management +│ │ │ │ └── meetings/ +│ │ │ │ +│ │ │ └── admin/ # Admin-only routes +│ │ │ ├── +layout.server.ts # Admin guard +│ │ │ ├── dashboard/ +│ │ │ ├── members/ +│ │ │ ├── users/ +│ │ │ ├── events/ +│ │ │ └── settings/ +│ │ │ +│ │ └── api/ # API routes (if needed) +│ │ +│ ├── hooks.server.ts # Server hooks (Supabase SSR) +│ └── app.d.ts # TypeScript declarations +│ +├── static/ # Static assets +├── supabase/ # Supabase local dev +│ └── migrations/ # Database migrations +├── tests/ # Test files +├── svelte.config.js +├── tailwind.config.ts +├── vite.config.ts +└── package.json +``` + +--- + +### Database Schema (Supabase/PostgreSQL) + +```sql +-- USERS (managed by Supabase Auth) +-- auth.users table is automatic + +-- MEMBERS (extends auth.users) +CREATE TABLE public.members ( + id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE, + member_id TEXT UNIQUE NOT NULL, -- MUSA-2026-0001 format + first_name TEXT NOT NULL, + last_name TEXT NOT NULL, + email TEXT UNIQUE NOT NULL, + phone TEXT, + date_of_birth DATE, + address TEXT, + nationality TEXT[], -- Array of country codes ['FR', 'US'] + + -- Membership + role TEXT NOT NULL DEFAULT 'member' CHECK (role IN ('member', 'board', 'admin')), + membership_status TEXT NOT NULL DEFAULT 'pending' + CHECK (membership_status IN ('active', 'inactive', 'pending', 'expired')), + member_since DATE DEFAULT CURRENT_DATE, + + -- Profile + avatar_url TEXT, + bio TEXT, + + -- Timestamps + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +-- DUES/PAYMENTS (tracks payment history) +CREATE TABLE public.dues_payments ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + member_id UUID NOT NULL REFERENCES public.members(id) ON DELETE CASCADE, + + amount DECIMAL(10,2) NOT NULL, + currency TEXT DEFAULT 'EUR', + payment_date DATE NOT NULL, + due_date DATE NOT NULL, -- When this payment period ends + payment_method TEXT, -- 'bank_transfer', 'cash', etc. + reference TEXT, -- Transaction reference + notes TEXT, + + recorded_by UUID REFERENCES public.members(id), -- Who recorded this payment + created_at TIMESTAMPTZ DEFAULT NOW() +); + +-- EVENTS +CREATE TABLE public.events ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + + title TEXT NOT NULL, + description TEXT, + event_type TEXT NOT NULL CHECK (event_type IN ('social', 'meeting', 'fundraiser', 'workshop', 'other')), + + start_datetime TIMESTAMPTZ NOT NULL, + end_datetime TIMESTAMPTZ NOT NULL, + location TEXT, + + -- Capacity & Pricing + max_attendees INTEGER, + max_guests_per_member INTEGER DEFAULT 1, + member_price DECIMAL(10,2) DEFAULT 0, + non_member_price DECIMAL(10,2) DEFAULT 0, + + -- Visibility + visibility TEXT NOT NULL DEFAULT 'members' + CHECK (visibility IN ('public', 'members', 'board', 'admin')), + status TEXT NOT NULL DEFAULT 'published' + CHECK (status IN ('draft', 'published', 'cancelled', 'completed')), + + -- Metadata + created_by UUID NOT NULL REFERENCES public.members(id), + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +-- EVENT RSVPs +CREATE TABLE public.event_rsvps ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + event_id UUID NOT NULL REFERENCES public.events(id) ON DELETE CASCADE, + member_id UUID NOT NULL REFERENCES public.members(id) ON DELETE CASCADE, + + status TEXT NOT NULL DEFAULT 'confirmed' + CHECK (status IN ('confirmed', 'declined', 'waitlist', 'cancelled')), + guest_count INTEGER DEFAULT 0, + guest_names TEXT[], + + payment_status TEXT DEFAULT 'not_required' + CHECK (payment_status IN ('not_required', 'pending', 'paid')), + + attended BOOLEAN DEFAULT FALSE, + + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW(), + + UNIQUE(event_id, member_id) +); + +-- DOCUMENTS (meeting minutes, governance, etc.) +CREATE TABLE public.documents ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + + title TEXT NOT NULL, + description TEXT, + category TEXT NOT NULL CHECK (category IN ('meeting_minutes', 'governance', 'financial', 'other')), + + file_path TEXT NOT NULL, -- Supabase Storage path + file_name TEXT NOT NULL, + file_size INTEGER, + mime_type TEXT, + + visibility TEXT NOT NULL DEFAULT 'board' + CHECK (visibility IN ('members', 'board', 'admin')), + + uploaded_by UUID NOT NULL REFERENCES public.members(id), + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +-- EMAIL NOTIFICATIONS LOG +CREATE TABLE public.email_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + + recipient_id UUID REFERENCES public.members(id), + recipient_email TEXT NOT NULL, + email_type TEXT NOT NULL, -- 'dues_reminder', 'event_invite', etc. + subject TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'sent' + CHECK (status IN ('sent', 'failed', 'bounced')), + + sent_at TIMESTAMPTZ DEFAULT NOW(), + error_message TEXT +); + +-- COMPUTED VIEW: Member with dues status +CREATE VIEW public.members_with_dues AS +SELECT + m.*, + dp.payment_date as last_payment_date, + dp.due_date as current_due_date, + CASE + WHEN dp.due_date IS NULL THEN 'never_paid' + WHEN dp.due_date < CURRENT_DATE THEN 'overdue' + WHEN dp.due_date < CURRENT_DATE + INTERVAL '30 days' THEN 'due_soon' + ELSE 'current' + END as dues_status, + CASE + WHEN dp.due_date < CURRENT_DATE + THEN CURRENT_DATE - dp.due_date + ELSE NULL + END as days_overdue +FROM public.members m +LEFT JOIN LATERAL ( + SELECT payment_date, due_date + FROM public.dues_payments + WHERE member_id = m.id + ORDER BY due_date DESC + LIMIT 1 +) dp ON true; + +-- ROW LEVEL SECURITY +ALTER TABLE public.members ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.dues_payments ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.events ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.event_rsvps ENABLE ROW LEVEL SECURITY; + +-- Members: Users can read all, update own, admins can do anything +CREATE POLICY "Members are viewable by authenticated users" + ON public.members FOR SELECT + TO authenticated + USING (true); + +CREATE POLICY "Users can update own profile" + ON public.members FOR UPDATE + TO authenticated + USING (auth.uid() = id); + +CREATE POLICY "Admins can insert members" + ON public.members FOR INSERT + TO authenticated + WITH CHECK ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin') + OR auth.uid() = id -- Self-registration + ); + +-- Events: Based on visibility +CREATE POLICY "Events viewable based on visibility" + ON public.events FOR SELECT + TO authenticated + USING ( + visibility = 'members' + OR visibility = 'public' + OR (visibility = 'board' AND EXISTS ( + SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin') + )) + OR (visibility = 'admin' AND EXISTS ( + SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin' + )) + ); + +-- Board/Admin can manage events +CREATE POLICY "Board can manage events" + ON public.events FOR ALL + TO authenticated + USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin')) + ); +``` + +--- + +### Authentication Flow + +``` +1. SIGNUP FLOW + ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ + │ /signup │────▶│ Supabase Auth│────▶│ Email Verify│ + │ Form │ │ signUp() │ │ Link Sent │ + └─────────────┘ └──────────────┘ └─────────────┘ + │ + ▼ + ┌──────────────┐ + │ Create Member│ + │ Record (RLS) │ + └──────────────┘ + +2. LOGIN FLOW + ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ + │ /login │────▶│ Supabase Auth│────▶│ Set Session │ + │ Form │ │ signIn() │ │ Cookie │ + └─────────────┘ └──────────────┘ └─────────────┘ + │ + ▼ + ┌──────────────┐ + │ Redirect to │ + │ Dashboard │ + └──────────────┘ + +3. PROTECTED ROUTES + ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ + │ Request │────▶│ hooks.server │────▶│ Check Role │ + │ /admin/* │ │ getSession() │ │ in members │ + └─────────────┘ └──────────────┘ └─────────────┘ + │ │ + ▼ ▼ + ┌──────────────┐ ┌─────────────┐ + │ Valid? │ │ Redirect or │ + │ Yes → Render │ │ 403 Error │ + └──────────────┘ └─────────────┘ +``` + +--- + +### UI Component Library + +Using **shadcn-svelte** with custom glass-morphism theme: + +```typescript +// tailwind.config.ts - Glass theme extensions +export default { + theme: { + extend: { + colors: { + monaco: { + 50: '#fef2f2', + 100: '#fee2e2', + 500: '#ef4444', + 600: '#dc2626', // Primary + 700: '#b91c1c', + 900: '#7f1d1d', + } + }, + backdropBlur: { + xs: '2px', + }, + boxShadow: { + 'glass': '0 8px 32px rgba(0, 0, 0, 0.1)', + 'glass-lg': '0 25px 50px rgba(0, 0, 0, 0.15)', + } + } + } +} +``` + +**Custom Glass Components:** +- `GlassCard` - Frosted glass container +- `GlassSidebar` - Navigation sidebar +- `GlassButton` - Glass-effect buttons +- `GlassInput` - Form inputs with glass styling +- `StatCard` - Dashboard stat display +- `EventCard` - Event display card +- `MemberCard` - Member profile card +- `DuesStatusBadge` - Dues status indicator + +--- + +### Key Features Implementation + +#### 1. Member Management +- View all members (admin/board) +- Edit member details +- Upload profile photos (Supabase Storage) +- Track membership status +- Filter by status, nationality, dues + +#### 2. Dues Tracking +- Payment history table +- Auto-calculate due dates (1 year from payment) +- Visual status indicators +- Overdue notifications +- Manual payment recording + +#### 3. Event System +- Calendar view (FullCalendar or custom) +- List view with filters +- RSVP with guest management +- Attendance tracking +- Event creation (board/admin) + +#### 4. Three Dashboards +| Dashboard | Features | +|-----------|----------| +| **Member** | Profile, upcoming events, dues status, quick actions | +| **Board** | Member stats, pending applications, dues overview, event management | +| **Admin** | System stats, user management, all member data, settings | + +#### 5. Email Notifications +- Dues reminder emails (30 days before, on due date, overdue) +- Event invitation/updates +- Welcome email on signup +- Password reset emails (Supabase built-in) + +#### 6. Document Storage +- Upload meeting minutes, governance docs +- Organize by category +- Visibility controls (members/board/admin) +- Download/preview functionality + +--- + +## Phase 4: Implementation Roadmap + +### Stage 1: Foundation (Week 1-2) +1. Initialize SvelteKit project with TypeScript +2. Set up Tailwind CSS 4 + shadcn-svelte +3. Configure Supabase project +4. Create database schema + migrations +5. Implement Supabase SSR hooks +6. Build base layout components + +### Stage 2: Authentication (Week 2-3) +1. Login/Signup pages +2. Email verification flow +3. Password reset +4. Protected route guards +5. Role-based access control + +### Stage 3: Core Features (Week 3-5) +1. Member dashboard +2. Profile management +3. Member directory (board/admin) +4. Dues tracking system +5. Payment recording + +### Stage 4: Events (Week 5-6) +1. Event listing/calendar +2. Event detail view +3. RSVP system +4. Event creation (board) +5. Attendance tracking + +### Stage 5: Admin Features (Week 6-7) +1. Admin dashboard +2. User management +3. System settings +4. Data export + +### Stage 6: Polish (Week 7-8) +1. Glass-morphism styling refinement +2. Responsive design +3. Performance optimization +4. Testing +5. Documentation + +--- + +## Verification Plan + +### Development Testing +```bash +# Start Supabase local +npx supabase start + +# Run dev server +npm run dev + +# Type checking +npm run check +``` + +### Manual Testing Checklist +- [ ] User can sign up and receive verification email +- [ ] User can log in and see dashboard +- [ ] Member can view/edit profile +- [ ] Member can view events and RSVP +- [ ] Board member can access board dashboard +- [ ] Board member can create/manage events +- [ ] Board member can view member directory +- [ ] Board member can record dues payments +- [ ] Admin can access all features +- [ ] Admin can manage user roles +- [ ] Role-based routing works correctly +- [ ] Responsive on mobile/tablet/desktop + +### Browser Testing +- Chrome, Firefox, Safari, Edge +- iOS Safari, Android Chrome + +--- + +## Data Entry Strategy + +Since members will be entered manually (no automated migration): + +### Admin Setup +1. Create first admin account via Supabase dashboard +2. Manually set `role = 'admin'` in members table +3. Admin can then add other members through the portal + +### Member Entry Options +1. **Admin adds members** - Admin creates accounts for existing members +2. **Self-registration** - Members sign up themselves +3. **Invite system** - Admin sends email invites with signup links + +### Initial Launch Checklist +- [ ] Admin account created and verified +- [ ] Board member accounts created +- [ ] Test member account for verification +- [ ] Email templates configured (Supabase) + +--- + +## Files to Create + +| Path | Purpose | +|------|---------| +| `monacousa-portal-2026/` | New project root | +| `src/hooks.server.ts` | Supabase SSR setup | +| `src/lib/supabase.ts` | Client initialization | +| `src/lib/server/supabase.ts` | Server client | +| `src/routes/+layout.svelte` | Root layout | +| `src/routes/(auth)/login/+page.svelte` | Login page | +| `src/routes/(auth)/signup/+page.svelte` | Signup page | +| `src/routes/(app)/+layout.svelte` | App layout | +| `src/routes/(app)/dashboard/+page.svelte` | Member dashboard | +| `supabase/migrations/001_schema.sql` | Database schema | diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..43f85a0 --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,230 @@ +# Monaco USA Portal - Production Deployment Guide + +## Prerequisites + +- Debian/Ubuntu server with root access +- Domain DNS configured (portal.monacousa.org, api.monacousa.org, studio.monacousa.org) +- Ports 80 and 443 open in firewall + +## Quick Start + +### 1. First-Time Server Setup + +```bash +# Clone the repository +git clone https://code.letsbe.solutions/matt/monacousa-portal.git +cd monacousa-portal + +# Make deploy script executable +chmod +x deploy.sh + +# Run first-time setup (installs Docker, configures firewall) +sudo ./deploy.sh setup +``` + +### 2. Configure Environment + +```bash +# Copy environment template +cp .env.production.example .env + +# Generate secrets +./deploy.sh generate-secrets + +# Edit environment file with your values +nano .env +``` + +**Important environment variables to configure:** +- `DOMAIN` - Your domain (e.g., portal.monacousa.org) +- `POSTGRES_PASSWORD` - Strong database password +- `JWT_SECRET` - 32+ character random string +- `ANON_KEY` / `SERVICE_ROLE_KEY` - Generate at supabase.com/docs/guides/self-hosting#api-keys +- `SMTP_*` - Email server settings + +### 3. Install and Configure Nginx + +```bash +# Install nginx +sudo apt install nginx certbot python3-certbot-nginx -y + +# Copy nginx config +sudo cp nginx/portal.monacousa.org.initial.conf /etc/nginx/sites-available/portal.monacousa.org + +# Enable the site +sudo ln -s /etc/nginx/sites-available/portal.monacousa.org /etc/nginx/sites-enabled/ + +# Remove default site if exists +sudo rm -f /etc/nginx/sites-enabled/default + +# Test config +sudo nginx -t + +# Reload nginx +sudo systemctl reload nginx +``` + +### 4. Deploy Docker Services + +```bash +# Deploy all services +./deploy.sh deploy + +# Wait for services to be healthy (check status) +./deploy.sh status +``` + +### 5. Get SSL Certificate + +```bash +# Get SSL certificate (after Docker services are running) +sudo certbot --nginx -d portal.monacousa.org -d api.monacousa.org -d studio.monacousa.org + +# Test auto-renewal +sudo certbot renew --dry-run +``` + +## Common Commands + +```bash +# View logs +./deploy.sh logs # All services +./deploy.sh logs portal # Portal only +./deploy.sh logs db # Database only + +# Service management +./deploy.sh status # Check status +./deploy.sh restart # Restart all services +./deploy.sh stop # Stop all services + +# Database +./deploy.sh backup # Backup database +./deploy.sh restore backup.sql.gz # Restore from backup + +# Updates +./deploy.sh update # Pull latest code and rebuild portal + +# Cleanup +./deploy.sh cleanup # Remove unused Docker resources +``` + +## Architecture + +``` + ┌─────────────────┐ + │ Internet │ + └────────┬────────┘ + │ + ┌────────┴────────┐ + │ Nginx (Host) │ + │ :80 / :443 │ + │ SSL Termination│ + └────────┬────────┘ + │ + ┌────────────────────┼────────────────────┐ + │ │ │ + ▼ ▼ ▼ + ┌─────────┐ ┌─────────┐ ┌─────────┐ + │ Portal │ │ API │ │ Studio │ + │ :7453 │ │ :7455 │ │ :7454 │ + └────┬────┘ └────┬────┘ └────┬────┘ + │ │ │ + │ ┌────┴────┐ │ + │ │ Kong │ │ + │ │ Gateway │ │ + │ └────┬────┘ │ + │ │ │ + ▼ ▼ ▼ + ┌─────────────────────────────────────────────────┐ + │ Docker Network │ + │ ┌──────┐ ┌──────┐ ┌─────────┐ ┌──────────┐ │ + │ │ DB │ │ Auth │ │ Storage │ │ Realtime │ │ + │ └──────┘ └──────┘ └─────────┘ └──────────┘ │ + └─────────────────────────────────────────────────┘ +``` + +## Ports + +| Service | Internal Port | External (localhost) | +|---------|---------------|---------------------| +| Portal | 3000 | 7453 | +| Studio | 3000 | 7454 | +| Kong | 8000 | 7455 | + +## Troubleshooting + +### Services not starting + +```bash +# Check Docker logs +docker logs monacousa-portal +docker logs monacousa-db +docker logs monacousa-kong + +# Check if ports are in use +sudo netstat -tlnp | grep -E '7453|7454|7455' +``` + +### Database connection issues + +```bash +# Check database health +docker exec monacousa-db pg_isready -U postgres + +# View database logs +docker logs monacousa-db --tail=50 +``` + +### Nginx issues + +```bash +# Test config +sudo nginx -t + +# Check error log +sudo tail -f /var/log/nginx/error.log + +# Check portal access log +sudo tail -f /var/log/nginx/portal.monacousa.org.error.log +``` + +### SSL certificate issues + +```bash +# Renew certificates manually +sudo certbot renew + +# Check certificate status +sudo certbot certificates +``` + +## Backup Strategy + +### Automated Daily Backups + +Add to crontab (`crontab -e`): + +```bash +# Daily database backup at 3 AM +0 3 * * * /path/to/monacousa-portal/deploy.sh backup 2>&1 | logger -t monacousa-backup +``` + +### Backup Storage + +Backups are saved to the project directory as `backup_YYYYMMDD_HHMMSS.sql.gz`. + +Consider copying to remote storage: +```bash +# Copy to remote server +scp backup_*.sql.gz user@backup-server:/backups/monacousa/ +``` + +## Security Checklist + +- [ ] Strong passwords in .env file +- [ ] Firewall enabled (only 80, 443, 22 open) +- [ ] SSL certificate installed +- [ ] Studio protected with basic auth +- [ ] Regular backups configured +- [ ] Log rotation configured +- [ ] Fail2ban installed (optional) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0a6b0b8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,77 @@ +# Monaco USA Portal - SvelteKit Application +# Multi-stage build for optimized production image + +# ============================================ +# Stage 1: Dependencies +# ============================================ +FROM node:20-alpine AS deps +WORKDIR /app + +# Copy package files +COPY package.json package-lock.json* ./ + +# Install dependencies +RUN npm ci + +# ============================================ +# Stage 2: Builder +# ============================================ +FROM node:20-alpine AS builder +WORKDIR /app + +# Copy package files first +COPY package.json package-lock.json* ./ + +# Install dependencies - use npm install instead of npm ci to properly +# resolve platform-specific optional dependencies (rollup binaries) +RUN rm -rf node_modules && npm install --legacy-peer-deps + +# Copy source files +COPY . . + +# Build arguments for environment variables +ARG PUBLIC_SUPABASE_URL +ARG PUBLIC_SUPABASE_ANON_KEY +ARG SUPABASE_SERVICE_ROLE_KEY + +# Set environment variables for build +ENV PUBLIC_SUPABASE_URL=$PUBLIC_SUPABASE_URL +ENV PUBLIC_SUPABASE_ANON_KEY=$PUBLIC_SUPABASE_ANON_KEY +ENV SUPABASE_SERVICE_ROLE_KEY=$SUPABASE_SERVICE_ROLE_KEY + +# Build the application +RUN npm run build + +# Prune dev dependencies +RUN npm prune --production + +# ============================================ +# Stage 3: Runner (Production) +# ============================================ +FROM node:20-alpine AS runner +WORKDIR /app + +# Set production environment +ENV NODE_ENV=production + +# Create non-root user for security +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 sveltekit + +# Copy built application +COPY --from=builder --chown=sveltekit:nodejs /app/build ./build +COPY --from=builder --chown=sveltekit:nodejs /app/node_modules ./node_modules +COPY --from=builder --chown=sveltekit:nodejs /app/package.json ./package.json + +# Switch to non-root user +USER sveltekit + +# Expose port +EXPOSE 3000 + +# Set runtime environment variables +ENV HOST=0.0.0.0 +ENV PORT=3000 + +# Start the application +CMD ["node", "build"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..75842c4 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# sv + +Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```sh +# create a new project in the current directory +npx sv create + +# create a new project in my-app +npx sv create my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```sh +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +To create a production version of your app: + +```sh +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. diff --git a/build.log b/build.log new file mode 100644 index 0000000..e69de29 diff --git a/components.json b/components.json new file mode 100644 index 0000000..05e10cb --- /dev/null +++ b/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://shadcn-svelte.com/schema.json", + "style": "new-york", + "tailwind": { + "config": "", + "css": "src/app.css", + "baseColor": "slate" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils", + "ui": "$lib/components/ui", + "hooks": "$lib/hooks" + }, + "typescript": true, + "registry": "https://next.shadcn-svelte.com/registry" +} diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..1201afe --- /dev/null +++ b/deploy.sh @@ -0,0 +1,339 @@ +#!/bin/bash +# Monaco USA Portal - Production Deployment Script +# For Debian/Ubuntu Linux servers +# +# Usage: ./deploy.sh [command] +# Commands: +# setup - First-time setup (install Docker, configure firewall) +# deploy - Build and start all services +# update - Pull latest changes and rebuild portal +# logs - View logs +# status - Check service status +# backup - Backup database +# restore - Restore database from backup + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Configuration +COMPOSE_FILE="docker-compose.nginx.yml" +PROJECT_NAME="monacousa" + +log_info() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Check if running as root +check_root() { + if [ "$EUID" -ne 0 ]; then + log_error "Please run as root (sudo ./deploy.sh)" + exit 1 + fi +} + +# Install Docker and Docker Compose on Debian +install_docker() { + log_info "Installing Docker..." + + # Remove old versions + apt-get remove -y docker docker-engine docker.io containerd runc 2>/dev/null || true + + # Install dependencies + apt-get update + apt-get install -y \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg \ + lsb-release + + # Add Docker's official GPG key + install -m 0755 -d /etc/apt/keyrings + curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg + chmod a+r /etc/apt/keyrings/docker.gpg + + # Add repository + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ + $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ + tee /etc/apt/sources.list.d/docker.list > /dev/null + + # Install Docker + apt-get update + apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + + # Start and enable Docker + systemctl start docker + systemctl enable docker + + log_info "Docker installed successfully" +} + +# Configure firewall +configure_firewall() { + log_info "Configuring firewall..." + + # Install ufw if not present + apt-get install -y ufw + + # Allow SSH, HTTP, HTTPS + ufw allow ssh + ufw allow http + ufw allow https + + # Enable firewall + ufw --force enable + + log_info "Firewall configured (SSH, HTTP, HTTPS allowed)" +} + +# First-time setup +setup() { + check_root + log_info "Starting first-time setup..." + + # Update system + apt-get update && apt-get upgrade -y + + # Install Docker + install_docker + + # Configure firewall + configure_firewall + + # Install useful tools + apt-get install -y htop nano git apache2-utils + + # Check for .env file + if [ ! -f .env ]; then + log_warn ".env file not found!" + log_info "Copy .env.production.example to .env and configure it:" + echo " cp .env.production.example .env" + echo " nano .env" + fi + + log_info "Setup complete! Next steps:" + echo " 1. Configure .env file: nano .env" + echo " 2. Deploy: ./deploy.sh deploy" +} + +# Generate secrets helper +generate_secrets() { + log_info "Generating secrets..." + echo "" + echo "JWT_SECRET=$(openssl rand -base64 32)" + echo "POSTGRES_PASSWORD=$(openssl rand -base64 32)" + echo "SECRET_KEY_BASE=$(openssl rand -base64 64)" + echo "" + log_info "Copy these values to your .env file" +} + +# Deploy/start services +deploy() { + log_info "Deploying Monaco USA Portal..." + + # Check for .env file + if [ ! -f .env ]; then + log_error ".env file not found! Copy .env.production.example to .env first." + exit 1 + fi + + # Build and start + docker compose -f $COMPOSE_FILE -p $PROJECT_NAME build --no-cache portal + docker compose -f $COMPOSE_FILE -p $PROJECT_NAME up -d + + log_info "Deployment complete!" + log_info "Waiting for services to be healthy..." + sleep 10 + + # Show status + docker compose -f $COMPOSE_FILE -p $PROJECT_NAME ps + + log_info "Portal should be available at https://\$(grep DOMAIN .env | cut -d '=' -f2)" +} + +# Update and rebuild +update() { + log_info "Updating Monaco USA Portal..." + + # Pull latest code (if git repo) + if [ -d .git ]; then + git pull origin main + fi + + # Rebuild only the portal service + docker compose -f $COMPOSE_FILE -p $PROJECT_NAME build --no-cache portal + + # Restart portal with zero downtime + docker compose -f $COMPOSE_FILE -p $PROJECT_NAME up -d --no-deps portal + + log_info "Update complete!" +} + +# View logs +logs() { + local service=${1:-""} + if [ -z "$service" ]; then + docker compose -f $COMPOSE_FILE -p $PROJECT_NAME logs -f --tail=100 + else + docker compose -f $COMPOSE_FILE -p $PROJECT_NAME logs -f --tail=100 $service + fi +} + +# Check status +status() { + log_info "Service Status:" + docker compose -f $COMPOSE_FILE -p $PROJECT_NAME ps + echo "" + log_info "Resource Usage:" + docker stats --no-stream $(docker compose -f $COMPOSE_FILE -p $PROJECT_NAME ps -q) +} + +# Backup database +backup() { + local backup_file="backup_$(date +%Y%m%d_%H%M%S).sql" + log_info "Backing up database to $backup_file..." + + docker compose -f $COMPOSE_FILE -p $PROJECT_NAME exec -T db \ + pg_dump -U postgres postgres > "$backup_file" + + # Compress + gzip "$backup_file" + + log_info "Backup complete: ${backup_file}.gz" +} + +# Restore database +restore() { + local backup_file=$1 + if [ -z "$backup_file" ]; then + log_error "Usage: ./deploy.sh restore " + exit 1 + fi + + log_warn "This will overwrite the current database!" + read -p "Are you sure? (y/N) " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi + + log_info "Restoring database from $backup_file..." + + # Decompress if needed + if [[ "$backup_file" == *.gz ]]; then + gunzip -c "$backup_file" | docker compose -f $COMPOSE_FILE -p $PROJECT_NAME exec -T db \ + psql -U postgres postgres + else + cat "$backup_file" | docker compose -f $COMPOSE_FILE -p $PROJECT_NAME exec -T db \ + psql -U postgres postgres + fi + + log_info "Restore complete!" +} + +# Stop all services +stop() { + log_info "Stopping all services..." + docker compose -f $COMPOSE_FILE -p $PROJECT_NAME down + log_info "All services stopped" +} + +# Restart all services +restart() { + log_info "Restarting all services..." + docker compose -f $COMPOSE_FILE -p $PROJECT_NAME restart + log_info "All services restarted" +} + +# Clean up unused Docker resources +cleanup() { + log_info "Cleaning up unused Docker resources..." + docker system prune -af --volumes + log_info "Cleanup complete" +} + +# Show help +help() { + echo "Monaco USA Portal - Deployment Script" + echo "" + echo "Usage: ./deploy.sh [command]" + echo "" + echo "Commands:" + echo " setup First-time server setup (install Docker, firewall)" + echo " generate-secrets Generate random secrets for .env" + echo " deploy Build and start all services" + echo " update Pull latest code and rebuild portal" + echo " stop Stop all services" + echo " restart Restart all services" + echo " status Show service status and resource usage" + echo " logs [service] View logs (optionally for specific service)" + echo " backup Backup database to file" + echo " restore Restore database from backup" + echo " cleanup Remove unused Docker resources" + echo " help Show this help message" + echo "" + echo "Examples:" + echo " sudo ./deploy.sh setup # First-time setup" + echo " ./deploy.sh deploy # Deploy the portal" + echo " ./deploy.sh logs portal # View portal logs" + echo " ./deploy.sh backup # Backup database" +} + +# Main command handler +case "${1:-help}" in + setup) + setup + ;; + generate-secrets) + generate_secrets + ;; + deploy) + deploy + ;; + update) + update + ;; + stop) + stop + ;; + restart) + restart + ;; + status) + status + ;; + logs) + logs $2 + ;; + backup) + backup + ;; + restore) + restore $2 + ;; + cleanup) + cleanup + ;; + help|--help|-h) + help + ;; + *) + log_error "Unknown command: $1" + help + exit 1 + ;; +esac diff --git a/dev-output.txt b/dev-output.txt new file mode 100644 index 0000000..e69de29 diff --git a/dev.log b/dev.log new file mode 100644 index 0000000..e69de29 diff --git a/docker-compose.nginx.yml b/docker-compose.nginx.yml new file mode 100644 index 0000000..7864136 --- /dev/null +++ b/docker-compose.nginx.yml @@ -0,0 +1,386 @@ +# Monaco USA Portal - Production Docker Compose (with Nginx on host) +# For deployment on Debian/Linux servers using Nginx as reverse proxy +# +# Usage: +# 1. Copy .env.production.example to .env +# 2. Configure all environment variables +# 3. Run: docker compose -f docker-compose.nginx.yml up -d +# +# Ports exposed to localhost (nginx proxies to these): +# - 7453: Portal (SvelteKit) +# - 7454: Studio (Supabase Dashboard) +# - 7455: Kong (API Gateway) + +services: + # ============================================ + # PostgreSQL Database + # ============================================ + db: + image: supabase/postgres:15.8.1.060 + container_name: monacousa-db + restart: unless-stopped + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + JWT_SECRET: ${JWT_SECRET} + JWT_EXP: ${JWT_EXPIRY} + volumes: + - db-data:/var/lib/postgresql/data + - ./supabase/migrations:/docker-entrypoint-initdb.d + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - monacousa-network + deploy: + resources: + limits: + memory: 2G + reservations: + memory: 512M + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # Supabase Studio (Dashboard) + # ============================================ + studio: + image: supabase/studio:20241202-71e5240 + container_name: monacousa-studio + restart: unless-stopped + ports: + - "127.0.0.1:7454:3000" + environment: + STUDIO_PG_META_URL: http://meta:8080 + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + DEFAULT_ORGANIZATION_NAME: Monaco USA + DEFAULT_PROJECT_NAME: Monaco USA Portal + SUPABASE_URL: http://kong:8000 + SUPABASE_PUBLIC_URL: https://api.${DOMAIN} + SUPABASE_ANON_KEY: ${ANON_KEY} + SUPABASE_SERVICE_KEY: ${SERVICE_ROLE_KEY} + depends_on: + meta: + condition: service_healthy + networks: + - monacousa-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # Kong API Gateway + # ============================================ + kong: + image: kong:2.8.1 + container_name: monacousa-kong + restart: unless-stopped + ports: + - "127.0.0.1:7455:8000" + environment: + KONG_DATABASE: "off" + KONG_DECLARATIVE_CONFIG: /var/lib/kong/kong.yml + KONG_DNS_ORDER: LAST,A,CNAME + KONG_PLUGINS: request-transformer,cors,key-auth,acl,basic-auth + KONG_NGINX_PROXY_PROXY_BUFFER_SIZE: 160k + KONG_NGINX_PROXY_PROXY_BUFFERS: 64 160k + volumes: + - ./supabase/docker/kong.yml:/var/lib/kong/kong.yml:ro + depends_on: + auth: + condition: service_healthy + networks: + - monacousa-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # GoTrue (Auth) + # ============================================ + auth: + image: supabase/gotrue:v2.164.0 + container_name: monacousa-auth + restart: unless-stopped + environment: + GOTRUE_API_HOST: 0.0.0.0 + GOTRUE_API_PORT: 9999 + API_EXTERNAL_URL: https://api.${DOMAIN} + + GOTRUE_DB_DRIVER: postgres + GOTRUE_DB_DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?search_path=auth + + GOTRUE_SITE_URL: https://${DOMAIN} + GOTRUE_URI_ALLOW_LIST: ${ADDITIONAL_REDIRECT_URLS} + GOTRUE_DISABLE_SIGNUP: ${DISABLE_SIGNUP} + + GOTRUE_JWT_ADMIN_ROLES: service_role + GOTRUE_JWT_AUD: authenticated + GOTRUE_JWT_DEFAULT_GROUP_NAME: authenticated + GOTRUE_JWT_EXP: ${JWT_EXPIRY} + GOTRUE_JWT_SECRET: ${JWT_SECRET} + + GOTRUE_EXTERNAL_EMAIL_ENABLED: true + GOTRUE_EXTERNAL_ANONYMOUS_USERS_ENABLED: false + GOTRUE_MAILER_AUTOCONFIRM: ${ENABLE_EMAIL_AUTOCONFIRM} + + GOTRUE_SMTP_HOST: ${SMTP_HOST} + GOTRUE_SMTP_PORT: ${SMTP_PORT} + GOTRUE_SMTP_USER: ${SMTP_USER} + GOTRUE_SMTP_PASS: ${SMTP_PASS} + GOTRUE_SMTP_ADMIN_EMAIL: ${SMTP_ADMIN_EMAIL} + GOTRUE_SMTP_SENDER_NAME: ${SMTP_SENDER_NAME} + GOTRUE_MAILER_URLPATHS_INVITE: /auth/verify + GOTRUE_MAILER_URLPATHS_CONFIRMATION: /auth/verify + GOTRUE_MAILER_URLPATHS_RECOVERY: /auth/verify + GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE: /auth/verify + + GOTRUE_RATE_LIMIT_EMAIL_SENT: ${RATE_LIMIT_EMAIL_SENT} + depends_on: + db: + condition: service_healthy + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9999/health"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - monacousa-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # PostgREST (REST API) + # ============================================ + rest: + image: postgrest/postgrest:v12.2.0 + container_name: monacousa-rest + restart: unless-stopped + environment: + PGRST_DB_URI: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} + PGRST_DB_SCHEMAS: ${PGRST_DB_SCHEMAS} + PGRST_DB_ANON_ROLE: anon + PGRST_JWT_SECRET: ${JWT_SECRET} + PGRST_DB_USE_LEGACY_GUCS: "false" + PGRST_APP_SETTINGS_JWT_SECRET: ${JWT_SECRET} + PGRST_APP_SETTINGS_JWT_EXP: ${JWT_EXPIRY} + depends_on: + db: + condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "exit 0"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 10s + networks: + - monacousa-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # Realtime + # ============================================ + realtime: + image: supabase/realtime:v2.33.58 + container_name: monacousa-realtime + restart: unless-stopped + environment: + PORT: 4000 + DB_HOST: db + DB_PORT: 5432 + DB_USER: supabase_admin + DB_PASSWORD: ${POSTGRES_PASSWORD} + DB_NAME: ${POSTGRES_DB} + DB_AFTER_CONNECT_QUERY: 'SET search_path TO _realtime' + DB_ENC_KEY: supabaserealtime + API_JWT_SECRET: ${JWT_SECRET} + SECRET_KEY_BASE: ${SECRET_KEY_BASE} + ERL_AFLAGS: -proto_dist inet_tcp + DNS_NODES: "''" + RLIMIT_NOFILE: "10000" + APP_NAME: realtime + SEED_SELF_HOST: true + depends_on: + db: + condition: service_healthy + networks: + - monacousa-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # Storage API + # ============================================ + storage: + image: supabase/storage-api:v1.11.13 + container_name: monacousa-storage + restart: unless-stopped + environment: + ANON_KEY: ${ANON_KEY} + SERVICE_KEY: ${SERVICE_ROLE_KEY} + POSTGREST_URL: http://rest:3000 + PGRST_JWT_SECRET: ${JWT_SECRET} + DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} + FILE_SIZE_LIMIT: 52428800 + STORAGE_BACKEND: file + FILE_STORAGE_BACKEND_PATH: /var/lib/storage + TENANT_ID: stub + REGION: stub + GLOBAL_S3_BUCKET: stub + ENABLE_IMAGE_TRANSFORMATION: "true" + IMGPROXY_URL: http://imgproxy:8080 + volumes: + - storage-data:/var/lib/storage + depends_on: + db: + condition: service_healthy + rest: + condition: service_healthy + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:5000/status"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - monacousa-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # Image Proxy (for storage transformations) + # ============================================ + imgproxy: + image: darthsim/imgproxy:v3.8.0 + container_name: monacousa-imgproxy + restart: unless-stopped + environment: + IMGPROXY_BIND: ":8080" + IMGPROXY_LOCAL_FILESYSTEM_ROOT: / + IMGPROXY_USE_ETAG: "true" + IMGPROXY_ENABLE_WEBP_DETECTION: "true" + volumes: + - storage-data:/var/lib/storage + healthcheck: + test: ["CMD", "imgproxy", "health"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - monacousa-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # Postgres Meta (for Studio) + # ============================================ + meta: + image: supabase/postgres-meta:v0.84.2 + container_name: monacousa-meta + restart: unless-stopped + environment: + PG_META_PORT: 8080 + PG_META_DB_HOST: db + PG_META_DB_PORT: 5432 + PG_META_DB_NAME: ${POSTGRES_DB} + PG_META_DB_USER: supabase_admin + PG_META_DB_PASSWORD: ${POSTGRES_PASSWORD} + depends_on: + db: + condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "exit 0"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 10s + networks: + - monacousa-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # Monaco USA Portal (SvelteKit App) + # ============================================ + portal: + build: + context: . + dockerfile: Dockerfile + args: + PUBLIC_SUPABASE_URL: https://api.${DOMAIN} + PUBLIC_SUPABASE_ANON_KEY: ${ANON_KEY} + SUPABASE_SERVICE_ROLE_KEY: ${SERVICE_ROLE_KEY} + container_name: monacousa-portal + restart: unless-stopped + ports: + - "127.0.0.1:7453:3000" + environment: + PUBLIC_SUPABASE_URL: https://api.${DOMAIN} + PUBLIC_SUPABASE_ANON_KEY: ${ANON_KEY} + SUPABASE_SERVICE_ROLE_KEY: ${SERVICE_ROLE_KEY} + SUPABASE_INTERNAL_URL: http://kong:8000 + NODE_ENV: production + ORIGIN: https://${DOMAIN} + BODY_SIZE_LIMIT: ${BODY_SIZE_LIMIT} + depends_on: + kong: + condition: service_started + db: + condition: service_healthy + networks: + - monacousa-network + deploy: + resources: + limits: + memory: 1G + reservations: + memory: 256M + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + +# ============================================ +# Networks +# ============================================ +networks: + monacousa-network: + driver: bridge + +# ============================================ +# Volumes +# ============================================ +volumes: + db-data: + driver: local + storage-data: + driver: local diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..aa8219b --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,440 @@ +# Monaco USA Portal - Production Docker Compose +# For deployment on Debian/Linux servers with Traefik reverse proxy +# +# Usage: +# 1. Copy .env.production.example to .env +# 2. Configure all environment variables +# 3. Run: docker compose -f docker-compose.prod.yml up -d +# +# Prerequisites: +# - Docker and Docker Compose installed +# - Domain DNS pointing to server IP +# - Ports 80 and 443 open + +services: + # ============================================ + # Traefik Reverse Proxy (SSL/HTTPS) + # ============================================ + traefik: + image: traefik:v3.0 + container_name: monacousa-traefik + restart: unless-stopped + command: + - "--api.dashboard=true" + - "--providers.docker=true" + - "--providers.docker.exposedbydefault=false" + - "--entrypoints.web.address=:80" + - "--entrypoints.websecure.address=:443" + - "--entrypoints.web.http.redirections.entryPoint.to=websecure" + - "--entrypoints.web.http.redirections.entryPoint.scheme=https" + - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true" + - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" + - "--certificatesresolvers.letsencrypt.acme.email=${ACME_EMAIL}" + - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" + - "--log.level=INFO" + ports: + - "80:80" + - "443:443" + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - traefik-certs:/letsencrypt + networks: + - monacousa-network + labels: + # Traefik dashboard (optional - remove in production if not needed) + - "traefik.enable=true" + - "traefik.http.routers.traefik.rule=Host(`traefik.${DOMAIN}`)" + - "traefik.http.routers.traefik.entrypoints=websecure" + - "traefik.http.routers.traefik.tls.certresolver=letsencrypt" + - "traefik.http.routers.traefik.service=api@internal" + - "traefik.http.routers.traefik.middlewares=traefik-auth" + - "traefik.http.middlewares.traefik-auth.basicauth.users=${TRAEFIK_DASHBOARD_AUTH}" + + # ============================================ + # PostgreSQL Database + # ============================================ + db: + image: supabase/postgres:15.8.1.060 + container_name: monacousa-db + restart: unless-stopped + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + JWT_SECRET: ${JWT_SECRET} + JWT_EXP: ${JWT_EXPIRY} + volumes: + - db-data:/var/lib/postgresql/data + - ./supabase/migrations:/docker-entrypoint-initdb.d + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - monacousa-network + deploy: + resources: + limits: + memory: 2G + reservations: + memory: 512M + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # Supabase Studio (Dashboard) - Optional + # ============================================ + studio: + image: supabase/studio:20241202-71e5240 + container_name: monacousa-studio + restart: unless-stopped + environment: + STUDIO_PG_META_URL: http://meta:8080 + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + DEFAULT_ORGANIZATION_NAME: Monaco USA + DEFAULT_PROJECT_NAME: Monaco USA Portal + SUPABASE_URL: http://kong:8000 + SUPABASE_PUBLIC_URL: https://api.${DOMAIN} + SUPABASE_ANON_KEY: ${ANON_KEY} + SUPABASE_SERVICE_KEY: ${SERVICE_ROLE_KEY} + depends_on: + meta: + condition: service_healthy + networks: + - monacousa-network + labels: + - "traefik.enable=true" + - "traefik.http.routers.studio.rule=Host(`studio.${DOMAIN}`)" + - "traefik.http.routers.studio.entrypoints=websecure" + - "traefik.http.routers.studio.tls.certresolver=letsencrypt" + - "traefik.http.services.studio.loadbalancer.server.port=3000" + - "traefik.http.routers.studio.middlewares=studio-auth" + - "traefik.http.middlewares.studio-auth.basicauth.users=${STUDIO_AUTH}" + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # Kong API Gateway + # ============================================ + kong: + image: kong:2.8.1 + container_name: monacousa-kong + restart: unless-stopped + environment: + KONG_DATABASE: "off" + KONG_DECLARATIVE_CONFIG: /var/lib/kong/kong.yml + KONG_DNS_ORDER: LAST,A,CNAME + KONG_PLUGINS: request-transformer,cors,key-auth,acl,basic-auth + KONG_NGINX_PROXY_PROXY_BUFFER_SIZE: 160k + KONG_NGINX_PROXY_PROXY_BUFFERS: 64 160k + volumes: + - ./supabase/docker/kong.yml:/var/lib/kong/kong.yml:ro + depends_on: + auth: + condition: service_healthy + networks: + - monacousa-network + labels: + - "traefik.enable=true" + - "traefik.http.routers.kong.rule=Host(`api.${DOMAIN}`)" + - "traefik.http.routers.kong.entrypoints=websecure" + - "traefik.http.routers.kong.tls.certresolver=letsencrypt" + - "traefik.http.services.kong.loadbalancer.server.port=8000" + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # GoTrue (Auth) + # ============================================ + auth: + image: supabase/gotrue:v2.164.0 + container_name: monacousa-auth + restart: unless-stopped + environment: + GOTRUE_API_HOST: 0.0.0.0 + GOTRUE_API_PORT: 9999 + API_EXTERNAL_URL: https://api.${DOMAIN} + + GOTRUE_DB_DRIVER: postgres + GOTRUE_DB_DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?search_path=auth + + GOTRUE_SITE_URL: https://${DOMAIN} + GOTRUE_URI_ALLOW_LIST: ${ADDITIONAL_REDIRECT_URLS} + GOTRUE_DISABLE_SIGNUP: ${DISABLE_SIGNUP} + + GOTRUE_JWT_ADMIN_ROLES: service_role + GOTRUE_JWT_AUD: authenticated + GOTRUE_JWT_DEFAULT_GROUP_NAME: authenticated + GOTRUE_JWT_EXP: ${JWT_EXPIRY} + GOTRUE_JWT_SECRET: ${JWT_SECRET} + + GOTRUE_EXTERNAL_EMAIL_ENABLED: true + GOTRUE_EXTERNAL_ANONYMOUS_USERS_ENABLED: false + GOTRUE_MAILER_AUTOCONFIRM: ${ENABLE_EMAIL_AUTOCONFIRM} + + GOTRUE_SMTP_HOST: ${SMTP_HOST} + GOTRUE_SMTP_PORT: ${SMTP_PORT} + GOTRUE_SMTP_USER: ${SMTP_USER} + GOTRUE_SMTP_PASS: ${SMTP_PASS} + GOTRUE_SMTP_ADMIN_EMAIL: ${SMTP_ADMIN_EMAIL} + GOTRUE_SMTP_SENDER_NAME: ${SMTP_SENDER_NAME} + GOTRUE_MAILER_URLPATHS_INVITE: /auth/verify + GOTRUE_MAILER_URLPATHS_CONFIRMATION: /auth/verify + GOTRUE_MAILER_URLPATHS_RECOVERY: /auth/verify + GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE: /auth/verify + + GOTRUE_RATE_LIMIT_EMAIL_SENT: ${RATE_LIMIT_EMAIL_SENT} + depends_on: + db: + condition: service_healthy + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9999/health"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - monacousa-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # PostgREST (REST API) + # ============================================ + rest: + image: postgrest/postgrest:v12.2.0 + container_name: monacousa-rest + restart: unless-stopped + environment: + PGRST_DB_URI: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} + PGRST_DB_SCHEMAS: ${PGRST_DB_SCHEMAS} + PGRST_DB_ANON_ROLE: anon + PGRST_JWT_SECRET: ${JWT_SECRET} + PGRST_DB_USE_LEGACY_GUCS: "false" + PGRST_APP_SETTINGS_JWT_SECRET: ${JWT_SECRET} + PGRST_APP_SETTINGS_JWT_EXP: ${JWT_EXPIRY} + depends_on: + db: + condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "exit 0"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 10s + networks: + - monacousa-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # Realtime + # ============================================ + realtime: + image: supabase/realtime:v2.33.58 + container_name: monacousa-realtime + restart: unless-stopped + environment: + PORT: 4000 + DB_HOST: db + DB_PORT: 5432 + DB_USER: supabase_admin + DB_PASSWORD: ${POSTGRES_PASSWORD} + DB_NAME: ${POSTGRES_DB} + DB_AFTER_CONNECT_QUERY: 'SET search_path TO _realtime' + DB_ENC_KEY: supabaserealtime + API_JWT_SECRET: ${JWT_SECRET} + SECRET_KEY_BASE: ${SECRET_KEY_BASE} + ERL_AFLAGS: -proto_dist inet_tcp + DNS_NODES: "''" + RLIMIT_NOFILE: "10000" + APP_NAME: realtime + SEED_SELF_HOST: true + depends_on: + db: + condition: service_healthy + networks: + - monacousa-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # Storage API + # ============================================ + storage: + image: supabase/storage-api:v1.11.13 + container_name: monacousa-storage + restart: unless-stopped + environment: + ANON_KEY: ${ANON_KEY} + SERVICE_KEY: ${SERVICE_ROLE_KEY} + POSTGREST_URL: http://rest:3000 + PGRST_JWT_SECRET: ${JWT_SECRET} + DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} + FILE_SIZE_LIMIT: 52428800 + STORAGE_BACKEND: file + FILE_STORAGE_BACKEND_PATH: /var/lib/storage + TENANT_ID: stub + REGION: stub + GLOBAL_S3_BUCKET: stub + ENABLE_IMAGE_TRANSFORMATION: "true" + IMGPROXY_URL: http://imgproxy:8080 + volumes: + - storage-data:/var/lib/storage + depends_on: + db: + condition: service_healthy + rest: + condition: service_healthy + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:5000/status"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - monacousa-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # Image Proxy (for storage transformations) + # ============================================ + imgproxy: + image: darthsim/imgproxy:v3.8.0 + container_name: monacousa-imgproxy + restart: unless-stopped + environment: + IMGPROXY_BIND: ":8080" + IMGPROXY_LOCAL_FILESYSTEM_ROOT: / + IMGPROXY_USE_ETAG: "true" + IMGPROXY_ENABLE_WEBP_DETECTION: "true" + volumes: + - storage-data:/var/lib/storage + healthcheck: + test: ["CMD", "imgproxy", "health"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - monacousa-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # Postgres Meta (for Studio) + # ============================================ + meta: + image: supabase/postgres-meta:v0.84.2 + container_name: monacousa-meta + restart: unless-stopped + environment: + PG_META_PORT: 8080 + PG_META_DB_HOST: db + PG_META_DB_PORT: 5432 + PG_META_DB_NAME: ${POSTGRES_DB} + PG_META_DB_USER: supabase_admin + PG_META_DB_PASSWORD: ${POSTGRES_PASSWORD} + depends_on: + db: + condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "exit 0"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 10s + networks: + - monacousa-network + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + + # ============================================ + # Monaco USA Portal (SvelteKit App) + # ============================================ + portal: + build: + context: . + dockerfile: Dockerfile + args: + PUBLIC_SUPABASE_URL: https://api.${DOMAIN} + PUBLIC_SUPABASE_ANON_KEY: ${ANON_KEY} + SUPABASE_SERVICE_ROLE_KEY: ${SERVICE_ROLE_KEY} + container_name: monacousa-portal + restart: unless-stopped + environment: + PUBLIC_SUPABASE_URL: https://api.${DOMAIN} + PUBLIC_SUPABASE_ANON_KEY: ${ANON_KEY} + SUPABASE_SERVICE_ROLE_KEY: ${SERVICE_ROLE_KEY} + SUPABASE_INTERNAL_URL: http://kong:8000 + NODE_ENV: production + ORIGIN: https://${DOMAIN} + BODY_SIZE_LIMIT: ${BODY_SIZE_LIMIT} + depends_on: + kong: + condition: service_started + db: + condition: service_healthy + networks: + - monacousa-network + labels: + - "traefik.enable=true" + - "traefik.http.routers.portal.rule=Host(`${DOMAIN}`)" + - "traefik.http.routers.portal.entrypoints=websecure" + - "traefik.http.routers.portal.tls.certresolver=letsencrypt" + - "traefik.http.services.portal.loadbalancer.server.port=3000" + deploy: + resources: + limits: + memory: 1G + reservations: + memory: 256M + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + +# ============================================ +# Networks +# ============================================ +networks: + monacousa-network: + driver: bridge + +# ============================================ +# Volumes +# ============================================ +volumes: + db-data: + driver: local + storage-data: + driver: local + traefik-certs: + driver: local diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..cd12f0f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,318 @@ +# Monaco USA Portal - Full Stack Docker Compose +# Includes: PostgreSQL, Supabase Services, and SvelteKit App + +services: + # ============================================ + # PostgreSQL Database + # ============================================ + db: + image: supabase/postgres:15.8.1.060 + container_name: monacousa-db + restart: unless-stopped + ports: + - "${POSTGRES_PORT:-5435}:5432" + environment: + POSTGRES_USER: ${POSTGRES_USER:-postgres} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + POSTGRES_DB: ${POSTGRES_DB:-postgres} + JWT_SECRET: ${JWT_SECRET} + JWT_EXP: ${JWT_EXPIRY:-3600} + volumes: + - db-data:/var/lib/postgresql/data + - ./supabase/migrations:/docker-entrypoint-initdb.d + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - monacousa-network + + # ============================================ + # Supabase Studio (Dashboard) + # ============================================ + studio: + image: supabase/studio:20241202-71e5240 + container_name: monacousa-studio + restart: unless-stopped + ports: + - "${STUDIO_PORT:-7454}:3000" + environment: + STUDIO_PG_META_URL: http://meta:8080 + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + DEFAULT_ORGANIZATION_NAME: Monaco USA + DEFAULT_PROJECT_NAME: Monaco USA Portal + SUPABASE_URL: http://kong:8000 + SUPABASE_PUBLIC_URL: ${SUPABASE_PUBLIC_URL:-http://localhost:7455} + SUPABASE_ANON_KEY: ${ANON_KEY} + SUPABASE_SERVICE_KEY: ${SERVICE_ROLE_KEY} + depends_on: + meta: + condition: service_healthy + networks: + - monacousa-network + + # ============================================ + # Kong API Gateway + # ============================================ + kong: + image: kong:2.8.1 + container_name: monacousa-kong + restart: unless-stopped + ports: + - "${KONG_HTTP_PORT:-7455}:8000" + - "${KONG_HTTPS_PORT:-7456}:8443" + environment: + KONG_DATABASE: "off" + KONG_DECLARATIVE_CONFIG: /var/lib/kong/kong.yml + KONG_DNS_ORDER: LAST,A,CNAME + KONG_PLUGINS: request-transformer,cors,key-auth,acl,basic-auth + KONG_NGINX_PROXY_PROXY_BUFFER_SIZE: 160k + KONG_NGINX_PROXY_PROXY_BUFFERS: 64 160k + volumes: + - ./supabase/docker/kong.yml:/var/lib/kong/kong.yml:ro + depends_on: + auth: + condition: service_healthy + networks: + - monacousa-network + + # ============================================ + # GoTrue (Auth) + # ============================================ + auth: + image: supabase/gotrue:v2.164.0 + container_name: monacousa-auth + restart: unless-stopped + environment: + GOTRUE_API_HOST: 0.0.0.0 + GOTRUE_API_PORT: 9999 + API_EXTERNAL_URL: ${API_EXTERNAL_URL:-http://localhost:7455} + + GOTRUE_DB_DRIVER: postgres + GOTRUE_DB_DATABASE_URL: postgres://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-postgres}?search_path=auth + + GOTRUE_SITE_URL: ${SITE_URL:-http://localhost:3000} + GOTRUE_URI_ALLOW_LIST: ${ADDITIONAL_REDIRECT_URLS} + GOTRUE_DISABLE_SIGNUP: ${DISABLE_SIGNUP:-false} + + GOTRUE_JWT_ADMIN_ROLES: service_role + GOTRUE_JWT_AUD: authenticated + GOTRUE_JWT_DEFAULT_GROUP_NAME: authenticated + GOTRUE_JWT_EXP: ${JWT_EXPIRY:-3600} + GOTRUE_JWT_SECRET: ${JWT_SECRET} + + GOTRUE_EXTERNAL_EMAIL_ENABLED: true + GOTRUE_EXTERNAL_ANONYMOUS_USERS_ENABLED: false + GOTRUE_MAILER_AUTOCONFIRM: ${ENABLE_EMAIL_AUTOCONFIRM:-false} + + GOTRUE_SMTP_HOST: ${SMTP_HOST:-} + GOTRUE_SMTP_PORT: ${SMTP_PORT:-587} + GOTRUE_SMTP_USER: ${SMTP_USER:-} + GOTRUE_SMTP_PASS: ${SMTP_PASS:-} + GOTRUE_SMTP_ADMIN_EMAIL: ${SMTP_ADMIN_EMAIL:-noreply@monacousa.org} + GOTRUE_SMTP_SENDER_NAME: ${SMTP_SENDER_NAME:-Monaco USA} + GOTRUE_MAILER_URLPATHS_INVITE: ${MAILER_URLPATHS_INVITE:-/auth/verify} + GOTRUE_MAILER_URLPATHS_CONFIRMATION: ${MAILER_URLPATHS_CONFIRMATION:-/auth/verify} + GOTRUE_MAILER_URLPATHS_RECOVERY: ${MAILER_URLPATHS_RECOVERY:-/auth/verify} + GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE: ${MAILER_URLPATHS_EMAIL_CHANGE:-/auth/verify} + + GOTRUE_RATE_LIMIT_EMAIL_SENT: ${RATE_LIMIT_EMAIL_SENT:-100} + depends_on: + db: + condition: service_healthy + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9999/health"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - monacousa-network + + # ============================================ + # PostgREST (REST API) + # ============================================ + rest: + image: postgrest/postgrest:v12.2.0 + container_name: monacousa-rest + restart: unless-stopped + environment: + PGRST_DB_URI: postgres://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-postgres} + PGRST_DB_SCHEMAS: ${PGRST_DB_SCHEMAS:-public,storage,graphql_public} + PGRST_DB_ANON_ROLE: anon + PGRST_JWT_SECRET: ${JWT_SECRET} + PGRST_DB_USE_LEGACY_GUCS: "false" + PGRST_APP_SETTINGS_JWT_SECRET: ${JWT_SECRET} + PGRST_APP_SETTINGS_JWT_EXP: ${JWT_EXPIRY:-3600} + depends_on: + db: + condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "exit 0"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 10s + networks: + - monacousa-network + + # ============================================ + # Realtime + # ============================================ + realtime: + image: supabase/realtime:v2.33.58 + container_name: monacousa-realtime + restart: unless-stopped + environment: + PORT: 4000 + DB_HOST: db + DB_PORT: 5432 + DB_USER: supabase_admin + DB_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + DB_NAME: ${POSTGRES_DB:-postgres} + DB_AFTER_CONNECT_QUERY: 'SET search_path TO _realtime' + DB_ENC_KEY: supabaserealtime + API_JWT_SECRET: ${JWT_SECRET} + SECRET_KEY_BASE: ${SECRET_KEY_BASE:-UpNVntn3cDxHJpq99YMc1T1AQgQpc8kfYTuRgBiYa15BLrx8etQoXz3gZv1/u2oq} + ERL_AFLAGS: -proto_dist inet_tcp + DNS_NODES: "''" + RLIMIT_NOFILE: "10000" + APP_NAME: realtime + SEED_SELF_HOST: true + depends_on: + db: + condition: service_healthy + networks: + - monacousa-network + + # ============================================ + # Storage API + # ============================================ + storage: + image: supabase/storage-api:v1.11.13 + container_name: monacousa-storage + restart: unless-stopped + environment: + ANON_KEY: ${ANON_KEY} + SERVICE_KEY: ${SERVICE_ROLE_KEY} + POSTGREST_URL: http://rest:3000 + PGRST_JWT_SECRET: ${JWT_SECRET} + DATABASE_URL: postgres://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-postgres} + FILE_SIZE_LIMIT: 52428800 + STORAGE_BACKEND: file + FILE_STORAGE_BACKEND_PATH: /var/lib/storage + TENANT_ID: stub + REGION: stub + GLOBAL_S3_BUCKET: stub + ENABLE_IMAGE_TRANSFORMATION: "true" + IMGPROXY_URL: http://imgproxy:8080 + volumes: + - storage-data:/var/lib/storage + depends_on: + db: + condition: service_healthy + rest: + condition: service_healthy + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:5000/status"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - monacousa-network + + # ============================================ + # Image Proxy (for storage transformations) + # ============================================ + imgproxy: + image: darthsim/imgproxy:v3.8.0 + container_name: monacousa-imgproxy + restart: unless-stopped + environment: + IMGPROXY_BIND: ":8080" + IMGPROXY_LOCAL_FILESYSTEM_ROOT: / + IMGPROXY_USE_ETAG: "true" + IMGPROXY_ENABLE_WEBP_DETECTION: "true" + volumes: + - storage-data:/var/lib/storage + healthcheck: + test: ["CMD", "imgproxy", "health"] + interval: 10s + timeout: 5s + retries: 5 + networks: + - monacousa-network + + # ============================================ + # Postgres Meta (for Studio) + # ============================================ + meta: + image: supabase/postgres-meta:v0.84.2 + container_name: monacousa-meta + restart: unless-stopped + environment: + PG_META_PORT: 8080 + PG_META_DB_HOST: db + PG_META_DB_PORT: 5432 + PG_META_DB_NAME: ${POSTGRES_DB:-postgres} + PG_META_DB_USER: supabase_admin + PG_META_DB_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + depends_on: + db: + condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "exit 0"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 10s + networks: + - monacousa-network + + # ============================================ + # Monaco USA Portal (SvelteKit App) + # ============================================ + portal: + build: + context: . + dockerfile: Dockerfile + args: + PUBLIC_SUPABASE_URL: ${PUBLIC_SUPABASE_URL:-http://localhost:7455} + PUBLIC_SUPABASE_ANON_KEY: ${ANON_KEY} + SUPABASE_SERVICE_ROLE_KEY: ${SERVICE_ROLE_KEY} + container_name: monacousa-portal + restart: unless-stopped + ports: + - "${PORTAL_PORT:-7453}:3000" + environment: + PUBLIC_SUPABASE_URL: ${PUBLIC_SUPABASE_URL:-http://localhost:7455} + PUBLIC_SUPABASE_ANON_KEY: ${ANON_KEY} + SUPABASE_SERVICE_ROLE_KEY: ${SERVICE_ROLE_KEY} + SUPABASE_INTERNAL_URL: http://kong:8000 + NODE_ENV: production + ORIGIN: http://localhost:7453 + # Body size limit for file uploads (50MB) + BODY_SIZE_LIMIT: ${BODY_SIZE_LIMIT:-52428800} + depends_on: + kong: + condition: service_started + db: + condition: service_healthy + networks: + - monacousa-network + +# ============================================ +# Networks +# ============================================ +networks: + monacousa-network: + driver: bridge + +# ============================================ +# Volumes +# ============================================ +volumes: + db-data: + driver: local + storage-data: + driver: local diff --git a/nginx/portal.monacousa.org.conf b/nginx/portal.monacousa.org.conf new file mode 100644 index 0000000..503710f --- /dev/null +++ b/nginx/portal.monacousa.org.conf @@ -0,0 +1,244 @@ +# Monaco USA Portal - Nginx Configuration +# Location: /etc/nginx/sites-available/portal.monacousa.org +# +# Installation: +# 1. Copy to /etc/nginx/sites-available/ +# 2. Create symlink: ln -s /etc/nginx/sites-available/portal.monacousa.org /etc/nginx/sites-enabled/ +# 3. Test config: nginx -t +# 4. Get SSL cert: certbot --nginx -d portal.monacousa.org -d api.monacousa.org -d studio.monacousa.org +# 5. Reload: systemctl reload nginx + +# Rate limiting zone +limit_req_zone $binary_remote_addr zone=portal_limit:10m rate=10r/s; +limit_req_zone $binary_remote_addr zone=api_limit:10m rate=30r/s; + +# Upstream definitions +upstream portal_backend { + server 127.0.0.1:7453; + keepalive 32; +} + +upstream api_backend { + server 127.0.0.1:7455; + keepalive 32; +} + +upstream studio_backend { + server 127.0.0.1:7454; + keepalive 16; +} + +# Main Portal - portal.monacousa.org +server { + listen 80; + listen [::]:80; + server_name portal.monacousa.org; + + # Redirect all HTTP to HTTPS + location / { + return 301 https://$host$request_uri; + } + + # Let's Encrypt challenge + location /.well-known/acme-challenge/ { + root /var/www/html; + } +} + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name portal.monacousa.org; + + # SSL certificates (managed by certbot) + # ssl_certificate /etc/letsencrypt/live/portal.monacousa.org/fullchain.pem; + # ssl_certificate_key /etc/letsencrypt/live/portal.monacousa.org/privkey.pem; + # include /etc/letsencrypt/options-ssl-nginx.conf; + # ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + # Temporary self-signed for testing (remove after certbot) + ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; + ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + add_header Referrer-Policy "strict-origin-when-cross-origin" always; + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + + # Logging + access_log /var/log/nginx/portal.monacousa.org.access.log; + error_log /var/log/nginx/portal.monacousa.org.error.log; + + # Client body size (for file uploads) + client_max_body_size 50M; + + # Gzip compression + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_proxied any; + gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml+rss image/svg+xml; + + # Rate limiting + limit_req zone=portal_limit burst=20 nodelay; + + # Main application + location / { + proxy_pass http://portal_backend; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + # Timeouts + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + + # Buffering + proxy_buffering on; + proxy_buffer_size 4k; + proxy_buffers 8 4k; + } + + # Static assets with caching + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + proxy_pass http://portal_backend; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # Cache static assets + expires 1y; + add_header Cache-Control "public, immutable"; + } +} + +# Supabase API - api.monacousa.org +server { + listen 80; + listen [::]:80; + server_name api.monacousa.org; + + location / { + return 301 https://$host$request_uri; + } + + location /.well-known/acme-challenge/ { + root /var/www/html; + } +} + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name api.monacousa.org; + + # SSL certificates (managed by certbot) + # ssl_certificate /etc/letsencrypt/live/portal.monacousa.org/fullchain.pem; + # ssl_certificate_key /etc/letsencrypt/live/portal.monacousa.org/privkey.pem; + # include /etc/letsencrypt/options-ssl-nginx.conf; + # ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + # Temporary self-signed for testing + ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; + ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; + + # Security headers + add_header X-Frame-Options "DENY" always; + add_header X-Content-Type-Options "nosniff" always; + + # Logging + access_log /var/log/nginx/api.monacousa.org.access.log; + error_log /var/log/nginx/api.monacousa.org.error.log; + + # Client body size + client_max_body_size 50M; + + # Rate limiting (higher for API) + limit_req zone=api_limit burst=50 nodelay; + + # CORS preflight + location / { + if ($request_method = 'OPTIONS') { + add_header 'Access-Control-Allow-Origin' '*'; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, PATCH, OPTIONS'; + add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type, apikey, x-client-info'; + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Type' 'text/plain charset=UTF-8'; + add_header 'Content-Length' 0; + return 204; + } + + proxy_pass http://api_backend; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + # Longer timeout for realtime connections + proxy_connect_timeout 60s; + proxy_send_timeout 300s; + proxy_read_timeout 300s; + } +} + +# Supabase Studio - studio.monacousa.org (optional, for admin access) +server { + listen 80; + listen [::]:80; + server_name studio.monacousa.org; + + location / { + return 301 https://$host$request_uri; + } + + location /.well-known/acme-challenge/ { + root /var/www/html; + } +} + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name studio.monacousa.org; + + # SSL certificates (managed by certbot) + # ssl_certificate /etc/letsencrypt/live/portal.monacousa.org/fullchain.pem; + # ssl_certificate_key /etc/letsencrypt/live/portal.monacousa.org/privkey.pem; + # include /etc/letsencrypt/options-ssl-nginx.conf; + # ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + # Temporary self-signed for testing + ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; + ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; + + # Basic auth protection for studio + auth_basic "Monaco USA Admin"; + auth_basic_user_file /etc/nginx/.htpasswd; + + # Logging + access_log /var/log/nginx/studio.monacousa.org.access.log; + error_log /var/log/nginx/studio.monacousa.org.error.log; + + location / { + proxy_pass http://studio_backend; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } +} diff --git a/nginx/portal.monacousa.org.initial.conf b/nginx/portal.monacousa.org.initial.conf new file mode 100644 index 0000000..5e49ff1 --- /dev/null +++ b/nginx/portal.monacousa.org.initial.conf @@ -0,0 +1,161 @@ +# Monaco USA Portal - Initial Nginx Configuration (HTTP only) +# Location: /etc/nginx/sites-available/portal.monacousa.org +# +# This is the initial config before running certbot. +# +# Installation: +# 1. sudo cp portal.monacousa.org.initial.conf /etc/nginx/sites-available/portal.monacousa.org +# 2. sudo ln -s /etc/nginx/sites-available/portal.monacousa.org /etc/nginx/sites-enabled/ +# 3. sudo nginx -t +# 4. sudo systemctl reload nginx +# 5. sudo certbot --nginx -d portal.monacousa.org -d api.monacousa.org -d studio.monacousa.org +# +# After certbot succeeds, it will automatically update this config with SSL settings. + +# Rate limiting zones +limit_req_zone $binary_remote_addr zone=portal_limit:10m rate=10r/s; +limit_req_zone $binary_remote_addr zone=api_limit:10m rate=30r/s; + +# Upstream definitions +upstream portal_backend { + server 127.0.0.1:7453; + keepalive 32; +} + +upstream api_backend { + server 127.0.0.1:7455; + keepalive 32; +} + +upstream studio_backend { + server 127.0.0.1:7454; + keepalive 16; +} + +# Main Portal - portal.monacousa.org +server { + listen 80; + listen [::]:80; + server_name portal.monacousa.org; + + # Let's Encrypt challenge + location /.well-known/acme-challenge/ { + root /var/www/html; + } + + # Logging + access_log /var/log/nginx/portal.monacousa.org.access.log; + error_log /var/log/nginx/portal.monacousa.org.error.log; + + # Client body size (for file uploads) + client_max_body_size 50M; + + # Gzip compression + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_proxied any; + gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml+rss image/svg+xml; + + # Rate limiting + limit_req zone=portal_limit burst=20 nodelay; + + # Main application + location / { + proxy_pass http://portal_backend; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + # Timeouts + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + + # Buffering + proxy_buffering on; + proxy_buffer_size 4k; + proxy_buffers 8 4k; + } + + # Static assets with caching + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + proxy_pass http://portal_backend; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # Cache static assets + expires 1y; + add_header Cache-Control "public, immutable"; + } +} + +# Supabase API - api.monacousa.org +server { + listen 80; + listen [::]:80; + server_name api.monacousa.org; + + location /.well-known/acme-challenge/ { + root /var/www/html; + } + + # Logging + access_log /var/log/nginx/api.monacousa.org.access.log; + error_log /var/log/nginx/api.monacousa.org.error.log; + + # Client body size + client_max_body_size 50M; + + # Rate limiting + limit_req zone=api_limit burst=50 nodelay; + + location / { + proxy_pass http://api_backend; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + # Longer timeout for realtime connections + proxy_connect_timeout 60s; + proxy_send_timeout 300s; + proxy_read_timeout 300s; + } +} + +# Supabase Studio - studio.monacousa.org (optional) +server { + listen 80; + listen [::]:80; + server_name studio.monacousa.org; + + location /.well-known/acme-challenge/ { + root /var/www/html; + } + + # Logging + access_log /var/log/nginx/studio.monacousa.org.access.log; + error_log /var/log/nginx/studio.monacousa.org.error.log; + + location / { + proxy_pass http://studio_backend; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } +} diff --git a/npm.log b/npm.log new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4146dc5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4514 @@ +{ + "name": "monacousa-portal-2026", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "monacousa-portal-2026", + "version": "0.0.1", + "dependencies": { + "@aws-sdk/client-s3": "^3.700.0", + "@aws-sdk/s3-request-presigner": "^3.700.0", + "@supabase/ssr": "^0.8.0", + "@supabase/supabase-js": "^2.90.1", + "@sveltejs/adapter-node": "^5.5.1", + "flag-icons": "^7.4.0", + "nodemailer": "^6.9.0" + }, + "devDependencies": { + "@sveltejs/adapter-auto": "^7.0.0", + "@sveltejs/kit": "^2.49.1", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@tailwindcss/vite": "^4.1.18", + "bits-ui": "^2.15.4", + "clsx": "^2.1.1", + "lucide-svelte": "^0.562.0", + "svelte": "^5.45.6", + "svelte-check": "^4.3.4", + "tailwind-merge": "^3.4.0", + "tailwind-variants": "^3.2.2", + "tailwindcss": "^4.1.18", + "typescript": "^5.9.3", + "vite": "^7.2.6" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/crc32c": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", + "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", + "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.974.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.974.0.tgz", + "integrity": "sha512-X+vpXNJ8cU8Iw1FtDgDHxo9z6RxlXfcTtpdGnKws4rk+tCYKSAor/DG6BRMzbh4E5xAA7DiU1Ny3BTrRRSt/Yg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.0", + "@aws-sdk/credential-provider-node": "^3.972.1", + "@aws-sdk/middleware-bucket-endpoint": "^3.972.1", + "@aws-sdk/middleware-expect-continue": "^3.972.1", + "@aws-sdk/middleware-flexible-checksums": "^3.972.1", + "@aws-sdk/middleware-host-header": "^3.972.1", + "@aws-sdk/middleware-location-constraint": "^3.972.1", + "@aws-sdk/middleware-logger": "^3.972.1", + "@aws-sdk/middleware-recursion-detection": "^3.972.1", + "@aws-sdk/middleware-sdk-s3": "^3.972.1", + "@aws-sdk/middleware-ssec": "^3.972.1", + "@aws-sdk/middleware-user-agent": "^3.972.1", + "@aws-sdk/region-config-resolver": "^3.972.1", + "@aws-sdk/signature-v4-multi-region": "3.972.0", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-endpoints": "3.972.0", + "@aws-sdk/util-user-agent-browser": "^3.972.1", + "@aws-sdk/util-user-agent-node": "^3.972.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.21.0", + "@smithy/eventstream-serde-browser": "^4.2.8", + "@smithy/eventstream-serde-config-resolver": "^4.3.8", + "@smithy/eventstream-serde-node": "^4.2.8", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-blob-browser": "^4.2.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/hash-stream-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/md5-js": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.10", + "@smithy/middleware-retry": "^4.4.26", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.11", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.25", + "@smithy/util-defaults-mode-node": "^4.2.28", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.974.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.974.0.tgz", + "integrity": "sha512-ci+GiM0c4ULo4D79UMcY06LcOLcfvUfiyt8PzNY0vbt5O8BfCPYf4QomwVgkNcLLCYmroO4ge2Yy1EsLUlcD6g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.0", + "@aws-sdk/middleware-host-header": "^3.972.1", + "@aws-sdk/middleware-logger": "^3.972.1", + "@aws-sdk/middleware-recursion-detection": "^3.972.1", + "@aws-sdk/middleware-user-agent": "^3.972.1", + "@aws-sdk/region-config-resolver": "^3.972.1", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-endpoints": "3.972.0", + "@aws-sdk/util-user-agent-browser": "^3.972.1", + "@aws-sdk/util-user-agent-node": "^3.972.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.21.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.10", + "@smithy/middleware-retry": "^4.4.26", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.11", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.25", + "@smithy/util-defaults-mode-node": "^4.2.28", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.973.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.0.tgz", + "integrity": "sha512-qy3Fmt8z4PRInM3ZqJmHihQ2tfCdj/MzbGaZpuHjYjgl1/Gcar4Pyp/zzHXh9hGEb61WNbWgsJcDUhnGIiX1TA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/xml-builder": "^3.972.1", + "@smithy/core": "^3.21.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.10.11", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/crc64-nvme": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.0.tgz", + "integrity": "sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.1.tgz", + "integrity": "sha512-/etNHqnx96phy/SjI0HRC588o4vKH5F0xfkZ13yAATV7aNrb+5gYGNE6ePWafP+FuZ3HkULSSlJFj0AxgrAqYw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.0", + "@aws-sdk/types": "^3.973.0", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.1.tgz", + "integrity": "sha512-AeopObGW5lpWbDRZ+t4EAtS7wdfSrHPLeFts7jaBzgIaCCD7TL7jAyAB9Y5bCLOPF+17+GL54djCCsjePljUAw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.0", + "@aws-sdk/types": "^3.973.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.11", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.1.tgz", + "integrity": "sha512-OdbJA3v+XlNDsrYzNPRUwr8l7gw1r/nR8l4r96MDzSBDU8WEo8T6C06SvwaXR8SpzsjO3sq5KMP86wXWg7Rj4g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.0", + "@aws-sdk/credential-provider-env": "^3.972.1", + "@aws-sdk/credential-provider-http": "^3.972.1", + "@aws-sdk/credential-provider-login": "^3.972.1", + "@aws-sdk/credential-provider-process": "^3.972.1", + "@aws-sdk/credential-provider-sso": "^3.972.1", + "@aws-sdk/credential-provider-web-identity": "^3.972.1", + "@aws-sdk/nested-clients": "3.974.0", + "@aws-sdk/types": "^3.973.0", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.1.tgz", + "integrity": "sha512-CccqDGL6ZrF3/EFWZefvKW7QwwRdxlHUO8NVBKNVcNq6womrPDvqB6xc9icACtE0XB0a7PLoSTkAg8bQVkTO2w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.0", + "@aws-sdk/nested-clients": "3.974.0", + "@aws-sdk/types": "^3.973.0", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.1.tgz", + "integrity": "sha512-DwXPk9GfuU/xG9tmCyXFVkCr6X3W8ZCoL5Ptb0pbltEx1/LCcg7T+PBqDlPiiinNCD6ilIoMJDWsnJ8ikzZA7Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.1", + "@aws-sdk/credential-provider-http": "^3.972.1", + "@aws-sdk/credential-provider-ini": "^3.972.1", + "@aws-sdk/credential-provider-process": "^3.972.1", + "@aws-sdk/credential-provider-sso": "^3.972.1", + "@aws-sdk/credential-provider-web-identity": "^3.972.1", + "@aws-sdk/types": "^3.973.0", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.1.tgz", + "integrity": "sha512-bi47Zigu3692SJwdBvo8y1dEwE6B61stCwCFnuRWJVTfiM84B+VTSCV661CSWJmIZzmcy7J5J3kWyxL02iHj0w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.0", + "@aws-sdk/types": "^3.973.0", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.1.tgz", + "integrity": "sha512-dLZVNhM7wSgVUFsgVYgI5hb5Z/9PUkT46pk/SHrSmUqfx6YDvoV4YcPtaiRqviPpEGGiRtdQMEadyOKIRqulUQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.974.0", + "@aws-sdk/core": "^3.973.0", + "@aws-sdk/token-providers": "3.974.0", + "@aws-sdk/types": "^3.973.0", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.1.tgz", + "integrity": "sha512-YMDeYgi0u687Ay0dAq/pFPKuijrlKTgsaB/UATbxCs/FzZfMiG4If5ksywHmmW7MiYUF8VVv+uou3TczvLrN4w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.0", + "@aws-sdk/nested-clients": "3.974.0", + "@aws-sdk/types": "^3.973.0", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.1.tgz", + "integrity": "sha512-YVvoitBdE8WOpHqIXvv49efT73F4bJ99XH2bi3Dn3mx7WngI4RwHwn/zF5i0q1Wdi5frGSCNF3vuh+pY817//w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-arn-parser": "^3.972.1", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.1.tgz", + "integrity": "sha512-6lfl2/J/kutzw/RLu1kjbahsz4vrGPysrdxWaw8fkjLYG+6M6AswocIAZFS/LgAVi/IWRwPTx9YC0/NH2wDrSw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.972.1.tgz", + "integrity": "sha512-kjVVREpqeUkYQsXr78AcsJbEUlxGH7+H6yS7zkjrnu6HyEVxbdSndkKX6VpKneFOihjCAhIXlk4wf3butDHkNQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "^3.973.0", + "@aws-sdk/crc64-nvme": "3.972.0", + "@aws-sdk/types": "^3.973.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.1.tgz", + "integrity": "sha512-/R82lXLPmZ9JaUGSUdKtBp2k/5xQxvBT3zZWyKiBOhyulFotlfvdlrO8TnqstBimsl4lYEYySDL+W6ldFh6ALg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.1.tgz", + "integrity": "sha512-YisPaCbvBk9gY5aUI8jDMDKXsLZ9Fet0WYj1MviK8tZYMgxBIYHM6l3O/OHaAIujojZvamd9F3haYYYWp5/V3w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.0", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.1.tgz", + "integrity": "sha512-JGgFl6cHg9G2FHu4lyFIzmFN8KESBiRr84gLC3Aeni0Gt1nKm+KxWLBuha/RPcXxJygGXCcMM4AykkIwxor8RA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.0", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.1.tgz", + "integrity": "sha512-taGzNRe8vPHjnliqXIHp9kBgIemLE/xCaRTMH1NH0cncHeaPcjxtnCroAAM9aOlPuKvBe2CpZESyvM1+D8oI7Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.0", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.1.tgz", + "integrity": "sha512-q/hK0ZNf/aafFRv2wIlDM3p+izi5cXwktVNvRvW646A0MvVZmT4/vwadv/jPA9AORFbnpyf/0luxiMz181f9yg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.0", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-arn-parser": "^3.972.1", + "@smithy/core": "^3.21.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.10.11", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.1.tgz", + "integrity": "sha512-fLtRTPd/MxJT2drJKft2GVGKm35PiNEeQ1Dvz1vc/WhhgAteYrp4f1SfSgjgLaYWGMExESJL4bt8Dxqp6tVsog==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.0", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.1.tgz", + "integrity": "sha512-6SVg4pY/9Oq9MLzO48xuM3lsOb8Rxg55qprEtFRpkUmuvKij31f5SQHEGxuiZ4RqIKrfjr2WMuIgXvqJ0eJsPA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.0", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-endpoints": "3.972.0", + "@smithy/core": "^3.21.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.974.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.974.0.tgz", + "integrity": "sha512-k3dwdo/vOiHMJc9gMnkPl1BA5aQfTrZbz+8fiDkWrPagqAioZgmo5oiaOaeX0grObfJQKDtcpPFR4iWf8cgl8Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.0", + "@aws-sdk/middleware-host-header": "^3.972.1", + "@aws-sdk/middleware-logger": "^3.972.1", + "@aws-sdk/middleware-recursion-detection": "^3.972.1", + "@aws-sdk/middleware-user-agent": "^3.972.1", + "@aws-sdk/region-config-resolver": "^3.972.1", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-endpoints": "3.972.0", + "@aws-sdk/util-user-agent-browser": "^3.972.1", + "@aws-sdk/util-user-agent-node": "^3.972.1", + "@smithy/config-resolver": "^4.4.6", + "@smithy/core": "^3.21.0", + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/hash-node": "^4.2.8", + "@smithy/invalid-dependency": "^4.2.8", + "@smithy/middleware-content-length": "^4.2.8", + "@smithy/middleware-endpoint": "^4.4.10", + "@smithy/middleware-retry": "^4.4.26", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.11", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.25", + "@smithy/util-defaults-mode-node": "^4.2.28", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.1.tgz", + "integrity": "sha512-voIY8RORpxLAEgEkYaTFnkaIuRwVBEc+RjVZYcSSllPV+ZEKAacai6kNhJeE3D70Le+JCfvRb52tng/AVHY+jQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.0", + "@smithy/config-resolver": "^4.4.6", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/s3-request-presigner": { + "version": "3.974.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.974.0.tgz", + "integrity": "sha512-tApmJb4XXBdNQzxTYIBq9aYj8vjJqiMPyeUF25wzvGjLQfXgvcv5sTR4yyzXBxRc8+O7quWDBgMJGtcNerapRQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/signature-v4-multi-region": "3.972.0", + "@aws-sdk/types": "^3.973.0", + "@aws-sdk/util-format-url": "^3.972.1", + "@smithy/middleware-endpoint": "^4.4.10", + "@smithy/protocol-http": "^5.3.8", + "@smithy/smithy-client": "^4.10.11", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.972.0.tgz", + "integrity": "sha512-2udiRijmjpN81Pvajje4TsjbXDZNP6K9bYUanBYH8hXa/tZG5qfGCySD+TyX0sgDxCQmEDMg3LaQdfjNHBDEgQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.972.0", + "@aws-sdk/types": "3.972.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/core": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.972.0.tgz", + "integrity": "sha512-nEeUW2M9F+xdIaD98F5MBcQ4ITtykj3yKbgFZ6J0JtL3bq+Z90szQ6Yy8H/BLPYXTs3V4n9ifnBo8cprRDiE6A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.972.0", + "@aws-sdk/xml-builder": "3.972.0", + "@smithy/core": "^3.20.6", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.10.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.0.tgz", + "integrity": "sha512-0bcKFXWx+NZ7tIlOo7KjQ+O2rydiHdIQahrq+fN6k9Osky29v17guy68urUKfhTobR6iY6KvxkroFWaFtTgS5w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.972.0", + "@aws-sdk/types": "3.972.0", + "@aws-sdk/util-arn-parser": "3.972.0", + "@smithy/core": "^3.20.6", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/signature-v4": "^5.3.8", + "@smithy/smithy-client": "^4.10.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.972.0.tgz", + "integrity": "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.0.tgz", + "integrity": "sha512-RM5Mmo/KJ593iMSrALlHEOcc9YOIyOsDmS5x2NLOMdEmzv1o00fcpAkCQ02IGu1eFneBFT7uX0Mpag0HI+Cz2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/xml-builder": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.0.tgz", + "integrity": "sha512-POaGMcXnozzqBUyJM3HLUZ9GR6OKJWPGJEmhtTnxZXt8B6JcJ/6K3xRJ5H/j8oovVLz8Wg6vFxAHv8lvuASxMg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.974.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.974.0.tgz", + "integrity": "sha512-cBykL0LiccKIgNhGWvQRTPvsBLPZxnmJU3pYxG538jpFX8lQtrCy1L7mmIHNEdxIdIGEPgAEHF8/JQxgBToqUQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.0", + "@aws-sdk/nested-clients": "3.974.0", + "@aws-sdk/types": "^3.973.0", + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.973.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.0.tgz", + "integrity": "sha512-jYIdB7a7jhRTvyb378nsjyvJh1Si+zVduJ6urMNGpz8RjkmHZ+9vM2H07XaIB2Cfq0GhJRZYOfUCH8uqQhqBkQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.1.tgz", + "integrity": "sha512-XnNit6H9PPHhqUXW/usjX6JeJ6Pm8ZNqivTjmNjgWHeOfVpblUc/MTic02UmCNR0jJLPjQ3mBKiMen0tnkNQjQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.972.0.tgz", + "integrity": "sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.972.0", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-endpoints": "^3.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { + "version": "3.972.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.972.0.tgz", + "integrity": "sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-format-url": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.972.1.tgz", + "integrity": "sha512-8wJ4/XOLU/RIYBHsXsIOTR04bNmalC8F2YPMyf3oL8YC750M3Rv5WGywW0Fo07HCv770KXJOzVq03Gyl68moFg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.0", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.3.tgz", + "integrity": "sha512-FNUqAjlKAGA7GM05kywE99q8wiPHPZqrzhq3wXRga6PRD6A0kzT85Pb0AzYBVTBRpSrKyyr6M92Y6bnSBVp2BA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.1.tgz", + "integrity": "sha512-IgF55NFmJX8d9Wql9M0nEpk2eYbuD8G4781FN4/fFgwTXBn86DvlZJuRWDCMcMqZymnBVX7HW9r+3r9ylqfW0w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.0", + "@smithy/types": "^4.12.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.972.1.tgz", + "integrity": "sha512-oIs4JFcADzoZ0c915R83XvK2HltWupxNsXUIuZse2rgk7b97zTpkxaqXiH0h9ylh31qtgo/t8hp4tIqcsMrEbQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "^3.972.1", + "@aws-sdk/types": "^3.973.0", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.1.tgz", + "integrity": "sha512-6zZGlPOqn7Xb+25MAXGb1JhgvaC5HjZj6GzszuVrnEgbhvzBRFGKYemuHBV4bho+dtqeYKPgaZUv7/e80hIGNg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz", + "integrity": "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@internationalized/date": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.10.1.tgz", + "integrity": "sha512-oJrXtQiAXLvT9clCf1K4kxp3eKsQhIaZqxEyowkBcsvZDdZkbWrVmnGknxs5flTD0VGsxrxKgBCZty1EzoiMzA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "28.0.9", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.9.tgz", + "integrity": "sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", + "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.56.0.tgz", + "integrity": "sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.56.0.tgz", + "integrity": "sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.56.0.tgz", + "integrity": "sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.56.0.tgz", + "integrity": "sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.56.0.tgz", + "integrity": "sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.56.0.tgz", + "integrity": "sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.56.0.tgz", + "integrity": "sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.56.0.tgz", + "integrity": "sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.56.0.tgz", + "integrity": "sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.56.0.tgz", + "integrity": "sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.56.0.tgz", + "integrity": "sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.56.0.tgz", + "integrity": "sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.56.0.tgz", + "integrity": "sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.56.0.tgz", + "integrity": "sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.56.0.tgz", + "integrity": "sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.56.0.tgz", + "integrity": "sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.56.0.tgz", + "integrity": "sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz", + "integrity": "sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz", + "integrity": "sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz", + "integrity": "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz", + "integrity": "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz", + "integrity": "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz", + "integrity": "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz", + "integrity": "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz", + "integrity": "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@smithy/abort-controller": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.8.tgz", + "integrity": "sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", + "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", + "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.6.tgz", + "integrity": "sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.21.1.tgz", + "integrity": "sha512-NUH8R4O6FkN8HKMojzbGg/5pNjsfTjlMmeFclyPfPaXXUrbr5TzhWgbf7t92wfrpCHRgpjyz7ffASIS3wX28aA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.9", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-stream": "^4.5.10", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.8.tgz", + "integrity": "sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.8.tgz", + "integrity": "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.12.0", + "@smithy/util-hex-encoding": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.8.tgz", + "integrity": "sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.8.tgz", + "integrity": "sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.8.tgz", + "integrity": "sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.8.tgz", + "integrity": "sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.9.tgz", + "integrity": "sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.9.tgz", + "integrity": "sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/chunked-blob-reader": "^5.2.0", + "@smithy/chunked-blob-reader-native": "^4.2.1", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.8.tgz", + "integrity": "sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.8.tgz", + "integrity": "sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.8.tgz", + "integrity": "sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.8.tgz", + "integrity": "sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.8.tgz", + "integrity": "sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.11.tgz", + "integrity": "sha512-/WqsrycweGGfb9sSzME4CrsuayjJF6BueBmkKlcbeU5q18OhxRrvvKlmfw3tpDsK5ilx2XUJvoukwxHB0nHs/Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.21.1", + "@smithy/middleware-serde": "^4.2.9", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "@smithy/url-parser": "^4.2.8", + "@smithy/util-middleware": "^4.2.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.4.27", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.27.tgz", + "integrity": "sha512-xFUYCGRVsfgiN5EjsJJSzih9+yjStgMTCLANPlf0LVQkPDYCe0hz97qbdTZosFOiYlGBlHYityGRxrQ/hxhfVQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/service-error-classification": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-retry": "^4.2.8", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.9.tgz", + "integrity": "sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.8.tgz", + "integrity": "sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.8.tgz", + "integrity": "sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/shared-ini-file-loader": "^4.4.3", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.8.tgz", + "integrity": "sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/querystring-builder": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.8.tgz", + "integrity": "sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.8.tgz", + "integrity": "sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.8.tgz", + "integrity": "sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.8.tgz", + "integrity": "sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.8.tgz", + "integrity": "sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.3.tgz", + "integrity": "sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.8.tgz", + "integrity": "sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.8", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.10.12", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.12.tgz", + "integrity": "sha512-VKO/HKoQ5OrSHW6AJUmEnUKeXI1/5LfCwO9cwyao7CmLvGnZeM1i36Lyful3LK1XU7HwTVieTqO1y2C/6t3qtA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.21.1", + "@smithy/middleware-endpoint": "^4.4.11", + "@smithy/middleware-stack": "^4.2.8", + "@smithy/protocol-http": "^5.3.8", + "@smithy/types": "^4.12.0", + "@smithy/util-stream": "^4.5.10", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.12.0.tgz", + "integrity": "sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.8.tgz", + "integrity": "sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.26", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.26.tgz", + "integrity": "sha512-vva0dzYUTgn7DdE0uaha10uEdAgmdLnNFowKFjpMm6p2R0XDk5FHPX3CBJLzWQkQXuEprsb0hGz9YwbicNWhjw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.29", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.29.tgz", + "integrity": "sha512-c6D7IUBsZt/aNnTBHMTf+OVh+h/JcxUUgfTcIJaWRe6zhOum1X+pNKSZtZ+7fbOn5I99XVFtmrnXKv8yHHErTQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.6", + "@smithy/credential-provider-imds": "^4.2.8", + "@smithy/node-config-provider": "^4.3.8", + "@smithy/property-provider": "^4.2.8", + "@smithy/smithy-client": "^4.10.12", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.8.tgz", + "integrity": "sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.8.tgz", + "integrity": "sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.8.tgz", + "integrity": "sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.10.tgz", + "integrity": "sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.9", + "@smithy/node-http-handler": "^4.4.8", + "@smithy/types": "^4.12.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.8.tgz", + "integrity": "sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.8", + "@smithy/types": "^4.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", + "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@supabase/auth-js": { + "version": "2.91.0", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.91.0.tgz", + "integrity": "sha512-9ywvsKLsxTwv7fvN5fXzP3UfRreqrX2waylTBDu0lkmeHXa8WtSQS9e0WV9FBduiazYqQbgfBQXBNPRPsRgWOQ==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/functions-js": { + "version": "2.91.0", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.91.0.tgz", + "integrity": "sha512-WaakXOqLK1mLtBNFXp5o5T+LlI6KZuADSeXz+9ofPRG5OpVSvW148LVJB1DRZ16Phck1a0YqIUswOUgxCz6vMw==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/postgrest-js": { + "version": "2.91.0", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.91.0.tgz", + "integrity": "sha512-5S41zv2euNpGucvtM4Wy+xOmLznqt/XO+Lh823LOFEQ00ov7QJfvqb6VzIxufvzhooZpmGR0BxvMcJtWxCIFdQ==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/realtime-js": { + "version": "2.91.0", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.91.0.tgz", + "integrity": "sha512-u2YuJFG35umw8DO9beC27L/jYXm3KhF+73WQwbynMpV0tXsFIA0DOGRM0NgRyy03hJIdO6mxTTwe8efW3yx3Tg==", + "license": "MIT", + "dependencies": { + "@types/phoenix": "^1.6.6", + "@types/ws": "^8.18.1", + "tslib": "2.8.1", + "ws": "^8.18.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/ssr": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@supabase/ssr/-/ssr-0.8.0.tgz", + "integrity": "sha512-/PKk8kNFSs8QvvJ2vOww1mF5/c5W8y42duYtXvkOSe+yZKRgTTZywYG2l41pjhNomqESZCpZtXuWmYjFRMV+dw==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.2" + }, + "peerDependencies": { + "@supabase/supabase-js": "^2.76.1" + } + }, + "node_modules/@supabase/storage-js": { + "version": "2.91.0", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.91.0.tgz", + "integrity": "sha512-CI7fsVIBQHfNObqU9kmyQ1GWr+Ug44y4rSpvxT4LdQB9tlhg1NTBov6z7Dlmt8d6lGi/8a9lf/epCDxyWI792g==", + "license": "MIT", + "dependencies": { + "iceberg-js": "^0.8.1", + "tslib": "2.8.1" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@supabase/supabase-js": { + "version": "2.91.0", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.91.0.tgz", + "integrity": "sha512-Rjb0QqkKrmXMVwUOdEqysPBZ0ZDZakeptTkUa6k2d8r3strBdbWVDqjOdkCjAmvvZMtXecBeyTyMEXD1Zzjfvg==", + "license": "MIT", + "dependencies": { + "@supabase/auth-js": "2.91.0", + "@supabase/functions-js": "2.91.0", + "@supabase/postgrest-js": "2.91.0", + "@supabase/realtime-js": "2.91.0", + "@supabase/storage-js": "2.91.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.8.tgz", + "integrity": "sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/adapter-auto": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-7.0.0.tgz", + "integrity": "sha512-ImDWaErTOCkRS4Gt+5gZuymKFBobnhChXUZ9lhUZLahUgvA4OOvRzi3sahzYgbxGj5nkA6OV0GAW378+dl/gyw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/adapter-node": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-5.5.2.tgz", + "integrity": "sha512-L15Djwpr7HrSAPj/Z8PYfc0pa9A1tllrr18phKI0WJHJeoWw45yinPf0IGgVTmakqx1B3JQ+C/OFl9ZwmxHU1Q==", + "license": "MIT", + "dependencies": { + "@rollup/plugin-commonjs": "^28.0.1", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.0", + "rollup": "^4.9.5" + }, + "peerDependencies": { + "@sveltejs/kit": "^2.4.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.50.1", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.50.1.tgz", + "integrity": "sha512-XRHD2i3zC4ukhz2iCQzO4mbsts081PAZnnMAQ7LNpWeYgeBmwMsalf0FGSwhFXBbtr2XViPKnFJBDCckWqrsLw==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.1", + "cookie": "^0.6.0", + "devalue": "^5.6.2", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": "^5.3.3", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@sveltejs/kit/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.4.tgz", + "integrity": "sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==", + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", + "deepmerge": "^4.3.1", + "magic-string": "^0.30.21", + "obug": "^2.1.0", + "vitefu": "^1.1.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.2.tgz", + "integrity": "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==", + "license": "MIT", + "dependencies": { + "obug": "^2.1.0" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz", + "integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", + "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.0.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz", + "integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/phoenix": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.7.tgz", + "integrity": "sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==", + "license": "MIT" + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bits-ui": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-2.15.4.tgz", + "integrity": "sha512-7H9YUfp03KOk1LVDh8wPYSRPxlZgG/GRWLNSA8QC73/8Z8ytun+DWJhIuibyFyz7A0cP/RANVcB4iDrbY8q+Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.1", + "@floating-ui/dom": "^1.7.1", + "esm-env": "^1.1.2", + "runed": "^0.35.1", + "svelte-toolbelt": "^0.10.6", + "tabbable": "^6.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/huntabyte" + }, + "peerDependencies": { + "@internationalized/date": "^3.8.1", + "svelte": "^5.33.0" + } + }, + "node_modules/bowser": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", + "integrity": "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.2.tgz", + "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==", + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "license": "MIT" + }, + "node_modules/esrap": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.2.tgz", + "integrity": "sha512-zA6497ha+qKvoWIK+WM9NAh5ni17sKZKhbS5B3PoYbBvaYHZWoS33zmFybmyqpn07RLUxSmn+RCls2/XF+d0oQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/flag-icons": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/flag-icons/-/flag-icons-7.5.0.tgz", + "integrity": "sha512-kd+MNXviFIg5hijH766tt+3x76ele1AXlo4zDdCxIvqWZhKt4T83bOtxUOOMlTx/EcFdUMH5yvQgYlFh1EqqFg==", + "license": "MIT" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/iceberg-js": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz", + "integrity": "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "license": "MIT" + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "devOptional": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "devOptional": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "license": "MIT" + }, + "node_modules/lucide-svelte": { + "version": "0.562.0", + "resolved": "https://registry.npmjs.org/lucide-svelte/-/lucide-svelte-0.562.0.tgz", + "integrity": "sha512-kSJDH/55lf0mun/o4nqWBXOcq0fWYzPeIjbTD97ywoeumAB9kWxtM06gC7oynqjtK3XhAljWSz5RafIzPEYIQA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "svelte": "^3 || ^4 || ^5.0.0-next.42" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nodemailer": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz", + "integrity": "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.56.0.tgz", + "integrity": "sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.56.0", + "@rollup/rollup-android-arm64": "4.56.0", + "@rollup/rollup-darwin-arm64": "4.56.0", + "@rollup/rollup-darwin-x64": "4.56.0", + "@rollup/rollup-freebsd-arm64": "4.56.0", + "@rollup/rollup-freebsd-x64": "4.56.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.56.0", + "@rollup/rollup-linux-arm-musleabihf": "4.56.0", + "@rollup/rollup-linux-arm64-gnu": "4.56.0", + "@rollup/rollup-linux-arm64-musl": "4.56.0", + "@rollup/rollup-linux-loong64-gnu": "4.56.0", + "@rollup/rollup-linux-loong64-musl": "4.56.0", + "@rollup/rollup-linux-ppc64-gnu": "4.56.0", + "@rollup/rollup-linux-ppc64-musl": "4.56.0", + "@rollup/rollup-linux-riscv64-gnu": "4.56.0", + "@rollup/rollup-linux-riscv64-musl": "4.56.0", + "@rollup/rollup-linux-s390x-gnu": "4.56.0", + "@rollup/rollup-linux-x64-gnu": "4.56.0", + "@rollup/rollup-linux-x64-musl": "4.56.0", + "@rollup/rollup-openbsd-x64": "4.56.0", + "@rollup/rollup-openharmony-arm64": "4.56.0", + "@rollup/rollup-win32-arm64-msvc": "4.56.0", + "@rollup/rollup-win32-ia32-msvc": "4.56.0", + "@rollup/rollup-win32-x64-gnu": "4.56.0", + "@rollup/rollup-win32-x64-msvc": "4.56.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/runed": { + "version": "0.35.1", + "resolved": "https://registry.npmjs.org/runed/-/runed-0.35.1.tgz", + "integrity": "sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q==", + "dev": true, + "funding": [ + "https://github.com/sponsors/huntabyte", + "https://github.com/sponsors/tglide" + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "esm-env": "^1.0.0", + "lz-string": "^1.5.0" + }, + "peerDependencies": { + "@sveltejs/kit": "^2.21.0", + "svelte": "^5.7.0" + }, + "peerDependenciesMeta": { + "@sveltejs/kit": { + "optional": true + } + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strnum": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", + "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svelte": { + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.48.0.tgz", + "integrity": "sha512-+NUe82VoFP1RQViZI/esojx70eazGF4u0O/9ucqZ4rPcOZD+n5EVp17uYsqwdzjUjZyTpGKunHbDziW6AIAVkQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.6.2", + "esm-env": "^1.2.1", + "esrap": "^2.2.1", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.5.tgz", + "integrity": "sha512-e4VWZETyXaKGhpkxOXP+B/d0Fp/zKViZoJmneZWe/05Y2aqSKj3YN2nLfYPJBQ87WEiY4BQCQ9hWGu9mPT1a1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/svelte-toolbelt": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/svelte-toolbelt/-/svelte-toolbelt-0.10.6.tgz", + "integrity": "sha512-YWuX+RE+CnWYx09yseAe4ZVMM7e7GRFZM6OYWpBKOb++s+SQ8RBIMMe+Bs/CznBMc0QPLjr+vDBxTAkozXsFXQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/huntabyte" + ], + "dependencies": { + "clsx": "^2.1.1", + "runed": "^0.35.1", + "style-to-object": "^1.0.8" + }, + "engines": { + "node": ">=18", + "pnpm": ">=8.7.0" + }, + "peerDependencies": { + "svelte": "^5.30.2" + } + }, + "node_modules/svelte/node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tailwind-merge": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-variants": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-3.2.2.tgz", + "integrity": "sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.x", + "pnpm": ">=7.x" + }, + "peerDependencies": { + "tailwind-merge": ">=3.0.0", + "tailwindcss": "*" + }, + "peerDependenciesMeta": { + "tailwind-merge": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e4d1dd8 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "monacousa-portal-2026", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" + }, + "devDependencies": { + "@sveltejs/adapter-auto": "^7.0.0", + "@sveltejs/kit": "^2.50.0", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@tailwindcss/vite": "^4.1.18", + "bits-ui": "^2.15.4", + "clsx": "^2.1.1", + "lucide-svelte": "^0.562.0", + "svelte": "^5.47.0", + "svelte-check": "^4.3.4", + "tailwind-merge": "^3.4.0", + "tailwind-variants": "^3.2.2", + "tailwindcss": "^4.1.18", + "typescript": "^5.9.3", + "vite": "^7.3.1" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.971.0", + "@aws-sdk/s3-request-presigner": "^3.971.0", + "@internationalized/date": "^3.7.0", + "@supabase/ssr": "^0.8.0", + "@supabase/supabase-js": "^2.90.1", + "@sveltejs/adapter-node": "^5.5.1", + "flag-icons": "^7.4.0", + "libphonenumber-js": "^1.12.8", + "nodemailer": "^6.10.0" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..5f1fea1 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,7 @@ +// PostCSS config for monacousa-portal-2026 +// Tailwind CSS v4 is handled by @tailwindcss/vite plugin in vite.config.ts +// This file exists to prevent Vite from picking up parent directory configs + +export default { + plugins: {} +}; diff --git a/src/app.css b/src/app.css new file mode 100644 index 0000000..ec4b959 --- /dev/null +++ b/src/app.css @@ -0,0 +1,263 @@ +@import "tailwindcss"; + +/* Monaco USA Custom Theme */ +@theme { + /* Monaco Red - Primary Brand Color */ + --color-monaco-50: #fef2f2; + --color-monaco-100: #fee2e2; + --color-monaco-200: #fecaca; + --color-monaco-300: #fca5a5; + --color-monaco-400: #f87171; + --color-monaco-500: #ef4444; + --color-monaco-600: #dc2626; + --color-monaco-700: #b91c1c; + --color-monaco-800: #991b1b; + --color-monaco-900: #7f1d1d; + --color-monaco-950: #450a0a; + + /* Glass effect shadows */ + --shadow-glass: 0 8px 32px rgba(0, 0, 0, 0.1); + --shadow-glass-lg: 0 25px 50px rgba(0, 0, 0, 0.15); + --shadow-glass-xl: 0 35px 60px rgba(0, 0, 0, 0.2); + + /* Backdrop blur values */ + --blur-glass: 10px; + --blur-glass-lg: 20px; + + /* Border radius */ + --radius-glass: 16px; + --radius-glass-lg: 24px; + + /* Animation durations */ + --duration-fast: 150ms; + --duration-normal: 300ms; + --duration-slow: 500ms; + + /* Font family */ + --font-sans: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; +} + +/* Base styles */ +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + --primary: 0 84% 50%; + --primary-foreground: 210 40% 98%; + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 0 84% 50%; + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + --primary: 0 84% 50%; + --primary-foreground: 210 40% 98%; + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 0 84% 50%; + } +} + +@layer base { + * { + border-color: hsl(var(--border)); + } + + body { + background-color: hsl(var(--background)); + color: hsl(var(--foreground)); + font-family: var(--font-sans); + font-feature-settings: "rlig" 1, "calt" 1; + } +} + +/* Glass-morphism utilities - in @layer components for proper ordering */ +@layer components { + .glass { + background: rgba(255, 255, 255, 0.7); + backdrop-filter: blur(var(--blur-glass)); + -webkit-backdrop-filter: blur(var(--blur-glass)); + border: 1px solid rgba(255, 255, 255, 0.3); + box-shadow: var(--shadow-glass); + } + + .glass-dark { + background: rgba(0, 0, 0, 0.3); + backdrop-filter: blur(var(--blur-glass)); + -webkit-backdrop-filter: blur(var(--blur-glass)); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: var(--shadow-glass); + } + + .glass-card { + background: rgba(255, 255, 255, 0.97); + backdrop-filter: blur(var(--blur-glass)); + -webkit-backdrop-filter: blur(var(--blur-glass)); + border: 1px solid rgba(226, 232, 240, 0.8); + box-shadow: var(--shadow-glass); + border-radius: var(--radius-glass); + } + + .glass-card-dark { + background: rgba(0, 0, 0, 0.3); + backdrop-filter: blur(var(--blur-glass)); + -webkit-backdrop-filter: blur(var(--blur-glass)); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: var(--shadow-glass); + border-radius: var(--radius-glass); + } + + .gradient-monaco { + background: linear-gradient(135deg, var(--color-monaco-600) 0%, var(--color-monaco-700) 100%); + } + + .gradient-monaco-light { + background: linear-gradient(135deg, var(--color-monaco-50) 0%, var(--color-monaco-100) 100%); + } + + .text-gradient-monaco { + background: linear-gradient(135deg, var(--color-monaco-600) 0%, var(--color-monaco-800) 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + } +} + +/* Custom utilities for shadcn-svelte compatibility */ +@layer utilities { + /* Border color utility using CSS variable */ + .border-border { + border-color: hsl(var(--border)); + } + + /* Background utilities using CSS variables */ + .bg-background { + background-color: hsl(var(--background)); + } + + .bg-foreground { + background-color: hsl(var(--foreground)); + } + + .bg-card { + background-color: hsl(var(--card)); + } + + .bg-popover { + background-color: hsl(var(--popover)); + } + + .bg-primary { + background-color: hsl(var(--primary)); + } + + .bg-secondary { + background-color: hsl(var(--secondary)); + } + + .bg-muted { + background-color: hsl(var(--muted)); + } + + .bg-accent { + background-color: hsl(var(--accent)); + } + + .bg-destructive { + background-color: hsl(var(--destructive)); + } + + /* Text color utilities using CSS variables */ + .text-foreground { + color: hsl(var(--foreground)); + } + + .text-card-foreground { + color: hsl(var(--card-foreground)); + } + + .text-popover-foreground { + color: hsl(var(--popover-foreground)); + } + + .text-primary-foreground { + color: hsl(var(--primary-foreground)); + } + + .text-secondary-foreground { + color: hsl(var(--secondary-foreground)); + } + + .text-muted-foreground { + color: hsl(var(--muted-foreground)); + } + + .text-accent-foreground { + color: hsl(var(--accent-foreground)); + } + + .text-destructive-foreground { + color: hsl(var(--destructive-foreground)); + } + + /* Ring utility */ + .ring-ring { + --tw-ring-color: hsl(var(--ring)); + } + + /* Input border utility */ + .border-input { + border-color: hsl(var(--input)); + } + + /* Scrollbar styling */ + .scrollbar-thin { + scrollbar-width: thin; + scrollbar-color: hsl(var(--muted-foreground) / 0.3) transparent; + } + + .scrollbar-thin::-webkit-scrollbar { + width: 6px; + height: 6px; + } + + .scrollbar-thin::-webkit-scrollbar-track { + background: transparent; + } + + .scrollbar-thin::-webkit-scrollbar-thumb { + background-color: hsl(var(--muted-foreground) / 0.3); + border-radius: 3px; + } + + .scrollbar-thin::-webkit-scrollbar-thumb:hover { + background-color: hsl(var(--muted-foreground) / 0.5); + } +} diff --git a/src/app.d.ts b/src/app.d.ts new file mode 100644 index 0000000..df65d88 --- /dev/null +++ b/src/app.d.ts @@ -0,0 +1,27 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +import type { SupabaseClient, Session, User } from '@supabase/supabase-js'; +import type { Database, MemberWithDues } from '$lib/types/database'; + +declare global { + namespace App { + // interface Error {} + interface Locals { + supabase: SupabaseClient; + safeGetSession: () => Promise<{ + session: Session | null; + user: User | null; + member: MemberWithDues | null; + }>; + } + interface PageData { + session: Session | null; + user: User | null; + member: MemberWithDues | null; + } + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/src/app.html b/src/app.html new file mode 100644 index 0000000..f273cc5 --- /dev/null +++ b/src/app.html @@ -0,0 +1,11 @@ + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/src/hooks.server.ts b/src/hooks.server.ts new file mode 100644 index 0000000..eb422c7 --- /dev/null +++ b/src/hooks.server.ts @@ -0,0 +1,134 @@ +import pkg from '@supabase/ssr'; +const { createServerClient } = pkg; +import { type Handle, redirect } from '@sveltejs/kit'; +import { sequence } from '@sveltejs/kit/hooks'; +import { PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY } from '$env/static/public'; +import { env } from '$env/dynamic/private'; +import type { Database } from '$lib/types/database'; + +// Use internal URL for server-side operations (Docker network), fallback to public URL +const SERVER_SUPABASE_URL = env.SUPABASE_INTERNAL_URL || PUBLIC_SUPABASE_URL; + +/** + * Supabase authentication hook + * Sets up the Supabase client with cookie handling for SSR + */ +const supabaseHandle: Handle = async ({ event, resolve }) => { + event.locals.supabase = createServerClient( + SERVER_SUPABASE_URL, + PUBLIC_SUPABASE_ANON_KEY, + { + cookies: { + getAll: () => event.cookies.getAll(), + setAll: (cookiesToSet) => { + cookiesToSet.forEach(({ name, value, options }) => { + event.cookies.set(name, value, { ...options, path: '/' }); + }); + } + } + } + ); + + /** + * Safe session getter that validates the JWT + * Returns session, user, and member data + */ + event.locals.safeGetSession = async () => { + const { + data: { session } + } = await event.locals.supabase.auth.getSession(); + + if (!session) { + return { session: null, user: null, member: null }; + } + + // Validate the session by getting the user + const { + data: { user }, + error: userError + } = await event.locals.supabase.auth.getUser(); + + if (userError || !user) { + return { session: null, user: null, member: null }; + } + + // Fetch member profile with dues status + const { data: member } = await event.locals.supabase + .from('members_with_dues') + .select('*') + .eq('id', user.id) + .single(); + + return { session, user, member }; + }; + + return resolve(event, { + filterSerializedResponseHeaders(name) { + return name === 'content-range' || name === 'x-supabase-api-version'; + } + }); +}; + +/** + * Authorization hook + * Protects routes based on authentication and role requirements + */ +const authorizationHandle: Handle = async ({ event, resolve }) => { + const { session, member } = await event.locals.safeGetSession(); + const path = event.url.pathname; + + // API routes handle their own authentication + if (path.startsWith('/api/')) { + return resolve(event); + } + + // Auth callback routes should always be accessible + if (path.startsWith('/auth/')) { + return resolve(event); + } + + // Logout route should always be accessible + if (path === '/logout') { + return resolve(event); + } + + // Protected routes - require authentication + const protectedPrefixes = ['/dashboard', '/profile', '/payments', '/documents', '/board', '/admin']; + const isProtectedRoute = protectedPrefixes.some((prefix) => path.startsWith(prefix)); + + if (isProtectedRoute && !session) { + throw redirect(303, `/login?redirectTo=${encodeURIComponent(path)}`); + } + + // Handle authenticated users without a member profile + // This can happen if member record creation failed or was deleted + if (isProtectedRoute && session && !member) { + console.error('Authenticated user has no member profile:', session.user?.id); + // Sign them out and redirect to login with an error + await event.locals.supabase.auth.signOut(); + throw redirect(303, '/login?error=no_profile'); + } + + // Board routes - require board or admin role + if (path.startsWith('/board') && member) { + if (member.role !== 'board' && member.role !== 'admin') { + throw redirect(303, '/dashboard'); + } + } + + // Admin routes - require admin role + if (path.startsWith('/admin') && member) { + if (member.role !== 'admin') { + throw redirect(303, '/dashboard'); + } + } + + // Redirect authenticated users away from auth pages + if (session && (path === '/login' || path === '/signup')) { + throw redirect(303, '/dashboard'); + } + + return resolve(event); +}; + +export const handle: Handle = sequence(supabaseHandle, authorizationHandle); diff --git a/src/lib/assets/favicon.svg b/src/lib/assets/favicon.svg new file mode 100644 index 0000000..cc5dc66 --- /dev/null +++ b/src/lib/assets/favicon.svg @@ -0,0 +1 @@ +svelte-logo \ No newline at end of file diff --git a/src/lib/components/EmailVerificationBanner.svelte b/src/lib/components/EmailVerificationBanner.svelte new file mode 100644 index 0000000..5175a26 --- /dev/null +++ b/src/lib/components/EmailVerificationBanner.svelte @@ -0,0 +1,92 @@ + + +{#if !dismissed} +
+
+
+
+
+ +
+
+

+ Please verify your email address +

+

+ Check {email} for verification link +

+
+
+ +
+ {#if resendSuccess} + + + Email sent! + + {:else} + + {/if} + +
+
+
+
+{/if} diff --git a/src/lib/components/auth/FormField.svelte b/src/lib/components/auth/FormField.svelte new file mode 100644 index 0000000..7e95d1a --- /dev/null +++ b/src/lib/components/auth/FormField.svelte @@ -0,0 +1,51 @@ + + +
+ + + {#if error} +

{error}

+ {/if} +
diff --git a/src/lib/components/auth/FormMessage.svelte b/src/lib/components/auth/FormMessage.svelte new file mode 100644 index 0000000..a5a8390 --- /dev/null +++ b/src/lib/components/auth/FormMessage.svelte @@ -0,0 +1,29 @@ + + +{#if message} +
+ +

{message}

+
+{/if} diff --git a/src/lib/components/auth/LoadingSpinner.svelte b/src/lib/components/auth/LoadingSpinner.svelte new file mode 100644 index 0000000..d9ca774 --- /dev/null +++ b/src/lib/components/auth/LoadingSpinner.svelte @@ -0,0 +1,28 @@ + + + + + + diff --git a/src/lib/components/auth/index.ts b/src/lib/components/auth/index.ts new file mode 100644 index 0000000..1593171 --- /dev/null +++ b/src/lib/components/auth/index.ts @@ -0,0 +1,3 @@ +export { default as FormField } from './FormField.svelte'; +export { default as FormMessage } from './FormMessage.svelte'; +export { default as LoadingSpinner } from './LoadingSpinner.svelte'; diff --git a/src/lib/components/dashboard/DuesStatusCard.svelte b/src/lib/components/dashboard/DuesStatusCard.svelte new file mode 100644 index 0000000..63dbc08 --- /dev/null +++ b/src/lib/components/dashboard/DuesStatusCard.svelte @@ -0,0 +1,113 @@ + + +
+
+

+ + Dues Status +

+
+ +
+
+ +
+

{duesInfo.label}

+

{duesInfo.description}

+
+
+ +
+
+

Annual Dues

+

+ {member.annual_dues ? `€${member.annual_dues.toFixed(2)}` : '€50.00'} +

+
+
+

Membership Type

+

{member.membership_type_name || 'Regular'}

+
+
+

Last Payment

+

{formatDate(member.last_payment_date)}

+
+
+

Next Due Date

+

{formatDate(member.current_due_date)}

+
+
+ +
+ +
+
+
diff --git a/src/lib/components/dashboard/QuickActionsCard.svelte b/src/lib/components/dashboard/QuickActionsCard.svelte new file mode 100644 index 0000000..93a394f --- /dev/null +++ b/src/lib/components/dashboard/QuickActionsCard.svelte @@ -0,0 +1,97 @@ + + +
+

Quick Actions

+ +
+ {#each actions.slice(0, 4) as action} + +
+ +
+ {action.label} + {action.description} +
+ {/each} +
+
diff --git a/src/lib/components/dashboard/StatsCard.svelte b/src/lib/components/dashboard/StatsCard.svelte new file mode 100644 index 0000000..26e0892 --- /dev/null +++ b/src/lib/components/dashboard/StatsCard.svelte @@ -0,0 +1,48 @@ + + +
+
+
+

{title}

+

{value}

+ {#if description} +

{description}

+ {/if} + {#if trend} +

+ = 0 ? 'text-green-600' : 'text-red-600'}> + {trend.value >= 0 ? '+' : ''}{trend.value}% + + {trend.label} +

+ {/if} +
+
+ +
+
+
diff --git a/src/lib/components/dashboard/UpcomingEventsCard.svelte b/src/lib/components/dashboard/UpcomingEventsCard.svelte new file mode 100644 index 0000000..b5446c2 --- /dev/null +++ b/src/lib/components/dashboard/UpcomingEventsCard.svelte @@ -0,0 +1,107 @@ + + +
+
+

+ + Upcoming Events +

+ + View all + +
+ +
+ {#if events.length === 0} +
+ +

No upcoming events

+

Check back later for new events.

+
+ {:else} + {#each events as event} + {@const { date, time } = formatDateTime(event.start_datetime)} + +
+ +
+ + {date.split(' ')[1]} + + + {date.split(' ')[2]} + +
+ + +
+
+ + + {event.event_type_name || 'Event'} + +
+

{event.title}

+
+ + + {time} + + {#if event.location} + + + {event.location} + + {/if} + + + {event.total_attendees} + {event.max_attendees ? ` / ${event.max_attendees}` : ''} attending + +
+
+ + +
+
+ {/each} + {/if} +
+
diff --git a/src/lib/components/dashboard/WelcomeCard.svelte b/src/lib/components/dashboard/WelcomeCard.svelte new file mode 100644 index 0000000..36f7d53 --- /dev/null +++ b/src/lib/components/dashboard/WelcomeCard.svelte @@ -0,0 +1,78 @@ + + +
+
+
+ + {#if member.avatar_url} + {`${member.first_name} + {:else} +
+ {member.first_name[0]}{member.last_name[0]} +
+ {/if} + +
+

{getGreeting()},

+

+ {member.first_name} + {member.last_name} +

+
+ {member.member_id} + | + + {member.status_display_name || 'Pending'} + +
+
+
+ + + {#if member.nationality && member.nationality.length > 0} +
+ {#each member.nationality as code} + + {/each} +
+ {/if} +
+
diff --git a/src/lib/components/dashboard/index.ts b/src/lib/components/dashboard/index.ts new file mode 100644 index 0000000..49c1a5d --- /dev/null +++ b/src/lib/components/dashboard/index.ts @@ -0,0 +1,5 @@ +export { default as WelcomeCard } from './WelcomeCard.svelte'; +export { default as DuesStatusCard } from './DuesStatusCard.svelte'; +export { default as UpcomingEventsCard } from './UpcomingEventsCard.svelte'; +export { default as QuickActionsCard } from './QuickActionsCard.svelte'; +export { default as StatsCard } from './StatsCard.svelte'; diff --git a/src/lib/components/documents/CreateFolderModal.svelte b/src/lib/components/documents/CreateFolderModal.svelte new file mode 100644 index 0000000..5a3658c --- /dev/null +++ b/src/lib/components/documents/CreateFolderModal.svelte @@ -0,0 +1,142 @@ + + + + + + diff --git a/src/lib/components/documents/DocumentPreviewModal.svelte b/src/lib/components/documents/DocumentPreviewModal.svelte new file mode 100644 index 0000000..d2ffbcb --- /dev/null +++ b/src/lib/components/documents/DocumentPreviewModal.svelte @@ -0,0 +1,246 @@ + + + + + + diff --git a/src/lib/components/documents/FolderBreadcrumbs.svelte b/src/lib/components/documents/FolderBreadcrumbs.svelte new file mode 100644 index 0000000..0320925 --- /dev/null +++ b/src/lib/components/documents/FolderBreadcrumbs.svelte @@ -0,0 +1,49 @@ + + + diff --git a/src/lib/components/documents/FolderItem.svelte b/src/lib/components/documents/FolderItem.svelte new file mode 100644 index 0000000..8cbd7ae --- /dev/null +++ b/src/lib/components/documents/FolderItem.svelte @@ -0,0 +1,120 @@ + + +
+ +
+ +
+ + +
+

{folder.name}

+
+ + {folder.visibility} + + {#if folder.creator} + · + {folder.creator.first_name} {folder.creator.last_name} + {/if} +
+
+ + + {#if canEdit || canDelete} + + {/if} +
diff --git a/src/lib/components/documents/index.ts b/src/lib/components/documents/index.ts new file mode 100644 index 0000000..7da6c72 --- /dev/null +++ b/src/lib/components/documents/index.ts @@ -0,0 +1,4 @@ +export { default as DocumentPreviewModal } from './DocumentPreviewModal.svelte'; +export { default as FolderItem } from './FolderItem.svelte'; +export { default as FolderBreadcrumbs } from './FolderBreadcrumbs.svelte'; +export { default as CreateFolderModal } from './CreateFolderModal.svelte'; diff --git a/src/lib/components/layout/Header.svelte b/src/lib/components/layout/Header.svelte new file mode 100644 index 0000000..3b01046 --- /dev/null +++ b/src/lib/components/layout/Header.svelte @@ -0,0 +1,152 @@ + + + + +
+ + + + +

{title}

+ + +
+ + + + + + + + {#if member} + + {/if} +
+
diff --git a/src/lib/components/layout/MobileMenu.svelte b/src/lib/components/layout/MobileMenu.svelte new file mode 100644 index 0000000..9cf0a41 --- /dev/null +++ b/src/lib/components/layout/MobileMenu.svelte @@ -0,0 +1,203 @@ + + +{#if open} + +
+ + + +{/if} diff --git a/src/lib/components/layout/MobileNav.svelte b/src/lib/components/layout/MobileNav.svelte new file mode 100644 index 0000000..a8fbf07 --- /dev/null +++ b/src/lib/components/layout/MobileNav.svelte @@ -0,0 +1,53 @@ + + + diff --git a/src/lib/components/layout/Sidebar.svelte b/src/lib/components/layout/Sidebar.svelte new file mode 100644 index 0000000..3189fcf --- /dev/null +++ b/src/lib/components/layout/Sidebar.svelte @@ -0,0 +1,245 @@ + + + diff --git a/src/lib/components/layout/index.ts b/src/lib/components/layout/index.ts new file mode 100644 index 0000000..1bdcf7c --- /dev/null +++ b/src/lib/components/layout/index.ts @@ -0,0 +1,4 @@ +export { default as Sidebar } from './Sidebar.svelte'; +export { default as Header } from './Header.svelte'; +export { default as MobileNav } from './MobileNav.svelte'; +export { default as MobileMenu } from './MobileMenu.svelte'; diff --git a/src/lib/components/ui/AddToCalendarButton.svelte b/src/lib/components/ui/AddToCalendarButton.svelte new file mode 100644 index 0000000..f625291 --- /dev/null +++ b/src/lib/components/ui/AddToCalendarButton.svelte @@ -0,0 +1,171 @@ + + +
+ + + {#if isOpen} + + {/if} +
diff --git a/src/lib/components/ui/CountryFlag.svelte b/src/lib/components/ui/CountryFlag.svelte new file mode 100644 index 0000000..42d12cf --- /dev/null +++ b/src/lib/components/ui/CountryFlag.svelte @@ -0,0 +1,40 @@ + + +{code} flag diff --git a/src/lib/components/ui/CountrySelect.svelte b/src/lib/components/ui/CountrySelect.svelte new file mode 100644 index 0000000..704a06f --- /dev/null +++ b/src/lib/components/ui/CountrySelect.svelte @@ -0,0 +1,173 @@ + + +
+ ({ value: c.code, label: c.name }))} + bind:value + onValueChange={(v) => v && handleSelect(v)} + > +
+ + {#if selectedCountry} + + + {selectedCountry.name} + + {:else} + {placeholder} + {/if} + + + +
+ + + +
+
+ + { + searchValue = e.currentTarget.value; + }} + /> +
+
+ + + {#if filteredCountries.length === 0} +
+ No countries found +
+ {:else} + {#each filteredCountries as country (country.code)} + {@const isSelected = value === country.code} + + {#snippet children({ selected })} + + {country.name} + {#if selected} + + {/if} + {/snippet} + + {/each} + {/if} +
+
+
+
+ + + {#if name} + + {/if} +
diff --git a/src/lib/components/ui/DatePicker.svelte b/src/lib/components/ui/DatePicker.svelte new file mode 100644 index 0000000..91dcc9d --- /dev/null +++ b/src/lib/components/ui/DatePicker.svelte @@ -0,0 +1,190 @@ + + + + + {#snippet children({ segments })} +
+ {#each segments as { part, value: segValue }} + {#if part === 'literal'} + {segValue} + {:else} + + {segValue} + + {/if} + {/each} +
+ + + + {/snippet} +
+ + + + {#snippet children({ months, weekdays })} + + + + + + + + + + + {#each months as month} + + + + {#each weekdays as day} + + {day.slice(0, 2)} + + {/each} + + + + {#each month.weeks as weekDates} + + {#each weekDates as date} + + + + {/each} + + {/each} + + + {/each} + {/snippet} + + +
+ + +{#if name} + +{/if} diff --git a/src/lib/components/ui/NationalitySelect.svelte b/src/lib/components/ui/NationalitySelect.svelte new file mode 100644 index 0000000..c8f542c --- /dev/null +++ b/src/lib/components/ui/NationalitySelect.svelte @@ -0,0 +1,198 @@ + + +
+ + {#if value.length > 0} +
+ {#each value as code} + {@const country = getCountry(code)} + {#if country} + + + {country.name} + + + {/if} + {/each} +
+ {/if} + + + onValueChange?.(v)} + > +
+ + + 0 ? 'Add more...' : placeholder} + {disabled} + oninput={(e) => { + searchValue = e.currentTarget.value; + if (!open) open = true; + }} + /> + + + +
+ + + + {#if filteredCountries.length === 0} +
+ No countries found +
+ {:else} + {#each filteredCountries as country (country.code)} + {@const isSelected = value.includes(country.code)} + {@const isDisabled = !isSelected && maxSelections > 0 && value.length >= maxSelections} + + {#snippet children({ selected })} + + {country.name} + {country.code} + {#if selected} + + {/if} + {/snippet} + + {/each} + {/if} +
+
+
+
+ + + {#if name} + + {/if} +
diff --git a/src/lib/components/ui/PhoneInput.svelte b/src/lib/components/ui/PhoneInput.svelte new file mode 100644 index 0000000..3e7e9a0 --- /dev/null +++ b/src/lib/components/ui/PhoneInput.svelte @@ -0,0 +1,260 @@ + + +
+ + ({ value: c.code, label: c.name }))} + bind:value={countryCode} + onValueChange={(v) => v && handleCountryChange(v)} + > +
+ + + {selectedCountry.dialCode} + + + +
+ + + +
+
+ + { + searchValue = e.currentTarget.value; + }} + /> +
+
+ + + {#if filteredCountries.length === 0} +
+ No countries found +
+ {:else} + {#each filteredCountries as country (country.code)} + {@const isSelected = countryCode === country.code} + + {#snippet children({ selected })} + + {country.name} + {country.dialCode} + {/snippet} + + {/each} + {/if} +
+
+
+
+ + + + + + {#if name} + + {/if} +
diff --git a/src/lib/components/ui/button/button.svelte b/src/lib/components/ui/button/button.svelte new file mode 100644 index 0000000..a6711e0 --- /dev/null +++ b/src/lib/components/ui/button/button.svelte @@ -0,0 +1,65 @@ + + + + + diff --git a/src/lib/components/ui/button/index.ts b/src/lib/components/ui/button/index.ts new file mode 100644 index 0000000..6086c50 --- /dev/null +++ b/src/lib/components/ui/button/index.ts @@ -0,0 +1,15 @@ +import Root, { + type ButtonProps, + type ButtonSize, + type ButtonVariant, + buttonVariants +} from './button.svelte'; + +export { + Root, + type ButtonProps, + type ButtonSize, + type ButtonVariant, + buttonVariants, + Root as Button +}; diff --git a/src/lib/components/ui/card/card-content.svelte b/src/lib/components/ui/card/card-content.svelte new file mode 100644 index 0000000..fba5c6b --- /dev/null +++ b/src/lib/components/ui/card/card-content.svelte @@ -0,0 +1,13 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/card-description.svelte b/src/lib/components/ui/card/card-description.svelte new file mode 100644 index 0000000..2da58ab --- /dev/null +++ b/src/lib/components/ui/card/card-description.svelte @@ -0,0 +1,13 @@ + + +

+ {@render children?.()} +

diff --git a/src/lib/components/ui/card/card-footer.svelte b/src/lib/components/ui/card/card-footer.svelte new file mode 100644 index 0000000..739f801 --- /dev/null +++ b/src/lib/components/ui/card/card-footer.svelte @@ -0,0 +1,13 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/card-header.svelte b/src/lib/components/ui/card/card-header.svelte new file mode 100644 index 0000000..80801c6 --- /dev/null +++ b/src/lib/components/ui/card/card-header.svelte @@ -0,0 +1,13 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/card-title.svelte b/src/lib/components/ui/card/card-title.svelte new file mode 100644 index 0000000..9b4e997 --- /dev/null +++ b/src/lib/components/ui/card/card-title.svelte @@ -0,0 +1,13 @@ + + +

+ {@render children?.()} +

diff --git a/src/lib/components/ui/card/card.svelte b/src/lib/components/ui/card/card.svelte new file mode 100644 index 0000000..29e1c6f --- /dev/null +++ b/src/lib/components/ui/card/card.svelte @@ -0,0 +1,16 @@ + + +
+ {@render children?.()} +
diff --git a/src/lib/components/ui/card/index.ts b/src/lib/components/ui/card/index.ts new file mode 100644 index 0000000..2f3ee7a --- /dev/null +++ b/src/lib/components/ui/card/index.ts @@ -0,0 +1,21 @@ +import Root from './card.svelte'; +import Content from './card-content.svelte'; +import Description from './card-description.svelte'; +import Footer from './card-footer.svelte'; +import Header from './card-header.svelte'; +import Title from './card-title.svelte'; + +export { + Root, + Content, + Description, + Footer, + Header, + Title, + Root as Card, + Content as CardContent, + Description as CardDescription, + Footer as CardFooter, + Header as CardHeader, + Title as CardTitle +}; diff --git a/src/lib/components/ui/index.ts b/src/lib/components/ui/index.ts new file mode 100644 index 0000000..41c3320 --- /dev/null +++ b/src/lib/components/ui/index.ts @@ -0,0 +1,19 @@ +// UI Components - shadcn-svelte style +export { Button, buttonVariants, type ButtonProps, type ButtonSize, type ButtonVariant } from './button'; +export { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle +} from './card'; +export { Input } from './input'; +export { Label } from './label'; + +// Custom components +export { default as DatePicker } from './DatePicker.svelte'; +export { default as NationalitySelect } from './NationalitySelect.svelte'; +export { default as CountryFlag } from './CountryFlag.svelte'; +export { default as PhoneInput } from './PhoneInput.svelte'; +export { default as CountrySelect } from './CountrySelect.svelte'; diff --git a/src/lib/components/ui/input/index.ts b/src/lib/components/ui/input/index.ts new file mode 100644 index 0000000..ba5ce62 --- /dev/null +++ b/src/lib/components/ui/input/index.ts @@ -0,0 +1,3 @@ +import Root from './input.svelte'; + +export { Root, Root as Input }; diff --git a/src/lib/components/ui/input/input.svelte b/src/lib/components/ui/input/input.svelte new file mode 100644 index 0000000..640c347 --- /dev/null +++ b/src/lib/components/ui/input/input.svelte @@ -0,0 +1,24 @@ + + + diff --git a/src/lib/components/ui/label/index.ts b/src/lib/components/ui/label/index.ts new file mode 100644 index 0000000..af72692 --- /dev/null +++ b/src/lib/components/ui/label/index.ts @@ -0,0 +1,3 @@ +import Root from './label.svelte'; + +export { Root, Root as Label }; diff --git a/src/lib/components/ui/label/label.svelte b/src/lib/components/ui/label/label.svelte new file mode 100644 index 0000000..9442ac9 --- /dev/null +++ b/src/lib/components/ui/label/label.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/index.ts b/src/lib/index.ts new file mode 100644 index 0000000..68d31ef --- /dev/null +++ b/src/lib/index.ts @@ -0,0 +1,3 @@ +// Monaco USA Portal 2026 - Library exports +export * from './utils'; + diff --git a/src/lib/server/audit.ts b/src/lib/server/audit.ts new file mode 100644 index 0000000..9ebea9a --- /dev/null +++ b/src/lib/server/audit.ts @@ -0,0 +1,233 @@ +import { supabaseAdmin } from './supabase'; + +export type AuditAction = + | 'member.create' + | 'member.update' + | 'member.delete' + | 'member.role_change' + | 'member.status_change' + | 'member.invite' + | 'event.create' + | 'event.update' + | 'event.delete' + | 'event.cancel' + | 'rsvp.create' + | 'rsvp.update' + | 'rsvp.cancel' + | 'rsvp.waitlist_promote' + | 'payment.record' + | 'payment.delete' + | 'document.upload' + | 'document.delete' + | 'document.visibility_change' + | 'settings.update' + | 'email.send' + | 'auth.login' + | 'auth.logout' + | 'auth.password_reset'; + +export interface AuditLogEntry { + userId?: string; + userEmail?: string; + action: AuditAction; + resourceType?: string; + resourceId?: string; + details?: Record; + ipAddress?: string; + userAgent?: string; +} + +/** + * Log an audit event to the database + */ +export async function logAudit(entry: AuditLogEntry): Promise<{ success: boolean; error?: string }> { + try { + const { error } = await supabaseAdmin.from('audit_logs').insert({ + user_id: entry.userId || null, + user_email: entry.userEmail || null, + action: entry.action, + resource_type: entry.resourceType || null, + resource_id: entry.resourceId || null, + details: entry.details || {}, + ip_address: entry.ipAddress || null, + user_agent: entry.userAgent || null + }); + + if (error) { + console.error('Audit log error:', error); + return { success: false, error: error.message }; + } + + return { success: true }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + console.error('Audit log exception:', error); + return { success: false, error: errorMessage }; + } +} + +/** + * Log a member-related action + */ +export async function logMemberAction( + action: 'create' | 'update' | 'delete' | 'role_change' | 'status_change' | 'invite', + performedBy: { id: string; email: string }, + targetMember: { id: string; email?: string }, + details?: Record, + requestInfo?: { ip?: string; userAgent?: string } +): Promise { + await logAudit({ + userId: performedBy.id, + userEmail: performedBy.email, + action: `member.${action}` as AuditAction, + resourceType: 'member', + resourceId: targetMember.id, + details: { + target_email: targetMember.email, + ...details + }, + ipAddress: requestInfo?.ip, + userAgent: requestInfo?.userAgent + }); +} + +/** + * Log an event-related action + */ +export async function logEventAction( + action: 'create' | 'update' | 'delete' | 'cancel', + performedBy: { id: string; email: string }, + event: { id: string; title?: string }, + details?: Record, + requestInfo?: { ip?: string; userAgent?: string } +): Promise { + await logAudit({ + userId: performedBy.id, + userEmail: performedBy.email, + action: `event.${action}` as AuditAction, + resourceType: 'event', + resourceId: event.id, + details: { + event_title: event.title, + ...details + }, + ipAddress: requestInfo?.ip, + userAgent: requestInfo?.userAgent + }); +} + +/** + * Log a payment-related action + */ +export async function logPaymentAction( + action: 'record' | 'delete', + performedBy: { id: string; email: string }, + payment: { id?: string; memberId: string; amount?: number }, + details?: Record, + requestInfo?: { ip?: string; userAgent?: string } +): Promise { + await logAudit({ + userId: performedBy.id, + userEmail: performedBy.email, + action: `payment.${action}` as AuditAction, + resourceType: 'payment', + resourceId: payment.id, + details: { + member_id: payment.memberId, + amount: payment.amount, + ...details + }, + ipAddress: requestInfo?.ip, + userAgent: requestInfo?.userAgent + }); +} + +/** + * Log a document-related action + */ +export async function logDocumentAction( + action: 'upload' | 'delete' | 'visibility_change', + performedBy: { id: string; email: string }, + document: { id: string; title?: string }, + details?: Record, + requestInfo?: { ip?: string; userAgent?: string } +): Promise { + await logAudit({ + userId: performedBy.id, + userEmail: performedBy.email, + action: `document.${action}` as AuditAction, + resourceType: 'document', + resourceId: document.id, + details: { + document_title: document.title, + ...details + }, + ipAddress: requestInfo?.ip, + userAgent: requestInfo?.userAgent + }); +} + +/** + * Log settings update + */ +export async function logSettingsUpdate( + performedBy: { id: string; email: string }, + category: string, + details?: Record, + requestInfo?: { ip?: string; userAgent?: string } +): Promise { + await logAudit({ + userId: performedBy.id, + userEmail: performedBy.email, + action: 'settings.update', + resourceType: 'settings', + resourceId: category, + details, + ipAddress: requestInfo?.ip, + userAgent: requestInfo?.userAgent + }); +} + +/** + * Get recent audit logs + */ +export async function getRecentAuditLogs( + limit: number = 50, + filters?: { + action?: string; + resourceType?: string; + userId?: string; + startDate?: string; + endDate?: string; + } +): Promise<{ logs: any[]; error: string | null }> { + let query = supabaseAdmin + .from('audit_logs') + .select('*') + .order('created_at', { ascending: false }) + .limit(limit); + + if (filters?.action) { + query = query.eq('action', filters.action); + } + if (filters?.resourceType) { + query = query.eq('resource_type', filters.resourceType); + } + if (filters?.userId) { + query = query.eq('user_id', filters.userId); + } + if (filters?.startDate) { + query = query.gte('created_at', filters.startDate); + } + if (filters?.endDate) { + query = query.lte('created_at', filters.endDate); + } + + const { data, error } = await query; + + if (error) { + return { logs: [], error: error.message }; + } + + return { logs: data || [], error: null }; +} diff --git a/src/lib/server/dues.ts b/src/lib/server/dues.ts new file mode 100644 index 0000000..1c0ba73 --- /dev/null +++ b/src/lib/server/dues.ts @@ -0,0 +1,881 @@ +/** + * Dues Management Service + * Handles dues reminders, bulk operations, and analytics + */ + +import { supabaseAdmin } from './supabase'; +import { sendTemplatedEmail } from './email'; +import type { MemberWithDues } from '$lib/types/database'; + +// ============================================ +// TYPES +// ============================================ + +export type ReminderType = 'due_soon_30' | 'due_soon_7' | 'due_soon_1' | 'overdue' | 'grace_period' | 'inactive_notice'; + +// Onboarding reminder types (for new members with payment_deadline) +export type OnboardingReminderType = 'onboarding_reminder_7' | 'onboarding_reminder_1' | 'onboarding_expired'; + +export interface DuesSettings { + reminder_days_before: number[]; + grace_period_days: number; + auto_inactive_enabled: boolean; + payment_iban: string; + payment_account_holder: string; + payment_bank_name: string; +} + +export interface DuesReminderResult { + sent: number; + skipped: number; + errors: string[]; + members: Array<{ id: string; name: string; email: string; status: 'sent' | 'skipped' | 'error'; error?: string }>; +} + +export interface DuesAnalytics { + totalMembers: number; + current: number; + dueSoon: number; + overdue: number; + neverPaid: number; + totalCollectedThisMonth: number; + totalCollectedThisYear: number; + totalOutstanding: number; + paymentsByMonth: Array<{ month: string; amount: number; count: number }>; + remindersSentThisMonth: number; + statusBreakdown: Array<{ status: string; count: number; percentage: number }>; +} + +// ============================================ +// SETTINGS +// ============================================ + +/** + * Get dues-related settings from the database + */ +export async function getDuesSettings(): Promise { + const { data: settings } = await supabaseAdmin + .from('app_settings') + .select('setting_key, setting_value') + .eq('category', 'dues'); + + const config: Record = {}; + for (const s of settings || []) { + config[s.setting_key] = s.setting_value; + } + + return { + reminder_days_before: Array.isArray(config.reminder_days_before) + ? config.reminder_days_before + : [30, 7, 1], + grace_period_days: typeof config.grace_period_days === 'number' ? config.grace_period_days : 30, + auto_inactive_enabled: + typeof config.auto_inactive_enabled === 'boolean' ? config.auto_inactive_enabled : true, + payment_iban: config.payment_iban || '', + payment_account_holder: config.payment_account_holder || '', + payment_bank_name: config.payment_bank_name || '' + }; +} + +// ============================================ +// MEMBER QUERIES +// ============================================ + +/** + * Get members who need a specific type of reminder + * Excludes members who have already received this reminder for their current due date + */ +export async function getMembersNeedingReminder(reminderType: ReminderType): Promise { + const settings = await getDuesSettings(); + const today = new Date(); + today.setHours(0, 0, 0, 0); + + // Get all members with dues info + const { data: members, error } = await supabaseAdmin + .from('members_with_dues') + .select('*') + .not('email', 'is', null); + + if (error || !members) { + console.error('Error fetching members:', error); + return []; + } + + // Filter based on reminder type + let filteredMembers: MemberWithDues[] = []; + + if (reminderType.startsWith('due_soon_')) { + const daysMatch = reminderType.match(/due_soon_(\d+)/); + if (!daysMatch) return []; + const daysBefore = parseInt(daysMatch[1]); + + filteredMembers = members.filter((m) => { + if (!m.current_due_date || m.dues_status === 'never_paid') return false; + const dueDate = new Date(m.current_due_date); + const daysUntil = Math.ceil((dueDate.getTime() - today.getTime()) / (1000 * 60 * 60 * 24)); + // Member is due within the specified window (e.g., 30 days means dues_until <= 30) + return daysUntil > 0 && daysUntil <= daysBefore; + }); + } else if (reminderType === 'overdue') { + filteredMembers = members.filter((m) => { + if (!m.current_due_date) return false; + const daysOverdue = m.days_overdue || 0; + // Overdue but still within grace period + return m.dues_status === 'overdue' && daysOverdue <= settings.grace_period_days; + }); + } else if (reminderType === 'grace_period') { + filteredMembers = members.filter((m) => { + if (!m.current_due_date) return false; + const daysOverdue = m.days_overdue || 0; + // In final week of grace period + const graceDaysRemaining = settings.grace_period_days - daysOverdue; + return m.dues_status === 'overdue' && graceDaysRemaining > 0 && graceDaysRemaining <= 7; + }); + } + + // Exclude members who already received this reminder for their current due period + if (filteredMembers.length > 0) { + const memberIds = filteredMembers.map((m) => m.id); + + // Get reminders already sent + const { data: existingReminders } = await supabaseAdmin + .from('dues_reminder_logs') + .select('member_id, due_date') + .eq('reminder_type', reminderType) + .in('member_id', memberIds); + + if (existingReminders && existingReminders.length > 0) { + const sentSet = new Set( + existingReminders.map((r) => `${r.member_id}-${r.due_date}`) + ); + + filteredMembers = filteredMembers.filter((m) => { + const key = `${m.id}-${m.current_due_date}`; + return !sentSet.has(key); + }); + } + } + + return filteredMembers; +} + +/** + * Get overdue members who have exceeded the grace period and should be marked inactive + */ +export async function getMembersForInactivation(): Promise { + const settings = await getDuesSettings(); + + if (!settings.auto_inactive_enabled) { + return []; + } + + const { data: members } = await supabaseAdmin + .from('members_with_dues') + .select('*') + .eq('dues_status', 'overdue') + .not('status_name', 'eq', 'inactive'); + + if (!members) return []; + + // Filter to those past grace period + return members.filter((m) => { + const daysOverdue = m.days_overdue || 0; + return daysOverdue > settings.grace_period_days; + }); +} + +// ============================================ +// REMINDER SENDING +// ============================================ + +/** + * Send a dues reminder to a specific member + */ +export async function sendDuesReminder( + member: MemberWithDues, + reminderType: ReminderType, + baseUrl: string = 'https://monacousa.org' +): Promise<{ success: boolean; error?: string; emailLogId?: string }> { + const settings = await getDuesSettings(); + + // Determine template key based on reminder type + const templateKey = + reminderType === 'overdue' + ? 'dues_overdue' + : reminderType === 'grace_period' + ? 'dues_grace_warning' + : reminderType === 'inactive_notice' + ? 'dues_inactive_notice' + : `dues_reminder_${reminderType.replace('due_soon_', '')}`; + + // Calculate variables + const dueDate = member.current_due_date + ? new Date(member.current_due_date).toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric' + }) + : 'N/A'; + + const daysOverdue = member.days_overdue || 0; + const graceDaysRemaining = Math.max(0, settings.grace_period_days - daysOverdue); + const graceEndDate = member.current_due_date + ? new Date( + new Date(member.current_due_date).getTime() + + settings.grace_period_days * 24 * 60 * 60 * 1000 + ).toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric' + }) + : 'N/A'; + + const variables: Record = { + first_name: member.first_name, + last_name: member.last_name, + member_id: member.member_id, + due_date: dueDate, + amount: `€${(member.annual_dues || 50).toFixed(2)}`, + days_overdue: daysOverdue.toString(), + grace_days_remaining: graceDaysRemaining.toString(), + grace_end_date: graceEndDate, + account_holder: settings.payment_account_holder, + bank_name: settings.payment_bank_name, + iban: settings.payment_iban, + portal_url: `${baseUrl}/payments` + }; + + // Send email + const result = await sendTemplatedEmail(templateKey, member.email, variables, { + recipientId: member.id, + recipientName: `${member.first_name} ${member.last_name}`, + baseUrl + }); + + if (!result.success) { + return { success: false, error: result.error }; + } + + // Log the reminder + const { error: logError } = await supabaseAdmin.from('dues_reminder_logs').insert({ + member_id: member.id, + reminder_type: reminderType, + due_date: member.current_due_date || new Date().toISOString().split('T')[0] + }); + + if (logError) { + console.error('Error logging reminder:', logError); + } + + return { success: true }; +} + +/** + * Send bulk reminders of a specific type + */ +export async function sendBulkReminders( + reminderType: ReminderType, + baseUrl: string = 'https://monacousa.org' +): Promise { + const members = await getMembersNeedingReminder(reminderType); + + const result: DuesReminderResult = { + sent: 0, + skipped: 0, + errors: [], + members: [] + }; + + for (const member of members) { + try { + const sendResult = await sendDuesReminder(member, reminderType, baseUrl); + + if (sendResult.success) { + result.sent++; + result.members.push({ + id: member.id, + name: `${member.first_name} ${member.last_name}`, + email: member.email, + status: 'sent' + }); + } else { + result.errors.push(`${member.email}: ${sendResult.error}`); + result.members.push({ + id: member.id, + name: `${member.first_name} ${member.last_name}`, + email: member.email, + status: 'error', + error: sendResult.error + }); + } + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + result.errors.push(`${member.email}: ${errorMessage}`); + result.members.push({ + id: member.id, + name: `${member.first_name} ${member.last_name}`, + email: member.email, + status: 'error', + error: errorMessage + }); + } + } + + return result; +} + +// ============================================ +// GRACE PERIOD & INACTIVATION +// ============================================ + +/** + * Process members who have exceeded grace period and mark them inactive + */ +export async function processGracePeriodExpirations( + baseUrl: string = 'https://monacousa.org' +): Promise<{ processed: number; members: Array<{ id: string; name: string; email: string }> }> { + const settings = await getDuesSettings(); + + if (!settings.auto_inactive_enabled) { + return { processed: 0, members: [] }; + } + + const members = await getMembersForInactivation(); + const processed: Array<{ id: string; name: string; email: string }> = []; + + // Get inactive status ID + const { data: inactiveStatus } = await supabaseAdmin + .from('membership_statuses') + .select('id') + .eq('name', 'inactive') + .single(); + + if (!inactiveStatus) { + console.error('Inactive status not found'); + return { processed: 0, members: [] }; + } + + for (const member of members) { + // Update member status to inactive + const { error: updateError } = await supabaseAdmin + .from('members') + .update({ membership_status_id: inactiveStatus.id }) + .eq('id', member.id); + + if (updateError) { + console.error(`Error updating member ${member.id}:`, updateError); + continue; + } + + // Send inactive notice + await sendDuesReminder(member, 'inactive_notice', baseUrl); + + // Log the reminder + await supabaseAdmin.from('dues_reminder_logs').insert({ + member_id: member.id, + reminder_type: 'inactive_notice', + due_date: member.current_due_date || new Date().toISOString().split('T')[0] + }); + + processed.push({ + id: member.id, + name: `${member.first_name} ${member.last_name}`, + email: member.email + }); + } + + return { processed: processed.length, members: processed }; +} + +// ============================================ +// ANALYTICS +// ============================================ + +/** + * Get comprehensive dues analytics + */ +export async function getDuesAnalytics(): Promise { + const now = new Date(); + const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1); + const startOfYear = new Date(now.getFullYear(), 0, 1); + + // Get members with dues + const { data: members } = await supabaseAdmin.from('members_with_dues').select('*'); + + const allMembers = members || []; + const totalMembers = allMembers.length; + const current = allMembers.filter((m) => m.dues_status === 'current').length; + const dueSoon = allMembers.filter((m) => m.dues_status === 'due_soon').length; + const overdue = allMembers.filter((m) => m.dues_status === 'overdue').length; + const neverPaid = allMembers.filter((m) => m.dues_status === 'never_paid').length; + + // Calculate total outstanding (overdue + due_soon + never_paid) + const totalOutstanding = allMembers + .filter((m) => m.dues_status !== 'current') + .reduce((sum, m) => sum + (m.annual_dues || 0), 0); + + // Get payments this month + const { data: monthPayments } = await supabaseAdmin + .from('dues_payments') + .select('amount') + .gte('payment_date', startOfMonth.toISOString().split('T')[0]); + + const totalCollectedThisMonth = (monthPayments || []).reduce((sum, p) => sum + p.amount, 0); + + // Get payments this year + const { data: yearPayments } = await supabaseAdmin + .from('dues_payments') + .select('amount') + .gte('payment_date', startOfYear.toISOString().split('T')[0]); + + const totalCollectedThisYear = (yearPayments || []).reduce((sum, p) => sum + p.amount, 0); + + // Get payments by month (last 12 months) + const twelveMonthsAgo = new Date(now.getFullYear(), now.getMonth() - 11, 1); + const { data: allPayments } = await supabaseAdmin + .from('dues_payments') + .select('amount, payment_date') + .gte('payment_date', twelveMonthsAgo.toISOString().split('T')[0]) + .order('payment_date', { ascending: true }); + + const paymentsByMonth: Array<{ month: string; amount: number; count: number }> = []; + const monthMap = new Map(); + + for (const payment of allPayments || []) { + const date = new Date(payment.payment_date); + const monthKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`; + + const existing = monthMap.get(monthKey) || { amount: 0, count: 0 }; + existing.amount += payment.amount; + existing.count += 1; + monthMap.set(monthKey, existing); + } + + // Fill in missing months + for (let i = 0; i < 12; i++) { + const date = new Date(now.getFullYear(), now.getMonth() - 11 + i, 1); + const monthKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`; + const data = monthMap.get(monthKey) || { amount: 0, count: 0 }; + paymentsByMonth.push({ + month: date.toLocaleDateString('en-US', { month: 'short', year: 'numeric' }), + amount: data.amount, + count: data.count + }); + } + + // Get reminders sent this month + const { count: remindersSentThisMonth } = await supabaseAdmin + .from('dues_reminder_logs') + .select('*', { count: 'exact', head: true }) + .gte('sent_at', startOfMonth.toISOString()); + + // Status breakdown with percentages + const statusBreakdown = [ + { status: 'current', count: current, percentage: totalMembers > 0 ? (current / totalMembers) * 100 : 0 }, + { status: 'due_soon', count: dueSoon, percentage: totalMembers > 0 ? (dueSoon / totalMembers) * 100 : 0 }, + { status: 'overdue', count: overdue, percentage: totalMembers > 0 ? (overdue / totalMembers) * 100 : 0 }, + { status: 'never_paid', count: neverPaid, percentage: totalMembers > 0 ? (neverPaid / totalMembers) * 100 : 0 } + ]; + + return { + totalMembers, + current, + dueSoon, + overdue, + neverPaid, + totalCollectedThisMonth, + totalCollectedThisYear, + totalOutstanding, + paymentsByMonth, + remindersSentThisMonth: remindersSentThisMonth || 0, + statusBreakdown + }; +} + +/** + * Get detailed dues report data for CSV export + */ +export async function getDuesReportData(): Promise<{ + members: Array<{ + member_id: string; + name: string; + email: string; + membership_type: string; + status: string; + dues_status: string; + annual_dues: number; + last_payment_date: string | null; + current_due_date: string | null; + days_overdue: number | null; + }>; + payments: Array<{ + member_id: string; + member_name: string; + amount: number; + payment_date: string; + payment_method: string; + reference: string | null; + recorded_by: string | null; + }>; +}> { + // Get members with dues + const { data: members } = await supabaseAdmin.from('members_with_dues').select('*'); + + const memberReport = (members || []).map((m) => ({ + member_id: m.member_id, + name: `${m.first_name} ${m.last_name}`, + email: m.email, + membership_type: m.membership_type_name || 'Regular', + status: m.status_display_name || 'Unknown', + dues_status: m.dues_status, + annual_dues: m.annual_dues || 0, + last_payment_date: m.last_payment_date, + current_due_date: m.current_due_date, + days_overdue: m.days_overdue + })); + + // Get all payments with member info + const { data: payments } = await supabaseAdmin + .from('dues_payments') + .select( + ` + *, + member:members(member_id, first_name, last_name), + recorder:members!dues_payments_recorded_by_fkey(first_name, last_name) + ` + ) + .order('payment_date', { ascending: false }); + + const paymentReport = (payments || []).map((p: any) => ({ + member_id: p.member?.member_id || 'Unknown', + member_name: p.member ? `${p.member.first_name} ${p.member.last_name}` : 'Unknown', + amount: p.amount, + payment_date: p.payment_date, + payment_method: p.payment_method, + reference: p.reference, + recorded_by: p.recorder ? `${p.recorder.first_name} ${p.recorder.last_name}` : null + })); + + return { + members: memberReport, + payments: paymentReport + }; +} + +/** + * Get reminder effectiveness stats + */ +export async function getReminderEffectiveness(): Promise<{ + totalRemindersSent: number; + paidWithin7Days: number; + paidWithin30Days: number; + effectivenessRate: number; +}> { + // Get all reminder logs with payment data + const { data: reminders } = await supabaseAdmin + .from('dues_reminder_logs') + .select('member_id, sent_at, due_date'); + + if (!reminders || reminders.length === 0) { + return { + totalRemindersSent: 0, + paidWithin7Days: 0, + paidWithin30Days: 0, + effectivenessRate: 0 + }; + } + + let paidWithin7Days = 0; + let paidWithin30Days = 0; + + for (const reminder of reminders) { + const sentDate = new Date(reminder.sent_at); + const sevenDaysLater = new Date(sentDate.getTime() + 7 * 24 * 60 * 60 * 1000); + const thirtyDaysLater = new Date(sentDate.getTime() + 30 * 24 * 60 * 60 * 1000); + + // Check if member paid within windows + const { data: payments } = await supabaseAdmin + .from('dues_payments') + .select('payment_date') + .eq('member_id', reminder.member_id) + .gte('payment_date', sentDate.toISOString().split('T')[0]) + .lte('payment_date', thirtyDaysLater.toISOString().split('T')[0]) + .limit(1); + + if (payments && payments.length > 0) { + const paymentDate = new Date(payments[0].payment_date); + if (paymentDate <= sevenDaysLater) { + paidWithin7Days++; + } + paidWithin30Days++; + } + } + + return { + totalRemindersSent: reminders.length, + paidWithin7Days, + paidWithin30Days, + effectivenessRate: reminders.length > 0 ? (paidWithin30Days / reminders.length) * 100 : 0 + }; +} + +// ============================================ +// ONBOARDING REMINDERS +// ============================================ + +interface OnboardingMember { + id: string; + first_name: string; + last_name: string; + email: string; + member_id: string; + payment_deadline: string; +} + +/** + * Get new members who need onboarding payment reminders + * These are members with a payment_deadline set from onboarding + */ +export async function getMembersNeedingOnboardingReminder( + reminderType: OnboardingReminderType +): Promise { + const today = new Date(); + today.setHours(0, 0, 0, 0); + + // Get pending status ID + const { data: pendingStatus } = await supabaseAdmin + .from('membership_statuses') + .select('id') + .eq('name', 'pending') + .single(); + + if (!pendingStatus) { + console.error('Pending status not found'); + return []; + } + + // Get members with payment_deadline set (from onboarding) + const { data: members, error } = await supabaseAdmin + .from('members') + .select('id, first_name, last_name, email, member_id, payment_deadline') + .eq('membership_status_id', pendingStatus.id) + .not('payment_deadline', 'is', null) + .not('email', 'is', null); + + if (error || !members) { + console.error('Error fetching onboarding members:', error); + return []; + } + + // Filter based on reminder type + let filteredMembers: OnboardingMember[] = []; + + if (reminderType === 'onboarding_reminder_7') { + // 7 days or less until deadline + filteredMembers = members.filter((m) => { + if (!m.payment_deadline) return false; + const deadline = new Date(m.payment_deadline); + const daysUntil = Math.ceil((deadline.getTime() - today.getTime()) / (1000 * 60 * 60 * 24)); + return daysUntil > 0 && daysUntil <= 7; + }) as OnboardingMember[]; + } else if (reminderType === 'onboarding_reminder_1') { + // 1 day or less until deadline (final reminder) + filteredMembers = members.filter((m) => { + if (!m.payment_deadline) return false; + const deadline = new Date(m.payment_deadline); + const daysUntil = Math.ceil((deadline.getTime() - today.getTime()) / (1000 * 60 * 60 * 24)); + return daysUntil === 1; + }) as OnboardingMember[]; + } else if (reminderType === 'onboarding_expired') { + // Deadline has passed + filteredMembers = members.filter((m) => { + if (!m.payment_deadline) return false; + const deadline = new Date(m.payment_deadline); + return deadline < today; + }) as OnboardingMember[]; + } + + // Exclude members who already received this reminder + if (filteredMembers.length > 0) { + const memberIds = filteredMembers.map((m) => m.id); + + const { data: existingReminders } = await supabaseAdmin + .from('dues_reminder_logs') + .select('member_id') + .eq('reminder_type', reminderType) + .in('member_id', memberIds); + + if (existingReminders && existingReminders.length > 0) { + const sentSet = new Set(existingReminders.map((r) => r.member_id)); + filteredMembers = filteredMembers.filter((m) => !sentSet.has(m.id)); + } + } + + return filteredMembers; +} + +/** + * Send an onboarding reminder to a specific member + */ +export async function sendOnboardingReminder( + member: OnboardingMember, + reminderType: OnboardingReminderType, + baseUrl: string = 'https://monacousa.org' +): Promise<{ success: boolean; error?: string }> { + const settings = await getDuesSettings(); + + // Calculate days until deadline + const deadline = new Date(member.payment_deadline); + const today = new Date(); + today.setHours(0, 0, 0, 0); + const daysLeft = Math.ceil((deadline.getTime() - today.getTime()) / (1000 * 60 * 60 * 24)); + + // Get default membership dues amount + const { data: defaultType } = await supabaseAdmin + .from('membership_types') + .select('annual_dues') + .eq('is_default', true) + .single(); + + const variables: Record = { + first_name: member.first_name, + last_name: member.last_name, + member_id: member.member_id || 'N/A', + payment_deadline: deadline.toLocaleDateString('en-US', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric' + }), + days_remaining: Math.max(0, daysLeft).toString(), + amount: `€${defaultType?.annual_dues || 150}`, + account_holder: settings.payment_account_holder || 'Monaco USA', + bank_name: settings.payment_bank_name || 'Credit Foncier de Monaco', + iban: settings.payment_iban || 'Contact for details', + portal_url: `${baseUrl}/payments` + }; + + // Send email + const result = await sendTemplatedEmail(reminderType, member.email, variables, { + recipientId: member.id, + recipientName: `${member.first_name} ${member.last_name}`, + baseUrl + }); + + if (!result.success) { + return { success: false, error: result.error }; + } + + // Log the reminder + const { error: logError } = await supabaseAdmin.from('dues_reminder_logs').insert({ + member_id: member.id, + reminder_type: reminderType, + due_date: member.payment_deadline + }); + + if (logError) { + console.error('Error logging onboarding reminder:', logError); + } + + return { success: true }; +} + +/** + * Send bulk onboarding reminders of a specific type + */ +export async function sendOnboardingReminders( + reminderType: OnboardingReminderType, + baseUrl: string = 'https://monacousa.org' +): Promise { + const members = await getMembersNeedingOnboardingReminder(reminderType); + + const result: DuesReminderResult = { + sent: 0, + skipped: 0, + errors: [], + members: [] + }; + + for (const member of members) { + try { + const sendResult = await sendOnboardingReminder(member, reminderType, baseUrl); + + if (sendResult.success) { + result.sent++; + result.members.push({ + id: member.id, + name: `${member.first_name} ${member.last_name}`, + email: member.email, + status: 'sent' + }); + } else { + result.errors.push(`${member.email}: ${sendResult.error}`); + result.members.push({ + id: member.id, + name: `${member.first_name} ${member.last_name}`, + email: member.email, + status: 'error', + error: sendResult.error + }); + } + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + result.errors.push(`${member.email}: ${errorMessage}`); + result.members.push({ + id: member.id, + name: `${member.first_name} ${member.last_name}`, + email: member.email, + status: 'error', + error: errorMessage + }); + } + } + + return result; +} + +/** + * Process expired onboarding payment deadlines and mark members as inactive + */ +export async function processOnboardingExpirations( + baseUrl: string = 'https://monacousa.org' +): Promise<{ processed: number; members: Array<{ id: string; name: string; email: string }> }> { + const members = await getMembersNeedingOnboardingReminder('onboarding_expired'); + const processed: Array<{ id: string; name: string; email: string }> = []; + + // Get inactive status ID + const { data: inactiveStatus } = await supabaseAdmin + .from('membership_statuses') + .select('id') + .eq('name', 'inactive') + .single(); + + if (!inactiveStatus) { + console.error('Inactive status not found'); + return { processed: 0, members: [] }; + } + + for (const member of members) { + // Update member status to inactive + const { error: updateError } = await supabaseAdmin + .from('members') + .update({ membership_status_id: inactiveStatus.id }) + .eq('id', member.id); + + if (updateError) { + console.error(`Error updating member ${member.id}:`, updateError); + continue; + } + + // Send expired notice + await sendOnboardingReminder(member, 'onboarding_expired', baseUrl); + + processed.push({ + id: member.id, + name: `${member.first_name} ${member.last_name}`, + email: member.email + }); + } + + return { processed: processed.length, members: processed }; +} diff --git a/src/lib/server/email.ts b/src/lib/server/email.ts new file mode 100644 index 0000000..6b5d884 --- /dev/null +++ b/src/lib/server/email.ts @@ -0,0 +1,394 @@ +import nodemailer from 'nodemailer'; +import type { Transporter } from 'nodemailer'; +import { supabaseAdmin } from './supabase'; + +export interface SmtpConfig { + host: string; + port: number; + secure: boolean; + username: string; + password: string; + from_address: string; + from_name: string; +} + +export interface SendEmailOptions { + to: string; + subject: string; + html: string; + text?: string; + recipientId?: string; + recipientName?: string; + templateKey?: string; + emailType?: string; + sentBy?: string; +} + +/** + * Get SMTP configuration from app_settings table + */ +export async function getSmtpConfig(): Promise { + const { data: settings } = await supabaseAdmin + .from('app_settings') + .select('setting_key, setting_value') + .eq('category', 'email'); + + if (!settings || settings.length === 0) { + return null; + } + + const config: Record = {}; + for (const s of settings) { + // Parse the value - it might be JSON stringified or plain + let value = s.setting_value; + if (typeof value === 'string') { + // Remove surrounding quotes if present + value = value.replace(/^"|"$/g, ''); + } + config[s.setting_key] = value as string; + } + + // Validate required fields + if (!config.smtp_host || !config.smtp_username || !config.smtp_password) { + return null; + } + + return { + host: config.smtp_host, + port: parseInt(config.smtp_port || '587'), + secure: config.smtp_secure === 'true' || parseInt(config.smtp_port || '587') === 465, + username: config.smtp_username, + password: config.smtp_password, + from_address: config.smtp_from_address || 'noreply@monacousa.org', + from_name: config.smtp_from_name || 'Monaco USA' + }; +} + +/** + * Create a nodemailer transporter with the configured SMTP settings + */ +export async function createTransporter(): Promise { + const config = await getSmtpConfig(); + if (!config) { + console.error('SMTP configuration not found or incomplete'); + return null; + } + + return nodemailer.createTransport({ + host: config.host, + port: config.port, + secure: config.secure, + auth: { + user: config.username, + pass: config.password + } + }); +} + +/** + * Send an email using the configured SMTP settings + */ +export async function sendEmail(options: SendEmailOptions): Promise<{ success: boolean; error?: string; messageId?: string }> { + const config = await getSmtpConfig(); + if (!config) { + return { success: false, error: 'SMTP not configured. Please configure email settings first.' }; + } + + const transporter = await createTransporter(); + if (!transporter) { + return { success: false, error: 'Failed to create email transporter' }; + } + + try { + const result = await transporter.sendMail({ + from: `"${config.from_name}" <${config.from_address}>`, + to: options.to, + subject: options.subject, + html: options.html, + text: options.text || stripHtml(options.html) + }); + + // Log to email_logs table + await supabaseAdmin.from('email_logs').insert({ + recipient_id: options.recipientId || null, + recipient_email: options.to, + recipient_name: options.recipientName || null, + template_key: options.templateKey || null, + subject: options.subject, + email_type: options.emailType || 'manual', + status: 'sent', + provider: 'smtp', + provider_message_id: result.messageId, + sent_by: options.sentBy || null, + sent_at: new Date().toISOString() + }); + + return { success: true, messageId: result.messageId }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + console.error('Email send error:', error); + + // Log failed attempt + await supabaseAdmin.from('email_logs').insert({ + recipient_id: options.recipientId || null, + recipient_email: options.to, + recipient_name: options.recipientName || null, + template_key: options.templateKey || null, + subject: options.subject, + email_type: options.emailType || 'manual', + status: 'failed', + provider: 'smtp', + error_message: errorMessage, + sent_by: options.sentBy || null + }); + + return { success: false, error: errorMessage }; + } +} + +/** + * Send a templated email with variable substitution + * Templates should contain content only (no full HTML wrapper) - will be wrapped automatically + */ +export async function sendTemplatedEmail( + templateKey: string, + to: string, + variables: Record, + options?: { + recipientId?: string; + recipientName?: string; + sentBy?: string; + baseUrl?: string; + } +): Promise<{ success: boolean; error?: string; messageId?: string }> { + // Fetch template from database + const { data: template, error: templateError } = await supabaseAdmin + .from('email_templates') + .select('*') + .eq('template_key', templateKey) + .eq('is_active', true) + .single(); + + if (templateError || !template) { + return { success: false, error: `Email template "${templateKey}" not found or inactive` }; + } + + // Get site URL for logo + const baseUrl = options?.baseUrl || process.env.SITE_URL || 'https://monacousa.org'; + const logoUrl = `${baseUrl}/MONACOUSA-Flags_376x376.png`; + + // Add default variables + const allVariables: Record = { + logo_url: logoUrl, + site_url: baseUrl, + ...variables + }; + + // Replace variables in subject and body + let subject = template.subject; + let bodyContent = template.body_html; + let text = template.body_text || ''; + + for (const [key, value] of Object.entries(allVariables)) { + const regex = new RegExp(`{{${key}}}`, 'g'); + subject = subject.replace(regex, value); + bodyContent = bodyContent.replace(regex, value); + text = text.replace(regex, value); + } + + // Extract title from template or use subject + // Look for title in template metadata or first h2 tag + let emailTitle = template.email_title || subject; + // Try to extract from first h2 in content + const h2Match = bodyContent.match(/]*>([^<]+)<\/h2>/i); + if (h2Match) { + emailTitle = h2Match[1].replace(/{{[^}]+}}/g, '').trim(); + } + + // Check if template already has full HTML wrapper (legacy templates) + const hasFullWrapper = bodyContent.includes('/g, + `` + ); + } else { + // Content-only template - wrap with Monaco template + html = wrapInMonacoTemplate({ + title: emailTitle, + content: bodyContent, + logoUrl + }); + } + + return sendEmail({ + to, + subject, + html, + text: text || undefined, + recipientId: options?.recipientId, + recipientName: options?.recipientName, + templateKey, + emailType: template.category, + sentBy: options?.sentBy + }); +} + +/** + * Test SMTP connection and optionally send a test email + */ +export async function testSmtpConnection( + sendTo?: string, + sentBy?: string +): Promise<{ success: boolean; error?: string }> { + const config = await getSmtpConfig(); + if (!config) { + return { success: false, error: 'SMTP not configured. Please configure and save email settings first.' }; + } + + const transporter = await createTransporter(); + if (!transporter) { + return { success: false, error: 'Failed to create email transporter' }; + } + + try { + // Verify connection + await transporter.verify(); + + // If a recipient is provided, send a test email + if (sendTo) { + const testContent = ` +

This is a test email from your Monaco USA Portal.

+
+

✓ Configuration Verified

+

Your SMTP settings are working correctly!

+
+

Sent at ${new Date().toLocaleString()}

`; + + const result = await sendEmail({ + to: sendTo, + subject: 'Monaco USA Portal - SMTP Test Email', + html: wrapInMonacoTemplate({ + title: 'SMTP Test Successful!', + content: testContent + }), + emailType: 'test', + sentBy + }); + + if (!result.success) { + return { success: false, error: result.error }; + } + } + + return { success: true }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + console.error('SMTP test error:', error); + return { success: false, error: `SMTP connection failed: ${errorMessage}` }; + } +} + +// S3-hosted background image URL matching login screen +const EMAIL_BACKGROUND_IMAGE_URL = 'https://s3.monacousa.org/public/monaco_high_res.jpg'; + +/** + * Wrap email content in Monaco-branded template + * This creates a consistent look matching the login page styling with background image + */ +export function wrapInMonacoTemplate(options: { + title: string; + content: string; + logoUrl?: string; + backgroundImageUrl?: string; +}): string { + const baseUrl = process.env.SITE_URL || 'http://localhost:7453'; + const logoUrl = options.logoUrl || `${baseUrl}/MONACOUSA-Flags_376x376.png`; + const bgImageUrl = options.backgroundImageUrl || EMAIL_BACKGROUND_IMAGE_URL; + + return ` + + + + + + + + +
+ + + +
+ +
+ + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

${options.title}

+
${options.content}
+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+
+
+ +`; +} + +/** + * Strip HTML tags from a string to create plain text version + */ +function stripHtml(html: string): string { + return html + .replace(/<[^>]*>/g, '') + .replace(/ /g, ' ') + .replace(/&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/\s+/g, ' ') + .trim(); +} diff --git a/src/lib/server/event-reminders.ts b/src/lib/server/event-reminders.ts new file mode 100644 index 0000000..33fe494 --- /dev/null +++ b/src/lib/server/event-reminders.ts @@ -0,0 +1,339 @@ +/** + * Event Reminder Service + * Handles sending automated reminder emails 24 hours before events + */ + +import { supabaseAdmin } from './supabase'; +import { sendTemplatedEmail } from './email'; + +// ============================================ +// TYPES +// ============================================ + +export interface EventReminderSettings { + event_reminders_enabled: boolean; + event_reminder_hours_before: number; +} + +export interface EventReminderResult { + sent: number; + skipped: number; + errors: string[]; + reminders: Array<{ + eventId: string; + eventTitle: string; + memberId: string; + memberName: string; + email: string; + status: 'sent' | 'skipped' | 'error'; + error?: string; + }>; +} + +export interface EventNeedingReminder { + event_id: string; + event_title: string; + start_datetime: string; + end_datetime: string; + location: string | null; + timezone: string; + rsvp_id: string; + member_id: string; + guest_count: number; + rsvp_status: string; + first_name: string; + last_name: string; + email: string; +} + +// ============================================ +// SETTINGS +// ============================================ + +/** + * Get event reminder settings from the database + */ +export async function getEventReminderSettings(): Promise { + const { data: settings } = await supabaseAdmin + .from('app_settings') + .select('setting_key, setting_value') + .eq('category', 'events') + .in('setting_key', ['event_reminders_enabled', 'event_reminder_hours_before']); + + const config: Record = {}; + for (const s of settings || []) { + config[s.setting_key] = s.setting_value as string; + } + + return { + event_reminders_enabled: config.event_reminders_enabled !== 'false', + event_reminder_hours_before: parseInt(config.event_reminder_hours_before || '24') + }; +} + +// ============================================ +// QUERIES +// ============================================ + +/** + * Get events with confirmed RSVPs that need reminders sent + * Uses the events_needing_reminders view for efficient querying + */ +export async function getEventsNeedingReminders(): Promise { + const settings = await getEventReminderSettings(); + + if (!settings.event_reminders_enabled) { + return []; + } + + // Calculate the time window based on settings + const hoursBeforeEvent = settings.event_reminder_hours_before; + const now = new Date(); + const windowStart = new Date(now.getTime() + (hoursBeforeEvent - 1) * 60 * 60 * 1000); + const windowEnd = new Date(now.getTime() + (hoursBeforeEvent + 1) * 60 * 60 * 1000); + + // Query events starting within the reminder window + const { data: events, error } = await supabaseAdmin + .from('events') + .select(` + id, + title, + start_datetime, + end_datetime, + location, + timezone + `) + .eq('status', 'published') + .gt('start_datetime', windowStart.toISOString()) + .lte('start_datetime', windowEnd.toISOString()); + + if (error || !events || events.length === 0) { + return []; + } + + // Get RSVPs for these events + const eventIds = events.map(e => e.id); + const { data: rsvps, error: rsvpError } = await supabaseAdmin + .from('event_rsvps') + .select(` + id, + event_id, + member_id, + guest_count, + status, + member:members(first_name, last_name, email) + `) + .in('event_id', eventIds) + .eq('status', 'confirmed'); + + if (rsvpError || !rsvps) { + return []; + } + + // Get already sent reminders + const { data: sentReminders } = await supabaseAdmin + .from('event_reminder_logs') + .select('event_id, member_id') + .in('event_id', eventIds) + .eq('reminder_type', '24hr'); + + const sentSet = new Set( + (sentReminders || []).map(r => `${r.event_id}-${r.member_id}`) + ); + + // Build the result array + const result: EventNeedingReminder[] = []; + + for (const event of events) { + const eventRsvps = rsvps.filter(r => r.event_id === event.id); + + for (const rsvp of eventRsvps) { + const member = rsvp.member as { first_name: string; last_name: string; email: string } | null; + if (!member?.email) continue; + + // Skip if reminder already sent + const key = `${event.id}-${rsvp.member_id}`; + if (sentSet.has(key)) continue; + + result.push({ + event_id: event.id, + event_title: event.title, + start_datetime: event.start_datetime, + end_datetime: event.end_datetime, + location: event.location, + timezone: event.timezone || 'Europe/Monaco', + rsvp_id: rsvp.id, + member_id: rsvp.member_id, + guest_count: rsvp.guest_count || 0, + rsvp_status: rsvp.status, + first_name: member.first_name, + last_name: member.last_name, + email: member.email + }); + } + } + + return result; +} + +// ============================================ +// REMINDER SENDING +// ============================================ + +/** + * Send a single event reminder email + */ +export async function sendEventReminder( + reminder: EventNeedingReminder, + baseUrl: string = 'https://monacousa.org' +): Promise<{ success: boolean; error?: string }> { + // Format date and time + const eventDate = new Date(reminder.start_datetime); + const formattedDate = eventDate.toLocaleDateString('en-US', { + weekday: 'long', + month: 'long', + day: 'numeric', + year: 'numeric' + }); + const formattedTime = eventDate.toLocaleTimeString('en-US', { + hour: 'numeric', + minute: '2-digit', + hour12: true, + timeZone: reminder.timezone + }); + + const variables: Record = { + first_name: reminder.first_name, + event_title: reminder.event_title, + event_date: formattedDate, + event_time: formattedTime, + event_location: reminder.location || 'TBD', + guest_count: reminder.guest_count > 0 ? reminder.guest_count.toString() : '', + portal_url: `${baseUrl}/events/${reminder.event_id}` + }; + + // Send email + const result = await sendTemplatedEmail('event_reminder_24hr', reminder.email, variables, { + recipientId: reminder.member_id, + recipientName: `${reminder.first_name} ${reminder.last_name}`, + baseUrl + }); + + if (!result.success) { + return { success: false, error: result.error }; + } + + // Log the reminder + const { error: logError } = await supabaseAdmin.from('event_reminder_logs').insert({ + event_id: reminder.event_id, + rsvp_id: reminder.rsvp_id, + member_id: reminder.member_id, + reminder_type: '24hr' + }); + + if (logError) { + console.error('Error logging event reminder:', logError); + } + + return { success: true }; +} + +/** + * Send all pending event reminders + */ +export async function sendEventReminders( + baseUrl: string = 'https://monacousa.org' +): Promise { + const remindersNeeded = await getEventsNeedingReminders(); + + const result: EventReminderResult = { + sent: 0, + skipped: 0, + errors: [], + reminders: [] + }; + + for (const reminder of remindersNeeded) { + try { + const sendResult = await sendEventReminder(reminder, baseUrl); + + if (sendResult.success) { + result.sent++; + result.reminders.push({ + eventId: reminder.event_id, + eventTitle: reminder.event_title, + memberId: reminder.member_id, + memberName: `${reminder.first_name} ${reminder.last_name}`, + email: reminder.email, + status: 'sent' + }); + } else { + result.errors.push(`${reminder.email}: ${sendResult.error}`); + result.reminders.push({ + eventId: reminder.event_id, + eventTitle: reminder.event_title, + memberId: reminder.member_id, + memberName: `${reminder.first_name} ${reminder.last_name}`, + email: reminder.email, + status: 'error', + error: sendResult.error + }); + } + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + result.errors.push(`${reminder.email}: ${errorMessage}`); + result.reminders.push({ + eventId: reminder.event_id, + eventTitle: reminder.event_title, + memberId: reminder.member_id, + memberName: `${reminder.first_name} ${reminder.last_name}`, + email: reminder.email, + status: 'error', + error: errorMessage + }); + } + } + + return result; +} + +// ============================================ +// ANALYTICS +// ============================================ + +/** + * Get statistics about event reminders + */ +export async function getEventReminderStats(): Promise<{ + totalRemindersSent: number; + remindersSentThisMonth: number; + eventsWithReminders: number; +}> { + const now = new Date(); + const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1); + + // Get total reminders sent + const { count: totalRemindersSent } = await supabaseAdmin + .from('event_reminder_logs') + .select('*', { count: 'exact', head: true }); + + // Get reminders sent this month + const { count: remindersSentThisMonth } = await supabaseAdmin + .from('event_reminder_logs') + .select('*', { count: 'exact', head: true }) + .gte('sent_at', startOfMonth.toISOString()); + + // Get unique events with reminders + const { data: uniqueEvents } = await supabaseAdmin + .from('event_reminder_logs') + .select('event_id') + .limit(10000); + + const uniqueEventIds = new Set((uniqueEvents || []).map(e => e.event_id)); + + return { + totalRemindersSent: totalRemindersSent || 0, + remindersSentThisMonth: remindersSentThisMonth || 0, + eventsWithReminders: uniqueEventIds.size + }; +} diff --git a/src/lib/server/ical.ts b/src/lib/server/ical.ts new file mode 100644 index 0000000..44a4c7a --- /dev/null +++ b/src/lib/server/ical.ts @@ -0,0 +1,299 @@ +/** + * iCal Calendar Generation Utilities + * Generate .ics files for events and calendar feeds + */ + +export interface ICalEvent { + id: string; + title: string; + description?: string; + start_datetime: string; + end_datetime: string; + location?: string | null; + location_url?: string | null; + timezone?: string; + status?: 'published' | 'cancelled' | 'draft'; + event_type_name?: string | null; + organizer_name?: string; + organizer_email?: string; + url?: string; + all_day?: boolean; +} + +/** + * Escape special characters for iCal format + */ +function escapeICalText(text: string): string { + return text + .replace(/\\/g, '\\\\') + .replace(/;/g, '\\;') + .replace(/,/g, '\\,') + .replace(/\n/g, '\\n') + .replace(/\r/g, ''); +} + +/** + * Format a date for iCal (YYYYMMDDTHHMMSSZ format for UTC) + */ +function formatICalDate(dateStr: string, timezone?: string): string { + const date = new Date(dateStr); + // Format as UTC + const year = date.getUTCFullYear(); + const month = String(date.getUTCMonth() + 1).padStart(2, '0'); + const day = String(date.getUTCDate()).padStart(2, '0'); + const hours = String(date.getUTCHours()).padStart(2, '0'); + const minutes = String(date.getUTCMinutes()).padStart(2, '0'); + const seconds = String(date.getUTCSeconds()).padStart(2, '0'); + return `${year}${month}${day}T${hours}${minutes}${seconds}Z`; +} + +/** + * Format a date for all-day events (YYYYMMDD format) + */ +function formatICalDateOnly(dateStr: string): string { + const date = new Date(dateStr); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}${month}${day}`; +} + +/** + * Map event status to iCal status + */ +function getICalStatus(status?: string): string { + switch (status) { + case 'cancelled': + return 'CANCELLED'; + case 'draft': + return 'TENTATIVE'; + default: + return 'CONFIRMED'; + } +} + +/** + * Fold long lines according to iCal spec (max 75 chars per line) + */ +function foldLine(line: string): string { + const maxLength = 75; + if (line.length <= maxLength) { + return line; + } + + const result: string[] = []; + let remaining = line; + + // First line can be full length + result.push(remaining.substring(0, maxLength)); + remaining = remaining.substring(maxLength); + + // Continuation lines start with a space and have maxLength-1 content + while (remaining.length > 0) { + result.push(' ' + remaining.substring(0, maxLength - 1)); + remaining = remaining.substring(maxLength - 1); + } + + return result.join('\r\n'); +} + +/** + * Generate a single iCal event entry + */ +export function generateICalEvent(event: ICalEvent, baseUrl: string = 'https://monacousa.org'): string { + const uid = `${event.id}@monacousa.org`; + const dtstamp = formatICalDate(new Date().toISOString()); + const created = dtstamp; + const lastModified = dtstamp; + + const lines: string[] = [ + 'BEGIN:VEVENT', + `UID:${uid}`, + `DTSTAMP:${dtstamp}`, + `CREATED:${created}`, + `LAST-MODIFIED:${lastModified}` + ]; + + // Date/time + if (event.all_day) { + lines.push(`DTSTART;VALUE=DATE:${formatICalDateOnly(event.start_datetime)}`); + // For all-day events, end date is exclusive, so add one day + const endDate = new Date(event.end_datetime); + endDate.setDate(endDate.getDate() + 1); + lines.push(`DTEND;VALUE=DATE:${formatICalDateOnly(endDate.toISOString())}`); + } else { + lines.push(`DTSTART:${formatICalDate(event.start_datetime, event.timezone)}`); + lines.push(`DTEND:${formatICalDate(event.end_datetime, event.timezone)}`); + } + + // Summary (title) + lines.push(foldLine(`SUMMARY:${escapeICalText(event.title)}`)); + + // Description + if (event.description) { + lines.push(foldLine(`DESCRIPTION:${escapeICalText(event.description)}`)); + } + + // Location + if (event.location) { + lines.push(foldLine(`LOCATION:${escapeICalText(event.location)}`)); + } + + // URL + const eventUrl = event.url || `${baseUrl}/events/${event.id}`; + lines.push(`URL:${eventUrl}`); + + // Status + lines.push(`STATUS:${getICalStatus(event.status)}`); + + // Categories + if (event.event_type_name) { + lines.push(`CATEGORIES:${escapeICalText(event.event_type_name)}`); + } + + // Organizer + if (event.organizer_email) { + const organizerName = event.organizer_name || 'Monaco USA'; + lines.push(`ORGANIZER;CN=${escapeICalText(organizerName)}:mailto:${event.organizer_email}`); + } + + // Sequence (for updates) + lines.push('SEQUENCE:0'); + + lines.push('END:VEVENT'); + + return lines.join('\r\n'); +} + +/** + * Generate a complete iCal calendar file for a single event + */ +export function generateSingleEventIcal(event: ICalEvent, baseUrl: string = 'https://monacousa.org'): string { + const lines = [ + 'BEGIN:VCALENDAR', + 'VERSION:2.0', + 'PRODID:-//Monaco USA//Event Calendar//EN', + 'CALSCALE:GREGORIAN', + 'METHOD:PUBLISH', + `X-WR-CALNAME:${escapeICalText(event.title)}`, + 'X-WR-TIMEZONE:Europe/Monaco', + generateICalEvent(event, baseUrl), + 'END:VCALENDAR' + ]; + + return lines.join('\r\n') + '\r\n'; +} + +/** + * Generate a complete iCal calendar feed for multiple events + */ +export function generateCalendarFeed( + events: ICalEvent[], + calendarName: string = 'Monaco USA Events', + baseUrl: string = 'https://monacousa.org' +): string { + const lines = [ + 'BEGIN:VCALENDAR', + 'VERSION:2.0', + 'PRODID:-//Monaco USA//Event Calendar//EN', + 'CALSCALE:GREGORIAN', + 'METHOD:PUBLISH', + `X-WR-CALNAME:${escapeICalText(calendarName)}`, + 'X-WR-TIMEZONE:Europe/Monaco', + // Refresh interval hint (1 hour) + 'REFRESH-INTERVAL;VALUE=DURATION:PT1H', + 'X-PUBLISHED-TTL:PT1H' + ]; + + // Add each event + for (const event of events) { + lines.push(generateICalEvent(event, baseUrl)); + } + + lines.push('END:VCALENDAR'); + + return lines.join('\r\n') + '\r\n'; +} + +/** + * Generate a Google Calendar URL for an event + */ +export function generateGoogleCalendarUrl(event: ICalEvent, baseUrl: string = 'https://monacousa.org'): string { + const start = new Date(event.start_datetime); + const end = new Date(event.end_datetime); + + // Format: YYYYMMDDTHHMMSSZ + const formatGoogleDate = (date: Date) => { + return date.toISOString().replace(/[-:]/g, '').replace(/\.\d{3}/, ''); + }; + + const params = new URLSearchParams({ + action: 'TEMPLATE', + text: event.title, + dates: `${formatGoogleDate(start)}/${formatGoogleDate(end)}`, + details: event.description || '', + location: event.location || '', + sprop: `website:${baseUrl}`, + sf: 'true', + output: 'xml' + }); + + return `https://www.google.com/calendar/render?${params.toString()}`; +} + +/** + * Generate an Outlook.com calendar URL for an event + */ +export function generateOutlookCalendarUrl(event: ICalEvent, baseUrl: string = 'https://monacousa.org'): string { + const start = new Date(event.start_datetime); + const end = new Date(event.end_datetime); + + // Outlook uses ISO format with URL encoding + const params = new URLSearchParams({ + rru: 'addevent', + startdt: start.toISOString(), + enddt: end.toISOString(), + subject: event.title, + body: event.description || '', + location: event.location || '', + path: '/calendar/action/compose' + }); + + return `https://outlook.live.com/calendar/0/deeplink/compose?${params.toString()}`; +} + +/** + * Generate a Yahoo Calendar URL for an event + */ +export function generateYahooCalendarUrl(event: ICalEvent): string { + const start = new Date(event.start_datetime); + const end = new Date(event.end_datetime); + + // Duration in hours and minutes + const durationMs = end.getTime() - start.getTime(); + const hours = Math.floor(durationMs / (1000 * 60 * 60)); + const minutes = Math.floor((durationMs % (1000 * 60 * 60)) / (1000 * 60)); + const duration = `${String(hours).padStart(2, '0')}${String(minutes).padStart(2, '0')}`; + + // Format: YYYYMMDDTHHMMSS + const formatYahooDate = (date: Date) => { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const h = String(date.getHours()).padStart(2, '0'); + const m = String(date.getMinutes()).padStart(2, '0'); + const s = String(date.getSeconds()).padStart(2, '0'); + return `${year}${month}${day}T${h}${m}${s}`; + }; + + const params = new URLSearchParams({ + v: '60', + title: event.title, + st: formatYahooDate(start), + dur: duration, + desc: event.description || '', + in_loc: event.location || '' + }); + + return `https://calendar.yahoo.com/?${params.toString()}`; +} diff --git a/src/lib/server/poste.ts b/src/lib/server/poste.ts new file mode 100644 index 0000000..509c135 --- /dev/null +++ b/src/lib/server/poste.ts @@ -0,0 +1,303 @@ +/** + * Poste.io Mail Server API Client + * Documentation: https://mail.monacousa.org/admin/api/doc + */ + +export interface PosteConfig { + host: string; + adminEmail: string; + adminPassword: string; +} + +export interface Mailbox { + address: string; + name: string; + disabled: boolean; + super_admin: boolean; + created?: string; + storage_limit?: number; + storage_usage?: number; +} + +export interface MailboxQuota { + storageLimit: number; + storageUsed: number; +} + +interface ApiResponse { + success: boolean; + data?: T; + error?: string; +} + +/** + * Make an authenticated request to the Poste API + */ +async function makeRequest( + config: PosteConfig, + method: string, + endpoint: string, + body?: Record +): Promise> { + const baseUrl = `https://${config.host}/admin/api/v1`; + const auth = Buffer.from(`${config.adminEmail}:${config.adminPassword}`).toString('base64'); + + try { + const response = await fetch(`${baseUrl}${endpoint}`, { + method, + headers: { + 'Authorization': `Basic ${auth}`, + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, + body: body ? JSON.stringify(body) : undefined + }); + + if (!response.ok) { + const errorText = await response.text(); + let errorMessage = `HTTP ${response.status}`; + try { + const errorJson = JSON.parse(errorText); + errorMessage = errorJson.message || errorJson.error || errorMessage; + } catch { + errorMessage = errorText || errorMessage; + } + return { success: false, error: errorMessage }; + } + + // Handle empty responses (e.g., DELETE) + const text = await response.text(); + if (!text) { + return { success: true }; + } + + const data = JSON.parse(text) as T; + return { success: true, data }; + } catch (error) { + const message = error instanceof Error ? error.message : 'Unknown error'; + return { success: false, error: message }; + } +} + +/** + * Test connection to the Poste API + */ +export async function testConnection(config: PosteConfig): Promise<{ success: boolean; error?: string }> { + const result = await makeRequest<{ results: unknown[] }>(config, 'GET', '/domains'); + if (!result.success) { + return { success: false, error: result.error }; + } + return { success: true }; +} + +/** + * List all mailboxes + */ +export async function listMailboxes( + config: PosteConfig, + options?: { query?: string; page?: number; limit?: number } +): Promise<{ success: boolean; mailboxes?: Mailbox[]; total?: number; error?: string }> { + let endpoint = '/boxes'; + const params = new URLSearchParams(); + + if (options?.query) params.set('query', options.query); + if (options?.page) params.set('page', options.page.toString()); + if (options?.limit) params.set('paging', options.limit.toString()); + + const queryString = params.toString(); + if (queryString) endpoint += `?${queryString}`; + + const result = await makeRequest<{ results: Mailbox[]; results_count: number }>( + config, + 'GET', + endpoint + ); + + if (!result.success) { + return { success: false, error: result.error }; + } + + return { + success: true, + mailboxes: result.data?.results || [], + total: result.data?.results_count || 0 + }; +} + +/** + * Get a single mailbox + */ +export async function getMailbox( + config: PosteConfig, + email: string +): Promise<{ success: boolean; mailbox?: Mailbox; error?: string }> { + const result = await makeRequest(config, 'GET', `/boxes/${encodeURIComponent(email)}`); + + if (!result.success) { + return { success: false, error: result.error }; + } + + return { success: true, mailbox: result.data }; +} + +/** + * Create a new mailbox + */ +export async function createMailbox( + config: PosteConfig, + options: { + email: string; + name: string; + password: string; + disabled?: boolean; + superAdmin?: boolean; + } +): Promise<{ success: boolean; error?: string }> { + const result = await makeRequest(config, 'POST', '/boxes', { + email: options.email, + name: options.name, + passwordPlaintext: options.password, + disabled: options.disabled ?? false, + superAdmin: options.superAdmin ?? false + }); + + if (!result.success) { + return { success: false, error: result.error }; + } + + return { success: true }; +} + +/** + * Update a mailbox + */ +export async function updateMailbox( + config: PosteConfig, + email: string, + updates: { + name?: string; + password?: string; + disabled?: boolean; + superAdmin?: boolean; + } +): Promise<{ success: boolean; error?: string }> { + const body: Record = {}; + + if (updates.name !== undefined) body.name = updates.name; + if (updates.password !== undefined) body.passwordPlaintext = updates.password; + if (updates.disabled !== undefined) body.disabled = updates.disabled; + if (updates.superAdmin !== undefined) body.superAdmin = updates.superAdmin; + + const result = await makeRequest( + config, + 'PATCH', + `/boxes/${encodeURIComponent(email)}`, + body + ); + + if (!result.success) { + return { success: false, error: result.error }; + } + + return { success: true }; +} + +/** + * Delete a mailbox + */ +export async function deleteMailbox( + config: PosteConfig, + email: string +): Promise<{ success: boolean; error?: string }> { + const result = await makeRequest( + config, + 'DELETE', + `/boxes/${encodeURIComponent(email)}` + ); + + if (!result.success) { + return { success: false, error: result.error }; + } + + return { success: true }; +} + +/** + * Get mailbox storage quota + */ +export async function getMailboxQuota( + config: PosteConfig, + email: string +): Promise<{ success: boolean; quota?: MailboxQuota; error?: string }> { + const result = await makeRequest<{ storageLimit: number; storageUsed: number }>( + config, + 'GET', + `/boxes/${encodeURIComponent(email)}/quota` + ); + + if (!result.success) { + return { success: false, error: result.error }; + } + + return { + success: true, + quota: { + storageLimit: result.data?.storageLimit || 0, + storageUsed: result.data?.storageUsed || 0 + } + }; +} + +/** + * Set mailbox storage quota + */ +export async function setMailboxQuota( + config: PosteConfig, + email: string, + storageLimitMB: number +): Promise<{ success: boolean; error?: string }> { + const result = await makeRequest( + config, + 'PATCH', + `/boxes/${encodeURIComponent(email)}/quota`, + { storageLimit: storageLimitMB } + ); + + if (!result.success) { + return { success: false, error: result.error }; + } + + return { success: true }; +} + +/** + * List all domains + */ +export async function listDomains( + config: PosteConfig +): Promise<{ success: boolean; domains?: string[]; error?: string }> { + const result = await makeRequest<{ results: { name: string }[] }>(config, 'GET', '/domains'); + + if (!result.success) { + return { success: false, error: result.error }; + } + + return { + success: true, + domains: result.data?.results?.map(d => d.name) || [] + }; +} + +/** + * Generate a random password + */ +export function generatePassword(length = 16): string { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*'; + let password = ''; + const randomValues = new Uint32Array(length); + crypto.getRandomValues(randomValues); + for (let i = 0; i < length; i++) { + password += chars[randomValues[i] % chars.length]; + } + return password; +} diff --git a/src/lib/server/storage.ts b/src/lib/server/storage.ts new file mode 100644 index 0000000..ce7d7d1 --- /dev/null +++ b/src/lib/server/storage.ts @@ -0,0 +1,901 @@ +import { supabaseAdmin } from './supabase'; +import { PUBLIC_SUPABASE_URL } from '$env/static/public'; +import { + S3Client, + PutObjectCommand, + GetObjectCommand, + DeleteObjectCommand, + DeleteObjectsCommand, + ListObjectsV2Command, + HeadBucketCommand +} from '@aws-sdk/client-s3'; +import { getSignedUrl as getS3SignedUrl } from '@aws-sdk/s3-request-presigner'; + +export type StorageBucket = 'documents' | 'avatars' | 'event-images'; + +/** + * Generate a browser-accessible public URL for Supabase Storage + * This uses PUBLIC_SUPABASE_URL instead of the internal Docker URL + */ +function getBrowserAccessibleUrl(bucket: StorageBucket, path: string): string { + return `${PUBLIC_SUPABASE_URL}/storage/v1/object/public/${bucket}/${path}`; +} + +export interface UploadResult { + success: boolean; + path?: string; + publicUrl?: string; + localUrl?: string; + s3Url?: string; + error?: string; +} + +export interface S3Config { + endpoint: string; + bucket: string; + accessKey: string; + secretKey: string; + region: string; + useSSL: boolean; + forcePathStyle: boolean; + enabled: boolean; +} + +let s3ClientCache: S3Client | null = null; +let s3ConfigCache: S3Config | null = null; +let s3ConfigCacheTime: number = 0; +const S3_CONFIG_CACHE_TTL = 60000; // 1 minute cache + +/** + * Get S3 configuration from app_settings table + */ +export async function getS3Config(): Promise { + // Check cache + if (s3ConfigCache && Date.now() - s3ConfigCacheTime < S3_CONFIG_CACHE_TTL) { + return s3ConfigCache; + } + + const { data: settings } = await supabaseAdmin + .from('app_settings') + .select('setting_key, setting_value') + .eq('category', 'storage'); + + if (!settings || settings.length === 0) { + return null; + } + + const config: Record = {}; + for (const s of settings) { + let value = s.setting_value; + if (typeof value === 'string') { + // Remove surrounding quotes if present (from JSON stringified values) + value = value.replace(/^"|"$/g, ''); + } + config[s.setting_key] = value; + } + + // Check if S3 is enabled - handle both boolean true and string 'true' + const isEnabled = config.s3_enabled === true || config.s3_enabled === 'true'; + + // Check if S3 is enabled and configured + if (!isEnabled || !config.s3_endpoint || !config.s3_access_key || !config.s3_secret_key) { + console.log('S3 config check failed:', { + isEnabled, + hasEndpoint: !!config.s3_endpoint, + hasAccessKey: !!config.s3_access_key, + hasSecretKey: !!config.s3_secret_key + }); + return null; + } + + s3ConfigCache = { + endpoint: config.s3_endpoint, + bucket: config.s3_bucket || 'monacousa-documents', + accessKey: config.s3_access_key, + secretKey: config.s3_secret_key, + region: config.s3_region || 'us-east-1', + useSSL: config.s3_use_ssl === true || config.s3_use_ssl === 'true', + forcePathStyle: config.s3_force_path_style === true || config.s3_force_path_style === 'true' || config.s3_force_path_style === undefined, + enabled: true + }; + s3ConfigCacheTime = Date.now(); + + return s3ConfigCache; +} + +/** + * Get or create S3 client + */ +export async function getS3Client(): Promise { + const config = await getS3Config(); + if (!config) { + return null; + } + + // Return cached client if config hasn't changed + if (s3ClientCache && s3ConfigCache) { + return s3ClientCache; + } + + s3ClientCache = new S3Client({ + endpoint: config.endpoint, + region: config.region, + credentials: { + accessKeyId: config.accessKey, + secretAccessKey: config.secretKey + }, + forcePathStyle: config.forcePathStyle + }); + + return s3ClientCache; +} + +/** + * Clear S3 client cache (call when settings change) + */ +export function clearS3ClientCache(): void { + s3ClientCache = null; + s3ConfigCache = null; + s3ConfigCacheTime = 0; +} + +/** + * Test S3 connection + */ +export async function testS3Connection(): Promise<{ success: boolean; error?: string }> { + const config = await getS3Config(); + if (!config) { + return { success: false, error: 'S3 not configured. Please configure and enable S3 storage settings first.' }; + } + + const client = await getS3Client(); + if (!client) { + return { success: false, error: 'Failed to create S3 client' }; + } + + try { + await client.send(new HeadBucketCommand({ Bucket: config.bucket })); + return { success: true }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + console.error('S3 connection test error:', error); + return { success: false, error: `S3 connection failed: ${errorMessage}` }; + } +} + +/** + * Check if S3 storage is enabled + */ +export async function isS3Enabled(): Promise { + const config = await getS3Config(); + return config !== null && config.enabled; +} + +/** + * Get the S3 key with bucket prefix for organization + */ +function getS3Key(bucket: StorageBucket, path: string): string { + return `${bucket}/${path}`; +} + +/** + * Upload a file to S3 + */ +async function uploadToS3( + bucket: StorageBucket, + path: string, + file: File | ArrayBuffer | Buffer, + options?: { + contentType?: string; + } +): Promise { + const config = await getS3Config(); + const client = await getS3Client(); + + if (!config || !client) { + return { success: false, error: 'S3 not configured' }; + } + + try { + const key = getS3Key(bucket, path); + let body: Buffer; + + if (file instanceof ArrayBuffer) { + body = Buffer.from(file); + } else if (Buffer.isBuffer(file)) { + body = file; + } else { + // It's a File object + body = Buffer.from(await file.arrayBuffer()); + } + + await client.send( + new PutObjectCommand({ + Bucket: config.bucket, + Key: key, + Body: body, + ContentType: options?.contentType + }) + ); + + // Construct public URL + const protocol = config.useSSL ? 'https' : 'http'; + let publicUrl: string; + if (config.forcePathStyle) { + publicUrl = `${config.endpoint}/${config.bucket}/${key}`; + } else { + publicUrl = `${protocol}://${config.bucket}.${new URL(config.endpoint).host}/${key}`; + } + + return { + success: true, + path: key, + publicUrl + }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + console.error('S3 upload error:', error); + return { success: false, error: errorMessage }; + } +} + +/** + * Get a signed URL from S3 + */ +async function getS3PresignedUrl( + bucket: StorageBucket, + path: string, + expiresIn: number = 3600 +): Promise<{ url: string | null; error: string | null }> { + const config = await getS3Config(); + const client = await getS3Client(); + + if (!config || !client) { + return { url: null, error: 'S3 not configured' }; + } + + try { + const key = getS3Key(bucket, path); + const command = new GetObjectCommand({ + Bucket: config.bucket, + Key: key + }); + + const url = await getS3SignedUrl(client, command, { expiresIn }); + return { url, error: null }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + console.error('S3 signed URL error:', error); + return { url: null, error: errorMessage }; + } +} + +/** + * Delete a file from S3 + */ +async function deleteFromS3( + bucket: StorageBucket, + path: string +): Promise<{ success: boolean; error?: string }> { + const config = await getS3Config(); + const client = await getS3Client(); + + if (!config || !client) { + return { success: false, error: 'S3 not configured' }; + } + + try { + const key = getS3Key(bucket, path); + await client.send( + new DeleteObjectCommand({ + Bucket: config.bucket, + Key: key + }) + ); + return { success: true }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + console.error('S3 delete error:', error); + return { success: false, error: errorMessage }; + } +} + +/** + * Delete multiple files from S3 + */ +async function deleteMultipleFromS3( + bucket: StorageBucket, + paths: string[] +): Promise<{ success: boolean; error?: string }> { + const config = await getS3Config(); + const client = await getS3Client(); + + if (!config || !client) { + return { success: false, error: 'S3 not configured' }; + } + + try { + const objects = paths.map((p) => ({ Key: getS3Key(bucket, p) })); + await client.send( + new DeleteObjectsCommand({ + Bucket: config.bucket, + Delete: { Objects: objects } + }) + ); + return { success: true }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + console.error('S3 delete multiple error:', error); + return { success: false, error: errorMessage }; + } +} + +/** + * List files from S3 + */ +async function listFilesFromS3( + bucket: StorageBucket, + folder?: string, + options?: { + limit?: number; + } +): Promise<{ files: any[]; error: string | null }> { + const config = await getS3Config(); + const client = await getS3Client(); + + if (!config || !client) { + return { files: [], error: 'S3 not configured' }; + } + + try { + const prefix = folder ? `${bucket}/${folder}/` : `${bucket}/`; + const response = await client.send( + new ListObjectsV2Command({ + Bucket: config.bucket, + Prefix: prefix, + MaxKeys: options?.limit || 100 + }) + ); + + const files = (response.Contents || []).map((obj) => ({ + name: obj.Key?.replace(prefix, '') || '', + size: obj.Size, + updated_at: obj.LastModified?.toISOString(), + created_at: obj.LastModified?.toISOString() + })); + + return { files, error: null }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + console.error('S3 list error:', error); + return { files: [], error: errorMessage }; + } +} + +// =========================================== +// PUBLIC API - Uses S3 or Supabase based on settings +// =========================================== + +/** + * Upload a file to storage (S3 or Supabase) + */ +export async function uploadFile( + bucket: StorageBucket, + path: string, + file: File | ArrayBuffer, + options?: { + contentType?: string; + cacheControl?: string; + upsert?: boolean; + } +): Promise { + // Check if S3 is enabled + if (await isS3Enabled()) { + return uploadToS3(bucket, path, file, options); + } + + // Fall back to Supabase Storage + try { + const { data, error } = await supabaseAdmin.storage.from(bucket).upload(path, file, { + contentType: options?.contentType, + cacheControl: options?.cacheControl || '3600', + upsert: options?.upsert || false + }); + + if (error) { + console.error('Storage upload error:', error); + return { success: false, error: error.message }; + } + + // Generate browser-accessible public URL (not the internal Docker URL) + const publicUrl = getBrowserAccessibleUrl(bucket, path); + + return { + success: true, + path: data.path, + publicUrl + }; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + console.error('Storage upload exception:', error); + return { success: false, error: errorMessage }; + } +} + +/** + * Get the public URL for a file in storage + */ +export async function getPublicUrl(bucket: StorageBucket, path: string): Promise { + // Check if S3 is enabled + if (await isS3Enabled()) { + const config = await getS3Config(); + if (config) { + const key = getS3Key(bucket, path); + if (config.forcePathStyle) { + return `${config.endpoint}/${config.bucket}/${key}`; + } + const protocol = config.useSSL ? 'https' : 'http'; + return `${protocol}://${config.bucket}.${new URL(config.endpoint).host}/${key}`; + } + } + + // Fall back to Supabase Storage - use browser-accessible URL + return getBrowserAccessibleUrl(bucket, path); +} + +/** + * Get a signed URL for private file access + */ +export async function getSignedUrl( + bucket: StorageBucket, + path: string, + expiresIn: number = 3600 +): Promise<{ url: string | null; error: string | null }> { + // Check if S3 is enabled + if (await isS3Enabled()) { + return getS3PresignedUrl(bucket, path, expiresIn); + } + + // Fall back to Supabase Storage + const { data, error } = await supabaseAdmin.storage + .from(bucket) + .createSignedUrl(path, expiresIn); + + if (error) { + return { url: null, error: error.message }; + } + + return { url: data.signedUrl, error: null }; +} + +/** + * Delete a file from storage + */ +export async function deleteFile( + bucket: StorageBucket, + path: string +): Promise<{ success: boolean; error?: string }> { + // Check if S3 is enabled + if (await isS3Enabled()) { + return deleteFromS3(bucket, path); + } + + // Fall back to Supabase Storage + const { error } = await supabaseAdmin.storage.from(bucket).remove([path]); + + if (error) { + console.error('Storage delete error:', error); + return { success: false, error: error.message }; + } + + return { success: true }; +} + +/** + * Delete multiple files from storage + */ +export async function deleteFiles( + bucket: StorageBucket, + paths: string[] +): Promise<{ success: boolean; error?: string }> { + // Check if S3 is enabled + if (await isS3Enabled()) { + return deleteMultipleFromS3(bucket, paths); + } + + // Fall back to Supabase Storage + const { error } = await supabaseAdmin.storage.from(bucket).remove(paths); + + if (error) { + console.error('Storage delete error:', error); + return { success: false, error: error.message }; + } + + return { success: true }; +} + +/** + * List files in a bucket/folder + */ +export async function listFiles( + bucket: StorageBucket, + folder?: string, + options?: { + limit?: number; + offset?: number; + sortBy?: { column: string; order: 'asc' | 'desc' }; + } +): Promise<{ files: any[]; error: string | null }> { + // Check if S3 is enabled + if (await isS3Enabled()) { + return listFilesFromS3(bucket, folder, options); + } + + // Fall back to Supabase Storage + const { data, error } = await supabaseAdmin.storage.from(bucket).list(folder || '', { + limit: options?.limit || 100, + offset: options?.offset || 0, + sortBy: options?.sortBy || { column: 'created_at', order: 'desc' } + }); + + if (error) { + return { files: [], error: error.message }; + } + + return { files: data || [], error: null }; +} + +/** + * Generate a unique filename with timestamp + */ +export function generateUniqueFilename(originalName: string): string { + const timestamp = Date.now(); + const randomStr = Math.random().toString(36).substring(2, 8); + const safeName = originalName.replace(/[^a-zA-Z0-9.-]/g, '_').substring(0, 50); + const ext = safeName.split('.').pop() || ''; + const nameWithoutExt = safeName.replace(`.${ext}`, ''); + return `${timestamp}-${randomStr}-${nameWithoutExt}.${ext}`; +} + +/** + * Upload an avatar image for a member + * Returns both S3 and local URLs for storage flexibility + */ +export async function uploadAvatar( + memberId: string, + file: File, + userSupabase?: ReturnType +): Promise { + // Validate file type + const allowedTypes = ['image/jpeg', 'image/png', 'image/webp', 'image/gif']; + if (!allowedTypes.includes(file.type)) { + return { success: false, error: 'Invalid image type. Allowed: JPEG, PNG, WebP, GIF' }; + } + + // Validate file size (max 5MB) + const maxSize = 5 * 1024 * 1024; + if (file.size > maxSize) { + return { success: false, error: 'Image size must be less than 5MB' }; + } + + // Generate path - memberId must match auth.uid() for RLS + const ext = file.name.split('.').pop() || 'jpg'; + const path = `${memberId}/avatar.${ext}`; + + // Convert to ArrayBuffer + const arrayBuffer = await file.arrayBuffer(); + + // Check if S3 is enabled + const s3Enabled = await isS3Enabled(); + + // Result object + const result: UploadResult = { + success: false, + path + }; + + // Upload to S3 if enabled + if (s3Enabled) { + const s3Result = await uploadToS3('avatars', path, arrayBuffer, { + contentType: file.type + }); + + if (!s3Result.success) { + return s3Result; + } + + result.s3Url = s3Result.publicUrl; + result.publicUrl = s3Result.publicUrl; + result.success = true; + } + + // Always upload to Supabase Storage as well (for fallback) + try { + // First try to delete existing avatar (ignore errors) + await supabaseAdmin.storage.from('avatars').remove([path]); + + const { data, error } = await supabaseAdmin.storage.from('avatars').upload(path, arrayBuffer, { + contentType: file.type, + cacheControl: '3600', + upsert: true + }); + + if (error) { + // If S3 succeeded, this is okay - just log + if (result.success) { + console.warn('Local storage upload failed (S3 succeeded):', error); + } else { + console.error('Avatar upload error:', error); + return { success: false, error: error.message }; + } + } else { + // Generate browser-accessible public URL (not the internal Docker URL) + result.localUrl = getBrowserAccessibleUrl('avatars', path); + + // If S3 is not enabled, use local URL as the public URL + if (!s3Enabled) { + result.publicUrl = result.localUrl; + result.success = true; + } + } + } catch (error) { + // If S3 succeeded, this is okay + if (!result.success) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + console.error('Avatar upload exception:', error); + return { success: false, error: errorMessage }; + } + } + + return result; +} + +/** + * Delete a member's avatar from ALL storage backends + * Always attempts to delete from both S3 and Supabase Storage + */ +export async function deleteAvatar( + memberId: string, + avatarPath?: string +): Promise<{ success: boolean; error?: string }> { + // If we have a specific path, use it; otherwise try common extensions + let paths: string[]; + if (avatarPath) { + paths = [avatarPath]; + } else { + const extensions = ['jpg', 'jpeg', 'png', 'webp', 'gif']; + paths = extensions.map((ext) => `${memberId}/avatar.${ext}`); + } + + const errors: string[] = []; + + // Always try to delete from S3 (in case it was uploaded when S3 was enabled) + try { + const s3Config = await getS3Config(); + if (s3Config) { + const result = await deleteMultipleFromS3('avatars', paths); + if (!result.success && result.error) { + console.warn('S3 avatar delete warning:', result.error); + } + } + } catch (error) { + console.warn('S3 avatar delete error (non-critical):', error); + } + + // Always try to delete from Supabase Storage + try { + await supabaseAdmin.storage.from('avatars').remove(paths); + } catch (error) { + console.warn('Local storage avatar delete error (non-critical):', error); + } + + return { success: true }; +} + +/** + * Get the appropriate avatar URL based on current storage settings + * Useful for getting the right URL when storage setting is toggled + */ +export async function getActiveAvatarUrl(member: { + avatar_url_s3?: string | null; + avatar_url_local?: string | null; + avatar_url?: string | null; +}): Promise { + // Check if S3 is enabled + if (await isS3Enabled()) { + return member.avatar_url_s3 || member.avatar_url || null; + } + return member.avatar_url_local || member.avatar_url || null; +} + +/** + * Upload a document to storage + * Returns both S3 and local URLs for storage flexibility (same pattern as avatars) + */ +export async function uploadDocument( + file: File, + options?: { + folder?: string; + } +): Promise { + // Validate file type + const allowedTypes = [ + 'application/pdf', + 'application/msword', + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'application/vnd.ms-excel', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'application/vnd.ms-powerpoint', + 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'text/plain', + 'text/csv', + 'application/json', + 'image/jpeg', + 'image/png', + 'image/webp', + 'image/gif' + ]; + + if (!allowedTypes.includes(file.type)) { + return { + success: false, + error: + 'File type not allowed. Supported: PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT, CSV, JSON, JPG, PNG, WebP, GIF' + }; + } + + // Validate file size (max 50MB) + const maxSize = 50 * 1024 * 1024; + if (file.size > maxSize) { + return { success: false, error: 'File size must be less than 50MB' }; + } + + // Generate unique storage path + const timestamp = Date.now(); + const randomStr = Math.random().toString(36).substring(2, 8); + const safeName = file.name.replace(/[^a-zA-Z0-9.-]/g, '_').substring(0, 50); + const path = options?.folder ? `${options.folder}/${timestamp}-${randomStr}-${safeName}` : `${timestamp}-${randomStr}-${safeName}`; + + // Convert to ArrayBuffer + const arrayBuffer = await file.arrayBuffer(); + + // Check if S3 is enabled + const s3Enabled = await isS3Enabled(); + + // Result object + const result: UploadResult = { + success: false, + path + }; + + // Upload to S3 if enabled + if (s3Enabled) { + const s3Result = await uploadToS3('documents', path, arrayBuffer, { + contentType: file.type + }); + + if (!s3Result.success) { + return s3Result; + } + + result.s3Url = s3Result.publicUrl; + result.publicUrl = s3Result.publicUrl; + result.success = true; + } + + // Always upload to Supabase Storage as well (for fallback) + try { + const { data, error } = await supabaseAdmin.storage.from('documents').upload(path, arrayBuffer, { + contentType: file.type, + cacheControl: '3600', + upsert: false + }); + + if (error) { + // If S3 succeeded, this is okay - just log + if (result.success) { + console.warn('Local storage upload failed (S3 succeeded):', error); + } else { + console.error('Document upload error:', error); + return { success: false, error: error.message }; + } + } else { + // Generate browser-accessible public URL (not the internal Docker URL) + result.localUrl = getBrowserAccessibleUrl('documents', path); + + // If S3 is not enabled, use local URL as the public URL + if (!s3Enabled) { + result.publicUrl = result.localUrl; + result.success = true; + } + } + } catch (error) { + // If S3 succeeded, this is okay + if (!result.success) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + console.error('Document upload exception:', error); + return { success: false, error: errorMessage }; + } + } + + return result; +} + +/** + * Delete a document from ALL storage backends + * Always attempts to delete from both S3 and Supabase Storage + */ +export async function deleteDocument( + storagePath: string +): Promise<{ success: boolean; error?: string }> { + const errors: string[] = []; + + // Always try to delete from S3 (in case it was uploaded when S3 was enabled) + try { + const s3Config = await getS3Config(); + if (s3Config) { + const result = await deleteFromS3('documents', storagePath); + if (!result.success && result.error) { + console.warn('S3 document delete warning:', result.error); + } + } + } catch (error) { + console.warn('S3 document delete error (non-critical):', error); + } + + // Always try to delete from Supabase Storage + try { + await supabaseAdmin.storage.from('documents').remove([storagePath]); + } catch (error) { + console.warn('Local storage document delete error (non-critical):', error); + } + + return { success: true }; +} + +/** + * Get the appropriate document URL based on current storage settings + * Useful for getting the right URL when storage setting is toggled + */ +export async function getActiveDocumentUrl(document: { + file_url_s3?: string | null; + file_url_local?: string | null; + file_path?: string | null; +}): Promise { + // Check if S3 is enabled + if (await isS3Enabled()) { + return document.file_url_s3 || document.file_path || null; + } + return document.file_url_local || document.file_path || null; +} + +/** + * Upload an event cover image + */ +export async function uploadEventImage(eventId: string, file: File): Promise { + // Validate file type + const allowedTypes = ['image/jpeg', 'image/png', 'image/webp']; + if (!allowedTypes.includes(file.type)) { + return { success: false, error: 'Invalid image type. Allowed: JPEG, PNG, WebP' }; + } + + // Validate file size (max 10MB) + const maxSize = 10 * 1024 * 1024; + if (file.size > maxSize) { + return { success: false, error: 'Image size must be less than 10MB' }; + } + + // Generate path + const ext = file.name.split('.').pop() || 'jpg'; + const path = `${eventId}/cover.${ext}`; + + // Convert to ArrayBuffer + const arrayBuffer = await file.arrayBuffer(); + + // Upload with upsert to replace existing cover + return uploadFile('event-images', path, arrayBuffer, { + contentType: file.type, + cacheControl: '3600', + upsert: true + }); +} diff --git a/src/lib/server/supabase.ts b/src/lib/server/supabase.ts new file mode 100644 index 0000000..72136e1 --- /dev/null +++ b/src/lib/server/supabase.ts @@ -0,0 +1,42 @@ +import pkg from '@supabase/ssr'; +const { createServerClient } = pkg; +import { createClient as createSupabaseClient } from '@supabase/supabase-js'; +import { PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY } from '$env/static/public'; +import { SUPABASE_SERVICE_ROLE_KEY } from '$env/static/private'; +import { env } from '$env/dynamic/private'; +import type { Cookies } from '@sveltejs/kit'; +import type { Database } from '$lib/types/database'; + +// Use internal URL for server-side operations (Docker network), fallback to public URL +const SERVER_SUPABASE_URL = env.SUPABASE_INTERNAL_URL || PUBLIC_SUPABASE_URL; + +/** + * Create a Supabase client for server-side operations with cookie handling + */ +export function createSupabaseServerClient(cookies: Cookies) { + return createServerClient(SERVER_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY, { + cookies: { + getAll: () => cookies.getAll(), + setAll: (cookiesToSet) => { + cookiesToSet.forEach(({ name, value, options }) => { + cookies.set(name, value, { ...options, path: '/' }); + }); + } + } + }); +} + +/** + * Supabase Admin client with service role key + * Use this for administrative operations that bypass RLS + */ +export const supabaseAdmin = createSupabaseClient( + SERVER_SUPABASE_URL, + SUPABASE_SERVICE_ROLE_KEY, + { + auth: { + autoRefreshToken: false, + persistSession: false + } + } +); diff --git a/src/lib/supabase.ts b/src/lib/supabase.ts new file mode 100644 index 0000000..0d101a0 --- /dev/null +++ b/src/lib/supabase.ts @@ -0,0 +1,11 @@ +import pkg from '@supabase/ssr'; +const { createBrowserClient } = pkg; +import { PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY } from '$env/static/public'; +import type { Database } from './types/database'; + +/** + * Create a Supabase client for browser-side operations + */ +export function createClient() { + return createBrowserClient(PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY); +} diff --git a/src/lib/types/database.ts b/src/lib/types/database.ts new file mode 100644 index 0000000..6535339 --- /dev/null +++ b/src/lib/types/database.ts @@ -0,0 +1,806 @@ +/** + * Database Types for Monaco USA Portal 2026 + * Generated based on the architecture plan schema + */ + +export type Json = string | number | boolean | null | { [key: string]: Json | undefined } | Json[]; + +export type Database = { + public: { + Tables: { + members: { + Row: { + id: string; + member_id: string; + first_name: string; + last_name: string; + email: string; + phone: string; + date_of_birth: string; + address: string; + nationality: string[]; + role: 'member' | 'board' | 'admin'; + membership_status_id: string | null; + membership_type_id: string | null; + member_since: string; + avatar_url: string | null; + notes: string | null; + created_at: string; + updated_at: string; + }; + Insert: { + id: string; + member_id?: string; + first_name: string; + last_name: string; + email: string; + phone: string; + date_of_birth: string; + address: string; + nationality: string[]; + role?: 'member' | 'board' | 'admin'; + membership_status_id?: string | null; + membership_type_id?: string | null; + member_since?: string; + avatar_url?: string | null; + notes?: string | null; + created_at?: string; + updated_at?: string; + }; + Update: { + id?: string; + member_id?: string; + first_name?: string; + last_name?: string; + email?: string; + phone?: string; + date_of_birth?: string; + address?: string; + nationality?: string[]; + role?: 'member' | 'board' | 'admin'; + membership_status_id?: string | null; + membership_type_id?: string | null; + member_since?: string; + avatar_url?: string | null; + notes?: string | null; + created_at?: string; + updated_at?: string; + }; + }; + membership_statuses: { + Row: { + id: string; + name: string; + display_name: string; + color: string; + description: string | null; + is_default: boolean; + sort_order: number; + created_at: string; + }; + Insert: { + id?: string; + name: string; + display_name: string; + color?: string; + description?: string | null; + is_default?: boolean; + sort_order?: number; + created_at?: string; + }; + Update: { + id?: string; + name?: string; + display_name?: string; + color?: string; + description?: string | null; + is_default?: boolean; + sort_order?: number; + created_at?: string; + }; + }; + membership_types: { + Row: { + id: string; + name: string; + display_name: string; + annual_dues: number; + description: string | null; + is_default: boolean; + is_active: boolean; + sort_order: number; + created_at: string; + }; + Insert: { + id?: string; + name: string; + display_name: string; + annual_dues: number; + description?: string | null; + is_default?: boolean; + is_active?: boolean; + sort_order?: number; + created_at?: string; + }; + Update: { + id?: string; + name?: string; + display_name?: string; + annual_dues?: number; + description?: string | null; + is_default?: boolean; + is_active?: boolean; + sort_order?: number; + created_at?: string; + }; + }; + dues_payments: { + Row: { + id: string; + member_id: string; + amount: number; + currency: string; + payment_date: string; + due_date: string; + payment_method: string; + reference: string | null; + notes: string | null; + recorded_by: string; + created_at: string; + }; + Insert: { + id?: string; + member_id: string; + amount: number; + currency?: string; + payment_date: string; + due_date?: string; + payment_method?: string; + reference?: string | null; + notes?: string | null; + recorded_by: string; + created_at?: string; + }; + Update: { + id?: string; + member_id?: string; + amount?: number; + currency?: string; + payment_date?: string; + due_date?: string; + payment_method?: string; + reference?: string | null; + notes?: string | null; + recorded_by?: string; + created_at?: string; + }; + }; + events: { + Row: { + id: string; + title: string; + description: string | null; + event_type_id: string | null; + start_datetime: string; + end_datetime: string; + all_day: boolean; + timezone: string; + location: string | null; + location_url: string | null; + max_attendees: number | null; + max_guests_per_member: number; + is_paid: boolean; + member_price: number; + non_member_price: number; + pricing_notes: string | null; + visibility: 'public' | 'members' | 'board' | 'admin'; + status: 'draft' | 'published' | 'cancelled' | 'completed'; + cover_image_url: string | null; + created_by: string; + created_at: string; + updated_at: string; + }; + Insert: { + id?: string; + title: string; + description?: string | null; + event_type_id?: string | null; + start_datetime: string; + end_datetime: string; + all_day?: boolean; + timezone?: string; + location?: string | null; + location_url?: string | null; + max_attendees?: number | null; + max_guests_per_member?: number; + is_paid?: boolean; + member_price?: number; + non_member_price?: number; + pricing_notes?: string | null; + visibility?: 'public' | 'members' | 'board' | 'admin'; + status?: 'draft' | 'published' | 'cancelled' | 'completed'; + cover_image_url?: string | null; + created_by: string; + created_at?: string; + updated_at?: string; + }; + Update: { + id?: string; + title?: string; + description?: string | null; + event_type_id?: string | null; + start_datetime?: string; + end_datetime?: string; + all_day?: boolean; + timezone?: string; + location?: string | null; + location_url?: string | null; + max_attendees?: number | null; + max_guests_per_member?: number; + is_paid?: boolean; + member_price?: number; + non_member_price?: number; + pricing_notes?: string | null; + visibility?: 'public' | 'members' | 'board' | 'admin'; + status?: 'draft' | 'published' | 'cancelled' | 'completed'; + cover_image_url?: string | null; + created_by?: string; + created_at?: string; + updated_at?: string; + }; + }; + event_types: { + Row: { + id: string; + name: string; + display_name: string; + color: string; + icon: string | null; + description: string | null; + is_active: boolean; + sort_order: number; + created_at: string; + }; + Insert: { + id?: string; + name: string; + display_name: string; + color?: string; + icon?: string | null; + description?: string | null; + is_active?: boolean; + sort_order?: number; + created_at?: string; + }; + Update: { + id?: string; + name?: string; + display_name?: string; + color?: string; + icon?: string | null; + description?: string | null; + is_active?: boolean; + sort_order?: number; + created_at?: string; + }; + }; + event_rsvps: { + Row: { + id: string; + event_id: string; + member_id: string; + status: 'confirmed' | 'declined' | 'maybe' | 'waitlist' | 'cancelled'; + guest_count: number; + guest_names: string[] | null; + notes: string | null; + payment_status: 'not_required' | 'pending' | 'paid'; + payment_reference: string | null; + payment_amount: number | null; + attended: boolean; + checked_in_at: string | null; + checked_in_by: string | null; + created_at: string; + updated_at: string; + }; + Insert: { + id?: string; + event_id: string; + member_id: string; + status?: 'confirmed' | 'declined' | 'maybe' | 'waitlist' | 'cancelled'; + guest_count?: number; + guest_names?: string[] | null; + notes?: string | null; + payment_status?: 'not_required' | 'pending' | 'paid'; + payment_reference?: string | null; + payment_amount?: number | null; + attended?: boolean; + checked_in_at?: string | null; + checked_in_by?: string | null; + created_at?: string; + updated_at?: string; + }; + Update: { + id?: string; + event_id?: string; + member_id?: string; + status?: 'confirmed' | 'declined' | 'maybe' | 'waitlist' | 'cancelled'; + guest_count?: number; + guest_names?: string[] | null; + notes?: string | null; + payment_status?: 'not_required' | 'pending' | 'paid'; + payment_reference?: string | null; + payment_amount?: number | null; + attended?: boolean; + checked_in_at?: string | null; + checked_in_by?: string | null; + created_at?: string; + updated_at?: string; + }; + }; + event_rsvps_public: { + Row: { + id: string; + event_id: string; + full_name: string; + email: string; + phone: string | null; + status: 'confirmed' | 'declined' | 'maybe' | 'waitlist' | 'cancelled'; + guest_count: number; + guest_names: string[] | null; + payment_status: 'not_required' | 'pending' | 'paid'; + payment_reference: string | null; + payment_amount: number | null; + attended: boolean; + created_at: string; + updated_at: string; + }; + Insert: { + id?: string; + event_id: string; + full_name: string; + email: string; + phone?: string | null; + status?: 'confirmed' | 'declined' | 'maybe' | 'waitlist' | 'cancelled'; + guest_count?: number; + guest_names?: string[] | null; + payment_status?: 'not_required' | 'pending' | 'paid'; + payment_reference?: string | null; + payment_amount?: number | null; + attended?: boolean; + created_at?: string; + updated_at?: string; + }; + Update: { + id?: string; + event_id?: string; + full_name?: string; + email?: string; + phone?: string | null; + status?: 'confirmed' | 'declined' | 'maybe' | 'waitlist' | 'cancelled'; + guest_count?: number; + guest_names?: string[] | null; + payment_status?: 'not_required' | 'pending' | 'paid'; + payment_reference?: string | null; + payment_amount?: number | null; + attended?: boolean; + created_at?: string; + updated_at?: string; + }; + }; + documents: { + Row: { + id: string; + title: string; + description: string | null; + category_id: string | null; + file_path: string; + file_name: string; + file_size: number; + mime_type: string; + visibility: 'public' | 'members' | 'board' | 'admin'; + allowed_member_ids: string[] | null; + version: number; + replaces_document_id: string | null; + meeting_date: string | null; + meeting_attendees: string[] | null; + uploaded_by: string; + created_at: string; + updated_at: string; + }; + Insert: { + id?: string; + title: string; + description?: string | null; + category_id?: string | null; + file_path: string; + file_name: string; + file_size: number; + mime_type: string; + visibility?: 'public' | 'members' | 'board' | 'admin'; + allowed_member_ids?: string[] | null; + version?: number; + replaces_document_id?: string | null; + meeting_date?: string | null; + meeting_attendees?: string[] | null; + uploaded_by: string; + created_at?: string; + updated_at?: string; + }; + Update: { + id?: string; + title?: string; + description?: string | null; + category_id?: string | null; + file_path?: string; + file_name?: string; + file_size?: number; + mime_type?: string; + visibility?: 'public' | 'members' | 'board' | 'admin'; + allowed_member_ids?: string[] | null; + version?: number; + replaces_document_id?: string | null; + meeting_date?: string | null; + meeting_attendees?: string[] | null; + uploaded_by?: string; + created_at?: string; + updated_at?: string; + }; + }; + document_categories: { + Row: { + id: string; + name: string; + display_name: string; + description: string | null; + icon: string | null; + sort_order: number; + is_active: boolean; + created_at: string; + }; + Insert: { + id?: string; + name: string; + display_name: string; + description?: string | null; + icon?: string | null; + sort_order?: number; + is_active?: boolean; + created_at?: string; + }; + Update: { + id?: string; + name?: string; + display_name?: string; + description?: string | null; + icon?: string | null; + sort_order?: number; + is_active?: boolean; + created_at?: string; + }; + }; + app_settings: { + Row: { + id: string; + category: string; + setting_key: string; + setting_value: Json; + setting_type: 'text' | 'number' | 'boolean' | 'json' | 'array'; + display_name: string; + description: string | null; + is_public: boolean; + updated_at: string; + updated_by: string | null; + }; + Insert: { + id?: string; + category: string; + setting_key: string; + setting_value: Json; + setting_type?: 'text' | 'number' | 'boolean' | 'json' | 'array'; + display_name: string; + description?: string | null; + is_public?: boolean; + updated_at?: string; + updated_by?: string | null; + }; + Update: { + id?: string; + category?: string; + setting_key?: string; + setting_value?: Json; + setting_type?: 'text' | 'number' | 'boolean' | 'json' | 'array'; + display_name?: string; + description?: string | null; + is_public?: boolean; + updated_at?: string; + updated_by?: string | null; + }; + }; + email_templates: { + Row: { + id: string; + template_key: string; + template_name: string; + category: string; + subject: string; + body_html: string; + body_text: string | null; + is_active: boolean; + is_system: boolean; + variables_schema: Json | null; + preview_data: Json | null; + created_at: string; + updated_at: string; + updated_by: string | null; + }; + Insert: { + id?: string; + template_key: string; + template_name: string; + category: string; + subject: string; + body_html: string; + body_text?: string | null; + is_active?: boolean; + is_system?: boolean; + variables_schema?: Json | null; + preview_data?: Json | null; + created_at?: string; + updated_at?: string; + updated_by?: string | null; + }; + Update: { + id?: string; + template_key?: string; + template_name?: string; + category?: string; + subject?: string; + body_html?: string; + body_text?: string | null; + is_active?: boolean; + is_system?: boolean; + variables_schema?: Json | null; + preview_data?: Json | null; + created_at?: string; + updated_at?: string; + updated_by?: string | null; + }; + }; + email_logs: { + Row: { + id: string; + recipient_id: string | null; + recipient_email: string; + recipient_name: string | null; + template_key: string | null; + subject: string; + email_type: string; + status: 'queued' | 'sent' | 'delivered' | 'opened' | 'clicked' | 'bounced' | 'failed'; + provider: string | null; + provider_message_id: string | null; + opened_at: string | null; + clicked_at: string | null; + error_message: string | null; + retry_count: number; + template_variables: Json | null; + sent_by: string | null; + created_at: string; + sent_at: string | null; + delivered_at: string | null; + }; + Insert: { + id?: string; + recipient_id?: string | null; + recipient_email: string; + recipient_name?: string | null; + template_key?: string | null; + subject: string; + email_type: string; + status?: 'queued' | 'sent' | 'delivered' | 'opened' | 'clicked' | 'bounced' | 'failed'; + provider?: string | null; + provider_message_id?: string | null; + opened_at?: string | null; + clicked_at?: string | null; + error_message?: string | null; + retry_count?: number; + template_variables?: Json | null; + sent_by?: string | null; + created_at?: string; + sent_at?: string | null; + delivered_at?: string | null; + }; + Update: { + id?: string; + recipient_id?: string | null; + recipient_email?: string; + recipient_name?: string | null; + template_key?: string | null; + subject?: string; + email_type?: string; + status?: 'queued' | 'sent' | 'delivered' | 'opened' | 'clicked' | 'bounced' | 'failed'; + provider?: string | null; + provider_message_id?: string | null; + opened_at?: string | null; + clicked_at?: string | null; + error_message?: string | null; + retry_count?: number; + template_variables?: Json | null; + sent_by?: string | null; + created_at?: string; + sent_at?: string | null; + delivered_at?: string | null; + }; + }; + audit_logs: { + Row: { + id: string; + user_id: string | null; + user_email: string | null; + action: string; + resource_type: string | null; + resource_id: string | null; + details: Json; + ip_address: string | null; + user_agent: string | null; + created_at: string; + }; + Insert: { + id?: string; + user_id?: string | null; + user_email?: string | null; + action: string; + resource_type?: string | null; + resource_id?: string | null; + details?: Json; + ip_address?: string | null; + user_agent?: string | null; + created_at?: string; + }; + Update: { + id?: string; + user_id?: string | null; + user_email?: string | null; + action?: string; + resource_type?: string | null; + resource_id?: string | null; + details?: Json; + ip_address?: string | null; + user_agent?: string | null; + created_at?: string; + }; + }; + dues_reminder_logs: { + Row: { + id: string; + member_id: string; + reminder_type: 'due_soon_30' | 'due_soon_7' | 'due_soon_1' | 'overdue' | 'grace_period' | 'inactive_notice'; + due_date: string; + sent_at: string; + email_log_id: string | null; + }; + Insert: { + id?: string; + member_id: string; + reminder_type: 'due_soon_30' | 'due_soon_7' | 'due_soon_1' | 'overdue' | 'grace_period' | 'inactive_notice'; + due_date: string; + sent_at?: string; + email_log_id?: string | null; + }; + Update: { + id?: string; + member_id?: string; + reminder_type?: 'due_soon_30' | 'due_soon_7' | 'due_soon_1' | 'overdue' | 'grace_period' | 'inactive_notice'; + due_date?: string; + sent_at?: string; + email_log_id?: string | null; + }; + }; + }; + Views: { + members_with_dues: { + Row: { + id: string; + member_id: string; + first_name: string; + last_name: string; + email: string; + phone: string; + date_of_birth: string; + address: string; + nationality: string[]; + role: 'member' | 'board' | 'admin'; + membership_status_id: string | null; + membership_type_id: string | null; + member_since: string; + avatar_url: string | null; + notes: string | null; + created_at: string; + updated_at: string; + status_name: string | null; + status_display_name: string | null; + status_color: string | null; + membership_type_name: string | null; + annual_dues: number | null; + last_payment_date: string | null; + current_due_date: string | null; + dues_status: 'never_paid' | 'overdue' | 'due_soon' | 'current'; + days_overdue: number | null; + days_until_due: number | null; + }; + }; + events_with_counts: { + Row: { + id: string; + title: string; + description: string | null; + event_type_id: string | null; + start_datetime: string; + end_datetime: string; + all_day: boolean; + timezone: string; + location: string | null; + location_url: string | null; + max_attendees: number | null; + max_guests_per_member: number; + is_paid: boolean; + member_price: number; + non_member_price: number; + pricing_notes: string | null; + visibility: 'public' | 'members' | 'board' | 'admin'; + status: 'draft' | 'published' | 'cancelled' | 'completed'; + cover_image_url: string | null; + created_by: string; + created_at: string; + updated_at: string; + event_type_name: string | null; + event_type_color: string | null; + event_type_icon: string | null; + total_attendees: number; + member_count: number; + non_member_count: number; + waitlist_count: number; + is_full: boolean; + }; + }; + }; + Functions: Record; + Enums: Record; + }; +}; + +// Convenience types +export type Member = Database['public']['Tables']['members']['Row']; +export type MemberInsert = Database['public']['Tables']['members']['Insert']; +export type MemberUpdate = Database['public']['Tables']['members']['Update']; + +export type MemberWithDues = Database['public']['Views']['members_with_dues']['Row']; + +export type Event = Database['public']['Tables']['events']['Row']; +export type EventInsert = Database['public']['Tables']['events']['Insert']; +export type EventUpdate = Database['public']['Tables']['events']['Update']; + +export type EventWithCounts = Database['public']['Views']['events_with_counts']['Row']; + +export type EventRSVP = Database['public']['Tables']['event_rsvps']['Row']; +export type EventRSVPInsert = Database['public']['Tables']['event_rsvps']['Insert']; + +export type DuesPayment = Database['public']['Tables']['dues_payments']['Row']; +export type DuesPaymentInsert = Database['public']['Tables']['dues_payments']['Insert']; + +export type Document = Database['public']['Tables']['documents']['Row']; +export type DocumentInsert = Database['public']['Tables']['documents']['Insert']; + +export type AppSetting = Database['public']['Tables']['app_settings']['Row']; +export type EmailTemplate = Database['public']['Tables']['email_templates']['Row']; +export type EmailLog = Database['public']['Tables']['email_logs']['Row']; +export type AuditLog = Database['public']['Tables']['audit_logs']['Row']; +export type DuesReminderLog = Database['public']['Tables']['dues_reminder_logs']['Row']; + +// Role type +export type MemberRole = 'member' | 'board' | 'admin'; + +// Event visibility +export type EventVisibility = 'public' | 'members' | 'board' | 'admin'; + +// Dues status +export type DuesStatus = 'never_paid' | 'overdue' | 'due_soon' | 'current'; diff --git a/src/lib/utils/countries.ts b/src/lib/utils/countries.ts new file mode 100644 index 0000000..0db4d26 --- /dev/null +++ b/src/lib/utils/countries.ts @@ -0,0 +1,262 @@ +// Complete ISO 3166-1 alpha-2 country codes with names and flags +export const countries = [ + { code: 'AF', name: 'Afghanistan', flag: '🇦🇫' }, + { code: 'AL', name: 'Albania', flag: '🇦🇱' }, + { code: 'DZ', name: 'Algeria', flag: '🇩🇿' }, + { code: 'AS', name: 'American Samoa', flag: '🇦🇸' }, + { code: 'AD', name: 'Andorra', flag: '🇦🇩' }, + { code: 'AO', name: 'Angola', flag: '🇦🇴' }, + { code: 'AI', name: 'Anguilla', flag: '🇦🇮' }, + { code: 'AQ', name: 'Antarctica', flag: '🇦🇶' }, + { code: 'AG', name: 'Antigua and Barbuda', flag: '🇦🇬' }, + { code: 'AR', name: 'Argentina', flag: '🇦🇷' }, + { code: 'AM', name: 'Armenia', flag: '🇦🇲' }, + { code: 'AW', name: 'Aruba', flag: '🇦🇼' }, + { code: 'AU', name: 'Australia', flag: '🇦🇺' }, + { code: 'AT', name: 'Austria', flag: '🇦🇹' }, + { code: 'AZ', name: 'Azerbaijan', flag: '🇦🇿' }, + { code: 'BS', name: 'Bahamas', flag: '🇧🇸' }, + { code: 'BH', name: 'Bahrain', flag: '🇧🇭' }, + { code: 'BD', name: 'Bangladesh', flag: '🇧🇩' }, + { code: 'BB', name: 'Barbados', flag: '🇧🇧' }, + { code: 'BY', name: 'Belarus', flag: '🇧🇾' }, + { code: 'BE', name: 'Belgium', flag: '🇧🇪' }, + { code: 'BZ', name: 'Belize', flag: '🇧🇿' }, + { code: 'BJ', name: 'Benin', flag: '🇧🇯' }, + { code: 'BM', name: 'Bermuda', flag: '🇧🇲' }, + { code: 'BT', name: 'Bhutan', flag: '🇧🇹' }, + { code: 'BO', name: 'Bolivia', flag: '🇧🇴' }, + { code: 'BA', name: 'Bosnia and Herzegovina', flag: '🇧🇦' }, + { code: 'BW', name: 'Botswana', flag: '🇧🇼' }, + { code: 'BR', name: 'Brazil', flag: '🇧🇷' }, + { code: 'IO', name: 'British Indian Ocean Territory', flag: '🇮🇴' }, + { code: 'VG', name: 'British Virgin Islands', flag: '🇻🇬' }, + { code: 'BN', name: 'Brunei', flag: '🇧🇳' }, + { code: 'BG', name: 'Bulgaria', flag: '🇧🇬' }, + { code: 'BF', name: 'Burkina Faso', flag: '🇧🇫' }, + { code: 'BI', name: 'Burundi', flag: '🇧🇮' }, + { code: 'CV', name: 'Cabo Verde', flag: '🇨🇻' }, + { code: 'KH', name: 'Cambodia', flag: '🇰🇭' }, + { code: 'CM', name: 'Cameroon', flag: '🇨🇲' }, + { code: 'CA', name: 'Canada', flag: '🇨🇦' }, + { code: 'KY', name: 'Cayman Islands', flag: '🇰🇾' }, + { code: 'CF', name: 'Central African Republic', flag: '🇨🇫' }, + { code: 'TD', name: 'Chad', flag: '🇹🇩' }, + { code: 'CL', name: 'Chile', flag: '🇨🇱' }, + { code: 'CN', name: 'China', flag: '🇨🇳' }, + { code: 'CX', name: 'Christmas Island', flag: '🇨🇽' }, + { code: 'CC', name: 'Cocos (Keeling) Islands', flag: '🇨🇨' }, + { code: 'CO', name: 'Colombia', flag: '🇨🇴' }, + { code: 'KM', name: 'Comoros', flag: '🇰🇲' }, + { code: 'CG', name: 'Congo', flag: '🇨🇬' }, + { code: 'CD', name: 'Congo (DRC)', flag: '🇨🇩' }, + { code: 'CK', name: 'Cook Islands', flag: '🇨🇰' }, + { code: 'CR', name: 'Costa Rica', flag: '🇨🇷' }, + { code: 'CI', name: "Côte d'Ivoire", flag: '🇨🇮' }, + { code: 'HR', name: 'Croatia', flag: '🇭🇷' }, + { code: 'CU', name: 'Cuba', flag: '🇨🇺' }, + { code: 'CW', name: 'Curaçao', flag: '🇨🇼' }, + { code: 'CY', name: 'Cyprus', flag: '🇨🇾' }, + { code: 'CZ', name: 'Czech Republic', flag: '🇨🇿' }, + { code: 'DK', name: 'Denmark', flag: '🇩🇰' }, + { code: 'DJ', name: 'Djibouti', flag: '🇩🇯' }, + { code: 'DM', name: 'Dominica', flag: '🇩🇲' }, + { code: 'DO', name: 'Dominican Republic', flag: '🇩🇴' }, + { code: 'EC', name: 'Ecuador', flag: '🇪🇨' }, + { code: 'EG', name: 'Egypt', flag: '🇪🇬' }, + { code: 'SV', name: 'El Salvador', flag: '🇸🇻' }, + { code: 'GQ', name: 'Equatorial Guinea', flag: '🇬🇶' }, + { code: 'ER', name: 'Eritrea', flag: '🇪🇷' }, + { code: 'EE', name: 'Estonia', flag: '🇪🇪' }, + { code: 'SZ', name: 'Eswatini', flag: '🇸🇿' }, + { code: 'ET', name: 'Ethiopia', flag: '🇪🇹' }, + { code: 'FK', name: 'Falkland Islands', flag: '🇫🇰' }, + { code: 'FO', name: 'Faroe Islands', flag: '🇫🇴' }, + { code: 'FJ', name: 'Fiji', flag: '🇫🇯' }, + { code: 'FI', name: 'Finland', flag: '🇫🇮' }, + { code: 'FR', name: 'France', flag: '🇫🇷' }, + { code: 'GF', name: 'French Guiana', flag: '🇬🇫' }, + { code: 'PF', name: 'French Polynesia', flag: '🇵🇫' }, + { code: 'TF', name: 'French Southern Territories', flag: '🇹🇫' }, + { code: 'GA', name: 'Gabon', flag: '🇬🇦' }, + { code: 'GM', name: 'Gambia', flag: '🇬🇲' }, + { code: 'GE', name: 'Georgia', flag: '🇬🇪' }, + { code: 'DE', name: 'Germany', flag: '🇩🇪' }, + { code: 'GH', name: 'Ghana', flag: '🇬🇭' }, + { code: 'GI', name: 'Gibraltar', flag: '🇬🇮' }, + { code: 'GR', name: 'Greece', flag: '🇬🇷' }, + { code: 'GL', name: 'Greenland', flag: '🇬🇱' }, + { code: 'GD', name: 'Grenada', flag: '🇬🇩' }, + { code: 'GP', name: 'Guadeloupe', flag: '🇬🇵' }, + { code: 'GU', name: 'Guam', flag: '🇬🇺' }, + { code: 'GT', name: 'Guatemala', flag: '🇬🇹' }, + { code: 'GG', name: 'Guernsey', flag: '🇬🇬' }, + { code: 'GN', name: 'Guinea', flag: '🇬🇳' }, + { code: 'GW', name: 'Guinea-Bissau', flag: '🇬🇼' }, + { code: 'GY', name: 'Guyana', flag: '🇬🇾' }, + { code: 'HT', name: 'Haiti', flag: '🇭🇹' }, + { code: 'HN', name: 'Honduras', flag: '🇭🇳' }, + { code: 'HK', name: 'Hong Kong', flag: '🇭🇰' }, + { code: 'HU', name: 'Hungary', flag: '🇭🇺' }, + { code: 'IS', name: 'Iceland', flag: '🇮🇸' }, + { code: 'IN', name: 'India', flag: '🇮🇳' }, + { code: 'ID', name: 'Indonesia', flag: '🇮🇩' }, + { code: 'IR', name: 'Iran', flag: '🇮🇷' }, + { code: 'IQ', name: 'Iraq', flag: '🇮🇶' }, + { code: 'IE', name: 'Ireland', flag: '🇮🇪' }, + { code: 'IM', name: 'Isle of Man', flag: '🇮🇲' }, + { code: 'IL', name: 'Israel', flag: '🇮🇱' }, + { code: 'IT', name: 'Italy', flag: '🇮🇹' }, + { code: 'JM', name: 'Jamaica', flag: '🇯🇲' }, + { code: 'JP', name: 'Japan', flag: '🇯🇵' }, + { code: 'JE', name: 'Jersey', flag: '🇯🇪' }, + { code: 'JO', name: 'Jordan', flag: '🇯🇴' }, + { code: 'KZ', name: 'Kazakhstan', flag: '🇰🇿' }, + { code: 'KE', name: 'Kenya', flag: '🇰🇪' }, + { code: 'KI', name: 'Kiribati', flag: '🇰🇮' }, + { code: 'KW', name: 'Kuwait', flag: '🇰🇼' }, + { code: 'KG', name: 'Kyrgyzstan', flag: '🇰🇬' }, + { code: 'LA', name: 'Laos', flag: '🇱🇦' }, + { code: 'LV', name: 'Latvia', flag: '🇱🇻' }, + { code: 'LB', name: 'Lebanon', flag: '🇱🇧' }, + { code: 'LS', name: 'Lesotho', flag: '🇱🇸' }, + { code: 'LR', name: 'Liberia', flag: '🇱🇷' }, + { code: 'LY', name: 'Libya', flag: '🇱🇾' }, + { code: 'LI', name: 'Liechtenstein', flag: '🇱🇮' }, + { code: 'LT', name: 'Lithuania', flag: '🇱🇹' }, + { code: 'LU', name: 'Luxembourg', flag: '🇱🇺' }, + { code: 'MO', name: 'Macao', flag: '🇲🇴' }, + { code: 'MG', name: 'Madagascar', flag: '🇲🇬' }, + { code: 'MW', name: 'Malawi', flag: '🇲🇼' }, + { code: 'MY', name: 'Malaysia', flag: '🇲🇾' }, + { code: 'MV', name: 'Maldives', flag: '🇲🇻' }, + { code: 'ML', name: 'Mali', flag: '🇲🇱' }, + { code: 'MT', name: 'Malta', flag: '🇲🇹' }, + { code: 'MH', name: 'Marshall Islands', flag: '🇲🇭' }, + { code: 'MQ', name: 'Martinique', flag: '🇲🇶' }, + { code: 'MR', name: 'Mauritania', flag: '🇲🇷' }, + { code: 'MU', name: 'Mauritius', flag: '🇲🇺' }, + { code: 'YT', name: 'Mayotte', flag: '🇾🇹' }, + { code: 'MX', name: 'Mexico', flag: '🇲🇽' }, + { code: 'FM', name: 'Micronesia', flag: '🇫🇲' }, + { code: 'MD', name: 'Moldova', flag: '🇲🇩' }, + { code: 'MC', name: 'Monaco', flag: '🇲🇨' }, + { code: 'MN', name: 'Mongolia', flag: '🇲🇳' }, + { code: 'ME', name: 'Montenegro', flag: '🇲🇪' }, + { code: 'MS', name: 'Montserrat', flag: '🇲🇸' }, + { code: 'MA', name: 'Morocco', flag: '🇲🇦' }, + { code: 'MZ', name: 'Mozambique', flag: '🇲🇿' }, + { code: 'MM', name: 'Myanmar', flag: '🇲🇲' }, + { code: 'NA', name: 'Namibia', flag: '🇳🇦' }, + { code: 'NR', name: 'Nauru', flag: '🇳🇷' }, + { code: 'NP', name: 'Nepal', flag: '🇳🇵' }, + { code: 'NL', name: 'Netherlands', flag: '🇳🇱' }, + { code: 'NC', name: 'New Caledonia', flag: '🇳🇨' }, + { code: 'NZ', name: 'New Zealand', flag: '🇳🇿' }, + { code: 'NI', name: 'Nicaragua', flag: '🇳🇮' }, + { code: 'NE', name: 'Niger', flag: '🇳🇪' }, + { code: 'NG', name: 'Nigeria', flag: '🇳🇬' }, + { code: 'NU', name: 'Niue', flag: '🇳🇺' }, + { code: 'NF', name: 'Norfolk Island', flag: '🇳🇫' }, + { code: 'KP', name: 'North Korea', flag: '🇰🇵' }, + { code: 'MK', name: 'North Macedonia', flag: '🇲🇰' }, + { code: 'MP', name: 'Northern Mariana Islands', flag: '🇲🇵' }, + { code: 'NO', name: 'Norway', flag: '🇳🇴' }, + { code: 'OM', name: 'Oman', flag: '🇴🇲' }, + { code: 'PK', name: 'Pakistan', flag: '🇵🇰' }, + { code: 'PW', name: 'Palau', flag: '🇵🇼' }, + { code: 'PS', name: 'Palestine', flag: '🇵🇸' }, + { code: 'PA', name: 'Panama', flag: '🇵🇦' }, + { code: 'PG', name: 'Papua New Guinea', flag: '🇵🇬' }, + { code: 'PY', name: 'Paraguay', flag: '🇵🇾' }, + { code: 'PE', name: 'Peru', flag: '🇵🇪' }, + { code: 'PH', name: 'Philippines', flag: '🇵🇭' }, + { code: 'PN', name: 'Pitcairn Islands', flag: '🇵🇳' }, + { code: 'PL', name: 'Poland', flag: '🇵🇱' }, + { code: 'PT', name: 'Portugal', flag: '🇵🇹' }, + { code: 'PR', name: 'Puerto Rico', flag: '🇵🇷' }, + { code: 'QA', name: 'Qatar', flag: '🇶🇦' }, + { code: 'RE', name: 'Réunion', flag: '🇷🇪' }, + { code: 'RO', name: 'Romania', flag: '🇷🇴' }, + { code: 'RU', name: 'Russia', flag: '🇷🇺' }, + { code: 'RW', name: 'Rwanda', flag: '🇷🇼' }, + { code: 'BL', name: 'Saint Barthélemy', flag: '🇧🇱' }, + { code: 'SH', name: 'Saint Helena', flag: '🇸🇭' }, + { code: 'KN', name: 'Saint Kitts and Nevis', flag: '🇰🇳' }, + { code: 'LC', name: 'Saint Lucia', flag: '🇱🇨' }, + { code: 'MF', name: 'Saint Martin', flag: '🇲🇫' }, + { code: 'PM', name: 'Saint Pierre and Miquelon', flag: '🇵🇲' }, + { code: 'VC', name: 'Saint Vincent and the Grenadines', flag: '🇻🇨' }, + { code: 'WS', name: 'Samoa', flag: '🇼🇸' }, + { code: 'SM', name: 'San Marino', flag: '🇸🇲' }, + { code: 'ST', name: 'São Tomé and Príncipe', flag: '🇸🇹' }, + { code: 'SA', name: 'Saudi Arabia', flag: '🇸🇦' }, + { code: 'SN', name: 'Senegal', flag: '🇸🇳' }, + { code: 'RS', name: 'Serbia', flag: '🇷🇸' }, + { code: 'SC', name: 'Seychelles', flag: '🇸🇨' }, + { code: 'SL', name: 'Sierra Leone', flag: '🇸🇱' }, + { code: 'SG', name: 'Singapore', flag: '🇸🇬' }, + { code: 'SX', name: 'Sint Maarten', flag: '🇸🇽' }, + { code: 'SK', name: 'Slovakia', flag: '🇸🇰' }, + { code: 'SI', name: 'Slovenia', flag: '🇸🇮' }, + { code: 'SB', name: 'Solomon Islands', flag: '🇸🇧' }, + { code: 'SO', name: 'Somalia', flag: '🇸🇴' }, + { code: 'ZA', name: 'South Africa', flag: '🇿🇦' }, + { code: 'GS', name: 'South Georgia and the South Sandwich Islands', flag: '🇬🇸' }, + { code: 'KR', name: 'South Korea', flag: '🇰🇷' }, + { code: 'SS', name: 'South Sudan', flag: '🇸🇸' }, + { code: 'ES', name: 'Spain', flag: '🇪🇸' }, + { code: 'LK', name: 'Sri Lanka', flag: '🇱🇰' }, + { code: 'SD', name: 'Sudan', flag: '🇸🇩' }, + { code: 'SR', name: 'Suriname', flag: '🇸🇷' }, + { code: 'SJ', name: 'Svalbard and Jan Mayen', flag: '🇸🇯' }, + { code: 'SE', name: 'Sweden', flag: '🇸🇪' }, + { code: 'CH', name: 'Switzerland', flag: '🇨🇭' }, + { code: 'SY', name: 'Syria', flag: '🇸🇾' }, + { code: 'TW', name: 'Taiwan', flag: '🇹🇼' }, + { code: 'TJ', name: 'Tajikistan', flag: '🇹🇯' }, + { code: 'TZ', name: 'Tanzania', flag: '🇹🇿' }, + { code: 'TH', name: 'Thailand', flag: '🇹🇭' }, + { code: 'TL', name: 'Timor-Leste', flag: '🇹🇱' }, + { code: 'TG', name: 'Togo', flag: '🇹🇬' }, + { code: 'TK', name: 'Tokelau', flag: '🇹🇰' }, + { code: 'TO', name: 'Tonga', flag: '🇹🇴' }, + { code: 'TT', name: 'Trinidad and Tobago', flag: '🇹🇹' }, + { code: 'TN', name: 'Tunisia', flag: '🇹🇳' }, + { code: 'TR', name: 'Turkey', flag: '🇹🇷' }, + { code: 'TM', name: 'Turkmenistan', flag: '🇹🇲' }, + { code: 'TC', name: 'Turks and Caicos Islands', flag: '🇹🇨' }, + { code: 'TV', name: 'Tuvalu', flag: '🇹🇻' }, + { code: 'UG', name: 'Uganda', flag: '🇺🇬' }, + { code: 'UA', name: 'Ukraine', flag: '🇺🇦' }, + { code: 'AE', name: 'United Arab Emirates', flag: '🇦🇪' }, + { code: 'GB', name: 'United Kingdom', flag: '🇬🇧' }, + { code: 'US', name: 'United States', flag: '🇺🇸' }, + { code: 'UM', name: 'United States Minor Outlying Islands', flag: '🇺🇲' }, + { code: 'VI', name: 'United States Virgin Islands', flag: '🇻🇮' }, + { code: 'UY', name: 'Uruguay', flag: '🇺🇾' }, + { code: 'UZ', name: 'Uzbekistan', flag: '🇺🇿' }, + { code: 'VU', name: 'Vanuatu', flag: '🇻🇺' }, + { code: 'VA', name: 'Vatican City', flag: '🇻🇦' }, + { code: 'VE', name: 'Venezuela', flag: '🇻🇪' }, + { code: 'VN', name: 'Vietnam', flag: '🇻🇳' }, + { code: 'WF', name: 'Wallis and Futuna', flag: '🇼🇫' }, + { code: 'EH', name: 'Western Sahara', flag: '🇪🇭' }, + { code: 'YE', name: 'Yemen', flag: '🇾🇪' }, + { code: 'ZM', name: 'Zambia', flag: '🇿🇲' }, + { code: 'ZW', name: 'Zimbabwe', flag: '🇿🇼' } +] as const; + +export type CountryCode = (typeof countries)[number]['code']; + +export function getCountryByCode(code: string) { + return countries.find((c) => c.code === code); +} + +export function getCountryName(code: string) { + return getCountryByCode(code)?.name || code; +} + +export function getCountryFlag(code: string) { + return getCountryByCode(code)?.flag || ''; +} diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts new file mode 100644 index 0000000..5532ada --- /dev/null +++ b/src/lib/utils/index.ts @@ -0,0 +1,59 @@ +import { type ClassValue, clsx } from 'clsx'; +import { twMerge } from 'tailwind-merge'; + +/** + * Merge Tailwind CSS classes with proper precedence + */ +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +/** + * Format a date to a human-readable string + */ +export function formatDate(date: Date | string, options?: Intl.DateTimeFormatOptions): string { + const d = typeof date === 'string' ? new Date(date) : date; + return d.toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric', + ...options + }); +} + +/** + * Format currency amount + */ +export function formatCurrency(amount: number, currency = 'EUR'): string { + return new Intl.NumberFormat('en-US', { + style: 'currency', + currency + }).format(amount); +} + +/** + * Generate a random ID + */ +export function generateId(prefix = ''): string { + const id = Math.random().toString(36).substring(2, 9); + return prefix ? `${prefix}_${id}` : id; +} + +/** + * Debounce a function + */ +export function debounce unknown>( + fn: T, + delay: number +): (...args: Parameters) => void { + let timeoutId: ReturnType; + return (...args: Parameters) => { + clearTimeout(timeoutId); + timeoutId = setTimeout(() => fn(...args), delay); + }; +} + +/** + * Check if running in browser + */ +export const isBrowser = typeof window !== 'undefined'; diff --git a/src/lib/utils/phoneCountries.ts b/src/lib/utils/phoneCountries.ts new file mode 100644 index 0000000..a260690 --- /dev/null +++ b/src/lib/utils/phoneCountries.ts @@ -0,0 +1,255 @@ +// Complete phone country codes with dial codes +// Prioritized: US, Monaco, France first, then common countries, then alphabetical +export const phoneCountries = [ + // Priority countries for Monaco USA + { code: 'US', name: 'United States', dialCode: '+1' }, + { code: 'MC', name: 'Monaco', dialCode: '+377' }, + { code: 'FR', name: 'France', dialCode: '+33' }, + { code: 'GB', name: 'United Kingdom', dialCode: '+44' }, + { code: 'IT', name: 'Italy', dialCode: '+39' }, + { code: 'CH', name: 'Switzerland', dialCode: '+41' }, + { code: 'DE', name: 'Germany', dialCode: '+49' }, + { code: 'ES', name: 'Spain', dialCode: '+34' }, + // All other countries alphabetically + { code: 'AF', name: 'Afghanistan', dialCode: '+93' }, + { code: 'AL', name: 'Albania', dialCode: '+355' }, + { code: 'DZ', name: 'Algeria', dialCode: '+213' }, + { code: 'AS', name: 'American Samoa', dialCode: '+1684' }, + { code: 'AD', name: 'Andorra', dialCode: '+376' }, + { code: 'AO', name: 'Angola', dialCode: '+244' }, + { code: 'AI', name: 'Anguilla', dialCode: '+1264' }, + { code: 'AG', name: 'Antigua and Barbuda', dialCode: '+1268' }, + { code: 'AR', name: 'Argentina', dialCode: '+54' }, + { code: 'AM', name: 'Armenia', dialCode: '+374' }, + { code: 'AW', name: 'Aruba', dialCode: '+297' }, + { code: 'AU', name: 'Australia', dialCode: '+61' }, + { code: 'AT', name: 'Austria', dialCode: '+43' }, + { code: 'AZ', name: 'Azerbaijan', dialCode: '+994' }, + { code: 'BS', name: 'Bahamas', dialCode: '+1242' }, + { code: 'BH', name: 'Bahrain', dialCode: '+973' }, + { code: 'BD', name: 'Bangladesh', dialCode: '+880' }, + { code: 'BB', name: 'Barbados', dialCode: '+1246' }, + { code: 'BY', name: 'Belarus', dialCode: '+375' }, + { code: 'BE', name: 'Belgium', dialCode: '+32' }, + { code: 'BZ', name: 'Belize', dialCode: '+501' }, + { code: 'BJ', name: 'Benin', dialCode: '+229' }, + { code: 'BM', name: 'Bermuda', dialCode: '+1441' }, + { code: 'BT', name: 'Bhutan', dialCode: '+975' }, + { code: 'BO', name: 'Bolivia', dialCode: '+591' }, + { code: 'BA', name: 'Bosnia and Herzegovina', dialCode: '+387' }, + { code: 'BW', name: 'Botswana', dialCode: '+267' }, + { code: 'BR', name: 'Brazil', dialCode: '+55' }, + { code: 'IO', name: 'British Indian Ocean Territory', dialCode: '+246' }, + { code: 'VG', name: 'British Virgin Islands', dialCode: '+1284' }, + { code: 'BN', name: 'Brunei', dialCode: '+673' }, + { code: 'BG', name: 'Bulgaria', dialCode: '+359' }, + { code: 'BF', name: 'Burkina Faso', dialCode: '+226' }, + { code: 'BI', name: 'Burundi', dialCode: '+257' }, + { code: 'CV', name: 'Cabo Verde', dialCode: '+238' }, + { code: 'KH', name: 'Cambodia', dialCode: '+855' }, + { code: 'CM', name: 'Cameroon', dialCode: '+237' }, + { code: 'CA', name: 'Canada', dialCode: '+1' }, + { code: 'KY', name: 'Cayman Islands', dialCode: '+1345' }, + { code: 'CF', name: 'Central African Republic', dialCode: '+236' }, + { code: 'TD', name: 'Chad', dialCode: '+235' }, + { code: 'CL', name: 'Chile', dialCode: '+56' }, + { code: 'CN', name: 'China', dialCode: '+86' }, + { code: 'CX', name: 'Christmas Island', dialCode: '+61' }, + { code: 'CC', name: 'Cocos (Keeling) Islands', dialCode: '+61' }, + { code: 'CO', name: 'Colombia', dialCode: '+57' }, + { code: 'KM', name: 'Comoros', dialCode: '+269' }, + { code: 'CG', name: 'Congo', dialCode: '+242' }, + { code: 'CD', name: 'Congo (DRC)', dialCode: '+243' }, + { code: 'CK', name: 'Cook Islands', dialCode: '+682' }, + { code: 'CR', name: 'Costa Rica', dialCode: '+506' }, + { code: 'CI', name: "Côte d'Ivoire", dialCode: '+225' }, + { code: 'HR', name: 'Croatia', dialCode: '+385' }, + { code: 'CU', name: 'Cuba', dialCode: '+53' }, + { code: 'CW', name: 'Curaçao', dialCode: '+599' }, + { code: 'CY', name: 'Cyprus', dialCode: '+357' }, + { code: 'CZ', name: 'Czech Republic', dialCode: '+420' }, + { code: 'DK', name: 'Denmark', dialCode: '+45' }, + { code: 'DJ', name: 'Djibouti', dialCode: '+253' }, + { code: 'DM', name: 'Dominica', dialCode: '+1767' }, + { code: 'DO', name: 'Dominican Republic', dialCode: '+1' }, + { code: 'EC', name: 'Ecuador', dialCode: '+593' }, + { code: 'EG', name: 'Egypt', dialCode: '+20' }, + { code: 'SV', name: 'El Salvador', dialCode: '+503' }, + { code: 'GQ', name: 'Equatorial Guinea', dialCode: '+240' }, + { code: 'ER', name: 'Eritrea', dialCode: '+291' }, + { code: 'EE', name: 'Estonia', dialCode: '+372' }, + { code: 'SZ', name: 'Eswatini', dialCode: '+268' }, + { code: 'ET', name: 'Ethiopia', dialCode: '+251' }, + { code: 'FK', name: 'Falkland Islands', dialCode: '+500' }, + { code: 'FO', name: 'Faroe Islands', dialCode: '+298' }, + { code: 'FJ', name: 'Fiji', dialCode: '+679' }, + { code: 'FI', name: 'Finland', dialCode: '+358' }, + { code: 'GF', name: 'French Guiana', dialCode: '+594' }, + { code: 'PF', name: 'French Polynesia', dialCode: '+689' }, + { code: 'GA', name: 'Gabon', dialCode: '+241' }, + { code: 'GM', name: 'Gambia', dialCode: '+220' }, + { code: 'GE', name: 'Georgia', dialCode: '+995' }, + { code: 'GH', name: 'Ghana', dialCode: '+233' }, + { code: 'GI', name: 'Gibraltar', dialCode: '+350' }, + { code: 'GR', name: 'Greece', dialCode: '+30' }, + { code: 'GL', name: 'Greenland', dialCode: '+299' }, + { code: 'GD', name: 'Grenada', dialCode: '+1473' }, + { code: 'GP', name: 'Guadeloupe', dialCode: '+590' }, + { code: 'GU', name: 'Guam', dialCode: '+1671' }, + { code: 'GT', name: 'Guatemala', dialCode: '+502' }, + { code: 'GG', name: 'Guernsey', dialCode: '+44' }, + { code: 'GN', name: 'Guinea', dialCode: '+224' }, + { code: 'GW', name: 'Guinea-Bissau', dialCode: '+245' }, + { code: 'GY', name: 'Guyana', dialCode: '+592' }, + { code: 'HT', name: 'Haiti', dialCode: '+509' }, + { code: 'HN', name: 'Honduras', dialCode: '+504' }, + { code: 'HK', name: 'Hong Kong', dialCode: '+852' }, + { code: 'HU', name: 'Hungary', dialCode: '+36' }, + { code: 'IS', name: 'Iceland', dialCode: '+354' }, + { code: 'IN', name: 'India', dialCode: '+91' }, + { code: 'ID', name: 'Indonesia', dialCode: '+62' }, + { code: 'IR', name: 'Iran', dialCode: '+98' }, + { code: 'IQ', name: 'Iraq', dialCode: '+964' }, + { code: 'IE', name: 'Ireland', dialCode: '+353' }, + { code: 'IM', name: 'Isle of Man', dialCode: '+44' }, + { code: 'IL', name: 'Israel', dialCode: '+972' }, + { code: 'JM', name: 'Jamaica', dialCode: '+1' }, + { code: 'JP', name: 'Japan', dialCode: '+81' }, + { code: 'JE', name: 'Jersey', dialCode: '+44' }, + { code: 'JO', name: 'Jordan', dialCode: '+962' }, + { code: 'KZ', name: 'Kazakhstan', dialCode: '+7' }, + { code: 'KE', name: 'Kenya', dialCode: '+254' }, + { code: 'KI', name: 'Kiribati', dialCode: '+686' }, + { code: 'KW', name: 'Kuwait', dialCode: '+965' }, + { code: 'KG', name: 'Kyrgyzstan', dialCode: '+996' }, + { code: 'LA', name: 'Laos', dialCode: '+856' }, + { code: 'LV', name: 'Latvia', dialCode: '+371' }, + { code: 'LB', name: 'Lebanon', dialCode: '+961' }, + { code: 'LS', name: 'Lesotho', dialCode: '+266' }, + { code: 'LR', name: 'Liberia', dialCode: '+231' }, + { code: 'LY', name: 'Libya', dialCode: '+218' }, + { code: 'LI', name: 'Liechtenstein', dialCode: '+423' }, + { code: 'LT', name: 'Lithuania', dialCode: '+370' }, + { code: 'LU', name: 'Luxembourg', dialCode: '+352' }, + { code: 'MO', name: 'Macao', dialCode: '+853' }, + { code: 'MG', name: 'Madagascar', dialCode: '+261' }, + { code: 'MW', name: 'Malawi', dialCode: '+265' }, + { code: 'MY', name: 'Malaysia', dialCode: '+60' }, + { code: 'MV', name: 'Maldives', dialCode: '+960' }, + { code: 'ML', name: 'Mali', dialCode: '+223' }, + { code: 'MT', name: 'Malta', dialCode: '+356' }, + { code: 'MH', name: 'Marshall Islands', dialCode: '+692' }, + { code: 'MQ', name: 'Martinique', dialCode: '+596' }, + { code: 'MR', name: 'Mauritania', dialCode: '+222' }, + { code: 'MU', name: 'Mauritius', dialCode: '+230' }, + { code: 'YT', name: 'Mayotte', dialCode: '+262' }, + { code: 'MX', name: 'Mexico', dialCode: '+52' }, + { code: 'FM', name: 'Micronesia', dialCode: '+691' }, + { code: 'MD', name: 'Moldova', dialCode: '+373' }, + { code: 'MN', name: 'Mongolia', dialCode: '+976' }, + { code: 'ME', name: 'Montenegro', dialCode: '+382' }, + { code: 'MS', name: 'Montserrat', dialCode: '+1664' }, + { code: 'MA', name: 'Morocco', dialCode: '+212' }, + { code: 'MZ', name: 'Mozambique', dialCode: '+258' }, + { code: 'MM', name: 'Myanmar', dialCode: '+95' }, + { code: 'NA', name: 'Namibia', dialCode: '+264' }, + { code: 'NR', name: 'Nauru', dialCode: '+674' }, + { code: 'NP', name: 'Nepal', dialCode: '+977' }, + { code: 'NL', name: 'Netherlands', dialCode: '+31' }, + { code: 'NC', name: 'New Caledonia', dialCode: '+687' }, + { code: 'NZ', name: 'New Zealand', dialCode: '+64' }, + { code: 'NI', name: 'Nicaragua', dialCode: '+505' }, + { code: 'NE', name: 'Niger', dialCode: '+227' }, + { code: 'NG', name: 'Nigeria', dialCode: '+234' }, + { code: 'NU', name: 'Niue', dialCode: '+683' }, + { code: 'NF', name: 'Norfolk Island', dialCode: '+672' }, + { code: 'KP', name: 'North Korea', dialCode: '+850' }, + { code: 'MK', name: 'North Macedonia', dialCode: '+389' }, + { code: 'MP', name: 'Northern Mariana Islands', dialCode: '+1670' }, + { code: 'NO', name: 'Norway', dialCode: '+47' }, + { code: 'OM', name: 'Oman', dialCode: '+968' }, + { code: 'PK', name: 'Pakistan', dialCode: '+92' }, + { code: 'PW', name: 'Palau', dialCode: '+680' }, + { code: 'PS', name: 'Palestine', dialCode: '+970' }, + { code: 'PA', name: 'Panama', dialCode: '+507' }, + { code: 'PG', name: 'Papua New Guinea', dialCode: '+675' }, + { code: 'PY', name: 'Paraguay', dialCode: '+595' }, + { code: 'PE', name: 'Peru', dialCode: '+51' }, + { code: 'PH', name: 'Philippines', dialCode: '+63' }, + { code: 'PL', name: 'Poland', dialCode: '+48' }, + { code: 'PT', name: 'Portugal', dialCode: '+351' }, + { code: 'PR', name: 'Puerto Rico', dialCode: '+1' }, + { code: 'QA', name: 'Qatar', dialCode: '+974' }, + { code: 'RE', name: 'Réunion', dialCode: '+262' }, + { code: 'RO', name: 'Romania', dialCode: '+40' }, + { code: 'RU', name: 'Russia', dialCode: '+7' }, + { code: 'RW', name: 'Rwanda', dialCode: '+250' }, + { code: 'BL', name: 'Saint Barthélemy', dialCode: '+590' }, + { code: 'SH', name: 'Saint Helena', dialCode: '+290' }, + { code: 'KN', name: 'Saint Kitts and Nevis', dialCode: '+1869' }, + { code: 'LC', name: 'Saint Lucia', dialCode: '+1758' }, + { code: 'MF', name: 'Saint Martin', dialCode: '+590' }, + { code: 'PM', name: 'Saint Pierre and Miquelon', dialCode: '+508' }, + { code: 'VC', name: 'Saint Vincent and the Grenadines', dialCode: '+1784' }, + { code: 'WS', name: 'Samoa', dialCode: '+685' }, + { code: 'SM', name: 'San Marino', dialCode: '+378' }, + { code: 'ST', name: 'São Tomé and Príncipe', dialCode: '+239' }, + { code: 'SA', name: 'Saudi Arabia', dialCode: '+966' }, + { code: 'SN', name: 'Senegal', dialCode: '+221' }, + { code: 'RS', name: 'Serbia', dialCode: '+381' }, + { code: 'SC', name: 'Seychelles', dialCode: '+248' }, + { code: 'SL', name: 'Sierra Leone', dialCode: '+232' }, + { code: 'SG', name: 'Singapore', dialCode: '+65' }, + { code: 'SX', name: 'Sint Maarten', dialCode: '+1721' }, + { code: 'SK', name: 'Slovakia', dialCode: '+421' }, + { code: 'SI', name: 'Slovenia', dialCode: '+386' }, + { code: 'SB', name: 'Solomon Islands', dialCode: '+677' }, + { code: 'SO', name: 'Somalia', dialCode: '+252' }, + { code: 'ZA', name: 'South Africa', dialCode: '+27' }, + { code: 'KR', name: 'South Korea', dialCode: '+82' }, + { code: 'SS', name: 'South Sudan', dialCode: '+211' }, + { code: 'LK', name: 'Sri Lanka', dialCode: '+94' }, + { code: 'SD', name: 'Sudan', dialCode: '+249' }, + { code: 'SR', name: 'Suriname', dialCode: '+597' }, + { code: 'SJ', name: 'Svalbard and Jan Mayen', dialCode: '+47' }, + { code: 'SE', name: 'Sweden', dialCode: '+46' }, + { code: 'SY', name: 'Syria', dialCode: '+963' }, + { code: 'TW', name: 'Taiwan', dialCode: '+886' }, + { code: 'TJ', name: 'Tajikistan', dialCode: '+992' }, + { code: 'TZ', name: 'Tanzania', dialCode: '+255' }, + { code: 'TH', name: 'Thailand', dialCode: '+66' }, + { code: 'TL', name: 'Timor-Leste', dialCode: '+670' }, + { code: 'TG', name: 'Togo', dialCode: '+228' }, + { code: 'TK', name: 'Tokelau', dialCode: '+690' }, + { code: 'TO', name: 'Tonga', dialCode: '+676' }, + { code: 'TT', name: 'Trinidad and Tobago', dialCode: '+1' }, + { code: 'TN', name: 'Tunisia', dialCode: '+216' }, + { code: 'TR', name: 'Turkey', dialCode: '+90' }, + { code: 'TM', name: 'Turkmenistan', dialCode: '+993' }, + { code: 'TC', name: 'Turks and Caicos Islands', dialCode: '+1649' }, + { code: 'TV', name: 'Tuvalu', dialCode: '+688' }, + { code: 'UG', name: 'Uganda', dialCode: '+256' }, + { code: 'UA', name: 'Ukraine', dialCode: '+380' }, + { code: 'AE', name: 'United Arab Emirates', dialCode: '+971' }, + { code: 'UY', name: 'Uruguay', dialCode: '+598' }, + { code: 'VI', name: 'United States Virgin Islands', dialCode: '+1340' }, + { code: 'UZ', name: 'Uzbekistan', dialCode: '+998' }, + { code: 'VU', name: 'Vanuatu', dialCode: '+678' }, + { code: 'VA', name: 'Vatican City', dialCode: '+39' }, + { code: 'VE', name: 'Venezuela', dialCode: '+58' }, + { code: 'VN', name: 'Vietnam', dialCode: '+84' }, + { code: 'WF', name: 'Wallis and Futuna', dialCode: '+681' }, + { code: 'YE', name: 'Yemen', dialCode: '+967' }, + { code: 'ZM', name: 'Zambia', dialCode: '+260' }, + { code: 'ZW', name: 'Zimbabwe', dialCode: '+263' } +] as const; + +export type PhoneCountryCode = (typeof phoneCountries)[number]['code']; + +export function getPhoneCountry(code: string) { + return phoneCountries.find((c) => c.code === code); +} + +export function getDialCode(code: string) { + return getPhoneCountry(code)?.dialCode || ''; +} diff --git a/src/routes/(app)/+error.svelte b/src/routes/(app)/+error.svelte new file mode 100644 index 0000000..d5fc1a5 --- /dev/null +++ b/src/routes/(app)/+error.svelte @@ -0,0 +1,179 @@ + + + + {status} - {errorInfo.title} | Monaco USA + + +
+ +
+ + Monaco USA + +
+ + +
+ +
+ + + +
+ + +
+ Error {status} +
+ + +

{errorInfo.title}

+ + +

{errorInfo.message}

+ + +
+ + + + + {#if status === 401} + + {/if} +
+
+ + +

+ Need assistance? + + Contact support + +

+ + + {#if $page.error?.message && import.meta.env.DEV} +
+ + Technical details + +
{$page.error.message}
+
+ {/if} +
diff --git a/src/routes/(app)/+layout.server.ts b/src/routes/(app)/+layout.server.ts new file mode 100644 index 0000000..2e97741 --- /dev/null +++ b/src/routes/(app)/+layout.server.ts @@ -0,0 +1,27 @@ +import { redirect } from '@sveltejs/kit'; +import type { LayoutServerLoad } from './$types'; + +export const load: LayoutServerLoad = async ({ locals, url }) => { + const { session, user, member } = await locals.safeGetSession(); + + // Require authentication for all app routes + if (!session) { + throw redirect(303, `/login?redirectTo=${encodeURIComponent(url.pathname)}`); + } + + // Require member profile to exist + if (!member) { + // User is authenticated but has no member profile - unusual situation + await locals.supabase.auth.signOut(); + throw redirect(303, '/login?error=no_profile'); + } + + // Check if user's email is verified + const emailVerified = user?.email_confirmed_at !== null && user?.email_confirmed_at !== undefined; + + return { + session, + member, + emailVerified + }; +}; diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte new file mode 100644 index 0000000..c453b4f --- /dev/null +++ b/src/routes/(app)/+layout.svelte @@ -0,0 +1,87 @@ + + +
+ + + + +
+ +
+ + + {#if !data.emailVerified} + + {/if} + + +
+
+ {@render children()} +
+
+
+ + + + + + +
diff --git a/src/routes/(app)/admin/+layout.server.ts b/src/routes/(app)/admin/+layout.server.ts new file mode 100644 index 0000000..0f15a57 --- /dev/null +++ b/src/routes/(app)/admin/+layout.server.ts @@ -0,0 +1,13 @@ +import { redirect } from '@sveltejs/kit'; +import type { LayoutServerLoad } from './$types'; + +export const load: LayoutServerLoad = async ({ parent }) => { + const { member } = await parent(); + + // Only admins can access admin pages + if (member?.role !== 'admin') { + throw redirect(303, '/dashboard'); + } + + return {}; +}; diff --git a/src/routes/(app)/admin/dashboard/+page.server.ts b/src/routes/(app)/admin/dashboard/+page.server.ts new file mode 100644 index 0000000..1e16518 --- /dev/null +++ b/src/routes/(app)/admin/dashboard/+page.server.ts @@ -0,0 +1,91 @@ +import type { PageServerLoad } from './$types'; +import { getRecentAuditLogs } from '$lib/server/audit'; + +export const load: PageServerLoad = async ({ locals }) => { + // Get all members with dues info for stats + const { data: members } = await locals.supabase + .from('members_with_dues') + .select('*'); + + // Get recent payments (this month and last month) + const now = new Date(); + const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1); + const startOfLastMonth = new Date(now.getFullYear(), now.getMonth() - 1, 1); + + const { data: recentPayments } = await locals.supabase + .from('dues_payments') + .select(` + *, + member:members(first_name, last_name, email) + `) + .gte('payment_date', startOfLastMonth.toISOString()) + .order('payment_date', { ascending: false }); + + // Get upcoming events (next 30 days) + const thirtyDaysFromNow = new Date(); + thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30); + + const { data: upcomingEvents } = await locals.supabase + .from('events_with_counts') + .select('*') + .eq('status', 'published') + .gte('start_datetime', now.toISOString()) + .lte('start_datetime', thirtyDaysFromNow.toISOString()) + .order('start_datetime', { ascending: true }) + .limit(5); + + // Get recent audit logs + const { logs: auditLogs } = await getRecentAuditLogs(20); + + // Calculate member stats + const memberStats = { + total: members?.length || 0, + byRole: { + admin: members?.filter(m => m.role === 'admin').length || 0, + board: members?.filter(m => m.role === 'board').length || 0, + member: members?.filter(m => m.role === 'member').length || 0 + }, + byDuesStatus: { + current: members?.filter(m => m.dues_status === 'current').length || 0, + due_soon: members?.filter(m => m.dues_status === 'due_soon').length || 0, + overdue: members?.filter(m => m.dues_status === 'overdue').length || 0, + never_paid: members?.filter(m => m.dues_status === 'never_paid').length || 0 + } + }; + + // Calculate revenue stats + const thisMonthPayments = recentPayments?.filter(p => + new Date(p.payment_date) >= startOfMonth + ) || []; + const lastMonthPayments = recentPayments?.filter(p => + new Date(p.payment_date) >= startOfLastMonth && + new Date(p.payment_date) < startOfMonth + ) || []; + + const revenueStats = { + thisMonth: thisMonthPayments.reduce((sum, p) => sum + (p.amount || 0), 0), + lastMonth: lastMonthPayments.reduce((sum, p) => sum + (p.amount || 0), 0), + thisMonthCount: thisMonthPayments.length, + lastMonthCount: lastMonthPayments.length + }; + + // Get recent payments for display + const { data: latestPayments } = await locals.supabase + .from('dues_payments') + .select(` + *, + member:members(first_name, last_name, email), + recorder:members!dues_payments_recorded_by_fkey(first_name, last_name) + `) + .order('created_at', { ascending: false }) + .limit(5); + + return { + memberStats, + revenueStats, + upcomingEvents: upcomingEvents || [], + recentPayments: latestPayments || [], + auditLogs: auditLogs || [], + overdueMembers: members?.filter(m => m.dues_status === 'overdue').slice(0, 5) || [] + }; +}; diff --git a/src/routes/(app)/admin/dashboard/+page.svelte b/src/routes/(app)/admin/dashboard/+page.svelte new file mode 100644 index 0000000..3e1634e --- /dev/null +++ b/src/routes/(app)/admin/dashboard/+page.svelte @@ -0,0 +1,295 @@ + + + + Admin Dashboard | Monaco USA + + +
+ +
+

Admin Dashboard

+

Overview of Monaco USA portal activity and metrics

+
+ + +
+ +
+
+
+

Total Members

+

{memberStats.total}

+
+
+ +
+
+
+ {memberStats.byRole.admin} Admin + {memberStats.byRole.board} Board + {memberStats.byRole.member} Members +
+
+ + +
+
+
+

Revenue This Month

+

{formatCurrency(revenueStats.thisMonth)}

+
+
+ +
+
+
+ {#if revenueUp} + + +{revenueTrend}% + {:else} + + {revenueTrend}% + {/if} + vs last month +
+
+ + +
+
+
+

Dues Status

+

{memberStats.byDuesStatus.current}

+
+
+ +
+
+
+ Current + {memberStats.byDuesStatus.due_soon} Due Soon + {memberStats.byDuesStatus.overdue} Overdue +
+
+ + +
+
+
+

Upcoming Events

+

{upcomingEvents.length}

+
+
+ +
+
+

Next 30 days

+
+
+ + +
+ +
+
+

Recent Payments

+ View all +
+ + {#if recentPayments.length > 0} +
+ {#each recentPayments as payment} +
+
+

+ {payment.member?.first_name} {payment.member?.last_name} +

+

{formatDate(payment.payment_date)}

+
+ {formatCurrency(payment.amount)} +
+ {/each} +
+ {:else} +

No recent payments

+ {/if} +
+ + +
+
+

Upcoming Events

+ View all +
+ + {#if upcomingEvents.length > 0} +
+ {#each upcomingEvents as event} +
+
+

{event.title}

+

+ {formatDateTime(event.start_datetime)} + {#if event.location} + | {event.location} + {/if} +

+
+
+ {event.total_attendees} + {#if event.max_attendees} + /{event.max_attendees} + {/if} +

attendees

+
+
+ {/each} +
+ {:else} +

No upcoming events

+ {/if} +
+ + +
+
+

Overdue Dues

+ View all +
+ + {#if overdueMembers.length > 0} +
+ {#each overdueMembers as member} +
+
+

+ {member.first_name} {member.last_name} +

+

{member.email}

+
+
+ + {member.days_overdue} days + +

overdue

+
+
+ {/each} +
+ {:else} +
+ +

All members are current!

+
+ {/if} +
+ + +
+
+

Recent Activity

+ +
+ + {#if auditLogs.length > 0} +
+ {#each auditLogs.slice(0, 8) as log} +
+
+ {#if log.action.startsWith('member')} + + {:else if log.action.startsWith('event')} + + {:else if log.action.startsWith('payment')} + + {:else if log.action.startsWith('document')} + + {:else} + + {/if} +
+
+

+ {formatAuditAction(log.action)} + {#if log.details?.target_email} + ({log.details.target_email}) + {/if} +

+

+ {log.user_email || 'System'} · {formatDateTime(log.created_at)} +

+
+
+ {/each} +
+ {:else} +

No recent activity

+ {/if} +
+
+
diff --git a/src/routes/(app)/admin/email-templates/+page.server.ts b/src/routes/(app)/admin/email-templates/+page.server.ts new file mode 100644 index 0000000..5535763 --- /dev/null +++ b/src/routes/(app)/admin/email-templates/+page.server.ts @@ -0,0 +1,83 @@ +import { fail, redirect } from '@sveltejs/kit'; +import type { PageServerLoad, Actions } from './$types'; + +export const load: PageServerLoad = async ({ locals }) => { + // Check admin access + const { data: { user } } = await locals.supabase.auth.getUser(); + if (!user) throw redirect(303, '/login'); + + const { data: member } = await locals.supabase + .from('members') + .select('role') + .eq('id', user.id) + .single(); + + if (!member || !['admin', 'board'].includes(member.role)) { + throw redirect(303, '/dashboard'); + } + + // Load all email templates + const { data: templates, error } = await locals.supabase + .from('email_templates') + .select('*') + .order('category', { ascending: true }) + .order('template_name', { ascending: true }); + + if (error) { + console.error('Error loading email templates:', error); + return { templates: [] }; + } + + return { templates: templates || [] }; +}; + +export const actions: Actions = { + updateTemplate: async ({ request, locals }) => { + const { data: { user } } = await locals.supabase.auth.getUser(); + if (!user) { + return fail(401, { error: 'Unauthorized' }); + } + + // Check admin access + const { data: member } = await locals.supabase + .from('members') + .select('role') + .eq('id', user.id) + .single(); + + if (!member || !['admin', 'board'].includes(member.role)) { + return fail(403, { error: 'Access denied' }); + } + + const formData = await request.formData(); + const template_key = formData.get('template_key') as string; + const subject = formData.get('subject') as string; + const body_html = formData.get('body_html') as string; + const body_text = formData.get('body_text') as string; + const is_active = formData.get('is_active') === 'true'; + + if (!template_key) { + return fail(400, { error: 'Template key is required' }); + } + + // Update the template + const { error } = await locals.supabase + .from('email_templates') + .update({ + subject, + body_html, + body_text, + is_active, + updated_at: new Date().toISOString(), + updated_by: user.id + }) + .eq('template_key', template_key); + + if (error) { + console.error('Error updating template:', error); + return fail(500, { error: 'Failed to update template' }); + } + + return { success: true, message: 'Template updated successfully' }; + } +}; diff --git a/src/routes/(app)/admin/email-templates/+page.svelte b/src/routes/(app)/admin/email-templates/+page.svelte new file mode 100644 index 0000000..e0af0d4 --- /dev/null +++ b/src/routes/(app)/admin/email-templates/+page.svelte @@ -0,0 +1,566 @@ + + + + Email Templates | Monaco USA Admin + + +
+ + + +
+

Email Templates

+

Edit the text content of email notifications sent by the system

+
+ + + {#if form?.success} +
+ + {form.message || 'Template updated successfully'} +
+ {/if} + + {#if form?.error} +
+ + {form.error} +
+ {/if} + + +
+
+ +
+ + +
+ + +
+ + +
+
+
+ + +
+ {#each filteredTemplates as template} +
+
+
+
+ + {formatCategory(template.category)} + + {#if !template.is_active} + + Inactive + + {/if} +
+

{template.template_name}

+

{template.subject}

+
+ +
+
+ {template.template_key} + +
+
+ {:else} +
+ +

No templates found

+
+ {/each} +
+
+ + +{#if editingTemplate} +
{ if (e.target === e.currentTarget) closeEditor(); }} + onkeydown={(e) => { if (e.key === 'Escape') closeEditor(); }} + role="dialog" + aria-modal="true" + tabindex="-1" + > +
+ +
+
+

Edit: {editingTemplate.template_name}

+

{editingTemplate.template_key}

+
+ +
+ + +
{ + isSubmitting = true; + return async ({ update, result }) => { + isSubmitting = false; + if (result.type === 'success') { + await invalidateAll(); + closeEditor(); + } + await update(); + }; + }} + class="p-6 space-y-6" + > + + + +
+ + activeField = 'subject'} + class="h-11 font-mono text-sm" + /> +
+ + + {#if templateVariables.length > 0} +
+
+ + Available Variables + (click to insert at cursor) +
+
+ {#each templateVariables as [varName, description]} + + {/each} +
+
+ {/if} + + +
+
+ + +
+ {#if showPreview} +
+
+

Subject: {renderPreview(editSubject)}

+
+ +
+ {:else} + + {/if} +
+ + +
+ + +
+ + +
+ + Template Active +
+ + +
+ + +
+
+
+
+{/if} diff --git a/src/routes/(app)/admin/email-testing/+page.server.ts b/src/routes/(app)/admin/email-testing/+page.server.ts new file mode 100644 index 0000000..46d760d --- /dev/null +++ b/src/routes/(app)/admin/email-testing/+page.server.ts @@ -0,0 +1,425 @@ +import { fail } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; +import { supabaseAdmin } from '$lib/server/supabase'; +import { sendEmail, sendTemplatedEmail, getSmtpConfig, wrapInMonacoTemplate } from '$lib/server/email'; + +export const load: PageServerLoad = async ({ locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || member.role !== 'admin') { + return { + templates: [], + recentLogs: [], + smtpConfigured: false + }; + } + + // Check if SMTP is configured + const smtpConfig = await getSmtpConfig(); + const smtpConfigured = !!smtpConfig; + + // Fetch all email templates + const { data: templates } = await supabaseAdmin + .from('email_templates') + .select('*') + .order('category', { ascending: true }) + .order('name', { ascending: true }); + + // Fetch recent email logs + const { data: recentLogs } = await supabaseAdmin + .from('email_logs') + .select(` + *, + sender:members!email_logs_sent_by_fkey(first_name, last_name) + `) + .order('created_at', { ascending: false }) + .limit(20); + + // Group templates by category + const templatesByCategory: Record = {}; + for (const template of templates || []) { + const category = template.category || 'other'; + if (!templatesByCategory[category]) { + templatesByCategory[category] = []; + } + templatesByCategory[category].push(template); + } + + return { + templates: templates || [], + templatesByCategory, + recentLogs: recentLogs || [], + smtpConfigured, + adminEmail: member.email + }; +}; + +export const actions: Actions = { + /** + * Send a test email using a template + */ + sendTestTemplate: async ({ request, locals, url }) => { + const { member } = await locals.safeGetSession(); + + if (!member || member.role !== 'admin') { + return fail(403, { error: 'Only admins can send test emails' }); + } + + const formData = await request.formData(); + const templateKey = formData.get('template_key') as string; + const recipientEmail = formData.get('recipient_email') as string; + + if (!templateKey || !recipientEmail) { + return fail(400, { error: 'Template and recipient email are required' }); + } + + // Validate email format + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(recipientEmail)) { + return fail(400, { error: 'Please enter a valid email address' }); + } + + // Build test variables based on template type + const testVariables = getTestVariables(templateKey, member, url.origin); + + const result = await sendTemplatedEmail(templateKey, recipientEmail, testVariables, { + recipientId: member.id, + recipientName: `${member.first_name} ${member.last_name}`, + sentBy: member.id, + baseUrl: url.origin + }); + + if (!result.success) { + return fail(500, { error: result.error || 'Failed to send test email' }); + } + + return { success: `Test email sent successfully to ${recipientEmail}!` }; + }, + + /** + * Send a custom test email + */ + sendCustomEmail: async ({ request, locals, url }) => { + const { member } = await locals.safeGetSession(); + + if (!member || member.role !== 'admin') { + return fail(403, { error: 'Only admins can send test emails' }); + } + + const formData = await request.formData(); + const recipientEmail = formData.get('recipient_email') as string; + const subject = formData.get('subject') as string; + const messageContent = formData.get('message') as string; + + if (!recipientEmail || !subject || !messageContent) { + return fail(400, { error: 'Recipient, subject, and message are required' }); + } + + // Validate email format + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(recipientEmail)) { + return fail(400, { error: 'Please enter a valid email address' }); + } + + // Wrap the message in the Monaco template + const logoUrl = `${url.origin}/MONACOUSA-Flags_376x376.png`; + const html = wrapInMonacoTemplate({ + title: subject, + content: `

${messageContent.replace(/\n/g, '
')}

`, + logoUrl + }); + + const result = await sendEmail({ + to: recipientEmail, + subject, + html, + emailType: 'test_custom', + sentBy: member.id + }); + + if (!result.success) { + return fail(500, { error: result.error || 'Failed to send email' }); + } + + return { success: `Custom email sent successfully to ${recipientEmail}!` }; + }, + + /** + * Test all notification types to a single recipient + */ + sendAllTests: async ({ request, locals, url }) => { + const { member } = await locals.safeGetSession(); + + if (!member || member.role !== 'admin') { + return fail(403, { error: 'Only admins can send test emails' }); + } + + const formData = await request.formData(); + const recipientEmail = formData.get('recipient_email') as string; + + if (!recipientEmail) { + return fail(400, { error: 'Recipient email is required' }); + } + + // Get all active templates + const { data: templates } = await supabaseAdmin + .from('email_templates') + .select('template_key') + .eq('is_active', true); + + if (!templates || templates.length === 0) { + return fail(400, { error: 'No active email templates found' }); + } + + let successCount = 0; + let failCount = 0; + const errors: string[] = []; + + for (const template of templates) { + const testVariables = getTestVariables(template.template_key, member, url.origin); + + const result = await sendTemplatedEmail(template.template_key, recipientEmail, testVariables, { + recipientId: member.id, + recipientName: `${member.first_name} ${member.last_name}`, + sentBy: member.id, + baseUrl: url.origin + }); + + if (result.success) { + successCount++; + } else { + failCount++; + errors.push(`${template.template_key}: ${result.error}`); + } + + // Small delay between emails to avoid rate limiting + await new Promise((resolve) => setTimeout(resolve, 500)); + } + + if (failCount === 0) { + return { success: `All ${successCount} test emails sent successfully!` }; + } else if (successCount === 0) { + return fail(500, { error: `All emails failed to send. Errors: ${errors.join('; ')}` }); + } else { + return { + success: `Sent ${successCount} emails, ${failCount} failed.`, + errors + }; + } + }, + + /** + * Preview a template (returns HTML) + */ + previewTemplate: async ({ request, locals, url }) => { + const { member } = await locals.safeGetSession(); + + if (!member || member.role !== 'admin') { + return fail(403, { error: 'Unauthorized' }); + } + + const formData = await request.formData(); + const templateKey = formData.get('template_key') as string; + + if (!templateKey) { + return fail(400, { error: 'Template key is required' }); + } + + // Fetch the template + const { data: template } = await supabaseAdmin + .from('email_templates') + .select('*') + .eq('template_key', templateKey) + .single(); + + if (!template) { + return fail(404, { error: 'Template not found' }); + } + + // Get test variables + const testVariables = getTestVariables(templateKey, member, url.origin); + const logoUrl = `${url.origin}/MONACOUSA-Flags_376x376.png`; + + // Replace variables in the template + let html = template.body_html; + let subject = template.subject; + + const allVariables: Record = { + logo_url: logoUrl, + site_url: url.origin, + ...testVariables + }; + + for (const [key, value] of Object.entries(allVariables)) { + const regex = new RegExp(`{{${key}}}`, 'g'); + html = html.replace(regex, value); + subject = subject.replace(regex, value); + } + + return { + preview: { + subject, + html, + templateName: template.name + } + }; + } +}; + +/** + * Get test variables for different template types + */ +function getTestVariables(templateKey: string, member: any, baseUrl: string): Record { + const commonVars = { + first_name: member.first_name || 'Test', + last_name: member.last_name || 'User', + member_name: `${member.first_name || 'Test'} ${member.last_name || 'User'}`, + member_id: member.member_id || 'TEST-001', + email: member.email || 'test@example.com', + site_url: baseUrl, + portal_url: baseUrl, + logo_url: `${baseUrl}/MONACOUSA-Flags_376x376.png` + }; + + // Template-specific variables + switch (templateKey) { + case 'welcome': + return { + ...commonVars, + login_url: `${baseUrl}/login` + }; + + case 'payment_received': + return { + ...commonVars, + amount: '100.00', + payment_date: new Date().toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric' + }), + reference: 'TEST-REF-123', + due_date: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric' + }) + }; + + case 'dues_reminder_30': + case 'dues_reminder_7': + case 'dues_reminder_1': + const daysMap: Record = { + dues_reminder_30: '30', + dues_reminder_7: '7', + dues_reminder_1: '1' + }; + return { + ...commonVars, + days_until_due: daysMap[templateKey] || '30', + due_date: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric' + }), + amount_due: '100.00', + payment_url: `${baseUrl}/payments`, + bank_name: 'Monaco Bank', + iban: 'MC00 0000 0000 0000 0000 0000 000', + bic: 'MONACOXX', + payment_reference: `DUES-${member.member_id || 'TEST001'}` + }; + + case 'dues_overdue': + return { + ...commonVars, + days_overdue: '15', + due_date: new Date(Date.now() - 15 * 24 * 60 * 60 * 1000).toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric' + }), + amount_due: '100.00', + payment_url: `${baseUrl}/payments`, + bank_name: 'Monaco Bank', + iban: 'MC00 0000 0000 0000 0000 0000 000', + bic: 'MONACOXX', + payment_reference: `DUES-${member.member_id || 'TEST001'}` + }; + + case 'dues_grace_warning': + return { + ...commonVars, + grace_days_remaining: '7', + grace_end_date: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric' + }), + amount_due: '100.00', + payment_url: `${baseUrl}/payments` + }; + + case 'dues_inactive_notice': + return { + ...commonVars, + inactive_date: new Date().toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric' + }), + reactivation_url: `${baseUrl}/payments` + }; + + case 'event_invitation': + return { + ...commonVars, + event_title: 'Monaco USA Annual Gala', + event_date: new Date(Date.now() + 14 * 24 * 60 * 60 * 1000).toLocaleDateString('en-US', { + weekday: 'long', + month: 'long', + day: 'numeric', + year: 'numeric' + }), + event_time: '7:00 PM', + event_location: 'Hotel de Paris, Monaco', + event_description: 'Join us for our annual celebration bringing together Americans living in Monaco.', + event_url: `${baseUrl}/events/test-event`, + rsvp_url: `${baseUrl}/events/test-event` + }; + + case 'event_reminder': + return { + ...commonVars, + event_title: 'Monaco USA Monthly Meetup', + event_date: new Date(Date.now() + 1 * 24 * 60 * 60 * 1000).toLocaleDateString('en-US', { + weekday: 'long', + month: 'long', + day: 'numeric', + year: 'numeric' + }), + event_time: '6:00 PM', + event_location: 'Stars n Bars, Monaco', + event_url: `${baseUrl}/events/test-event` + }; + + case 'waitlist_promotion': + return { + ...commonVars, + event_title: 'Exclusive Wine Tasting Event', + event_date: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toLocaleDateString('en-US', { + weekday: 'long', + month: 'long', + day: 'numeric', + year: 'numeric' + }), + event_time: '8:00 PM', + event_location: 'Cave Princesse, Monaco', + event_url: `${baseUrl}/events/test-event`, + confirm_url: `${baseUrl}/events/test-event` + }; + + default: + return commonVars; + } +} diff --git a/src/routes/(app)/admin/email-testing/+page.svelte b/src/routes/(app)/admin/email-testing/+page.svelte new file mode 100644 index 0000000..3001952 --- /dev/null +++ b/src/routes/(app)/admin/email-testing/+page.svelte @@ -0,0 +1,561 @@ + + + + Email Testing | Monaco USA Admin + + +
+ +
+
+

Email Testing

+

Test email notifications across the platform

+
+ + + Email Settings + +
+ + + {#if !smtpConfigured} +
+
+ +
+

SMTP Not Configured

+

+ Email sending is not configured. Please configure SMTP settings in the + Admin Settings + before testing emails. +

+
+
+
+ {/if} + + + {#if form?.success} +
+
+ + {form.success} +
+
+ {/if} + + {#if form?.error} +
+
+ + {form.error} +
+
+ {/if} + + +
+ + + +
+ + + {#if activeTab === 'templates'} +
+ +
+ {#each Object.entries(templatesByCategory || {}) as [category, categoryTemplates]} +
+
+

{getCategoryName(category)}

+
+
+ {#each categoryTemplates as template} +
(selectedTemplate = template.template_key)} + onkeydown={(e) => e.key === 'Enter' && (selectedTemplate = template.template_key)} + role="button" + tabindex="0" + > +
+

{template.name}

+

{template.subject}

+
+
+ {#if template.is_active} + + Active + + {:else} + + Inactive + + {/if} +
+
+ {/each} +
+
+ {/each} + + {#if !templates || templates.length === 0} +
+ +

No Email Templates

+

+ No email templates have been configured yet. +

+
+ {/if} +
+ + +
+
+

Send Test Email

+ +
{ + isLoading = true; + return async ({ update }) => { + isLoading = false; + await update(); + await invalidateAll(); + }; + }} + class="space-y-4" + > +
+ + +
+ +
+ + +
+ +
+ +
+
+ + + {#if selectedTemplate} +
{ + isLoadingPreview = true; + return async ({ result, update }) => { + isLoadingPreview = false; + if (result.type === 'success' && result.data?.preview) { + previewHtml = result.data.preview.html; + previewSubject = result.data.preview.subject; + showPreview = true; + } + await update(); + }; + }} + class="mt-4" + > + + +
+ {/if} + + +
+

Bulk Testing

+
{ + if (!confirm(`This will send ALL active email templates to ${recipientEmail}. Continue?`)) { + return async () => {}; + } + isLoading = true; + return async ({ update }) => { + isLoading = false; + await update(); + await invalidateAll(); + }; + }} + > + + +
+

+ Sends all active templates to test the complete notification system. +

+
+
+
+
+ {/if} + + + {#if activeTab === 'custom'} +
+
+

Send Custom Test Email

+

+ Send a custom email using the Monaco USA branding template. +

+ +
{ + isLoading = true; + return async ({ update }) => { + isLoading = false; + await update(); + await invalidateAll(); + }; + }} + class="space-y-4" + > +
+ + +
+ +
+ + +
+ +
+ + +

+ The message will be wrapped in the Monaco USA email template. +

+
+ + +
+
+
+ {/if} + + + {#if activeTab === 'logs'} +
+
+

Recent Email Logs

+ +
+ + {#if recentLogs.length === 0} +
+ +

No Email Logs

+

No emails have been sent yet.

+
+ {:else} +
+ + + + + + + + + + + + + {#each recentLogs as log} + {@const statusBadge = getStatusBadge(log.status)} + + + + + + + + + {#if log.status === 'failed' && log.error_message} + + + + {/if} + {/each} + +
StatusRecipientSubjectTypeSentBy
+ + + {log.status} + + +
+

{log.recipient_email}

+ {#if log.recipient_name} +

{log.recipient_name}

+ {/if} +
+
+

+ {log.subject} +

+
+ + {log.email_type || 'manual'} + + + {log.sent_at ? formatDate(log.sent_at) : formatDate(log.created_at)} + + {#if log.sender} + {log.sender.first_name} {log.sender.last_name} + {:else} + System + {/if} +
+

+ Error: {log.error_message} +

+
+
+ {/if} +
+ {/if} +
+ + +{#if showPreview} +
+
+
+
+

Email Preview

+

{previewSubject}

+
+ +
+
+
+ {@html previewHtml} +
+
+
+ +
+
+
+{/if} diff --git a/src/routes/(app)/admin/members/+page.server.ts b/src/routes/(app)/admin/members/+page.server.ts new file mode 100644 index 0000000..a56b1ad --- /dev/null +++ b/src/routes/(app)/admin/members/+page.server.ts @@ -0,0 +1,430 @@ +import { fail } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; +import { supabaseAdmin } from '$lib/server/supabase'; +import { sendEmail } from '$lib/server/email'; + +export const load: PageServerLoad = async ({ locals, url }) => { + const searchQuery = url.searchParams.get('search') || ''; + const roleFilter = url.searchParams.get('role') || 'all'; + const statusFilter = url.searchParams.get('status') || 'all'; + + // Load all members with dues info using admin client (bypasses RLS for admin page) + const { data: members } = await supabaseAdmin + .from('members_with_dues') + .select('*') + .order('created_at', { ascending: false }); + + // Filter members + let filteredMembers = members || []; + + if (searchQuery) { + const lowerSearch = searchQuery.toLowerCase(); + filteredMembers = filteredMembers.filter( + (m: any) => + m.first_name?.toLowerCase().includes(lowerSearch) || + m.last_name?.toLowerCase().includes(lowerSearch) || + m.email?.toLowerCase().includes(lowerSearch) || + m.member_id?.toLowerCase().includes(lowerSearch) + ); + } + + if (roleFilter !== 'all') { + filteredMembers = filteredMembers.filter((m: any) => m.role === roleFilter); + } + + if (statusFilter !== 'all') { + filteredMembers = filteredMembers.filter((m: any) => m.status_name === statusFilter); + } + + // Load membership statuses for dropdown + const { data: statuses } = await supabaseAdmin + .from('membership_statuses') + .select('*') + .order('sort_order', { ascending: true }); + + // Calculate stats + const stats = { + total: members?.length || 0, + admins: members?.filter((m: any) => m.role === 'admin').length || 0, + board: members?.filter((m: any) => m.role === 'board').length || 0, + members: members?.filter((m: any) => m.role === 'member').length || 0 + }; + + return { + members: filteredMembers, + statuses: statuses || [], + stats, + filters: { + search: searchQuery, + role: roleFilter, + status: statusFilter + } + }; +}; + +export const actions: Actions = { + updateRole: async ({ request, locals }) => { + const formData = await request.formData(); + const memberId = formData.get('member_id') as string; + const newRole = formData.get('role') as string; + + if (!memberId || !newRole) { + return fail(400, { error: 'Member ID and role are required' }); + } + + if (!['member', 'board', 'admin'].includes(newRole)) { + return fail(400, { error: 'Invalid role' }); + } + + const { error } = await locals.supabase + .from('members') + .update({ role: newRole, updated_at: new Date().toISOString() }) + .eq('id', memberId); + + if (error) { + console.error('Update role error:', error); + return fail(500, { error: 'Failed to update role' }); + } + + return { success: 'Role updated successfully!' }; + }, + + updateStatus: async ({ request, locals }) => { + const formData = await request.formData(); + const memberId = formData.get('member_id') as string; + const statusId = formData.get('status_id') as string; + + if (!memberId || !statusId) { + return fail(400, { error: 'Member ID and status are required' }); + } + + const { error } = await locals.supabase + .from('members') + .update({ + membership_status_id: statusId, + updated_at: new Date().toISOString() + }) + .eq('id', memberId); + + if (error) { + console.error('Update status error:', error); + return fail(500, { error: 'Failed to update status' }); + } + + return { success: 'Status updated successfully!' }; + }, + + deleteMember: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || member.role !== 'admin') { + return fail(403, { error: 'Only admins can delete members' }); + } + + const formData = await request.formData(); + const memberId = formData.get('member_id') as string; + + if (!memberId) { + return fail(400, { error: 'Member ID is required' }); + } + + // Prevent admin from deleting themselves + if (memberId === member.id) { + return fail(400, { error: 'You cannot delete your own account' }); + } + + // First handle related records that have foreign keys to members + + // Reassign events created by this member to the current admin + await supabaseAdmin + .from('events') + .update({ created_by: member.id }) + .eq('created_by', memberId); + + // Reassign app_settings updated by this member to the current admin + await supabaseAdmin + .from('app_settings') + .update({ updated_by: member.id }) + .eq('updated_by', memberId); + + // Delete dues payments + await supabaseAdmin.from('dues_payments').delete().eq('member_id', memberId); + + // Delete event RSVPs + await supabaseAdmin.from('event_rsvps').delete().eq('member_id', memberId); + + // Delete email logs + await supabaseAdmin.from('email_logs').delete().eq('recipient_id', memberId); + await supabaseAdmin.from('email_logs').delete().eq('sent_by', memberId); + + // Now delete from members table using admin client (bypasses RLS) + const { error } = await supabaseAdmin.from('members').delete().eq('id', memberId); + + if (error) { + console.error('Delete member error:', error); + console.error('Error details:', JSON.stringify(error, null, 2)); + return fail(500, { error: `Failed to delete member: ${error.message}` }); + } + + // Also delete the auth user using admin client + const { error: authError } = await supabaseAdmin.auth.admin.deleteUser(memberId); + + if (authError) { + console.error('Delete auth user error:', authError); + // Member is already deleted, just log this + } + + return { success: 'Member deleted successfully!' }; + }, + + inviteMember: async ({ request, locals, url }) => { + const { member } = await locals.safeGetSession(); + + if (!member || member.role !== 'admin') { + return fail(403, { error: 'Only admins can invite members' }); + } + + const formData = await request.formData(); + const email = (formData.get('email') as string)?.trim().toLowerCase(); + const firstName = (formData.get('first_name') as string)?.trim() || ''; + const lastName = (formData.get('last_name') as string)?.trim() || ''; + const role = (formData.get('role') as string) || 'member'; + const duesPaidDate = formData.get('dues_paid_date') as string; + + if (!email) { + return fail(400, { error: 'Email is required' }); + } + + // Validate role + if (!['member', 'board', 'admin'].includes(role)) { + return fail(400, { error: 'Invalid role' }); + } + + // Validate email format + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(email)) { + return fail(400, { error: 'Please enter a valid email address' }); + } + + // Check if email already exists + const { data: existingMember } = await locals.supabase + .from('members') + .select('id') + .eq('email', email) + .single(); + + if (existingMember) { + return fail(400, { error: 'A member with this email already exists' }); + } + + // Get default status (pending) + const { data: defaultStatus } = await locals.supabase + .from('membership_statuses') + .select('id') + .eq('is_default', true) + .single(); + + // Get default membership type + const { data: defaultType } = await locals.supabase + .from('membership_types') + .select('id, annual_dues') + .eq('is_default', true) + .single(); + + // Create auth user with a temporary password using admin client (requires service_role) + // The user will reset their password when they first log in + const tempPassword = crypto.randomUUID(); + + const { data: authData, error: authError } = await supabaseAdmin.auth.admin.createUser({ + email, + password: tempPassword, + email_confirm: true, // Auto-confirm the email since admin is inviting + user_metadata: { + first_name: firstName || 'New', + last_name: lastName || 'Member', + invited_by: member.id + } + }); + + if (authError) { + console.error('Auth user creation error:', authError); + if (authError.message.includes('already registered')) { + return fail(400, { error: 'This email is already registered' }); + } + return fail(500, { error: 'Failed to create user account. Please try again.' }); + } + + if (!authData.user) { + return fail(500, { error: 'Failed to create user account' }); + } + + // Get active status if dues are paid + let statusId = defaultStatus?.id; + if (duesPaidDate) { + const { data: activeStatus } = await locals.supabase + .from('membership_statuses') + .select('id') + .eq('name', 'active') + .single(); + if (activeStatus) { + statusId = activeStatus.id; + } + } + + // Create member record + const { error: memberError } = await locals.supabase.from('members').insert({ + id: authData.user.id, + first_name: firstName || 'New', + last_name: lastName || 'Member', + email: email, + phone: '', + date_of_birth: '1990-01-01', // Placeholder - member will update + address: 'TBD', // Placeholder + nationality: [], + role: role, + membership_status_id: statusId, + membership_type_id: defaultType?.id + }); + + if (memberError) { + console.error('Member creation error:', memberError); + // Clean up auth user using admin client + await supabaseAdmin.auth.admin.deleteUser(authData.user.id); + return fail(500, { error: 'Failed to create member record. Please try again.' }); + } + + // Create dues payment record if dues paid date is provided + // The dues_paid_date is the date when dues are NEXT due (not when paid) + // So we calculate payment_date as 1 year before the due date + if (duesPaidDate) { + const dueDate = new Date(duesPaidDate); + const paymentDate = new Date(dueDate); + paymentDate.setFullYear(paymentDate.getFullYear() - 1); + + const { error: duesError } = await locals.supabase.from('dues_payments').insert({ + member_id: authData.user.id, + amount: defaultType?.annual_dues || 0, + payment_date: paymentDate.toISOString().split('T')[0], + due_date: duesPaidDate, + payment_method: 'other', + notes: 'Initial dues set by admin during member invitation', + recorded_by: member.id + }); + + if (duesError) { + console.error('Dues payment creation error:', duesError); + // Non-critical - member still created + } + } + + // Send welcome email with Monaco branding + const baseUrl = url.origin; + const logoUrl = `${baseUrl}/MONACOUSA-Flags_376x376.png`; + const memberFirstName = firstName || 'New Member'; + + // Format dues paid date for display + const formattedDuesPaidDate = duesPaidDate + ? new Date(duesPaidDate).toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric' + }) + : null; + + // Dues section for the email + const duesSection = duesPaidDate + ? `
+

Membership Status

+

Status: Active Member

+

Dues Paid Through: ${formattedDuesPaidDate}

+
` + : ''; + + const welcomeEmailResult = await sendEmail({ + to: email, + subject: `Welcome to Monaco USA, ${memberFirstName}!`, + html: ` + + + + + + + + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

Welcome to Monaco USA!

+

Dear ${memberFirstName},

+

We are thrilled to welcome you to the Monaco USA community! Your membership account has been created and you are now part of our growing network of Americans in Monaco.

+ ${duesSection} +
+

To get started:

+
    +
  1. You will receive a separate email shortly to set up your password
  2. +
  3. Log in to your member portal at ${baseUrl}
  4. +
  5. Complete your profile with your details
  6. +
  7. Explore upcoming events and connect with fellow members
  8. +
+
+

If you have any questions, please don't hesitate to reach out to our board members.

+

Best regards,
The Monaco USA Team

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+ +`, + recipientId: authData.user.id, + recipientName: `${firstName} ${lastName}`.trim() || 'New Member', + emailType: 'welcome', + sentBy: member.id + }); + + if (!welcomeEmailResult.success) { + console.error('Welcome email error:', welcomeEmailResult.error); + // Non-critical - member still created + } + + // Send password reset email so user can set their own password + const { error: resetError } = await locals.supabase.auth.resetPasswordForEmail(email, { + redirectTo: `${url.origin}/auth/reset-password` + }); + + if (resetError) { + console.error('Password reset email error:', resetError); + // Member created but email failed - not critical + } + + return { + success: `Invitation sent to ${email}! They will receive a welcome email and instructions to set up their password.` + }; + } +}; diff --git a/src/routes/(app)/admin/members/+page.svelte b/src/routes/(app)/admin/members/+page.svelte new file mode 100644 index 0000000..74ff84d --- /dev/null +++ b/src/routes/(app)/admin/members/+page.svelte @@ -0,0 +1,596 @@ + + + + User Management | Monaco USA Admin + + +
+
+
+

User Management

+

Manage member accounts, roles, and statuses

+
+ +
+ + {#if form?.error} +
+ {form.error} +
+ {/if} + + {#if form?.success} +
+ {form.success} +
+ {/if} + + +
+
+
+
+ +
+
+

{stats.total}

+

Total Users

+
+
+
+
+
+
+ +
+
+

{stats.admins}

+

Admins

+
+
+
+
+
+
+ +
+
+

{stats.board}

+

Board Members

+
+
+
+
+
+
+ +
+
+

{stats.members}

+

Members

+
+
+
+
+ + +
+
+
+ + { + searchQuery = e.currentTarget.value; + handleSearch(e.currentTarget.value); + }} + class="h-10 pl-9" + /> +
+ + + + +
+
+ + +
+ {#if members.length === 0} +
+ +

No users found

+

Try adjusting your search or filters.

+
+ {:else} +
+ + + + + + + + + + + + + {#each members as member} + {@const roleInfo = getRoleInfo(member.role)} + {@const statusInfo = getStatusInfo(member.status_name)} + + + + + + + + + {/each} + +
UserContactRoleStatusJoinedActions
+
+ {#if member.avatar_url} + + {:else} +
+ {member.first_name?.[0]}{member.last_name?.[0]} +
+ {/if} +
+
+

+ {member.first_name} {member.last_name} +

+ {#if member.nationality && member.nationality.length > 0} +
+ {#each member.nationality as code} + + {/each} +
+ {/if} +
+

{member.member_id}

+
+
+
+
+
+ + {member.email} +
+ {#if member.phone} +
+ + {member.phone} +
+ {/if} +
+
+
{ + return async ({ update }) => { + await invalidateAll(); + await update(); + }; + }} + class="inline" + > + + +
+
+
{ + return async ({ update }) => { + await invalidateAll(); + await update(); + }; + }} + class="inline" + > + + +
+
+ {formatDate(member.member_since)} + + +
+
+ {/if} +
+
+ + +{#if showDeleteConfirm && memberToDelete} +
+
+
+ +

Delete Member

+
+ +

+ Are you sure you want to delete {memberToDelete.first_name} {memberToDelete.last_name} + ({memberToDelete.member_id})? This action cannot be undone. +

+ +

+ This will permanently delete their account, payment history, and all associated data. +

+ +
+ +
{ + return async ({ update, result }) => { + if (result.type === 'success') { + showDeleteConfirm = false; + memberToDelete = null; + await invalidateAll(); + } + await update(); + }; + }} + class="flex-1" + > + + +
+
+
+
+{/if} + + +{#if showInviteModal} +
+
+
+ +

Invite New Member

+
+ +

+ Send an invitation email to a new member. They will receive instructions to set up their account. +

+ +
{ + inviteLoading = true; + return async ({ update, result }) => { + inviteLoading = false; + if (result.type === 'success') { + await invalidateAll(); + } + await update(); + }; + }} + class="space-y-4" + > +
+ + +
+ +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + inviteDuesPaidDate = e.currentTarget.value} + disabled={inviteLoading} + class="h-11 w-full rounded-md border border-slate-200 bg-white px-3 text-sm focus:border-monaco-500 focus:outline-none focus:ring-1 focus:ring-monaco-500" + /> +
+
+ +

+ * Required field. Other fields are optional - the member can update their profile after joining. +

+ +
+ + +
+
+
+
+{/if} diff --git a/src/routes/(app)/admin/settings/+page.server.ts b/src/routes/(app)/admin/settings/+page.server.ts new file mode 100644 index 0000000..47105ab --- /dev/null +++ b/src/routes/(app)/admin/settings/+page.server.ts @@ -0,0 +1,709 @@ +import { fail } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; +import { testSmtpConnection, sendTemplatedEmail } from '$lib/server/email'; +import { testS3Connection, clearS3ClientCache } from '$lib/server/storage'; +import * as poste from '$lib/server/poste'; + +export const load: PageServerLoad = async ({ locals }) => { + // Load all configurable data + const [ + { data: membershipStatuses }, + { data: membershipTypes }, + { data: eventTypes }, + { data: documentCategories }, + { data: appSettings }, + { data: emailTemplates } + ] = await Promise.all([ + locals.supabase.from('membership_statuses').select('*').order('sort_order', { ascending: true }), + locals.supabase.from('membership_types').select('*').order('sort_order', { ascending: true }), + locals.supabase.from('event_types').select('*').order('sort_order', { ascending: true }), + locals.supabase.from('document_categories').select('*').order('sort_order', { ascending: true }), + locals.supabase.from('app_settings').select('*'), + locals.supabase.from('email_templates').select('template_key, template_name, category').eq('is_active', true).order('category').order('template_name') + ]); + + // Convert settings to object by category + const settings: Record> = {}; + for (const setting of appSettings || []) { + if (!settings[setting.category]) { + settings[setting.category] = {}; + } + settings[setting.category][setting.setting_key] = setting.setting_value; + } + + return { + membershipStatuses: membershipStatuses || [], + membershipTypes: membershipTypes || [], + eventTypes: eventTypes || [], + documentCategories: documentCategories || [], + settings, + emailTemplates: emailTemplates || [] + }; +}; + +export const actions: Actions = { + // Membership Status actions + createStatus: async ({ request, locals }) => { + const formData = await request.formData(); + const name = formData.get('name') as string; + const displayName = formData.get('display_name') as string; + const color = formData.get('color') as string; + const description = formData.get('description') as string; + + if (!name || !displayName) { + return fail(400, { error: 'Name and display name are required' }); + } + + const { error } = await locals.supabase.from('membership_statuses').insert({ + name: name.toLowerCase().replace(/\s+/g, '_'), + display_name: displayName, + color: color || '#6b7280', + description: description || null + }); + + if (error) { + console.error('Create status error:', error); + return fail(500, { error: 'Failed to create status' }); + } + + return { success: 'Status created successfully!' }; + }, + + deleteStatus: async ({ request, locals }) => { + const formData = await request.formData(); + const id = formData.get('id') as string; + + const { error } = await locals.supabase.from('membership_statuses').delete().eq('id', id); + + if (error) { + console.error('Delete status error:', error); + return fail(500, { error: 'Failed to delete status' }); + } + + return { success: 'Status deleted!' }; + }, + + // Membership Type actions + createType: async ({ request, locals }) => { + const formData = await request.formData(); + const name = formData.get('name') as string; + const displayName = formData.get('display_name') as string; + const annualDues = formData.get('annual_dues') as string; + const description = formData.get('description') as string; + + if (!name || !displayName || !annualDues) { + return fail(400, { error: 'Name, display name, and annual dues are required' }); + } + + const { error } = await locals.supabase.from('membership_types').insert({ + name: name.toLowerCase().replace(/\s+/g, '_'), + display_name: displayName, + annual_dues: parseFloat(annualDues), + description: description || null + }); + + if (error) { + console.error('Create type error:', error); + return fail(500, { error: 'Failed to create membership type' }); + } + + return { success: 'Membership type created successfully!' }; + }, + + deleteType: async ({ request, locals }) => { + const formData = await request.formData(); + const id = formData.get('id') as string; + + const { error } = await locals.supabase.from('membership_types').delete().eq('id', id); + + if (error) { + console.error('Delete type error:', error); + return fail(500, { error: 'Failed to delete membership type' }); + } + + return { success: 'Membership type deleted!' }; + }, + + // Event Type actions + createEventType: async ({ request, locals }) => { + const formData = await request.formData(); + const name = formData.get('name') as string; + const displayName = formData.get('display_name') as string; + const color = formData.get('color') as string; + + if (!name || !displayName) { + return fail(400, { error: 'Name and display name are required' }); + } + + const { error } = await locals.supabase.from('event_types').insert({ + name: name.toLowerCase().replace(/\s+/g, '_'), + display_name: displayName, + color: color || '#3b82f6' + }); + + if (error) { + console.error('Create event type error:', error); + return fail(500, { error: 'Failed to create event type' }); + } + + return { success: 'Event type created successfully!' }; + }, + + deleteEventType: async ({ request, locals }) => { + const formData = await request.formData(); + const id = formData.get('id') as string; + + const { error } = await locals.supabase.from('event_types').delete().eq('id', id); + + if (error) { + console.error('Delete event type error:', error); + return fail(500, { error: 'Failed to delete event type' }); + } + + return { success: 'Event type deleted!' }; + }, + + // Document Category actions + createCategory: async ({ request, locals }) => { + const formData = await request.formData(); + const name = formData.get('name') as string; + const displayName = formData.get('display_name') as string; + const description = formData.get('description') as string; + + if (!name || !displayName) { + return fail(400, { error: 'Name and display name are required' }); + } + + const { error } = await locals.supabase.from('document_categories').insert({ + name: name.toLowerCase().replace(/\s+/g, '_'), + display_name: displayName, + description: description || null + }); + + if (error) { + console.error('Create category error:', error); + return fail(500, { error: 'Failed to create document category' }); + } + + return { success: 'Document category created successfully!' }; + }, + + deleteCategory: async ({ request, locals }) => { + const formData = await request.formData(); + const id = formData.get('id') as string; + + const { error } = await locals.supabase.from('document_categories').delete().eq('id', id); + + if (error) { + console.error('Delete category error:', error); + return fail(500, { error: 'Failed to delete document category' }); + } + + return { success: 'Document category deleted!' }; + }, + + // Update app settings + updateSettings: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + const formData = await request.formData(); + const category = formData.get('category') as string; + + // Get existing boolean settings for this category to handle unchecked checkboxes + const { data: existingSettings } = await locals.supabase + .from('app_settings') + .select('setting_key, setting_type') + .eq('category', category); + + const existingBooleanKeys = new Set( + (existingSettings || []) + .filter(s => s.setting_type === 'boolean') + .map(s => s.setting_key) + ); + + // Get all settings from form data + const settingsToUpdate: Array<{ key: string; value: any; type: string }> = []; + const processedKeys = new Set(); + + for (const [key, value] of formData.entries()) { + if (key !== 'category' && key.startsWith('setting_')) { + const settingKey = key.replace('setting_', ''); + processedKeys.add(settingKey); + // Handle checkbox values - they come as 'on' when checked + const isCheckbox = value === 'on' || existingBooleanKeys.has(settingKey); + settingsToUpdate.push({ + key: settingKey, + value: isCheckbox ? (value === 'on' || value === 'true') : value, + type: isCheckbox ? 'boolean' : 'text' + }); + } + } + + // Handle unchecked checkboxes - they don't send any value + // For any existing boolean setting NOT in the form data, set to false + for (const booleanKey of existingBooleanKeys) { + if (!processedKeys.has(booleanKey)) { + settingsToUpdate.push({ + key: booleanKey, + value: false, + type: 'boolean' + }); + } + } + + // Update or insert each setting + for (const setting of settingsToUpdate) { + // Try to update first + const { data: existing } = await locals.supabase + .from('app_settings') + .select('id') + .eq('category', category) + .eq('setting_key', setting.key) + .single(); + + if (existing) { + // Update existing + await locals.supabase + .from('app_settings') + .update({ + setting_value: setting.type === 'boolean' ? setting.value : JSON.stringify(setting.value), + updated_at: new Date().toISOString(), + updated_by: member?.id + }) + .eq('category', category) + .eq('setting_key', setting.key); + } else { + // Insert new setting + await locals.supabase + .from('app_settings') + .insert({ + category, + setting_key: setting.key, + setting_value: setting.type === 'boolean' ? setting.value : JSON.stringify(setting.value), + setting_type: setting.type, + display_name: setting.key.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase()), + updated_at: new Date().toISOString(), + updated_by: member?.id + }); + } + } + + // Clear caches if storage settings were updated + if (category === 'storage') { + clearS3ClientCache(); + } + + return { success: 'Settings updated successfully!' }; + }, + + // Test SMTP connection + testSmtp: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + const formData = await request.formData(); + const testEmail = formData.get('test_email') as string; + + // Use the member's email if no test email is provided + const recipientEmail = testEmail || member?.email; + + if (!recipientEmail) { + return fail(400, { error: 'No email address provided for test' }); + } + + // Test SMTP connection and send a test email + const result = await testSmtpConnection(recipientEmail, member?.id); + + if (!result.success) { + return fail(400, { error: result.error || 'SMTP test failed' }); + } + + return { + success: `Test email sent successfully to ${recipientEmail}! Check your inbox.` + }; + }, + + // Test S3/MinIO connection + testS3: async () => { + // Clear cache to ensure fresh settings are used + clearS3ClientCache(); + + // Test S3 connection using the actual client + const result = await testS3Connection(); + + if (!result.success) { + return fail(400, { error: result.error || 'S3 connection test failed' }); + } + + return { + success: 'S3/MinIO connection successful! Bucket is accessible.' + }; + }, + + // Test email template + testEmailTemplate: async ({ request, locals, url }) => { + const { member } = await locals.safeGetSession(); + + if (!member?.email) { + return fail(400, { error: 'No email address found for your account' }); + } + + const formData = await request.formData(); + const templateKey = formData.get('template_key') as string; + + if (!templateKey) { + return fail(400, { error: 'Template key is required' }); + } + + // Get full member details including member_id + const { data: fullMember } = await locals.supabase + .from('members') + .select('member_id') + .eq('id', member.id) + .single(); + + const memberId = fullMember?.member_id || 'MUSA-0001'; + + // Create sample variables for each template type + const sampleVariables: Record> = { + // Welcome/Auth templates + welcome: { + first_name: member.first_name || 'Test', + last_name: member.last_name || 'User', + member_id: memberId, + portal_url: url.origin + }, + password_reset: { + first_name: member.first_name || 'Test', + reset_link: `${url.origin}/reset-password?token=sample-token` + }, + email_verification: { + first_name: member.first_name || 'Test', + verification_link: `${url.origin}/verify?token=sample-token` + }, + // Event templates + rsvp_confirmation: { + first_name: member.first_name || 'Test', + event_title: 'Monaco USA Annual Gala', + event_date: 'Saturday, March 15, 2026', + event_time: '7:00 PM', + event_location: 'Hotel Hermitage, Monaco', + guest_count: '2', + portal_url: `${url.origin}/events` + }, + waitlist_promotion: { + first_name: member.first_name || 'Test', + event_title: 'Monaco USA Annual Gala', + event_date: 'Saturday, March 15, 2026', + event_location: 'Hotel Hermitage, Monaco', + portal_url: `${url.origin}/events` + }, + event_reminder_24hr: { + first_name: member.first_name || 'Test', + event_title: 'Monaco USA Monthly Meetup', + event_date: 'Tomorrow, January 25, 2026', + event_time: '6:30 PM', + event_location: 'Stars\'n\'Bars, Monaco', + guest_count: '1', + portal_url: `${url.origin}/events/sample-event-id` + }, + // Payment/Dues templates + payment_received: { + first_name: member.first_name || 'Test', + amount: '€50.00', + payment_date: 'January 24, 2026', + payment_method: 'Bank Transfer', + new_due_date: 'January 24, 2027', + member_id: memberId + }, + dues_reminder_30: { + first_name: member.first_name || 'Test', + due_date: 'February 24, 2026', + amount: '€50.00', + member_id: memberId, + account_holder: 'Monaco USA Association', + bank_name: 'CMB Monaco', + iban: 'MC00 0000 0000 0000 0000 0000 000', + portal_url: `${url.origin}/payments` + }, + dues_reminder_7: { + first_name: member.first_name || 'Test', + due_date: 'January 31, 2026', + amount: '€50.00', + member_id: memberId, + iban: 'MC00 0000 0000 0000 0000 0000 000', + portal_url: `${url.origin}/payments` + }, + dues_reminder_1: { + first_name: member.first_name || 'Test', + due_date: 'January 25, 2026', + amount: '€50.00', + member_id: memberId, + iban: 'MC00 0000 0000 0000 0000 0000 000', + portal_url: `${url.origin}/payments` + }, + dues_overdue: { + first_name: member.first_name || 'Test', + due_date: 'January 15, 2026', + amount: '€50.00', + days_overdue: '9', + grace_days_remaining: '21', + member_id: memberId, + account_holder: 'Monaco USA Association', + iban: 'MC00 0000 0000 0000 0000 0000 000', + portal_url: `${url.origin}/payments` + }, + dues_grace_warning: { + first_name: member.first_name || 'Test', + due_date: 'December 24, 2025', + amount: '€50.00', + days_overdue: '31', + grace_days_remaining: '7', + grace_end_date: 'February 1, 2026', + member_id: memberId, + iban: 'MC00 0000 0000 0000 0000 0000 000', + portal_url: `${url.origin}/payments` + }, + dues_inactive_notice: { + first_name: member.first_name || 'Test', + amount: '€50.00', + member_id: memberId, + account_holder: 'Monaco USA Association', + iban: 'MC00 0000 0000 0000 0000 0000 000', + portal_url: `${url.origin}/payments` + } + }; + + // Get variables for this template, or use defaults + const variables = sampleVariables[templateKey] || { + first_name: member.first_name || 'Test', + last_name: member.last_name || 'User', + portal_url: url.origin + }; + + // Send test email + const result = await sendTemplatedEmail(templateKey, member.email, variables, { + recipientId: member.id, + recipientName: `${member.first_name} ${member.last_name}`, + baseUrl: url.origin + }); + + if (!result.success) { + return fail(400, { error: result.error || 'Failed to send test email' }); + } + + return { + success: `Test email "${templateKey}" sent to ${member.email}` + }; + }, + + // ============================================ + // Poste Mail Server Actions + // ============================================ + + testPoste: async ({ locals }) => { + // Get Poste settings + const { data: settings } = await locals.supabase + .from('app_settings') + .select('setting_key, setting_value') + .eq('category', 'poste'); + + if (!settings || settings.length === 0) { + return fail(400, { error: 'Poste mail server not configured. Please save settings first.' }); + } + + const config: Record = {}; + for (const s of settings) { + let value = s.setting_value; + if (typeof value === 'string') { + value = value.replace(/^"|"$/g, ''); + } + config[s.setting_key] = value as string; + } + + if (!config.poste_api_host || !config.poste_admin_email || !config.poste_admin_password) { + return fail(400, { error: 'Poste configuration incomplete. Host, admin email, and password are required.' }); + } + + const result = await poste.testConnection({ + host: config.poste_api_host, + adminEmail: config.poste_admin_email, + adminPassword: config.poste_admin_password + }); + + if (!result.success) { + return fail(400, { error: result.error || 'Connection test failed' }); + } + + return { success: 'Connection to Poste mail server successful!' }; + }, + + listMailboxes: async ({ locals }) => { + // Get Poste settings + const { data: settings } = await locals.supabase + .from('app_settings') + .select('setting_key, setting_value') + .eq('category', 'poste'); + + if (!settings || settings.length === 0) { + return fail(400, { error: 'Poste not configured' }); + } + + const config: Record = {}; + for (const s of settings) { + let value = s.setting_value; + if (typeof value === 'string') { + value = value.replace(/^"|"$/g, ''); + } + config[s.setting_key] = value as string; + } + + const result = await poste.listMailboxes({ + host: config.poste_api_host, + adminEmail: config.poste_admin_email, + adminPassword: config.poste_admin_password + }); + + if (!result.success) { + return fail(400, { error: result.error }); + } + + return { mailboxes: result.mailboxes }; + }, + + createMailbox: async ({ request, locals }) => { + const formData = await request.formData(); + const emailPrefix = formData.get('email_prefix') as string; + const displayName = formData.get('display_name') as string; + const password = formData.get('password') as string; + + if (!emailPrefix || !displayName) { + return fail(400, { error: 'Email prefix and display name are required' }); + } + + // Get Poste settings + const { data: settings } = await locals.supabase + .from('app_settings') + .select('setting_key, setting_value') + .eq('category', 'poste'); + + const config: Record = {}; + for (const s of settings || []) { + let value = s.setting_value; + if (typeof value === 'string') { + value = value.replace(/^"|"$/g, ''); + } + config[s.setting_key] = value as string; + } + + const domain = config.poste_domain || 'monacousa.org'; + const fullEmail = `${emailPrefix}@${domain}`; + const actualPassword = password || poste.generatePassword(); + + const result = await poste.createMailbox( + { + host: config.poste_api_host, + adminEmail: config.poste_admin_email, + adminPassword: config.poste_admin_password + }, + { + email: fullEmail, + name: displayName, + password: actualPassword + } + ); + + if (!result.success) { + return fail(400, { error: result.error }); + } + + return { + success: `Mailbox ${fullEmail} created successfully!`, + generatedPassword: password ? undefined : actualPassword + }; + }, + + updateMailbox: async ({ request, locals }) => { + const formData = await request.formData(); + const email = formData.get('email') as string; + const displayName = formData.get('display_name') as string; + const newPassword = formData.get('new_password') as string; + const disabled = formData.get('disabled') === 'true'; + + if (!email) { + return fail(400, { error: 'Email is required' }); + } + + // Get Poste settings + const { data: settings } = await locals.supabase + .from('app_settings') + .select('setting_key, setting_value') + .eq('category', 'poste'); + + const config: Record = {}; + for (const s of settings || []) { + let value = s.setting_value; + if (typeof value === 'string') { + value = value.replace(/^"|"$/g, ''); + } + config[s.setting_key] = value as string; + } + + const updates: { name?: string; password?: string; disabled?: boolean } = {}; + if (displayName) updates.name = displayName; + if (newPassword) updates.password = newPassword; + updates.disabled = disabled; + + const result = await poste.updateMailbox( + { + host: config.poste_api_host, + adminEmail: config.poste_admin_email, + adminPassword: config.poste_admin_password + }, + email, + updates + ); + + if (!result.success) { + return fail(400, { error: result.error }); + } + + return { success: `Mailbox ${email} updated successfully!` }; + }, + + deleteMailbox: async ({ request, locals }) => { + const formData = await request.formData(); + const email = formData.get('email') as string; + + if (!email) { + return fail(400, { error: 'Email is required' }); + } + + // Get Poste settings + const { data: settings } = await locals.supabase + .from('app_settings') + .select('setting_key, setting_value') + .eq('category', 'poste'); + + const config: Record = {}; + for (const s of settings || []) { + let value = s.setting_value; + if (typeof value === 'string') { + value = value.replace(/^"|"$/g, ''); + } + config[s.setting_key] = value as string; + } + + const result = await poste.deleteMailbox( + { + host: config.poste_api_host, + adminEmail: config.poste_admin_email, + adminPassword: config.poste_admin_password + }, + email + ); + + if (!result.success) { + return fail(400, { error: result.error }); + } + + return { success: `Mailbox ${email} deleted successfully!` }; + } +}; diff --git a/src/routes/(app)/admin/settings/+page.svelte b/src/routes/(app)/admin/settings/+page.svelte new file mode 100644 index 0000000..de8a85e --- /dev/null +++ b/src/routes/(app)/admin/settings/+page.svelte @@ -0,0 +1,1703 @@ + + + + Settings | Monaco USA Admin + + +
+
+

Settings

+

Configure membership types, dues, events, and more

+
+ + {#if form?.error} +
+ {form.error} +
+ {/if} + + {#if form?.success} +
+ {form.success} +
+ {/if} + + +
+ +
+ + + {#if activeTab === 'membership'} +
+ +
+
+
+

Membership Statuses

+

Define the different states a membership can be in

+
+ +
+ +
+ + + + + + + + + + + + {#each membershipStatuses as status} + + + + + + + + {/each} + +
NameDisplayColorDefaultActions
{status.name}{status.display_name} + + + {status.is_default ? 'Yes' : ''} + +
+ + +
+
+
+
+ + +
+
+
+

Membership Types

+

Define different membership tiers with pricing

+
+ +
+ +
+ + + + + + + + + + + + {#each membershipTypes as type} + + + + + + + + {/each} + +
NameDisplayAnnual DuesDefaultActions
{type.name}{type.display_name}€{type.annual_dues.toFixed(2)} + {type.is_default ? 'Yes' : ''} + +
+ + +
+
+
+
+
+ {/if} + + + {#if activeTab === 'dues'} +
+

Payment Settings

+

Configure bank details and payment instructions shown to members

+ +
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ + +
+
+ {/if} + + + {#if activeTab === 'events'} +
+
+
+

Event Types

+

Define the different types of events

+
+ +
+ +
+ + + + + + + + + + + {#each eventTypes as eventType} + + + + + + + {/each} + +
NameDisplayColorActions
{eventType.name}{eventType.display_name} + + {eventType.display_name} + + +
+ + +
+
+
+
+ {/if} + + + {#if activeTab === 'documents'} +
+
+
+

Document Categories

+

Define categories for organizing documents

+
+ +
+ +
+ + + + + + + + + + + {#each documentCategories as category} + + + + + + + {/each} + +
NameDisplayDescriptionActions
{category.name}{category.display_name}{category.description || '-'} +
+ + +
+
+
+
+ {/if} + + + {#if activeTab === 'email'} +
+
+

SMTP Email Configuration

+

Configure outgoing email settings for notifications and reminders

+
+ + {#if smtpTestResult} +
+ {#if smtpTestResult.success} + + {:else} + + {/if} + {smtpTestResult.message} +
+ {/if} + +
+ + + +
+ +
+ +

When enabled, the system will send email notifications

+
+
+ + +
+

Server Settings

+
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+

Authentication

+
+
+ + +
+
+ +
+ + +
+
+
+
+ + +
+

Sender Settings

+
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+ +
+
+ +
{ + testingSmtp = true; + smtpTestResult = null; + return async ({ result }) => { + testingSmtp = false; + if (result.type === 'success' && result.data?.success) { + smtpTestResult = { success: true, message: result.data.success }; + } else if (result.type === 'failure' && result.data?.error) { + smtpTestResult = { success: false, message: result.data.error }; + } else { + smtpTestResult = { success: false, message: 'Test failed. Please check your settings.' }; + } + }; + }} + > + +
+
+ + +
+
+
+

Test Email Templates

+

Send test versions of each email template to yourself

+
+ + + Edit Templates + +
+ + {#if templateTestResult} +
+ {#if templateTestResult.success} + + {:else} + + {/if} + {templateTestResult.message} +
+ {/if} + +
+ {#each Object.entries(templatesByCategory) as [category, templates]} +
+

+ {category === 'events' ? 'Events' : category === 'payment' ? 'Payments & Dues' : category === 'auth' ? 'Authentication' : category === 'member' ? 'Membership' : 'Other'} +

+
+ {#each templates as template} +
{ + testingTemplate = template.template_key; + templateTestResult = null; + return async ({ result }) => { + testingTemplate = null; + if (result.type === 'success' && result.data?.success) { + templateTestResult = { success: true, message: result.data.success }; + } else if (result.type === 'failure' && result.data?.error) { + templateTestResult = { success: false, message: result.data.error }; + } else { + templateTestResult = { success: false, message: 'Failed to send test email' }; + } + }; + }} + > + + +
+ {/each} +
+
+ {/each} + + {#if !emailTemplates || emailTemplates.length === 0} +

No email templates found in the database.

+ {/if} +
+
+ {/if} + + + {#if activeTab === 'poste'} +
+ +
+
+

Poste Mail Server Configuration

+

Configure connection to your Poste.io mail server to manage @monacousa.org email accounts

+
+ + {#if posteTestResult} +
+ {#if posteTestResult.success} + + {:else} + + {/if} + {posteTestResult.message} +
+ {/if} + +
+ + +
+
+ + +

The hostname of your Poste mail server

+
+
+ + +
+
+ +
+ + +
+
+
+ + +
+
+ +
+ +
+
+ +
{ + testingPoste = true; + posteTestResult = null; + return async ({ result }) => { + testingPoste = false; + if (result.type === 'success' && result.data?.success) { + posteTestResult = { success: true, message: result.data.success }; + await loadMailboxes(); + } else if (result.type === 'failure' && result.data?.error) { + posteTestResult = { success: false, message: result.data.error }; + } else { + posteTestResult = { success: false, message: 'Connection test failed.' }; + } + }; + }} + > + +
+
+ + +
+
+
+

Email Accounts

+

Manage @monacousa.org email accounts for board members

+
+
+ + +
+
+ + {#if generatedPassword} +
+
+
+

Mailbox created! Generated password:

+ {generatedPassword} +
+ +
+

Save this password now - it cannot be retrieved later.

+
+ {/if} + + {#if loadingMailboxes} +
+ +
+ {:else if mailboxes.length === 0} +
+ +

No mailboxes loaded. Click "Test Connection" to load mailboxes.

+
+ {:else} +
+ + + + + + + + + + + {#each mailboxes as mailbox} + + + + + + + {/each} + +
EmailDisplay NameStatusActions
+ {mailbox.address} + {#if mailbox.super_admin} + Admin + {/if} + {mailbox.name || '-'} + {#if mailbox.disabled} + + + Disabled + + {:else} + + + Active + + {/if} + +
{ + if (!confirm(`Delete mailbox ${mailbox.address}? This cannot be undone.`)) { + return async () => {}; + } + return async ({ result }) => { + if (result.type === 'success') { + await loadMailboxes(); + } + }; + }} + > + + +
+
+
+ {/if} +
+
+ {/if} + + + {#if activeTab === 'storage'} +
+
+

S3/MinIO Storage Configuration

+

Configure external S3-compatible storage for documents and files

+
+ + {#if s3TestResult} +
+ {#if s3TestResult.success} + + {:else} + + {/if} + {s3TestResult.message} +
+ {/if} + +
+ + + +
+ +
+ +

Use external S3/MinIO instead of Supabase Storage

+
+
+ + +
+

Connection Settings

+
+
+ + +

For MinIO, use your MinIO server URL. For AWS S3, leave empty or use regional endpoint.

+
+
+ + +
+
+ + +

Use us-east-1 for MinIO

+
+
+
+ + +
+

Credentials

+
+
+ + +
+
+ +
+ + +
+
+
+
+ + +
+

Options

+
+
+ + +
+
+ +
+ +

Required for MinIO and some S3-compatible services

+
+
+
+
+ +
+ +
+
+ +
{ + testingS3 = true; + s3TestResult = null; + return async ({ result }) => { + testingS3 = false; + if (result.type === 'success' && result.data?.success) { + s3TestResult = { success: true, message: result.data.success }; + } else if (result.type === 'failure' && result.data?.error) { + s3TestResult = { success: false, message: result.data.error }; + } else { + s3TestResult = { success: false, message: 'S3 test failed. Please check your settings.' }; + } + }; + }} + > + +
+
+ {/if} + + + {#if activeTab === 'system'} +
+ +
+

Maintenance Mode

+
+ + +
+ +
+ +

When enabled, non-admin users will see the maintenance message

+
+
+ +
+ + +
+ + +
+
+ + +
+

Session & Security

+
+ + +
+ + +

Default is 168 hours (7 days). Max is 720 hours (30 days).

+
+ + +
+
+ + +
+

File Uploads

+
+ + +
+ + +
+ +
+ +

+ PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT, JPG, JPEG, PNG, WEBP +

+

File type restrictions are enforced on upload

+
+ + +
+
+ + +
+

Public Access

+
+ + +
+
+ +
+ +

Allow non-members to view events marked as public

+
+
+ +
+ +
+ +

Allow non-members to RSVP to public events

+
+
+
+ + +
+
+
+ {/if} +
+ + +{#if showAddStatusModal} +
+
+
+

Add Membership Status

+ +
+ +
{ + isSubmitting = true; + return async ({ update, result }) => { + if (result.type === 'success') { + showAddStatusModal = false; + await invalidateAll(); + } + await update(); + isSubmitting = false; + }; + }} + class="space-y-4" + > +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+{/if} + + +{#if showAddTypeModal} +
+
+
+

Add Membership Type

+ +
+ +
{ + isSubmitting = true; + return async ({ update, result }) => { + if (result.type === 'success') { + showAddTypeModal = false; + await invalidateAll(); + } + await update(); + isSubmitting = false; + }; + }} + class="space-y-4" + > +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+{/if} + + +{#if showAddEventTypeModal} +
+
+
+

Add Event Type

+ +
+ +
{ + isSubmitting = true; + return async ({ update, result }) => { + if (result.type === 'success') { + showAddEventTypeModal = false; + await invalidateAll(); + } + await update(); + isSubmitting = false; + }; + }} + class="space-y-4" + > +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+{/if} + + +{#if showAddCategoryModal} +
+
+
+

Add Document Category

+ +
+ +
{ + isSubmitting = true; + return async ({ update, result }) => { + if (result.type === 'success') { + showAddCategoryModal = false; + await invalidateAll(); + } + await update(); + isSubmitting = false; + }; + }} + class="space-y-4" + > +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+{/if} + + +{#if showCreateMailboxModal} +
+
+
+
+
+ +
+

Create Email Account

+
+ +
+ +
{ + creatingMailbox = true; + return async ({ result }) => { + creatingMailbox = false; + if (result.type === 'success') { + showCreateMailboxModal = false; + if (result.data?.generatedPassword) { + generatedPassword = result.data.generatedPassword; + } + await loadMailboxes(); + } + }; + }} + class="space-y-4" + > +
+ +
+ + + @{getSetting('poste', 'poste_domain', 'monacousa.org')} + +
+

Letters, numbers, dots, dashes, and underscores only

+
+ +
+ + +
+ +
+ +
+ + +
+

If left empty, a secure password will be generated

+
+ +
+ + +
+
+
+
+{/if} diff --git a/src/routes/(app)/board/+layout.server.ts b/src/routes/(app)/board/+layout.server.ts new file mode 100644 index 0000000..41f7dc7 --- /dev/null +++ b/src/routes/(app)/board/+layout.server.ts @@ -0,0 +1,13 @@ +import { redirect } from '@sveltejs/kit'; +import type { LayoutServerLoad } from './$types'; + +export const load: LayoutServerLoad = async ({ parent }) => { + const { member } = await parent(); + + // Only board and admin can access board pages + if (member?.role !== 'board' && member?.role !== 'admin') { + throw redirect(303, '/dashboard'); + } + + return {}; +}; diff --git a/src/routes/(app)/board/documents/+page.server.ts b/src/routes/(app)/board/documents/+page.server.ts new file mode 100644 index 0000000..f1bb830 --- /dev/null +++ b/src/routes/(app)/board/documents/+page.server.ts @@ -0,0 +1,480 @@ +import { fail } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; +import { uploadDocument, deleteDocument, getSignedUrl, isS3Enabled, getActiveDocumentUrl } from '$lib/server/storage'; +import { supabaseAdmin } from '$lib/server/supabase'; + +export const load: PageServerLoad = async ({ locals, url }) => { + const folderId = url.searchParams.get('folder'); + + // Load folders in current directory + let foldersQuery = locals.supabase + .from('document_folders') + .select(` + *, + creator:members!document_folders_created_by_fkey(first_name, last_name) + `) + .order('name', { ascending: true }); + + if (folderId) { + foldersQuery = foldersQuery.eq('parent_id', folderId); + } else { + foldersQuery = foldersQuery.is('parent_id', null); + } + + const { data: folders } = await foldersQuery; + + // Load documents in current folder + let documentsQuery = locals.supabase + .from('documents') + .select(` + *, + category:document_categories(id, name, display_name, icon), + uploader:members!documents_uploaded_by_fkey(first_name, last_name) + `) + .order('created_at', { ascending: false }); + + if (folderId) { + documentsQuery = documentsQuery.eq('folder_id', folderId); + } else { + documentsQuery = documentsQuery.is('folder_id', null); + } + + const { data: documents } = await documentsQuery; + + // Load current folder details for breadcrumbs + let currentFolder = null; + let breadcrumbs: { id: string | null; name: string }[] = [{ id: null, name: 'Documents' }]; + + if (folderId) { + const { data: folder } = await locals.supabase + .from('document_folders') + .select('*') + .eq('id', folderId) + .single(); + + currentFolder = folder; + + // Build breadcrumb path + if (folder?.path) { + const pathParts = folder.path.split('/'); + let currentPath = ''; + + // Get all ancestor folders + for (let i = 0; i < pathParts.length - 1; i++) { + currentPath = currentPath ? `${currentPath}/${pathParts[i]}` : pathParts[i]; + const { data: ancestorFolder } = await locals.supabase + .from('document_folders') + .select('id, name') + .eq('path', currentPath) + .single(); + + if (ancestorFolder) { + breadcrumbs.push({ id: ancestorFolder.id, name: ancestorFolder.name }); + } + } + breadcrumbs.push({ id: folder.id, name: folder.name }); + } + } + + // Load categories + const { data: categories } = await locals.supabase + .from('document_categories') + .select('*') + .eq('is_active', true) + .order('sort_order', { ascending: true }); + + // Resolve active URL for each document based on current storage settings + const s3Enabled = await isS3Enabled(); + const documentsWithActiveUrl = (documents || []).map((doc: any) => ({ + ...doc, + // Compute active URL based on storage setting + active_url: s3Enabled + ? (doc.file_url_s3 || doc.file_path) + : (doc.file_url_local || doc.file_path) + })); + + return { + documents: documentsWithActiveUrl, + folders: folders || [], + categories: categories || [], + currentFolder, + currentFolderId: folderId, + breadcrumbs + }; +}; + +export const actions: Actions = { + createFolder: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to create folders' }); + } + + const formData = await request.formData(); + const name = (formData.get('name') as string)?.trim(); + const parentId = formData.get('parent_id') as string | null; + const visibility = (formData.get('visibility') as string) || 'members'; + + if (!name) { + return fail(400, { error: 'Folder name is required' }); + } + + // Validate folder name + if (name.includes('/') || name.includes('\\')) { + return fail(400, { error: 'Folder name cannot contain slashes' }); + } + + const { error } = await locals.supabase.from('document_folders').insert({ + name, + parent_id: parentId || null, + visibility, + created_by: member.id + }); + + if (error) { + console.error('Create folder error:', error); + if (error.code === '23505') { + return fail(400, { error: 'A folder with this name already exists here' }); + } + return fail(500, { error: 'Failed to create folder' }); + } + + return { success: 'Folder created!' }; + }, + + renameFolder: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to rename folders' }); + } + + const formData = await request.formData(); + const folderId = formData.get('folder_id') as string; + const name = (formData.get('name') as string)?.trim(); + + if (!folderId || !name) { + return fail(400, { error: 'Folder ID and name are required' }); + } + + if (name.includes('/') || name.includes('\\')) { + return fail(400, { error: 'Folder name cannot contain slashes' }); + } + + const { error } = await locals.supabase + .from('document_folders') + .update({ name }) + .eq('id', folderId); + + if (error) { + console.error('Rename folder error:', error); + if (error.code === '23505') { + return fail(400, { error: 'A folder with this name already exists here' }); + } + return fail(500, { error: 'Failed to rename folder' }); + } + + return { success: 'Folder renamed!' }; + }, + + deleteFolder: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || member.role !== 'admin') { + return fail(403, { error: 'Only admins can delete folders' }); + } + + const formData = await request.formData(); + const folderId = formData.get('folder_id') as string; + + if (!folderId) { + return fail(400, { error: 'Folder ID is required' }); + } + + // Check if folder has documents + const { data: docs } = await locals.supabase + .from('documents') + .select('id') + .eq('folder_id', folderId) + .limit(1); + + if (docs && docs.length > 0) { + return fail(400, { error: 'Cannot delete folder with documents. Move or delete documents first.' }); + } + + // Check if folder has subfolders + const { data: subfolders } = await locals.supabase + .from('document_folders') + .select('id') + .eq('parent_id', folderId) + .limit(1); + + if (subfolders && subfolders.length > 0) { + return fail(400, { error: 'Cannot delete folder with subfolders. Delete subfolders first.' }); + } + + const { error } = await locals.supabase + .from('document_folders') + .delete() + .eq('id', folderId); + + if (error) { + console.error('Delete folder error:', error); + return fail(500, { error: 'Failed to delete folder' }); + } + + return { success: 'Folder deleted!' }; + }, + + moveDocument: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to move documents' }); + } + + const formData = await request.formData(); + const documentId = formData.get('document_id') as string; + const folderId = formData.get('folder_id') as string | null; + + if (!documentId) { + return fail(400, { error: 'Document ID is required' }); + } + + const { error } = await locals.supabase + .from('documents') + .update({ + folder_id: folderId || null, + updated_at: new Date().toISOString() + }) + .eq('id', documentId); + + if (error) { + console.error('Move document error:', error); + return fail(500, { error: 'Failed to move document' }); + } + + return { success: 'Document moved!' }; + }, + + upload: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to upload documents' }); + } + + const formData = await request.formData(); + const file = formData.get('file') as File; + const title = formData.get('title') as string; + const description = formData.get('description') as string; + const categoryId = formData.get('category_id') as string; + const visibility = formData.get('visibility') as string; + const folderId = formData.get('folder_id') as string | null; + + // Validation + if (!file || !file.size) { + return fail(400, { error: 'Please select a file to upload' }); + } + + if (!title) { + return fail(400, { error: 'Title is required' }); + } + + // Upload using dual-storage document service (uploads to both S3 and Supabase Storage) + const uploadResult = await uploadDocument(file); + + if (!uploadResult.success) { + console.error('Upload error:', uploadResult.error); + return fail(500, { error: uploadResult.error || 'Failed to upload file. Please try again.' }); + } + + // Create document record with both URLs for storage flexibility + const { error: insertError } = await locals.supabase.from('documents').insert({ + title, + description: description || null, + category_id: categoryId || null, + folder_id: folderId || null, + // Primary URL (computed based on active storage setting) + file_path: uploadResult.publicUrl || uploadResult.path, + // Dual storage URLs + file_url_local: uploadResult.localUrl || null, + file_url_s3: uploadResult.s3Url || null, + storage_path: uploadResult.path, + // File metadata + file_name: file.name, + file_size: file.size, + mime_type: file.type, + visibility: visibility || 'members', + uploaded_by: member.id + }); + + if (insertError) { + // Try to clean up uploaded files from both backends + if (uploadResult.path) { + await deleteDocument(uploadResult.path); + } + console.error('Insert error:', insertError); + return fail(500, { error: 'Failed to save document. Please try again.' }); + } + + return { success: 'Document uploaded successfully!' }; + }, + + delete: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || member.role !== 'admin') { + return fail(403, { error: 'Only admins can delete documents' }); + } + + const formData = await request.formData(); + const documentId = formData.get('document_id') as string; + + if (!documentId) { + return fail(400, { error: 'Document ID is required' }); + } + + // Get document to find storage path + const { data: doc } = await locals.supabase + .from('documents') + .select('storage_path, file_path') + .eq('id', documentId) + .single(); + + // Delete from database + const { error: deleteError } = await locals.supabase + .from('documents') + .delete() + .eq('id', documentId); + + if (deleteError) { + console.error('Delete error:', deleteError); + return fail(500, { error: 'Failed to delete document' }); + } + + // Delete from ALL storage backends (both S3 and Supabase Storage) + if (doc?.storage_path) { + // Use the storage_path directly + await deleteDocument(doc.storage_path); + } else if (doc?.file_path) { + // Fallback for older documents without storage_path + try { + let storagePath = doc.file_path; + + // If it's a URL, extract the path + if (doc.file_path.startsWith('http')) { + const url = new URL(doc.file_path); + // Handle Supabase storage URL format + const supabaseMatch = url.pathname.match(/\/storage\/v1\/object\/public\/documents\/(.+)/); + if (supabaseMatch) { + storagePath = supabaseMatch[1]; + } else { + // Handle S3 URL format + const s3Match = url.pathname.match(/\/documents\/(.+)/); + if (s3Match) { + storagePath = s3Match[1]; + } + } + } + + await deleteDocument(storagePath); + } catch (e) { + console.error('Failed to delete file from storage:', e); + } + } + + return { success: 'Document deleted successfully!' }; + }, + + updateVisibility: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to update documents' }); + } + + const formData = await request.formData(); + const documentId = formData.get('document_id') as string; + const visibility = formData.get('visibility') as string; + + if (!documentId || !visibility) { + return fail(400, { error: 'Document ID and visibility are required' }); + } + + const { error: updateError } = await locals.supabase + .from('documents') + .update({ + visibility, + updated_at: new Date().toISOString() + }) + .eq('id', documentId); + + if (updateError) { + console.error('Update error:', updateError); + return fail(500, { error: 'Failed to update document' }); + } + + return { success: 'Visibility updated!' }; + }, + + getPreviewUrl: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member) { + return fail(401, { error: 'Not authenticated' }); + } + + const formData = await request.formData(); + const documentId = formData.get('document_id') as string; + + if (!documentId) { + return fail(400, { error: 'Document ID is required' }); + } + + // Get document with all URL columns + const { data: doc } = await locals.supabase + .from('documents') + .select('*') + .eq('id', documentId) + .single(); + + if (!doc) { + return fail(404, { error: 'Document not found' }); + } + + // Check visibility permissions + const canAccess = + doc.visibility === 'public' || + (doc.visibility === 'members') || + (doc.visibility === 'board' && ['board', 'admin'].includes(member.role)) || + (doc.visibility === 'admin' && member.role === 'admin'); + + if (!canAccess) { + return fail(403, { error: 'You do not have permission to view this document' }); + } + + // Get the active URL based on current storage settings + const activeUrl = await getActiveDocumentUrl({ + file_url_s3: doc.file_url_s3, + file_url_local: doc.file_url_local, + file_path: doc.file_path + }); + + // If we have a public URL, return it + if (activeUrl && activeUrl.startsWith('http')) { + return { previewUrl: activeUrl }; + } + + // Generate signed URL for private storage using storage_path or file_path + const storagePath = doc.storage_path || doc.file_path; + const { url, error } = await getSignedUrl('documents', storagePath, 3600); + + if (error || !url) { + return fail(500, { error: 'Failed to generate preview URL' }); + } + + return { previewUrl: url }; + } +}; diff --git a/src/routes/(app)/board/documents/+page.svelte b/src/routes/(app)/board/documents/+page.svelte new file mode 100644 index 0000000..2eb1750 --- /dev/null +++ b/src/routes/(app)/board/documents/+page.svelte @@ -0,0 +1,719 @@ + + + + Document Management | Monaco USA + + +
+ +
+
+

Document Management

+

Upload and manage association documents

+
+ +
+ {#if canEdit} + + {/if} + + +
+
+ + {#if form?.error} +
+ {form.error} +
+ {/if} + + {#if form?.success} +
+ {form.success} +
+ {/if} + + + {#if breadcrumbs && breadcrumbs.length > 0} +
+ +
+ {/if} + + +
+
+
+ + +
+ + +
+
+ + + {#if filteredFolders.length > 0} +
+

Folders

+
+ {#each filteredFolders as folder} + + {/each} +
+
+ {/if} + + +
+ {#if filteredFolders.length === 0 && filteredDocuments.length === 0} +
+ +

+ {currentFolderId ? 'This folder is empty' : 'No documents found'} +

+

+ {searchQuery || selectedCategory + ? 'Try adjusting your search or filters.' + : currentFolderId + ? 'Upload documents or create subfolders to get started.' + : 'Upload your first document to get started.'} +

+
+ {:else if filteredDocuments.length === 0} +
+ +

No documents in this location

+

+ Documents you upload here will appear in this list. +

+
+ {:else} +
+

+ Documents ({filteredDocuments.length}) +

+
+ + + + + + + + + + + + {#each filteredDocuments as doc} + {@const visInfo = getVisibilityLabel(doc.visibility)} + + + + + + + + {/each} + +
+ Document + + Category + + Visibility + + Uploaded + + Actions +
+ + + {doc.category?.display_name || '-'} + +
{ + return async ({ update }) => { + await invalidateAll(); + await update(); + }; + }} + class="inline" + > + + +
+
+
+

{formatDate(doc.created_at)}

+

+ by {doc.uploader?.first_name} {doc.uploader?.last_name} +

+
+
+
+ + + + + {#if canDelete} + + {/if} +
+
+
+
+ {/if} +
+
+ + +{#if showCreateFolderModal} + (showCreateFolderModal = false)} + /> +{/if} + + +{#if showPreviewModal && documentToPreview} + { + showPreviewModal = false; + documentToPreview = null; + }} + /> +{/if} + + +{#if showUploadModal} +
+
+
+

Upload Document

+ +
+ +
{ + isSubmitting = true; + return async ({ update, result }) => { + await invalidateAll(); + isSubmitting = false; + if (result.type === 'success') { + resetUploadForm(); + } + await update(); + }; + }} + class="space-y-4" + > + + {#if currentFolderId} + + {/if} + + +
+ + + {#if selectedFile} +
+ +
+

{selectedFile.name}

+

{formatFileSize(selectedFile.size)}

+
+ +
+ {:else} + +

+ Drag and drop or click to select +

+

+ PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT, CSV, JSON, JPG, PNG, GIF (max 50MB) +

+ {/if} +
+ +
+ + +
+ +
+ + +
+ +
+
+ + +
+ +
+ + +
+
+ +
+ + +
+
+
+
+{/if} + + +{#if showDeleteConfirm && documentToDelete} +
+
+
+ +

+ Delete {documentToDelete.isFolder ? 'Folder' : 'Document'} +

+
+ +

+ Are you sure you want to delete {documentToDelete.title || documentToDelete.name}? This action cannot be undone. +

+ +
+ +
{ + return async ({ update, result }) => { + if (result.type === 'success') { + showDeleteConfirm = false; + documentToDelete = null; + } + await invalidateAll(); + await update(); + }; + }} + class="flex-1" + > + + +
+
+
+
+{/if} + + +{#if showRenameFolderModal && renamingFolder} +
+
+
+

Rename Folder

+ +
+ +
{ + isSubmitting = true; + return async ({ update, result }) => { + await invalidateAll(); + isSubmitting = false; + if (result.type === 'success') { + showRenameFolderModal = false; + renamingFolder = null; + } + await update(); + }; + }} + class="space-y-4" + > + + +
+ + +
+ +
+ + +
+
+
+
+{/if} diff --git a/src/routes/(app)/board/dues/+page.server.ts b/src/routes/(app)/board/dues/+page.server.ts new file mode 100644 index 0000000..b6d6bb4 --- /dev/null +++ b/src/routes/(app)/board/dues/+page.server.ts @@ -0,0 +1,345 @@ +import { fail } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; +import { sendTemplatedEmail } from '$lib/server/email'; +import { logPaymentAction } from '$lib/server/audit'; +import { + sendBulkReminders, + sendDuesReminder, + getMembersNeedingReminder, + getDuesSettings, + type ReminderType +} from '$lib/server/dues'; +import { supabaseAdmin } from '$lib/server/supabase'; + +export const load: PageServerLoad = async ({ locals, url }) => { + const statusFilter = url.searchParams.get('status') || 'all'; + const searchQuery = url.searchParams.get('search') || ''; + const memberId = url.searchParams.get('member') || null; + + // If specific member requested, load their details + let selectedMember = null; + if (memberId) { + const { data } = await locals.supabase + .from('members_with_dues') + .select('*') + .eq('id', memberId) + .single(); + selectedMember = data; + } + + // Load all members with dues status + const { data: members } = await locals.supabase + .from('members_with_dues') + .select('*') + .order('last_name', { ascending: true }); + + // Filter by dues status + let filteredMembers = members || []; + if (statusFilter !== 'all') { + filteredMembers = filteredMembers.filter((m: any) => m.dues_status === statusFilter); + } + + // Filter by search + if (searchQuery) { + const lowerSearch = searchQuery.toLowerCase(); + filteredMembers = filteredMembers.filter( + (m: any) => + m.first_name?.toLowerCase().includes(lowerSearch) || + m.last_name?.toLowerCase().includes(lowerSearch) || + m.member_id?.toLowerCase().includes(lowerSearch) + ); + } + + // Calculate stats + const stats = { + total: members?.length || 0, + current: members?.filter((m: any) => m.dues_status === 'current').length || 0, + dueSoon: members?.filter((m: any) => m.dues_status === 'due_soon').length || 0, + overdue: members?.filter((m: any) => m.dues_status === 'overdue').length || 0, + neverPaid: members?.filter((m: any) => m.dues_status === 'never_paid').length || 0 + }; + + // Get recent payments + const { data: recentPayments } = await locals.supabase + .from('dues_payments') + .select( + ` + *, + member:members(id, first_name, last_name, member_id), + recorder:members!dues_payments_recorded_by_fkey(first_name, last_name) + ` + ) + .order('created_at', { ascending: false }) + .limit(10); + + // Get membership types for payment recording + const { data: membershipTypes } = await locals.supabase + .from('membership_types') + .select('*') + .eq('is_active', true) + .order('sort_order', { ascending: true }); + + return { + members: filteredMembers, + selectedMember, + stats, + recentPayments: recentPayments || [], + membershipTypes: membershipTypes || [], + filters: { + status: statusFilter, + search: searchQuery, + memberId + } + }; +}; + +export const actions: Actions = { + recordPayment: async ({ request, locals, url }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to record payments' }); + } + + const formData = await request.formData(); + const memberId = formData.get('member_id') as string; + const amount = parseFloat(formData.get('amount') as string); + const paymentDate = formData.get('payment_date') as string; + const paymentMethod = formData.get('payment_method') as string; + const reference = formData.get('reference') as string; + const notes = formData.get('notes') as string; + const sendNotification = formData.get('send_notification') === 'on'; + + if (!memberId || !amount || !paymentDate) { + return fail(400, { error: 'Member, amount, and payment date are required' }); + } + + // Get member details for notification + const { data: payingMember } = await locals.supabase + .from('members') + .select('first_name, last_name, email') + .eq('id', memberId) + .single(); + + // Calculate due date (1 year from payment date) + const dueDate = new Date(paymentDate); + dueDate.setFullYear(dueDate.getFullYear() + 1); + const dueDateStr = dueDate.toISOString().split('T')[0]; + + // Record the payment + const { data: paymentData, error: paymentError } = await locals.supabase + .from('dues_payments') + .insert({ + member_id: memberId, + amount, + payment_date: paymentDate, + due_date: dueDateStr, + payment_method: paymentMethod || 'bank_transfer', + reference: reference || null, + notes: notes || null, + recorded_by: member.id + }) + .select('id') + .single(); + + if (paymentError) { + console.error('Payment recording error:', paymentError); + return fail(500, { error: 'Failed to record payment. Please try again.' }); + } + + // Log audit + await logPaymentAction( + 'record', + { id: member.id, email: member.email }, + { id: paymentData?.id, memberId, amount }, + { payment_date: paymentDate, payment_method: paymentMethod } + ); + + // Send email notification if requested + if (sendNotification && payingMember?.email) { + const formattedDate = new Date(paymentDate).toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric' + }); + const formattedDueDate = dueDate.toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric' + }); + + await sendTemplatedEmail( + 'payment_received', + payingMember.email, + { + first_name: payingMember.first_name, + amount: amount.toFixed(2), + payment_date: formattedDate, + reference: reference || 'N/A', + due_date: formattedDueDate + }, + { + recipientId: memberId, + recipientName: `${payingMember.first_name} ${payingMember.last_name}`, + sentBy: member.id, + baseUrl: url.origin + } + ); + } + + return { success: 'Payment recorded successfully!' + (sendNotification ? ' Notification sent.' : '') }; + }, + + /** + * Send individual reminder to a specific member + */ + sendReminder: async ({ request, locals, url }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to send reminders' }); + } + + const formData = await request.formData(); + const memberId = formData.get('member_id') as string; + const reminderType = formData.get('reminder_type') as ReminderType; + + if (!memberId) { + return fail(400, { error: 'Member ID is required' }); + } + + // Get member details + const { data: targetMember } = await supabaseAdmin + .from('members_with_dues') + .select('*') + .eq('id', memberId) + .single(); + + if (!targetMember) { + return fail(404, { error: 'Member not found' }); + } + + // Determine the appropriate reminder type based on their status + let effectiveReminderType = reminderType; + if (!effectiveReminderType) { + if (targetMember.dues_status === 'overdue') { + effectiveReminderType = 'overdue'; + } else if (targetMember.dues_status === 'due_soon') { + effectiveReminderType = 'due_soon_7'; + } else { + effectiveReminderType = 'due_soon_30'; + } + } + + const result = await sendDuesReminder(targetMember, effectiveReminderType, url.origin); + + if (!result.success) { + return fail(500, { error: result.error || 'Failed to send reminder' }); + } + + return { + success: `Reminder sent to ${targetMember.first_name} ${targetMember.last_name}` + }; + }, + + /** + * Send bulk reminders to all members in due_soon status + */ + sendBulkDueSoonReminders: async ({ locals, url }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to send bulk reminders' }); + } + + const results = { + due_soon_30: { sent: 0, errors: [] as string[] }, + due_soon_7: { sent: 0, errors: [] as string[] }, + due_soon_1: { sent: 0, errors: [] as string[] } + }; + + // Get settings to determine which reminder tiers to process + const settings = await getDuesSettings(); + const reminderDays = settings.reminder_days_before || [30, 7, 1]; + + let totalSent = 0; + const allErrors: string[] = []; + + for (const days of reminderDays) { + const reminderType = `due_soon_${days}` as ReminderType; + const result = await sendBulkReminders(reminderType, url.origin); + + results[reminderType as keyof typeof results] = { + sent: result.sent, + errors: result.errors + }; + totalSent += result.sent; + allErrors.push(...result.errors); + } + + if (totalSent === 0 && allErrors.length === 0) { + return { success: 'No members need due soon reminders at this time.' }; + } + + const errorMsg = allErrors.length > 0 ? ` (${allErrors.length} errors)` : ''; + return { + success: `Sent ${totalSent} due soon reminder(s)${errorMsg}`, + bulkResult: results + }; + }, + + /** + * Send bulk reminders to all overdue members + */ + sendBulkOverdueReminders: async ({ locals, url }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to send bulk reminders' }); + } + + const result = await sendBulkReminders('overdue', url.origin); + + if (result.sent === 0 && result.errors.length === 0) { + return { success: 'No overdue members need reminders at this time.' }; + } + + const errorMsg = result.errors.length > 0 ? ` (${result.errors.length} errors)` : ''; + return { + success: `Sent ${result.sent} overdue reminder(s)${errorMsg}`, + bulkResult: result + }; + }, + + /** + * Get preview counts for bulk operations + */ + getBulkPreview: async ({ locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'Unauthorized' }); + } + + const settings = await getDuesSettings(); + const reminderDays = settings.reminder_days_before || [30, 7, 1]; + + const preview = { + dueSoon: 0, + overdue: 0, + breakdown: {} as Record + }; + + for (const days of reminderDays) { + const reminderType = `due_soon_${days}` as ReminderType; + const members = await getMembersNeedingReminder(reminderType); + preview.breakdown[reminderType] = members.length; + preview.dueSoon += members.length; + } + + const overdueMembers = await getMembersNeedingReminder('overdue'); + preview.overdue = overdueMembers.length; + + return { preview }; + } +}; diff --git a/src/routes/(app)/board/dues/+page.svelte b/src/routes/(app)/board/dues/+page.svelte new file mode 100644 index 0000000..f787000 --- /dev/null +++ b/src/routes/(app)/board/dues/+page.svelte @@ -0,0 +1,679 @@ + + + + Dues Management | Monaco USA + + +
+
+
+

Dues Management

+

Track and record membership dues payments

+
+
+ + + Reports + + + +
+
+ + +
+
+
+
+ +
+
+

{stats.total}

+

Total

+
+
+
+
+
+
+ +
+
+

{stats.current}

+

Current

+
+
+
+
+
+
+ +
+
+

{stats.dueSoon}

+

Due Soon

+
+
+
+
+
+
+ +
+
+

{stats.overdue}

+

Overdue

+
+
+
+
+
+
+ +
+
+

{stats.neverPaid}

+

Never Paid

+
+
+
+
+ +
+ +
+
+
+
+
+ + { + searchQuery = e.currentTarget.value; + handleSearch(e.currentTarget.value); + }} + class="h-10 pl-9" + /> +
+ + +
+
+ + {#if members.length === 0} +
+ +

No members found

+

Try adjusting your search or filters.

+
+ {:else} +
+ {#each members as member} + {@const duesInfo = getDuesInfo(member.dues_status)} +
+
+ {#if member.avatar_url} + + {:else} +
+ {member.first_name?.[0]}{member.last_name?.[0]} +
+ {/if} +
+

+ {member.first_name} {member.last_name} +

+

{member.member_id}

+
+
+ +
+
+ + + {duesInfo.label} + + {#if member.current_due_date} +

+ {member.dues_status === 'overdue' + ? `${member.days_overdue} days overdue` + : `Due: ${formatDate(member.current_due_date)}`} +

+ {/if} +
+ + {#if member.dues_status !== 'current' && member.dues_status !== 'never_paid'} +
{ + sendingReminderId = member.id; + return async ({ update }) => { + sendingReminderId = null; + await update(); + await invalidateAll(); + }; + }} + > + + +
+ {/if} + + +
+
+ {/each} +
+ {/if} +
+
+ + +
+
+
+

+ + Recent Payments +

+
+ + {#if recentPayments.length === 0} +
+

No payments recorded yet.

+
+ {:else} +
+ {#each recentPayments as payment} +
+
+
+

+ {payment.member?.first_name} {payment.member?.last_name} +

+

{payment.member?.member_id}

+
+

€{payment.amount.toFixed(2)}

+
+
+ {formatDate(payment.payment_date)} + by {payment.recorder?.first_name} +
+
+ {/each} +
+ {/if} +
+
+
+
+ + +{#if showPaymentModal && selectedMemberForPayment} +
+
+
+

Record Payment

+ +
+ + +
+ {#if selectedMemberForPayment.avatar_url} + + {:else} +
+ {selectedMemberForPayment.first_name?.[0]}{selectedMemberForPayment.last_name?.[0]} +
+ {/if} +
+

+ {selectedMemberForPayment.first_name} {selectedMemberForPayment.last_name} +

+

+ {selectedMemberForPayment.member_id} • + {selectedMemberForPayment.membership_type_name || 'Regular Member'} +

+
+
+ + {#if form?.error} +
+ {form.error} +
+ {/if} + + {#if form?.success} +
+ {form.success} +
+ {/if} + +
{ + isSubmitting = true; + return async ({ update, result }) => { + isSubmitting = false; + if (result.type === 'success') { + await invalidateAll(); + setTimeout(closePaymentModal, 1500); + } + await update(); + }; + }} + class="space-y-4" + > + + +
+ + +
+ +
+ +
+ +
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+{/if} + + +{#if showBulkModal && bulkActionType} +
+
+
+

+ {bulkActionType === 'dueSoon' ? 'Send Due Soon Reminders' : 'Send Overdue Reminders'} +

+ +
+ + {#if bulkResult} + +
+
+

{bulkResult.success || bulkResult}

+
+ +
+ {:else} + +
+
+
+ {#if bulkActionType === 'dueSoon'} + + {:else} + + {/if} +
+

+ {bulkActionType === 'dueSoon' ? stats.dueSoon : stats.overdue} member(s) will receive reminders +

+

+ {bulkActionType === 'dueSoon' + ? 'Members with dues due within 30 days' + : 'Members with overdue payments'} +

+
+
+
+ +

+ This will send email reminders to all eligible members who haven't already received a reminder for their current dues period. +

+ +
{ + isBulkSubmitting = true; + return async ({ result, update }) => { + isBulkSubmitting = false; + if (result.type === 'success' && result.data) { + bulkResult = result.data; + await invalidateAll(); + } + await update(); + }; + }} + > +
+ + +
+
+
+ {/if} +
+
+{/if} + + +{#if form?.success && !showPaymentModal && !showBulkModal} +
+

{form.success}

+
+{/if} + +{#if form?.error && !showPaymentModal && !showBulkModal} +
+

{form.error}

+
+{/if} diff --git a/src/routes/(app)/board/dues/reports/+page.server.ts b/src/routes/(app)/board/dues/reports/+page.server.ts new file mode 100644 index 0000000..8f2a4cb --- /dev/null +++ b/src/routes/(app)/board/dues/reports/+page.server.ts @@ -0,0 +1,169 @@ +import { fail } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; +import { getDuesAnalytics, getDuesReportData, getReminderEffectiveness } from '$lib/server/dues'; + +export const load: PageServerLoad = async ({ locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return { error: 'Unauthorized' }; + } + + // Load analytics data + const analytics = await getDuesAnalytics(); + const effectiveness = await getReminderEffectiveness(); + + return { + analytics, + effectiveness + }; +}; + +export const actions: Actions = { + /** + * Export members report as CSV + */ + exportMembers: async ({ locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'Unauthorized' }); + } + + const data = await getDuesReportData(); + + // Generate CSV + const headers = [ + 'Member ID', + 'Name', + 'Email', + 'Membership Type', + 'Status', + 'Dues Status', + 'Annual Dues', + 'Last Payment', + 'Due Date', + 'Days Overdue' + ]; + + const rows = data.members.map((m) => [ + m.member_id, + m.name, + m.email, + m.membership_type, + m.status, + m.dues_status, + m.annual_dues.toFixed(2), + m.last_payment_date || 'Never', + m.current_due_date || 'N/A', + m.days_overdue?.toString() || '0' + ]); + + const csv = [headers.join(','), ...rows.map((r) => r.map(escapeCSV).join(','))].join('\n'); + + return { + csv, + filename: `dues-members-${new Date().toISOString().split('T')[0]}.csv` + }; + }, + + /** + * Export payments report as CSV + */ + exportPayments: async ({ locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'Unauthorized' }); + } + + const data = await getDuesReportData(); + + // Generate CSV + const headers = [ + 'Member ID', + 'Member Name', + 'Amount', + 'Payment Date', + 'Payment Method', + 'Reference', + 'Recorded By' + ]; + + const rows = data.payments.map((p) => [ + p.member_id, + p.member_name, + p.amount.toFixed(2), + p.payment_date, + p.payment_method, + p.reference || '', + p.recorded_by || '' + ]); + + const csv = [headers.join(','), ...rows.map((r) => r.map(escapeCSV).join(','))].join('\n'); + + return { + csv, + filename: `dues-payments-${new Date().toISOString().split('T')[0]}.csv` + }; + }, + + /** + * Export overdue members report as CSV + */ + exportOverdue: async ({ locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'Unauthorized' }); + } + + const data = await getDuesReportData(); + + // Filter to overdue only + const overdueMembers = data.members.filter( + (m) => m.dues_status === 'overdue' || m.dues_status === 'never_paid' + ); + + // Generate CSV + const headers = [ + 'Member ID', + 'Name', + 'Email', + 'Membership Type', + 'Dues Status', + 'Amount Owed', + 'Due Date', + 'Days Overdue' + ]; + + const rows = overdueMembers.map((m) => [ + m.member_id, + m.name, + m.email, + m.membership_type, + m.dues_status, + m.annual_dues.toFixed(2), + m.current_due_date || 'N/A', + m.days_overdue?.toString() || 'N/A' + ]); + + const csv = [headers.join(','), ...rows.map((r) => r.map(escapeCSV).join(','))].join('\n'); + + return { + csv, + filename: `dues-overdue-${new Date().toISOString().split('T')[0]}.csv` + }; + } +}; + +/** + * Escape a value for CSV + */ +function escapeCSV(value: string | number): string { + const str = String(value); + if (str.includes(',') || str.includes('"') || str.includes('\n')) { + return `"${str.replace(/"/g, '""')}"`; + } + return str; +} diff --git a/src/routes/(app)/board/dues/reports/+page.svelte b/src/routes/(app)/board/dues/reports/+page.svelte new file mode 100644 index 0000000..b4ff149 --- /dev/null +++ b/src/routes/(app)/board/dues/reports/+page.svelte @@ -0,0 +1,346 @@ + + + + Dues Reports | Monaco USA + + +
+ +
+
+ + + +
+

Dues Reports

+

Analytics and financial reporting

+
+
+
+ + +
+
+
+
+

Collected This Month

+

+ {formatCurrency(analytics?.totalCollectedThisMonth || 0)} +

+
+
+ +
+
+
+ +
+
+
+

Collected This Year

+

+ {formatCurrency(analytics?.totalCollectedThisYear || 0)} +

+
+
+ +
+
+
+ +
+
+
+

Outstanding

+

+ {formatCurrency(analytics?.totalOutstanding || 0)} +

+
+
+ +
+
+
+ +
+
+
+

Reminders Sent

+

+ {analytics?.remindersSentThisMonth || 0} +

+

This month

+
+
+ +
+
+
+
+ +
+ +
+
+

+ + Collection Trend (12 Months) +

+
+ +
+ {#if analytics?.paymentsByMonth && analytics.paymentsByMonth.length > 0} +
+ {#each analytics.paymentsByMonth as month, i} +
+
+

+ {month.month.split(' ')[0].slice(0, 3)} +

+
+ {/each} +
+ {:else} +
+

No payment data available

+
+ {/if} +
+
+ + +
+
+

+ + Member Status Breakdown +

+
+ +
+ {#if analytics?.statusBreakdown} + {@const statusConfig = { + current: { icon: CheckCircle2, color: 'bg-green-500', textColor: 'text-green-600', label: 'Current' }, + due_soon: { icon: Clock, color: 'bg-yellow-500', textColor: 'text-yellow-600', label: 'Due Soon' }, + overdue: { icon: AlertCircle, color: 'bg-red-500', textColor: 'text-red-600', label: 'Overdue' }, + never_paid: { icon: XCircle, color: 'bg-slate-400', textColor: 'text-slate-500', label: 'Never Paid' } + }} + {#each analytics.statusBreakdown as status} + {@const config = statusConfig[status.status as keyof typeof statusConfig]} +
+ +
+
+ {config.label} + + {status.count} ({status.percentage.toFixed(1)}%) + +
+
+
+
+
+
+ {/each} + {/if} +
+ +
+
+ Total Members + {analytics?.totalMembers || 0} +
+
+
+
+ + +
+
+

+ + Reminder Effectiveness +

+
+ +
+
+

Total Reminders Sent

+

{effectiveness?.totalRemindersSent || 0}

+
+
+

Paid Within 7 Days

+

{effectiveness?.paidWithin7Days || 0}

+
+
+

Paid Within 30 Days

+

{effectiveness?.paidWithin30Days || 0}

+
+
+

Effectiveness Rate

+

+ {(effectiveness?.effectivenessRate || 0).toFixed(1)}% +

+
+
+
+ + +
+
+

+ + Export Reports +

+

Download detailed reports as CSV files

+
+ +
+
{ + isExporting = 'members'; + return async ({ update }) => { + isExporting = null; + await update(); + }; + }} + > + +
+ +
{ + isExporting = 'payments'; + return async ({ update }) => { + isExporting = null; + await update(); + }; + }} + > + +
+ +
{ + isExporting = 'overdue'; + return async ({ update }) => { + isExporting = null; + await update(); + }; + }} + > + +
+
+
+
diff --git a/src/routes/(app)/board/events/+page.server.ts b/src/routes/(app)/board/events/+page.server.ts new file mode 100644 index 0000000..a70f45b --- /dev/null +++ b/src/routes/(app)/board/events/+page.server.ts @@ -0,0 +1,161 @@ +import { fail } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ locals, url }) => { + const statusFilter = url.searchParams.get('status') || 'all'; + + // Load events with counts + let query = locals.supabase + .from('events_with_counts') + .select('*') + .order('start_datetime', { ascending: true }); + + if (statusFilter !== 'all') { + query = query.eq('status', statusFilter); + } + + const { data: events } = await query; + + // Load event types + const { data: eventTypes } = await locals.supabase + .from('event_types') + .select('*') + .eq('is_active', true) + .order('sort_order', { ascending: true }); + + // Calculate stats + const now = new Date(); + const stats = { + total: events?.length || 0, + upcoming: events?.filter((e: any) => new Date(e.start_datetime) > now && e.status === 'published').length || 0, + draft: events?.filter((e: any) => e.status === 'draft').length || 0, + past: events?.filter((e: any) => new Date(e.end_datetime) < now).length || 0 + }; + + return { + events: events || [], + eventTypes: eventTypes || [], + stats, + filters: { + status: statusFilter + } + }; +}; + +export const actions: Actions = { + create: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to create events' }); + } + + const formData = await request.formData(); + + const title = formData.get('title') as string; + const description = formData.get('description') as string; + const eventTypeId = formData.get('event_type_id') as string; + const startDate = formData.get('start_date') as string; + const startTime = formData.get('start_time') as string; + const endDate = formData.get('end_date') as string; + const endTime = formData.get('end_time') as string; + const location = formData.get('location') as string; + const maxAttendees = formData.get('max_attendees') as string; + const maxGuests = formData.get('max_guests_per_member') as string; + const isPaid = formData.get('is_paid') === 'true'; + const memberPrice = formData.get('member_price') as string; + const nonMemberPrice = formData.get('non_member_price') as string; + const visibility = formData.get('visibility') as string; + const status = formData.get('status') as string; + + // Validation + if (!title || !startDate || !startTime || !endDate || !endTime) { + return fail(400, { error: 'Title, start date/time, and end date/time are required' }); + } + + // Construct datetime strings + const startDatetime = `${startDate}T${startTime}:00`; + const endDatetime = `${endDate}T${endTime}:00`; + + // Validate end is after start + if (new Date(endDatetime) <= new Date(startDatetime)) { + return fail(400, { error: 'End date/time must be after start date/time' }); + } + + const { error: insertError } = await locals.supabase.from('events').insert({ + title, + description: description || null, + event_type_id: eventTypeId || null, + start_datetime: startDatetime, + end_datetime: endDatetime, + location: location || null, + max_attendees: maxAttendees ? parseInt(maxAttendees) : null, + max_guests_per_member: maxGuests ? parseInt(maxGuests) : 1, + is_paid: isPaid, + member_price: isPaid && memberPrice ? parseFloat(memberPrice) : 0, + non_member_price: isPaid && nonMemberPrice ? parseFloat(nonMemberPrice) : 0, + visibility: visibility || 'members', + status: status || 'published', + created_by: member.id + }); + + if (insertError) { + console.error('Event creation error:', insertError); + return fail(500, { error: 'Failed to create event. Please try again.' }); + } + + return { success: 'Event created successfully!' }; + }, + + delete: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || member.role !== 'admin') { + return fail(403, { error: 'Only admins can delete events' }); + } + + const formData = await request.formData(); + const eventId = formData.get('event_id') as string; + + if (!eventId) { + return fail(400, { error: 'Event ID is required' }); + } + + const { error: deleteError } = await locals.supabase.from('events').delete().eq('id', eventId); + + if (deleteError) { + console.error('Event deletion error:', deleteError); + return fail(500, { error: 'Failed to delete event. Please try again.' }); + } + + return { success: 'Event deleted successfully!' }; + }, + + updateStatus: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to update events' }); + } + + const formData = await request.formData(); + const eventId = formData.get('event_id') as string; + const status = formData.get('status') as string; + + if (!eventId || !status) { + return fail(400, { error: 'Event ID and status are required' }); + } + + const { error: updateError } = await locals.supabase + .from('events') + .update({ status, updated_at: new Date().toISOString() }) + .eq('id', eventId); + + if (updateError) { + console.error('Event status update error:', updateError); + return fail(500, { error: 'Failed to update event status. Please try again.' }); + } + + return { success: 'Event status updated!' }; + } +}; diff --git a/src/routes/(app)/board/events/+page.svelte b/src/routes/(app)/board/events/+page.svelte new file mode 100644 index 0000000..9d88e83 --- /dev/null +++ b/src/routes/(app)/board/events/+page.svelte @@ -0,0 +1,580 @@ + + + + Event Management | Monaco USA + + +
+
+
+

Event Management

+

Create and manage association events

+
+ + +
+ + +
+
+
+
+ +
+
+

{stats.total}

+

Total Events

+
+
+
+
+
+
+ +
+
+

{stats.upcoming}

+

Upcoming

+
+
+
+
+
+
+ +
+
+

{stats.draft}

+

Drafts

+
+
+
+
+
+
+ +
+
+

{stats.past}

+

Past Events

+
+
+
+
+ + +
+ +
+ + {#if form?.error} +
+ {form.error} +
+ {/if} + + {#if form?.success} +
+ {form.success} +
+ {/if} + + +
+ {#if events.length === 0} +
+ +

No events found

+

+ {filters.status !== 'all' + ? 'Try adjusting your filters.' + : 'Create your first event to get started.'} +

+
+ {:else} +
+ + + + + + + + + + + + + {#each events as event} + {@const statusInfo = getStatusInfo(event.status)} + {@const eventPast = isPast(event.end_datetime)} + { + // Don't navigate if clicking on action buttons + if ((e.target as HTMLElement).closest('.actions-cell')) return; + goto(`/events/${event.id}`); + }} + onkeydown={(e) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + goto(`/events/${event.id}`); + } + }} + tabindex="0" + role="button" + > + + + + + + + + {/each} + +
+ Event + + Date & Time + + Attendees + + Visibility + + Status + + Actions +
+
+

{event.title}

+ {#if event.event_type_name} + + {event.event_type_name} + + {/if} +
+
+
+

{formatDate(event.start_datetime)}

+

+ {formatTime(event.start_datetime)} - {formatTime(event.end_datetime)} +

+
+
+
+ + {event.total_attendees || 0} + {#if event.max_attendees} + / {event.max_attendees} + {/if} +
+ {#if event.waitlist_count > 0} +

{event.waitlist_count} on waitlist

+ {/if} +
+ + {getVisibilityLabel(event.visibility)} + + + + + {statusInfo.label} + + e.stopPropagation()}> +
+ + + + + + + + + + {#if event.status === 'draft'} +
+ + + +
+ {/if} +
+
+
+ {/if} +
+
+ + +{#if showCreateModal} +
+
+
+
+

Create New Event

+ +
+ +
{ + isSubmitting = true; + return async ({ update, result }) => { + isSubmitting = false; + if (result.type === 'success') { + showCreateModal = false; + await invalidateAll(); + } + await update(); + }; + }} + class="space-y-4" + > +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+
+ +
+ + +
+ +
+ +
+ +
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ + {#if isPaid} +
+ + +
+ +
+ + +
+ {/if} + +
+ + +
+ +
+ + +
+
+ +
+ + +
+
+
+
+
+{/if} diff --git a/src/routes/(app)/board/events/[id]/attendees/+page.server.ts b/src/routes/(app)/board/events/[id]/attendees/+page.server.ts new file mode 100644 index 0000000..6ddb2d4 --- /dev/null +++ b/src/routes/(app)/board/events/[id]/attendees/+page.server.ts @@ -0,0 +1,449 @@ +import { fail, error } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; +import { supabaseAdmin } from '$lib/server/supabase'; +import { sendEmail } from '$lib/server/email'; + +export const load: PageServerLoad = async ({ locals, params }) => { + // Fetch the event + const { data: event } = await locals.supabase + .from('events_with_counts') + .select('*') + .eq('id', params.id) + .single(); + + if (!event) { + throw error(404, 'Event not found'); + } + + // Fetch all RSVPs with member details + // Note: Using explicit foreign key reference because event_rsvps has two FKs to members (member_id, checked_in_by) + const { data: rsvps, error: rsvpError } = await locals.supabase + .from('event_rsvps') + .select(` + *, + member:members!event_rsvps_member_id_fkey( + id, + first_name, + last_name, + email, + phone, + member_id + ) + `) + .eq('event_id', params.id) + .order('created_at', { ascending: true }); + + if (rsvpError) { + console.error('RSVP fetch error:', rsvpError); + } + + // Fetch public RSVPs (non-members) + const { data: publicRsvps } = await locals.supabase + .from('event_rsvps_public') + .select('*') + .eq('event_id', params.id) + .order('created_at', { ascending: true }); + + // Calculate stats + const memberRsvps = rsvps || []; + const nonMemberRsvps = publicRsvps || []; + + const stats = { + confirmed: memberRsvps.filter(r => r.status === 'confirmed').length + + nonMemberRsvps.filter(r => r.status === 'confirmed').length, + confirmedGuests: memberRsvps.filter(r => r.status === 'confirmed').reduce((sum, r) => sum + (r.guest_count || 0), 0) + + nonMemberRsvps.filter(r => r.status === 'confirmed').reduce((sum, r) => sum + (r.guest_count || 0), 0), + waitlist: memberRsvps.filter(r => r.status === 'waitlist').length + + nonMemberRsvps.filter(r => r.status === 'waitlist').length, + maybe: memberRsvps.filter(r => r.status === 'maybe').length, + declined: memberRsvps.filter(r => r.status === 'declined').length + + nonMemberRsvps.filter(r => r.status === 'declined').length, + attended: memberRsvps.filter(r => r.attended).length + + nonMemberRsvps.filter(r => r.attended).length, + totalMembers: memberRsvps.length, + totalNonMembers: nonMemberRsvps.length + }; + + stats.confirmedGuests; // Suppress unused warning + + // Get all members for invitation feature + const { data: allMembers } = await supabaseAdmin + .from('members') + .select('id, first_name, last_name, email, member_id') + .order('first_name', { ascending: true }); + + // Filter out members who have already RSVPed + const rsvpedMemberIds = new Set(memberRsvps.map(r => r.member_id)); + const uninvitedMembers = (allMembers || []).filter(m => !rsvpedMemberIds.has(m.id)); + + return { + event, + memberRsvps, + publicRsvps: nonMemberRsvps, + stats, + uninvitedMembers + }; +}; + +export const actions: Actions = { + checkIn: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to check in attendees' }); + } + + const formData = await request.formData(); + const rsvpId = formData.get('rsvp_id') as string; + const isPublic = formData.get('is_public') === 'true'; + const attended = formData.get('attended') === 'true'; + + if (!rsvpId) { + return fail(400, { error: 'RSVP ID is required' }); + } + + const table = isPublic ? 'event_rsvps_public' : 'event_rsvps'; + + const updateData: Record = { + attended, + updated_at: new Date().toISOString() + }; + + // Only set checked_in fields if checking in + if (attended) { + updateData.checked_in_at = new Date().toISOString(); + if (!isPublic) { + updateData.checked_in_by = member.id; + } + } else { + updateData.checked_in_at = null; + if (!isPublic) { + updateData.checked_in_by = null; + } + } + + const { error: updateError } = await locals.supabase + .from(table) + .update(updateData) + .eq('id', rsvpId); + + if (updateError) { + console.error('Check-in error:', updateError); + return fail(500, { error: 'Failed to update attendance. Please try again.' }); + } + + return { success: attended ? 'Checked in successfully!' : 'Check-in removed.' }; + }, + + updateRsvpStatus: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to update RSVPs' }); + } + + const formData = await request.formData(); + const rsvpId = formData.get('rsvp_id') as string; + const isPublic = formData.get('is_public') === 'true'; + const status = formData.get('status') as string; + + if (!rsvpId || !status) { + return fail(400, { error: 'RSVP ID and status are required' }); + } + + const validStatuses = ['confirmed', 'declined', 'maybe', 'waitlist', 'cancelled']; + if (!validStatuses.includes(status)) { + return fail(400, { error: 'Invalid status' }); + } + + const table = isPublic ? 'event_rsvps_public' : 'event_rsvps'; + + const { error: updateError } = await locals.supabase + .from(table) + .update({ + status, + updated_at: new Date().toISOString() + }) + .eq('id', rsvpId); + + if (updateError) { + console.error('RSVP status update error:', updateError); + return fail(500, { error: 'Failed to update RSVP status. Please try again.' }); + } + + return { success: 'RSVP status updated!' }; + }, + + promoteFromWaitlist: async ({ request, locals, params }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to manage waitlist' }); + } + + const formData = await request.formData(); + const rsvpId = formData.get('rsvp_id') as string; + const isPublic = formData.get('is_public') === 'true'; + + if (!rsvpId) { + return fail(400, { error: 'RSVP ID is required' }); + } + + // Get event to check capacity + const { data: event } = await locals.supabase + .from('events_with_counts') + .select('*') + .eq('id', params.id) + .single(); + + if (!event) { + return fail(404, { error: 'Event not found' }); + } + + // Get the RSVP to promote + const table = isPublic ? 'event_rsvps_public' : 'event_rsvps'; + const { data: rsvp } = await locals.supabase + .from(table) + .select('*') + .eq('id', rsvpId) + .single(); + + if (!rsvp) { + return fail(404, { error: 'RSVP not found' }); + } + + if (rsvp.status !== 'waitlist') { + return fail(400, { error: 'Only waitlisted RSVPs can be promoted' }); + } + + // Check capacity + const spotsNeeded = 1 + (rsvp.guest_count || 0); + if (event.max_attendees && event.total_attendees + spotsNeeded > event.max_attendees) { + return fail(400, { error: 'Not enough capacity for this attendee and their guests' }); + } + + // Promote to confirmed + const { error: updateError } = await locals.supabase + .from(table) + .update({ + status: 'confirmed', + updated_at: new Date().toISOString() + }) + .eq('id', rsvpId); + + if (updateError) { + console.error('Promotion error:', updateError); + return fail(500, { error: 'Failed to promote from waitlist. Please try again.' }); + } + + return { success: 'Successfully promoted from waitlist!' }; + }, + + deleteRsvp: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to delete RSVPs' }); + } + + const formData = await request.formData(); + const rsvpId = formData.get('rsvp_id') as string; + const isPublic = formData.get('is_public') === 'true'; + + if (!rsvpId) { + return fail(400, { error: 'RSVP ID is required' }); + } + + const table = isPublic ? 'event_rsvps_public' : 'event_rsvps'; + + const { error: deleteError } = await locals.supabase + .from(table) + .delete() + .eq('id', rsvpId); + + if (deleteError) { + console.error('Delete RSVP error:', deleteError); + return fail(500, { error: 'Failed to delete RSVP. Please try again.' }); + } + + return { success: 'RSVP removed successfully!' }; + }, + + markAsPaid: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to manage payments' }); + } + + const formData = await request.formData(); + const rsvpId = formData.get('rsvp_id') as string; + const isPublic = formData.get('is_public') === 'true'; + + if (!rsvpId) { + return fail(400, { error: 'RSVP ID is required' }); + } + + const table = isPublic ? 'event_rsvps_public' : 'event_rsvps'; + + const { error: updateError } = await locals.supabase + .from(table) + .update({ + payment_status: 'paid', + updated_at: new Date().toISOString() + }) + .eq('id', rsvpId); + + if (updateError) { + console.error('Mark as paid error:', updateError); + return fail(500, { error: 'Failed to update payment status. Please try again.' }); + } + + return { success: 'Payment marked as received!' }; + }, + + inviteMembers: async ({ request, locals, params, url }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to invite members' }); + } + + const formData = await request.formData(); + const memberIds = formData.getAll('member_ids') as string[]; + + if (!memberIds || memberIds.length === 0) { + return fail(400, { error: 'Please select at least one member to invite' }); + } + + // Get the event details + const { data: event } = await locals.supabase + .from('events') + .select('*') + .eq('id', params.id) + .single(); + + if (!event) { + return fail(404, { error: 'Event not found' }); + } + + // Get the selected members + const { data: members } = await supabaseAdmin + .from('members') + .select('id, first_name, last_name, email') + .in('id', memberIds); + + if (!members || members.length === 0) { + return fail(400, { error: 'No valid members found' }); + } + + // Prepare email content + const baseUrl = url.origin; + const eventUrl = `${baseUrl}/events/${event.id}`; + const logoUrl = `${baseUrl}/MONACOUSA-Flags_376x376.png`; + + // Format event date and time + const eventDate = new Date(event.start_time).toLocaleDateString('en-US', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric' + }); + const eventTime = new Date(event.start_time).toLocaleTimeString('en-US', { + hour: 'numeric', + minute: '2-digit' + }); + + let successCount = 0; + let failCount = 0; + + // Send invitations to each member + for (const invitee of members) { + const emailResult = await sendEmail({ + to: invitee.email, + subject: `You're Invited: ${event.title}`, + html: ` + + + + + + + + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

You're Invited!

+

Dear ${invitee.first_name},

+

We'd love for you to join us at an upcoming Monaco USA event!

+ +
+

${event.title}

+

Date: ${eventDate}

+

Time: ${eventTime}

+ ${event.location ? `

Location: ${event.location}

` : ''} +
+ + ${event.description ? `

${event.description.substring(0, 200)}${event.description.length > 200 ? '...' : ''}

` : ''} + +
+ RSVP Now +
+ +

Click the button above to view the event details and RSVP.

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+ +`, + recipientId: invitee.id, + recipientName: `${invitee.first_name} ${invitee.last_name}`, + emailType: 'event_invitation', + sentBy: member.id + }); + + if (emailResult.success) { + successCount++; + } else { + failCount++; + console.error(`Failed to send invitation to ${invitee.email}:`, emailResult.error); + } + } + + if (failCount === 0) { + return { success: `Successfully sent ${successCount} invitation${successCount !== 1 ? 's' : ''}!` }; + } else if (successCount === 0) { + return fail(500, { error: 'Failed to send all invitations. Please check your email settings.' }); + } else { + return { success: `Sent ${successCount} invitation${successCount !== 1 ? 's' : ''}, but ${failCount} failed.` }; + } + } +}; diff --git a/src/routes/(app)/board/events/[id]/attendees/+page.svelte b/src/routes/(app)/board/events/[id]/attendees/+page.svelte new file mode 100644 index 0000000..ffc2297 --- /dev/null +++ b/src/routes/(app)/board/events/[id]/attendees/+page.svelte @@ -0,0 +1,919 @@ + + + + Attendees: {event?.title || 'Event'} | Monaco USA + + +
+ +
+
+ + + Back to events + +

Attendees

+ {#if event} +

{event.title}

+ {/if} +
+
+ + + Edit Event + +
+
+ + {#if form?.error} + + {/if} + + {#if form?.success} + + {/if} + + {#if event} + +
+
+
+ + {formatDate(event.start_datetime)} + {formatTime(event.start_datetime)} - {formatTime(event.end_datetime)} +
+ {#if event.location} +
+ + {event.location} +
+ {/if} +
+ + {event.total_attendees}{event.max_attendees ? ` / ${event.max_attendees}` : ''} attendees +
+
+
+ + +
+
+
+
+ +
+
+

{stats.confirmed}

+

Confirmed

+
+
+
+ {#if event?.is_paid} +
+
+
+ +
+
+

{pendingPaymentsCount}

+

Pending Payment

+
+
+
+ {/if} +
+
+
+ +
+
+

{stats.waitlist}

+

Waitlist

+
+
+
+
+
+
+ +
+
+

{stats.maybe}

+

Maybe

+
+
+
+
+
+
+ +
+
+

{stats.declined}

+

Declined

+
+
+
+
+
+
+ +
+
+

{stats.attended}

+

Checked In

+
+
+
+
+ + +
+ {#each [ + { value: 'all', label: 'All' }, + { value: 'confirmed', label: 'Confirmed' }, + { value: 'waitlist', label: 'Waitlist' }, + { value: 'maybe', label: 'Maybe' }, + { value: 'attended', label: 'Checked In' }, + { value: 'not_attended', label: 'Not Checked In' }, + ...(event?.is_paid ? [ + { value: 'pending_payment', label: 'Pending Payment' }, + { value: 'paid', label: 'Paid' } + ] : []) + ] as filter} + + {/each} +
+ + + {#if memberRsvps.length > 0} +
+
+

Members ({stats.totalMembers})

+
+
+ {#each filterRsvps(memberRsvps, statusFilter) as rsvp} +
+
+
+ +
{ + loading = true; + return async ({ update }) => { + await invalidateAll(); + loading = false; + await update(); + }; + }} + > + + + + +
+ + +
+
+

+ {rsvp.member?.first_name} {rsvp.member?.last_name} +

+ + {rsvp.status} + + {#if event?.is_paid && rsvp.payment_status === 'pending'} + + + Payment Pending + + {:else if event?.is_paid && rsvp.payment_status === 'paid'} + + + Paid + + {/if} +
+

{rsvp.member?.member_id}

+
+
+ +
+ {#if rsvp.guest_count > 0} + + +{rsvp.guest_count} guest{rsvp.guest_count > 1 ? 's' : ''} + + {/if} + + + {#if event?.is_paid && rsvp.payment_status === 'pending'} +
{ + loading = true; + return async ({ update, result }) => { + loading = false; + if (result.type === 'success') { + await invalidateAll(); + } + await update(); + }; + }} + > + + + +
+ {/if} + + + +
+
+ + + {#if expandedRsvp === rsvp.id} +
+
+ {#if rsvp.member?.email} + + + {rsvp.member.email} + + {/if} + {#if rsvp.member?.phone} + + + {rsvp.member.phone} + + {/if} +
+ + + {#if event?.is_paid && rsvp.payment_amount} +
+ Amount: €{rsvp.payment_amount.toFixed(2)} +
+ {/if} + + +
+ {#if event?.is_paid && rsvp.payment_status === 'pending'} +
{ + loading = true; + return async ({ update, result }) => { + loading = false; + if (result.type === 'success') { + await invalidateAll(); + } + await update(); + }; + }} + > + + + +
+ {/if} + {#if rsvp.status === 'waitlist'} +
{ + loading = true; + return async ({ update, result }) => { + loading = false; + if (result.type === 'success') { + await invalidateAll(); + } + await update(); + }; + }} + > + + + +
+ {/if} +
{ + if (!confirm('Remove this RSVP? This cannot be undone.')) { + return async () => {}; + } + loading = true; + return async ({ update, result }) => { + loading = false; + if (result.type === 'success') { + await invalidateAll(); + } + await update(); + }; + }} + > + + + +
+
+
+ {/if} +
+ {/each} +
+
+ {/if} + + + {#if publicRsvps.length > 0} +
+
+

Non-Members ({stats.totalNonMembers})

+
+
+ {#each filterRsvps(publicRsvps, statusFilter) as rsvp} +
+
+
+ +
{ + loading = true; + return async ({ update }) => { + await invalidateAll(); + loading = false; + await update(); + }; + }} + > + + + + +
+ + +
+
+

+ {rsvp.full_name} +

+ + Guest + + + {rsvp.status} + + {#if event?.is_paid && rsvp.payment_status === 'pending'} + + + Payment Pending + + {:else if event?.is_paid && rsvp.payment_status === 'paid'} + + + Paid + + {/if} +
+

{rsvp.email}

+
+
+ +
+ {#if rsvp.guest_count > 0} + + +{rsvp.guest_count} guest{rsvp.guest_count > 1 ? 's' : ''} + + {/if} + + + {#if event?.is_paid && rsvp.payment_status === 'pending'} +
{ + loading = true; + return async ({ update, result }) => { + loading = false; + if (result.type === 'success') { + await invalidateAll(); + } + await update(); + }; + }} + > + + + +
+ {/if} + + + +
+
+ + + {#if expandedRsvp === `public-${rsvp.id}`} +
+
+ + + {rsvp.email} + + {#if rsvp.phone} + + + {rsvp.phone} + + {/if} +
+ + + {#if event?.is_paid && rsvp.payment_amount} +
+ Amount: €{rsvp.payment_amount.toFixed(2)} +
+ {/if} + + +
+ {#if event?.is_paid && rsvp.payment_status === 'pending'} +
{ + loading = true; + return async ({ update, result }) => { + loading = false; + if (result.type === 'success') { + await invalidateAll(); + } + await update(); + }; + }} + > + + + +
+ {/if} + {#if rsvp.status === 'waitlist'} +
{ + loading = true; + return async ({ update, result }) => { + loading = false; + if (result.type === 'success') { + await invalidateAll(); + } + await update(); + }; + }} + > + + + +
+ {/if} +
{ + if (!confirm('Remove this RSVP? This cannot be undone.')) { + return async () => {}; + } + loading = true; + return async ({ update, result }) => { + loading = false; + if (result.type === 'success') { + await invalidateAll(); + } + await update(); + }; + }} + > + + + +
+
+
+ {/if} +
+ {/each} +
+
+ {/if} + + + {#if memberRsvps.length === 0 && publicRsvps.length === 0} +
+ +

No RSVPs yet

+

No one has RSVP'd to this event yet.

+
+ {/if} + {:else} +
+

Event not found.

+ + View all events + +
+ {/if} +
+ + +{#if showInviteModal} +
+
+
+
+ +

Invite Members to Event

+
+ +
+ +

+ Select members to send an email invitation with a link to RSVP for "{event?.title}". +

+ + +
+ + +
+ + {#if uninvitedMembers.length === 0} +
+ +

All members have already been invited or RSVPed.

+
+ {:else} + +
+ + + {selectedMembers.size} of {filteredUninvitedMembers.length} selected + +
+ + +
+ {#each filteredUninvitedMembers as member (member.id)} + + {:else} +
+ No members match your search. +
+ {/each} +
+ {/if} + + +
+ +
{ + inviteLoading = true; + return async ({ update, result }) => { + inviteLoading = false; + if (result.type === 'success') { + closeInviteModal(); + await invalidateAll(); + } + await update(); + }; + }} + class="flex-1" + > + {#each Array.from(selectedMembers) as memberId} + + {/each} + +
+
+
+
+{/if} diff --git a/src/routes/(app)/board/events/[id]/edit/+page.server.ts b/src/routes/(app)/board/events/[id]/edit/+page.server.ts new file mode 100644 index 0000000..9702e43 --- /dev/null +++ b/src/routes/(app)/board/events/[id]/edit/+page.server.ts @@ -0,0 +1,124 @@ +import { fail, error, redirect } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ locals, params }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + throw redirect(303, '/dashboard'); + } + + // Fetch the event + const { data: event } = await locals.supabase + .from('events') + .select('*') + .eq('id', params.id) + .single(); + + if (!event) { + throw error(404, 'Event not found'); + } + + // Load event types + const { data: eventTypes } = await locals.supabase + .from('event_types') + .select('*') + .eq('is_active', true) + .order('sort_order', { ascending: true }); + + return { + event, + eventTypes: eventTypes || [] + }; +}; + +export const actions: Actions = { + update: async ({ request, locals, params }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'You do not have permission to edit events' }); + } + + const formData = await request.formData(); + + const title = formData.get('title') as string; + const description = formData.get('description') as string; + const eventTypeId = formData.get('event_type_id') as string; + const startDate = formData.get('start_date') as string; + const startTime = formData.get('start_time') as string; + const endDate = formData.get('end_date') as string; + const endTime = formData.get('end_time') as string; + const location = formData.get('location') as string; + const locationUrl = formData.get('location_url') as string; + const maxAttendees = formData.get('max_attendees') as string; + const maxGuests = formData.get('max_guests_per_member') as string; + const isPaid = formData.get('is_paid') === 'true'; + const memberPrice = formData.get('member_price') as string; + const nonMemberPrice = formData.get('non_member_price') as string; + const visibility = formData.get('visibility') as string; + const status = formData.get('status') as string; + + // Validation + if (!title || !startDate || !startTime || !endDate || !endTime) { + return fail(400, { error: 'Title, start date/time, and end date/time are required' }); + } + + // Construct datetime strings + const startDatetime = `${startDate}T${startTime}:00`; + const endDatetime = `${endDate}T${endTime}:00`; + + // Validate end is after start + if (new Date(endDatetime) <= new Date(startDatetime)) { + return fail(400, { error: 'End date/time must be after start date/time' }); + } + + const { error: updateError } = await locals.supabase + .from('events') + .update({ + title, + description: description || null, + event_type_id: eventTypeId || null, + start_datetime: startDatetime, + end_datetime: endDatetime, + location: location || null, + location_url: locationUrl || null, + max_attendees: maxAttendees ? parseInt(maxAttendees) : null, + max_guests_per_member: maxGuests ? parseInt(maxGuests) : 1, + is_paid: isPaid, + member_price: isPaid && memberPrice ? parseFloat(memberPrice) : 0, + non_member_price: isPaid && nonMemberPrice ? parseFloat(nonMemberPrice) : 0, + visibility: visibility || 'members', + status: status || 'published', + updated_at: new Date().toISOString() + }) + .eq('id', params.id); + + if (updateError) { + console.error('Event update error:', updateError); + return fail(500, { error: 'Failed to update event. Please try again.' }); + } + + return { success: 'Event updated successfully!' }; + }, + + delete: async ({ locals, params }) => { + const { member } = await locals.safeGetSession(); + + if (!member || member.role !== 'admin') { + return fail(403, { error: 'Only admins can delete events' }); + } + + const { error: deleteError } = await locals.supabase + .from('events') + .delete() + .eq('id', params.id); + + if (deleteError) { + console.error('Event deletion error:', deleteError); + return fail(500, { error: 'Failed to delete event. Please try again.' }); + } + + throw redirect(303, '/board/events?deleted=true'); + } +}; diff --git a/src/routes/(app)/board/events/[id]/edit/+page.svelte b/src/routes/(app)/board/events/[id]/edit/+page.svelte new file mode 100644 index 0000000..6551aa1 --- /dev/null +++ b/src/routes/(app)/board/events/[id]/edit/+page.svelte @@ -0,0 +1,416 @@ + + + + Edit Event | Monaco USA + + +
+ + + + Back to events + + +
+
+

Edit Event

+

Update event details and settings

+
+ + {#if form?.error} +
+ {form.error} +
+ {/if} + + {#if form?.success} +
+ {form.success} +
+ {/if} + +
{ + isSubmitting = true; + return async ({ update }) => { + await invalidateAll(); + await update(); + isSubmitting = false; + }; + }} + class="space-y-6" + > + +
+

+ + Event Details +

+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ + +
+

Date & Time

+ +
+
+ +
+ +
+
+ +
+ + +
+ +
+ +
+ +
+
+ +
+ + +
+
+
+ + +
+

+ + Location +

+ +
+
+ + +
+ +
+ + +
+
+
+ + +
+

+ + Capacity +

+ +
+
+ + +

Leave empty for unlimited

+
+ +
+ + +
+
+
+ + +
+

+ + Pricing +

+ + + + {#if isPaid} +
+
+ + +
+ +
+ + +
+
+ {/if} +
+ + +
+

+ + Visibility +

+ +
+ + +
+
+ + +
+ {#if member?.role === 'admin'} + + {:else} +
+ {/if} + +
+ + Cancel + + +
+
+
+
+
+ + +{#if showDeleteConfirm} +
+
+
+

Delete Event

+ +
+ +

+ Are you sure you want to delete {event.title}? This action cannot be undone. +

+ +

+ All RSVPs and associated data will also be deleted. +

+ +
+ +
+ +
+
+
+
+{/if} diff --git a/src/routes/(app)/board/events/[id]/roll-call/+page.server.ts b/src/routes/(app)/board/events/[id]/roll-call/+page.server.ts new file mode 100644 index 0000000..a1e74ed --- /dev/null +++ b/src/routes/(app)/board/events/[id]/roll-call/+page.server.ts @@ -0,0 +1,281 @@ +import { fail, error, redirect } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; +import { supabaseAdmin } from '$lib/server/supabase'; + +export const load: PageServerLoad = async ({ locals, params }) => { + const { member } = await locals.safeGetSession(); + + // Only board and admin can access roll call + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + throw redirect(303, `/board/events/${params.id}`); + } + + // Fetch the event + const { data: event, error: eventError } = await locals.supabase + .from('events_with_counts') + .select('*') + .eq('id', params.id) + .single(); + + if (eventError || !event) { + throw error(404, 'Event not found'); + } + + // Fetch all RSVPs with member details (only confirmed status for roll call) + const { data: rsvps, error: rsvpError } = await locals.supabase + .from('event_rsvps') + .select(` + *, + member:members!event_rsvps_member_id_fkey( + id, + first_name, + last_name, + email, + phone, + member_id, + avatar_url + ) + `) + .eq('event_id', params.id) + .in('status', ['confirmed', 'waitlist']) + .order('created_at', { ascending: true }); + + if (rsvpError) { + console.error('RSVP fetch error:', rsvpError); + } + + // Fetch public RSVPs (non-members with confirmed status) + const { data: publicRsvps, error: publicError } = await locals.supabase + .from('event_rsvps_public') + .select('*') + .eq('event_id', params.id) + .in('status', ['confirmed', 'waitlist']) + .order('created_at', { ascending: true }); + + if (publicError) { + console.error('Public RSVP fetch error:', publicError); + } + + // Calculate stats + const allMemberRsvps = rsvps || []; + const allPublicRsvps = publicRsvps || []; + const allRsvps = [...allMemberRsvps, ...allPublicRsvps]; + + const stats = { + total: allRsvps.length, + confirmed: allRsvps.filter(r => r.status === 'confirmed').length, + checkedIn: allRsvps.filter(r => r.attended).length, + waitlist: allRsvps.filter(r => r.status === 'waitlist').length + }; + + // Get all members for walk-in feature + const { data: allMembers } = await supabaseAdmin + .from('members') + .select('id, first_name, last_name, email, member_id, avatar_url') + .order('first_name', { ascending: true }); + + // Filter out members who have already RSVPed + const rsvpedMemberIds = new Set(allMemberRsvps.map(r => r.member_id)); + const availableMembers = (allMembers || []).filter(m => !rsvpedMemberIds.has(m.id)); + + return { + event, + memberRsvps: allMemberRsvps, + publicRsvps: allPublicRsvps, + stats, + availableMembers + }; +}; + +export const actions: Actions = { + checkIn: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'Permission denied' }); + } + + const formData = await request.formData(); + const rsvpId = formData.get('rsvp_id') as string; + const isPublic = formData.get('is_public') === 'true'; + const attended = formData.get('attended') === 'true'; + + if (!rsvpId) { + return fail(400, { error: 'RSVP ID required' }); + } + + const table = isPublic ? 'event_rsvps_public' : 'event_rsvps'; + + const updateData: Record = { + attended, + updated_at: new Date().toISOString() + }; + + if (attended) { + updateData.checked_in_at = new Date().toISOString(); + if (!isPublic) { + updateData.checked_in_by = member.id; + } + } else { + updateData.checked_in_at = null; + if (!isPublic) { + updateData.checked_in_by = null; + } + } + + const { error: updateError } = await locals.supabase + .from(table) + .update(updateData) + .eq('id', rsvpId); + + if (updateError) { + console.error('Check-in error:', updateError); + return fail(500, { error: 'Check-in failed' }); + } + + return { success: true, attended }; + }, + + addWalkIn: async ({ request, locals, params }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'Permission denied' }); + } + + const formData = await request.formData(); + const memberId = formData.get('member_id') as string; + const guestName = formData.get('guest_name') as string; + const guestEmail = formData.get('guest_email') as string; + + const eventId = params.id; + + // If it's an existing member + if (memberId) { + // Check if member already has an RSVP + const { data: existing } = await locals.supabase + .from('event_rsvps') + .select('id') + .eq('event_id', eventId) + .eq('member_id', memberId) + .single(); + + if (existing) { + return fail(400, { error: 'Member already has an RSVP for this event' }); + } + + // Create RSVP with immediate check-in + const { error: insertError } = await locals.supabase + .from('event_rsvps') + .insert({ + event_id: eventId, + member_id: memberId, + status: 'confirmed', + attended: true, + checked_in_at: new Date().toISOString(), + checked_in_by: member.id, + rsvp_source: 'walk_in', + created_at: new Date().toISOString(), + updated_at: new Date().toISOString() + }); + + if (insertError) { + console.error('Walk-in RSVP error:', insertError); + return fail(500, { error: 'Failed to add walk-in' }); + } + + return { success: true, message: 'Member added as walk-in' }; + } + + // If it's a non-member guest + if (guestName) { + const { error: insertError } = await locals.supabase + .from('event_rsvps_public') + .insert({ + event_id: eventId, + full_name: guestName, + email: guestEmail || null, + status: 'confirmed', + attended: true, + checked_in_at: new Date().toISOString(), + created_at: new Date().toISOString(), + updated_at: new Date().toISOString() + }); + + if (insertError) { + console.error('Walk-in guest error:', insertError); + return fail(500, { error: 'Failed to add guest' }); + } + + return { success: true, message: 'Guest added as walk-in' }; + } + + return fail(400, { error: 'Please provide a member or guest information' }); + }, + + bulkCheckIn: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member || (member.role !== 'board' && member.role !== 'admin')) { + return fail(403, { error: 'Permission denied' }); + } + + const formData = await request.formData(); + const rsvpIdsString = formData.get('rsvp_ids') as string; + const isPublicString = formData.get('is_public_ids') as string; + const attended = formData.get('attended') === 'true'; + + if (!rsvpIdsString) { + return fail(400, { error: 'No RSVPs selected' }); + } + + const rsvpIds = rsvpIdsString.split(','); + const isPublicIds = isPublicString ? isPublicString.split(',') : []; + + const updateData: Record = { + attended, + updated_at: new Date().toISOString() + }; + + if (attended) { + updateData.checked_in_at = new Date().toISOString(); + } else { + updateData.checked_in_at = null; + } + + // Update member RSVPs + const memberRsvpIds = rsvpIds.filter(id => !isPublicIds.includes(id)); + const publicRsvpIds = rsvpIds.filter(id => isPublicIds.includes(id)); + + if (memberRsvpIds.length > 0) { + const memberUpdateData = { ...updateData }; + if (attended) { + memberUpdateData.checked_in_by = member.id; + } else { + memberUpdateData.checked_in_by = null; + } + + const { error: memberError } = await locals.supabase + .from('event_rsvps') + .update(memberUpdateData) + .in('id', memberRsvpIds); + + if (memberError) { + console.error('Bulk member check-in error:', memberError); + } + } + + if (publicRsvpIds.length > 0) { + const { error: publicError } = await locals.supabase + .from('event_rsvps_public') + .update(updateData) + .in('id', publicRsvpIds); + + if (publicError) { + console.error('Bulk public check-in error:', publicError); + } + } + + return { success: true, count: rsvpIds.length }; + } +}; diff --git a/src/routes/(app)/board/events/[id]/roll-call/+page.svelte b/src/routes/(app)/board/events/[id]/roll-call/+page.svelte new file mode 100644 index 0000000..eda6f21 --- /dev/null +++ b/src/routes/(app)/board/events/[id]/roll-call/+page.svelte @@ -0,0 +1,513 @@ + + + + Roll Call: {event?.title || 'Event'} | Monaco USA + + + +
+ +
+
+
+ + + Back + +
+

+ {event?.title || 'Roll Call'} +

+
+ {#if event?.start_datetime} + {formatEventDate(event.start_datetime)} + {/if} + {#if event?.location} + • {event.location} + {/if} +
+
+ +
+
+ + +
+
+

{stats.checkedIn}

+

Checked In

+
+
+
+

{stats.confirmed}

+

Confirmed

+
+ {#if stats.waitlist > 0} +
+
+

{stats.waitlist}

+

Waitlist

+
+ {/if} +
+ + +
+
+ + + {#if searchQuery} + + {/if} +
+
+ + +
+ {#each [ + { value: 'all', label: 'All', count: stats.total }, + { value: 'confirmed', label: 'Confirmed', count: stats.confirmed }, + { value: 'checked', label: 'Here', count: stats.checkedIn }, + { value: 'unchecked', label: 'Not Here', count: stats.confirmed - stats.checkedIn } + ] as tab} + + {/each} +
+
+ + +
+ {#if form?.error} +
+ {form.error} +
+ {/if} + + {#if filteredRsvps().length === 0} +
+ +

+ {searchQuery ? 'No attendees match your search' : 'No attendees to show'} +

+
+ {:else} +
+ {#each filteredRsvps() as rsvp (rsvp.id)} + {@const isMember = rsvp.type === 'member'} + {@const name = isMember ? `${rsvp.member?.first_name} ${rsvp.member?.last_name}` : rsvp.full_name} + {@const memberId = isMember ? rsvp.member?.member_id : null} + {@const avatarUrl = isMember ? rsvp.member?.avatar_url : null} + +
{ + return async ({ update }) => { + await invalidateAll(); + await update({ reset: false }); + }; + }} + > + + + + + +
+ {/each} +
+ {/if} +
+ + + +
+ + +{#if showWalkInModal} +
+
+ +
+

Add Walk-in

+ +
+ + +
+ + +
+ + +
+ {#if walkInTab === 'member'} + +
+ + +
+ + {#if filteredWalkInMembers.length === 0} +

+ {walkInMemberSearch ? 'No members found' : 'All members have already RSVPed'} +

+ {:else} +
+ {#each filteredWalkInMembers as member (member.id)} + + {/each} +
+ {/if} + + + {#if selectedWalkInMember} +
{ + walkInLoading = true; + return async ({ update, result }) => { + walkInLoading = false; + if (result.type === 'success') { + closeWalkInModal(); + await invalidateAll(); + } + await update({ reset: false }); + }; + }} + class="mt-4" + > + + +
+ {/if} + {:else} + +
{ + walkInLoading = true; + return async ({ update, result }) => { + walkInLoading = false; + if (result.type === 'success') { + closeWalkInModal(); + await invalidateAll(); + } + await update({ reset: false }); + }; + }} + class="space-y-4" + > +
+ + +
+
+ + +
+ +
+ {/if} +
+
+
+{/if} + + diff --git a/src/routes/(app)/board/members/+page.server.ts b/src/routes/(app)/board/members/+page.server.ts new file mode 100644 index 0000000..0b06b0e --- /dev/null +++ b/src/routes/(app)/board/members/+page.server.ts @@ -0,0 +1,62 @@ +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ locals, url }) => { + const searchQuery = url.searchParams.get('search') || ''; + const statusFilter = url.searchParams.get('status') || 'all'; + const roleFilter = url.searchParams.get('role') || 'all'; + + // Build the query + let query = locals.supabase + .from('members_with_dues') + .select('*') + .order('last_name', { ascending: true }); + + // Apply filters + if (statusFilter !== 'all') { + query = query.eq('status_name', statusFilter); + } + + if (roleFilter !== 'all') { + query = query.eq('role', roleFilter); + } + + const { data: members } = await query; + + // Filter by search query in application (for name/email search) + let filteredMembers = members || []; + if (searchQuery) { + const lowerSearch = searchQuery.toLowerCase(); + filteredMembers = filteredMembers.filter( + (m: any) => + m.first_name?.toLowerCase().includes(lowerSearch) || + m.last_name?.toLowerCase().includes(lowerSearch) || + m.email?.toLowerCase().includes(lowerSearch) || + m.member_id?.toLowerCase().includes(lowerSearch) + ); + } + + // Get membership statuses for filter dropdown + const { data: statuses } = await locals.supabase + .from('membership_statuses') + .select('*') + .order('sort_order', { ascending: true }); + + // Calculate stats + const stats = { + total: members?.length || 0, + active: members?.filter((m: any) => m.status_name === 'active').length || 0, + pending: members?.filter((m: any) => m.status_name === 'pending').length || 0, + inactive: members?.filter((m: any) => m.status_name === 'inactive').length || 0 + }; + + return { + members: filteredMembers, + statuses: statuses || [], + stats, + filters: { + search: searchQuery, + status: statusFilter, + role: roleFilter + } + }; +}; diff --git a/src/routes/(app)/board/members/+page.svelte b/src/routes/(app)/board/members/+page.svelte new file mode 100644 index 0000000..de21553 --- /dev/null +++ b/src/routes/(app)/board/members/+page.svelte @@ -0,0 +1,374 @@ + + + + Members Directory | Monaco USA + + +
+
+
+

Members Directory

+

View and manage association members

+
+
+ + +
+
+
+
+ +
+
+

{stats.total}

+

Total Members

+
+
+
+
+
+
+ +
+
+

{stats.active}

+

Active

+
+
+
+
+
+
+ +
+
+

{stats.pending}

+

Pending

+
+
+
+
+
+
+ +
+
+

{stats.inactive}

+

Inactive

+
+
+
+
+ + +
+
+
+ + { + searchQuery = e.currentTarget.value; + handleSearch(e.currentTarget.value); + }} + class="h-10 pl-9" + /> +
+ + +
+ + {#if showFilters} +
+
+ + +
+ +
+ + +
+
+ {/if} +
+ + +
+ {#if members.length === 0} +
+ +

No members found

+

+ {filters.search || filters.status !== 'all' || filters.role !== 'all' + ? 'Try adjusting your search or filters.' + : 'Members will appear here when added.'} +

+
+ {:else} +
+ + + + + + + + + + + + + {#each members as member} + {@const statusInfo = getStatusInfo(member.status_name)} + {@const duesInfo = getDuesInfo(member.dues_status)} + {@const roleBadge = getRoleBadge(member.role)} + + + + + + + + + {/each} + +
+ Member + + Contact + + Status + + Dues + + Member Since + + Actions +
+
+ {#if member.avatar_url} + + {:else} +
+ {member.first_name?.[0]}{member.last_name?.[0]} +
+ {/if} +
+
+

+ {member.first_name} {member.last_name} +

+ + {roleBadge.label} + + {#if member.nationality && member.nationality.length > 0} +
+ {#each member.nationality as code} + + {/each} +
+ {/if} +
+

{member.member_id}

+
+
+
+
+ + {#if member.phone} +
+ + {member.phone} +
+ {/if} +
+
+ + + {member.status_display_name || member.status_name || 'Unknown'} + + +
+ + {duesInfo.label} + + {#if member.current_due_date} +

+ Due: {formatDate(member.current_due_date)} +

+ {/if} +
+
+ {formatDate(member.member_since)} + + +
+
+ {/if} +
+
diff --git a/src/routes/(app)/board/reports/+page.server.ts b/src/routes/(app)/board/reports/+page.server.ts new file mode 100644 index 0000000..34f3055 --- /dev/null +++ b/src/routes/(app)/board/reports/+page.server.ts @@ -0,0 +1,141 @@ +import type { PageServerLoad, Actions } from './$types'; + +export const load: PageServerLoad = async ({ locals, url }) => { + const reportType = url.searchParams.get('type') || 'membership'; + const year = parseInt(url.searchParams.get('year') || new Date().getFullYear().toString()); + + // Get all members with dues info + const { data: members } = await locals.supabase + .from('members_with_dues') + .select('*') + .order('last_name', { ascending: true }); + + // Get all payments for the year + const startOfYear = new Date(year, 0, 1).toISOString(); + const endOfYear = new Date(year, 11, 31, 23, 59, 59).toISOString(); + + const { data: payments } = await locals.supabase + .from('dues_payments') + .select(` + *, + member:members(first_name, last_name, email, member_id) + `) + .gte('payment_date', startOfYear) + .lte('payment_date', endOfYear) + .order('payment_date', { ascending: false }); + + // Get all events for the year with attendance data + const { data: events } = await locals.supabase + .from('events_with_counts') + .select('*') + .gte('start_datetime', startOfYear) + .lte('start_datetime', endOfYear) + .order('start_datetime', { ascending: false }); + + // Get event RSVPs for attendance report + const { data: rsvps } = await locals.supabase + .from('event_rsvps') + .select(` + *, + event:events(title, start_datetime), + member:members(first_name, last_name, email) + `) + .eq('status', 'confirmed'); + + // Calculate membership statistics + const membershipStats = { + total: members?.length || 0, + byStatus: {} as Record, + byRole: { + admin: members?.filter(m => m.role === 'admin').length || 0, + board: members?.filter(m => m.role === 'board').length || 0, + member: members?.filter(m => m.role === 'member').length || 0 + }, + byDuesStatus: { + current: members?.filter(m => m.dues_status === 'current').length || 0, + due_soon: members?.filter(m => m.dues_status === 'due_soon').length || 0, + overdue: members?.filter(m => m.dues_status === 'overdue').length || 0, + never_paid: members?.filter(m => m.dues_status === 'never_paid').length || 0 + } + }; + + // Group by status + for (const member of members || []) { + const status = member.status_display_name || 'Unknown'; + membershipStats.byStatus[status] = (membershipStats.byStatus[status] || 0) + 1; + } + + // Calculate dues collection statistics + const duesStats = { + totalCollected: payments?.reduce((sum, p) => sum + (p.amount || 0), 0) || 0, + paymentCount: payments?.length || 0, + byMonth: {} as Record, + byMethod: {} as Record + }; + + // Group payments by month + for (const payment of payments || []) { + const month = new Date(payment.payment_date).toLocaleDateString('en-US', { month: 'short', year: 'numeric' }); + if (!duesStats.byMonth[month]) { + duesStats.byMonth[month] = { amount: 0, count: 0 }; + } + duesStats.byMonth[month].amount += payment.amount || 0; + duesStats.byMonth[month].count++; + + const method = payment.payment_method || 'Unknown'; + if (!duesStats.byMethod[method]) { + duesStats.byMethod[method] = { amount: 0, count: 0 }; + } + duesStats.byMethod[method].amount += payment.amount || 0; + duesStats.byMethod[method].count++; + } + + // Calculate event attendance statistics + const eventStats = { + totalEvents: events?.length || 0, + totalAttendees: events?.reduce((sum, e) => sum + (e.total_attendees || 0), 0) || 0, + averageAttendance: events?.length + ? Math.round((events.reduce((sum, e) => sum + (e.total_attendees || 0), 0) / events.length)) + : 0, + byType: {} as Record + }; + + // Group events by type + for (const event of events || []) { + const type = event.event_type_name || 'General'; + if (!eventStats.byType[type]) { + eventStats.byType[type] = { count: 0, attendees: 0 }; + } + eventStats.byType[type].count++; + eventStats.byType[type].attendees += event.total_attendees || 0; + } + + // Available years for dropdown + const currentYear = new Date().getFullYear(); + const availableYears = Array.from({ length: 5 }, (_, i) => currentYear - i); + + return { + reportType, + year, + availableYears, + members: members || [], + payments: payments || [], + events: events || [], + rsvps: rsvps || [], + membershipStats, + duesStats, + eventStats + }; +}; + +export const actions: Actions = { + exportCsv: async ({ request, locals }) => { + const formData = await request.formData(); + const reportType = formData.get('report_type') as string; + const year = parseInt(formData.get('year') as string); + + // Data will be generated client-side for CSV export + // This action is a placeholder for server-side export if needed + return { success: true }; + } +}; diff --git a/src/routes/(app)/board/reports/+page.svelte b/src/routes/(app)/board/reports/+page.svelte new file mode 100644 index 0000000..67e9e7d --- /dev/null +++ b/src/routes/(app)/board/reports/+page.svelte @@ -0,0 +1,511 @@ + + + + Reports | Monaco USA + + +
+ +
+
+

Reports

+

Generate and export membership, dues, and event reports

+
+ +
+ + + + + +
+
+ + +
+ {#each reportTabs as tab} + + {/each} +
+ + + {#if reportType === 'membership'} +
+ +
+
+
+
+

Total Members

+

{membershipStats.total}

+
+ +
+
+ +
+
+
+

Current Dues

+

{membershipStats.byDuesStatus.current}

+
+ +
+
+ +
+
+
+

Overdue

+

{membershipStats.byDuesStatus.overdue}

+
+ +
+
+ +
+
+
+

Never Paid

+

{membershipStats.byDuesStatus.never_paid}

+
+ +
+
+
+ + +
+ +
+

Members by Role

+
+
+ Administrators + {membershipStats.byRole.admin} +
+
+ Board Members + {membershipStats.byRole.board} +
+
+ Regular Members + {membershipStats.byRole.member} +
+
+
+ + +
+

Members by Status

+
+ {#each Object.entries(membershipStats.byStatus) as [status, count]} +
+ {status} + {count} +
+ {/each} +
+
+
+ + +
+
+

All Members ({members.length})

+
+
+ + + + + + + + + + + + {#each members.slice(0, 20) as member} + + + + + + + + {/each} + +
MemberIDStatusDuesSince
+
+

{member.first_name} {member.last_name}

+

{member.email}

+
+
{member.member_id} + + {member.status_display_name || 'Unknown'} + + + + {member.dues_status.replace('_', ' ')} + + {formatDate(member.member_since)}
+
+ {#if members.length > 20} +
+ Showing 20 of {members.length} members. Export CSV for full list. +
+ {/if} +
+
+ {/if} + + + {#if reportType === 'dues'} +
+ +
+
+
+
+

Total Collected ({year})

+

{formatCurrency(duesStats.totalCollected)}

+
+ +
+
+ +
+
+
+

Payments

+

{duesStats.paymentCount}

+
+ +
+
+ +
+
+
+

Avg. Payment

+

+ {formatCurrency(duesStats.paymentCount > 0 ? duesStats.totalCollected / duesStats.paymentCount : 0)} +

+
+ +
+
+ +
+
+
+

Collection Rate

+

+ {Math.round((membershipStats.byDuesStatus.current / membershipStats.total) * 100)}% +

+
+ +
+
+
+ + +
+ +
+

Collection by Month

+
+ {#each Object.entries(duesStats.byMonth).slice(0, 12) as [month, data]} +
+ {month} +
+ {formatCurrency(data.amount)} + ({data.count}) +
+
+ {/each} +
+
+ + +
+

Collection by Payment Method

+
+ {#each Object.entries(duesStats.byMethod) as [method, data]} +
+ {method.replace('_', ' ')} +
+ {formatCurrency(data.amount)} + ({data.count}) +
+
+ {/each} +
+
+
+ + +
+
+

All Payments ({payments.length})

+
+
+ + + + + + + + + + + + {#each payments.slice(0, 20) as payment} + + + + + + + + {/each} + +
DateMemberAmountMethodReference
{formatDate(payment.payment_date)} +

{payment.member?.first_name} {payment.member?.last_name}

+
{formatCurrency(payment.amount)}{payment.payment_method?.replace('_', ' ')}{payment.reference || '-'}
+
+ {#if payments.length > 20} +
+ Showing 20 of {payments.length} payments. Export CSV for full list. +
+ {/if} +
+
+ {/if} + + + {#if reportType === 'events'} +
+ +
+
+
+
+

Total Events ({year})

+

{eventStats.totalEvents}

+
+ +
+
+ +
+
+
+

Total Attendees

+

{eventStats.totalAttendees}

+
+ +
+
+ +
+
+
+

Avg. Attendance

+

{eventStats.averageAttendance}

+
+ +
+
+ +
+
+
+

Event Types

+

{Object.keys(eventStats.byType).length}

+
+ +
+
+
+ + +
+

Attendance by Event Type

+
+ {#each Object.entries(eventStats.byType) as [type, data]} +
+

{type}

+
+ {data.count} events + {data.attendees} attendees +
+
+ {/each} +
+
+ + +
+
+

All Events ({events.length})

+
+
+ + + + + + + + + + + + + {#each events.slice(0, 20) as event} + + + + + + + + + {/each} + +
DateEventTypeAttendeesCapacityWaitlist
{formatDate(event.start_datetime)}{event.title} + + {event.event_type_name || 'General'} + + {event.total_attendees}{event.max_attendees || 'Unlimited'}{event.waitlist_count}
+
+ {#if events.length > 20} +
+ Showing 20 of {events.length} events. Export CSV for full list. +
+ {/if} +
+
+ {/if} +
diff --git a/src/routes/(app)/dashboard/+page.server.ts b/src/routes/(app)/dashboard/+page.server.ts new file mode 100644 index 0000000..63b8887 --- /dev/null +++ b/src/routes/(app)/dashboard/+page.server.ts @@ -0,0 +1,84 @@ +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ locals, parent }) => { + const { member } = await parent(); + + // Fetch upcoming events + const { data: upcomingEvents } = await locals.supabase + .from('events_with_counts') + .select('*') + .in('visibility', getVisibleLevels(member?.role)) + .eq('status', 'published') + .gte('start_datetime', new Date().toISOString()) + .order('start_datetime', { ascending: true }) + .limit(5); + + // Fetch stats for board/admin + let stats = null; + + if (member?.role === 'board' || member?.role === 'admin') { + const isAdmin = member?.role === 'admin'; + + // Get member counts by status + const { data: memberCounts } = await locals.supabase + .from('members_with_dues') + .select('status_name, dues_status'); + + const totalMembers = memberCounts?.length || 0; + const activeMembers = memberCounts?.filter((m) => m.status_name === 'active').length || 0; + const pendingMembers = memberCounts?.filter((m) => m.status_name === 'pending').length || 0; + const inactiveMembers = memberCounts?.filter((m) => m.status_name === 'inactive').length || 0; + const duesOverdue = memberCounts?.filter((m) => m.dues_status === 'overdue').length || 0; + const duesSoon = memberCounts?.filter((m) => m.dues_status === 'due_soon').length || 0; + + // Get upcoming events count (next 30 days) + const thirtyDaysFromNow = new Date(); + thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30); + + const { count: upcomingEventsCount } = await locals.supabase + .from('events') + .select('*', { count: 'exact', head: true }) + .eq('status', 'published') + .gte('start_datetime', new Date().toISOString()) + .lte('start_datetime', thirtyDaysFromNow.toISOString()); + + // Get total dues collected this year (admin only) + let totalDuesCollected = 0; + if (isAdmin) { + const startOfYear = new Date(new Date().getFullYear(), 0, 1).toISOString(); + const { data: payments } = await locals.supabase + .from('dues_payments') + .select('amount') + .gte('payment_date', startOfYear); + + totalDuesCollected = payments?.reduce((sum, p) => sum + (p.amount || 0), 0) || 0; + } + + stats = { + totalMembers, + activeMembers, + pendingMembers, + inactiveMembers, + duesOverdue, + duesSoon, + upcomingEventsCount: upcomingEventsCount || 0, + totalDuesCollected + }; + } + + return { + upcomingEvents: upcomingEvents || [], + stats + }; +}; + +function getVisibleLevels(role: string | undefined): string[] { + switch (role) { + case 'admin': + return ['public', 'members', 'board', 'admin']; + case 'board': + return ['public', 'members', 'board']; + default: + return ['public', 'members']; + } +} diff --git a/src/routes/(app)/dashboard/+page.svelte b/src/routes/(app)/dashboard/+page.svelte new file mode 100644 index 0000000..0188d8c --- /dev/null +++ b/src/routes/(app)/dashboard/+page.svelte @@ -0,0 +1,110 @@ + + + + Dashboard | Monaco USA + + +
+ + {#if member} + + {/if} + + + {#if member} + + {/if} + + +
+ + {#if member} + + {/if} + + + +
+ + + {#if isBoard && stats} +
+

Board Overview

+
+ + + + +
+
+ {/if} + + + {#if isAdmin && stats} +
+

Admin Overview

+
+ + + +
+
+ {/if} +
diff --git a/src/routes/(app)/documents/+page.server.ts b/src/routes/(app)/documents/+page.server.ts new file mode 100644 index 0000000..9bce5ae --- /dev/null +++ b/src/routes/(app)/documents/+page.server.ts @@ -0,0 +1,49 @@ +import type { PageServerLoad } from './$types'; +import { isS3Enabled } from '$lib/server/storage'; + +export const load: PageServerLoad = async ({ locals, parent }) => { + const { member } = await parent(); + + // Get visible visibility levels + const visibleLevels = getVisibleLevels(member?.role); + + // Fetch documents with all URL columns + const { data: documents } = await locals.supabase + .from('documents') + .select('*') + .in('visibility', visibleLevels) + .order('created_at', { ascending: false }); + + // Fetch categories + const { data: categories } = await locals.supabase + .from('document_categories') + .select('*') + .eq('is_active', true) + .order('sort_order', { ascending: true }); + + // Resolve active URL for each document based on current storage settings + const s3Enabled = await isS3Enabled(); + const documentsWithActiveUrl = (documents || []).map((doc: any) => ({ + ...doc, + // Compute active URL based on storage setting + active_url: s3Enabled + ? (doc.file_url_s3 || doc.file_path) + : (doc.file_url_local || doc.file_path) + })); + + return { + documents: documentsWithActiveUrl, + categories: categories || [] + }; +}; + +function getVisibleLevels(role: string | undefined): string[] { + switch (role) { + case 'admin': + return ['public', 'members', 'board', 'admin']; + case 'board': + return ['public', 'members', 'board']; + default: + return ['public', 'members']; + } +} diff --git a/src/routes/(app)/documents/+page.svelte b/src/routes/(app)/documents/+page.svelte new file mode 100644 index 0000000..b5fbe80 --- /dev/null +++ b/src/routes/(app)/documents/+page.svelte @@ -0,0 +1,270 @@ + + + + Documents | Monaco USA + + +
+
+
+

Documents

+

Meeting minutes, bylaws, and resources

+
+ +
+
+ + +
+
+
+ + +
+ +
+ + +
+ + +
+ + {#each categories || [] as category} + + {/each} +
+
+ + + {#if filteredDocuments.length === 0} +
+ +

No documents found

+

+ {searchQuery || selectedCategory + ? 'Try adjusting your search or filters.' + : 'Documents will appear here when added.'} +

+
+ {:else if viewMode === 'grid'} +
+ {#each filteredDocuments as doc} + {@const category = getCategory(doc.category_id)} +
+
+
+ + + {getFileIcon(doc.mime_type)} + + {#if category} + + {category.display_name} + + {/if} +
+
+ +
+

{doc.title}

+ {#if doc.description} +

{doc.description}

+ {/if} + +
+ + + {formatDate(doc.created_at)} + + {formatFileSize(doc.file_size)} +
+ + +
+
+ {/each} +
+ {:else} + +
+ + + + + + + + + + + + {#each filteredDocuments as doc} + {@const category = getCategory(doc.category_id)} + + + + + + + + {/each} + +
+ Document + + Category + + Date + + Size + + Actions +
+
+ +
+

{doc.title}

+

{doc.file_name}

+
+
+
+ {category?.display_name || '-'} + + {formatDate(doc.created_at)} + + {formatFileSize(doc.file_size)} + + +
+
+ {/if} +
diff --git a/src/routes/(app)/events/+page.server.ts b/src/routes/(app)/events/+page.server.ts new file mode 100644 index 0000000..175d1ac --- /dev/null +++ b/src/routes/(app)/events/+page.server.ts @@ -0,0 +1,31 @@ +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ locals, parent }) => { + const { member } = await parent(); + + // Get visible events based on user role + const visibleLevels = getVisibleLevels(member?.role); + + const { data: events } = await locals.supabase + .from('events_with_counts') + .select('*') + .in('visibility', visibleLevels) + .eq('status', 'published') + .gte('start_datetime', new Date().toISOString()) + .order('start_datetime', { ascending: true }); + + return { + events: events || [] + }; +}; + +function getVisibleLevels(role: string | undefined): string[] { + switch (role) { + case 'admin': + return ['public', 'members', 'board', 'admin']; + case 'board': + return ['public', 'members', 'board']; + default: + return ['public', 'members']; + } +} diff --git a/src/routes/(app)/events/+page.svelte b/src/routes/(app)/events/+page.svelte new file mode 100644 index 0000000..ce3777b --- /dev/null +++ b/src/routes/(app)/events/+page.svelte @@ -0,0 +1,340 @@ + + + + Events | Monaco USA + + +
+ +
+
+

Events

+

Upcoming events and activities

+
+ +
+
+ + +
+
+
+ + {#if viewMode === 'list'} + +
+ {#if groupedEvents.length === 0} +
+ +

No upcoming events

+

Check back later for new events and activities.

+
+ {:else} + {#each groupedEvents as group} + {@const groupDate = new Date(group.date)} +
+ +
+
+ + {groupDate.toLocaleDateString('en-US', { month: 'short' })} + + + {groupDate.getDate()} + +
+
+

+ {isToday(group.date) + ? 'Today' + : groupDate.toLocaleDateString('en-US', { weekday: 'long' })} +

+

+ {groupDate.toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric' + })} +

+
+
+ + + +
+ {/each} + {/if} +
+ {:else} + +
+ +
+ +

{monthName}

+ +
+ + +
+ +
+
Sun
+
Mon
+
Tue
+
Wed
+
Thu
+
Fri
+
Sat
+
+ + +
+ {#each calendarDays as day} + {@const dayEvents = getEventsForDate(day)} +
+ {#if day} +
+ {day.getDate()} +
+ {#each dayEvents.slice(0, 2) as event} + + {event.title} + + {/each} + {#if dayEvents.length > 2} + +{dayEvents.length - 2} more + {/if} + {/if} +
+ {/each} +
+
+
+ {/if} +
diff --git a/src/routes/(app)/events/[id]/+page.server.ts b/src/routes/(app)/events/[id]/+page.server.ts new file mode 100644 index 0000000..e772021 --- /dev/null +++ b/src/routes/(app)/events/[id]/+page.server.ts @@ -0,0 +1,314 @@ +import { fail, error } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; +import { sendTemplatedEmail } from '$lib/server/email'; + +export const load: PageServerLoad = async ({ locals, params, parent }) => { + const { member } = await parent(); + + // Fetch the event + const { data: event } = await locals.supabase + .from('events_with_counts') + .select('*') + .eq('id', params.id) + .single(); + + if (!event) { + throw error(404, 'Event not found'); + } + + // Check visibility permissions + const visibleLevels = getVisibleLevels(member?.role); + if (!visibleLevels.includes(event.visibility)) { + throw error(403, 'You do not have permission to view this event'); + } + + // Fetch user's RSVP if they have one + let rsvp = null; + if (member) { + const { data } = await locals.supabase + .from('event_rsvps') + .select('*') + .eq('event_id', params.id) + .eq('member_id', member.id) + .single(); + rsvp = data; + } + + return { + event, + rsvp + }; +}; + +export const actions: Actions = { + rsvp: async ({ request, locals, params }) => { + const { member } = await locals.safeGetSession(); + + if (!member) { + return fail(401, { error: 'You must be logged in to RSVP' }); + } + + const formData = await request.formData(); + const guestCount = parseInt(formData.get('guest_count') as string) || 0; + + // Fetch the event to check capacity and guest limits + const { data: event } = await locals.supabase + .from('events_with_counts') + .select('*') + .eq('id', params.id) + .single(); + + if (!event) { + return fail(404, { error: 'Event not found' }); + } + + // Server-side guest count validation + if (event.max_guests_per_member !== null && guestCount > event.max_guests_per_member) { + return fail(400, { + error: `Maximum ${event.max_guests_per_member} guest${event.max_guests_per_member === 1 ? '' : 's'} allowed per member` + }); + } + + // Check if event is full + const totalAttending = event.total_attendees + 1 + guestCount; + const isFull = event.max_attendees && totalAttending > event.max_attendees; + + // Create RSVP + const { error: rsvpError } = await locals.supabase.from('event_rsvps').insert({ + event_id: params.id, + member_id: member.id, + status: isFull ? 'waitlist' : 'confirmed', + guest_count: guestCount, + payment_status: event.is_paid ? 'pending' : 'not_required', + payment_amount: event.is_paid ? event.member_price * (1 + guestCount) : null + }); + + if (rsvpError) { + if (rsvpError.code === '23505') { + return fail(400, { error: 'You have already RSVP\'d to this event' }); + } + console.error('RSVP error:', rsvpError); + return fail(500, { error: 'Failed to submit RSVP. Please try again.' }); + } + + return { + success: isFull + ? 'You have been added to the waitlist. We will notify you if a spot opens up.' + : 'RSVP submitted successfully!' + }; + }, + + updateRsvp: async ({ request, locals, params }) => { + const { member } = await locals.safeGetSession(); + + if (!member) { + return fail(401, { error: 'You must be logged in' }); + } + + const formData = await request.formData(); + const newStatus = formData.get('status') as string; + const guestCount = parseInt(formData.get('guest_count') as string) || 0; + + // Validate status + const validStatuses = ['confirmed', 'declined', 'maybe']; + if (!validStatuses.includes(newStatus)) { + return fail(400, { error: 'Invalid RSVP status' }); + } + + // Fetch the event for validation + const { data: event } = await locals.supabase + .from('events_with_counts') + .select('*') + .eq('id', params.id) + .single(); + + if (!event) { + return fail(404, { error: 'Event not found' }); + } + + // Get current RSVP + const { data: currentRsvp } = await locals.supabase + .from('event_rsvps') + .select('*') + .eq('event_id', params.id) + .eq('member_id', member.id) + .single(); + + if (!currentRsvp) { + return fail(404, { error: 'RSVP not found' }); + } + + // Validate guest count + if (event.max_guests_per_member !== null && guestCount > event.max_guests_per_member) { + return fail(400, { + error: `Maximum ${event.max_guests_per_member} guest${event.max_guests_per_member === 1 ? '' : 's'} allowed` + }); + } + + // If changing from waitlist/declined to confirmed, check capacity + if (newStatus === 'confirmed' && currentRsvp.status !== 'confirmed') { + const spotsNeeded = 1 + guestCount; + const currentConfirmed = event.total_attendees; + if (event.max_attendees && currentConfirmed + spotsNeeded > event.max_attendees) { + return fail(400, { error: 'Event is at capacity. You will remain on the waitlist.' }); + } + } + + // Update RSVP + const { error: updateError } = await locals.supabase + .from('event_rsvps') + .update({ + status: newStatus, + guest_count: guestCount, + payment_amount: event.is_paid ? event.member_price * (1 + guestCount) : null, + updated_at: new Date().toISOString() + }) + .eq('event_id', params.id) + .eq('member_id', member.id); + + if (updateError) { + console.error('Update RSVP error:', updateError); + return fail(500, { error: 'Failed to update RSVP. Please try again.' }); + } + + // If changing to declined from confirmed, try to promote someone from waitlist + if (newStatus === 'declined' && currentRsvp.status === 'confirmed') { + await promoteFromWaitlist(locals.supabase, params.id as string, event); + } + + const statusMessages: Record = { + confirmed: 'Great! You\'re now confirmed for this event.', + declined: 'You have declined this event.', + maybe: 'Your tentative response has been recorded.' + }; + + return { success: statusMessages[newStatus] || 'RSVP updated successfully.' }; + }, + + cancel: async ({ locals, params }) => { + const { member } = await locals.safeGetSession(); + + if (!member) { + return fail(401, { error: 'You must be logged in' }); + } + + // Get current RSVP status before deleting + const { data: currentRsvp } = await locals.supabase + .from('event_rsvps') + .select('status') + .eq('event_id', params.id) + .eq('member_id', member.id) + .single(); + + const { error: deleteError } = await locals.supabase + .from('event_rsvps') + .delete() + .eq('event_id', params.id) + .eq('member_id', member.id); + + if (deleteError) { + console.error('Cancel RSVP error:', deleteError); + return fail(500, { error: 'Failed to cancel RSVP. Please try again.' }); + } + + // If cancelling a confirmed RSVP, try to promote someone from waitlist + if (currentRsvp?.status === 'confirmed') { + // Fetch event for capacity check + const { data: event } = await locals.supabase + .from('events_with_counts') + .select('*') + .eq('id', params.id) + .single(); + + if (event) { + await promoteFromWaitlist(locals.supabase, params.id as string, event); + } + } + + return { success: 'RSVP cancelled successfully.' }; + } +}; + +/** + * Promote the oldest waitlisted member to confirmed status + */ +async function promoteFromWaitlist( + supabase: typeof import('@supabase/supabase-js').SupabaseClient, + eventId: string, + event: { max_attendees: number | null; total_attendees: number; is_paid: boolean; member_price: number; title?: string; start_datetime?: string; location?: string } +) { + // Check if there's room + if (event.max_attendees && event.total_attendees >= event.max_attendees) { + return; // Still full + } + + // Get oldest waitlisted member with their info + const { data: waitlisted } = await supabase + .from('event_rsvps') + .select('id, member_id, guest_count, member:members(first_name, last_name, email)') + .eq('event_id', eventId) + .eq('status', 'waitlist') + .order('created_at', { ascending: true }) + .limit(1) + .single(); + + if (!waitlisted) { + return; // No one on waitlist + } + + // Check if promoting them (plus guests) would exceed capacity + const spotsNeeded = 1 + (waitlisted.guest_count || 0); + if (event.max_attendees && event.total_attendees + spotsNeeded > event.max_attendees) { + return; // Not enough room for this person + guests + } + + // Promote to confirmed + await supabase + .from('event_rsvps') + .update({ + status: 'confirmed', + updated_at: new Date().toISOString() + }) + .eq('id', waitlisted.id); + + // Send email notification to promoted member + const member = waitlisted.member as { first_name: string; last_name: string; email: string } | null; + if (member?.email) { + const eventDate = event.start_datetime + ? new Date(event.start_datetime).toLocaleDateString('en-US', { + weekday: 'long', + month: 'long', + day: 'numeric', + year: 'numeric' + }) + : 'TBD'; + + await sendTemplatedEmail( + 'waitlist_promotion', + member.email, + { + first_name: member.first_name, + event_title: event.title || 'Event', + event_date: eventDate, + event_location: event.location || 'TBD' + }, + { + recipientId: waitlisted.member_id, + recipientName: `${member.first_name} ${member.last_name}` + } + ); + + console.log(`Promoted member ${waitlisted.member_id} from waitlist for event ${eventId} and sent notification`); + } +} + +function getVisibleLevels(role: string | undefined): string[] { + switch (role) { + case 'admin': + return ['public', 'members', 'board', 'admin']; + case 'board': + return ['public', 'members', 'board']; + default: + return ['public', 'members']; + } +} diff --git a/src/routes/(app)/events/[id]/+page.svelte b/src/routes/(app)/events/[id]/+page.svelte new file mode 100644 index 0000000..0862ff9 --- /dev/null +++ b/src/routes/(app)/events/[id]/+page.svelte @@ -0,0 +1,483 @@ + + + + {event?.title || 'Event'} | Monaco USA + + +
+ + + + Back to events + + + {#if event} + +
+ {#if event.cover_image_url} +
+ {event.title} +
+ {/if} + +
+
+ + {event.event_type_name || 'Event'} + + {#if event.is_paid} + + + €{event.member_price} + + {:else} + + Free + + {/if} + {#if event.is_full} + + Full + + {/if} + {#if isPast} + + Past Event + + {/if} +
+ +

{event.title}

+ + {#if event.description} +

{event.description}

+ {/if} +
+
+ + +
+
+ +
+
+

Date & Time

+ {#if event && !isPast} + + {/if} +
+
+
+ +
+

{startDateTime.date}

+

+ {startDateTime.time} - {endDateTime.time} +

+
+
+ {#if event.location} +
+ +
+

{event.location}

+ {#if event.location_url} + + View on map + + + {/if} +
+
+ {/if} +
+
+ + +
+

Attendees

+
+ +
+

+ {event.total_attendees} + {event.max_attendees ? ` / ${event.max_attendees}` : ''} attending +

+ {#if event.waitlist_count > 0} +

{event.waitlist_count} on waitlist

+ {/if} +
+
+
+
+ + +
+
+

RSVP

+ + {#if form?.error} +
+ +
+ {/if} + + {#if form?.success} +
+ +
+ {/if} + + {#if isPast} +

This event has already ended.

+ {:else if rsvp} + +
+
+ {#if isPendingPayment} + + Processing - Payment Required + {:else if rsvp.status === 'confirmed'} + + You're attending! + {:else if rsvp.status === 'waitlist'} + + You're on the waitlist + {:else if rsvp.status === 'maybe'} + + You're tentative + {:else if rsvp.status === 'declined'} + + You declined + {/if} +
+ {#if isPendingPayment && rsvp.payment_amount} +
+
+ Amount Due: + €{rsvp.payment_amount.toFixed(2)} +
+

+ Your RSVP will be confirmed once payment is received. +

+
+ {/if} + {#if rsvp.guest_count > 0} +

+ +{rsvp.guest_count} guest{rsvp.guest_count > 1 ? 's' : ''} +

+ {/if} +
+ + + {#if rsvp.status !== 'cancelled'} +
+

Change your response:

+
+ {#if rsvp.status !== 'confirmed' && !event.is_full} +
{ + loading = true; + return async ({ update, result }) => { + loading = false; + if (result.type === 'success') { + await invalidateAll(); + } + await update(); + }; + }} + class="inline" + > + + + +
+ {/if} + {#if rsvp.status !== 'maybe'} +
{ + loading = true; + return async ({ update, result }) => { + loading = false; + if (result.type === 'success') { + await invalidateAll(); + } + await update(); + }; + }} + class="inline" + > + + + +
+ {/if} + {#if rsvp.status !== 'declined'} +
{ + loading = true; + return async ({ update, result }) => { + loading = false; + if (result.type === 'success') { + await invalidateAll(); + } + await update(); + }; + }} + class="inline" + > + + + +
+ {/if} +
+ + +
{ + loading = true; + return async ({ update, result }) => { + loading = false; + if (result.type === 'success') { + await invalidateAll(); + } + await update(); + }; + }} + > + +
+
+ {/if} + {:else} + +
{ + loading = true; + return async ({ update, result }) => { + loading = false; + if (result.type === 'success') { + await invalidateAll(); + } + await update(); + }; + }} + class="space-y-4" + > + {#if event.max_guests_per_member > 0} +
+ + +

+ Max {event.max_guests_per_member} guest{event.max_guests_per_member > 1 + ? 's' + : ''} allowed +

+
+ {/if} + + {#if event.is_paid} +
+

+ Total: €{(event.member_price * (1 + guestCount)).toFixed(2)} +

+

+ Payment instructions will be sent after RSVP +

+
+ {/if} + + +
+ {/if} +
+
+
+ {:else} +
+

Event not found.

+ + View all events + +
+ {/if} +
diff --git a/src/routes/(app)/payments/+page.server.ts b/src/routes/(app)/payments/+page.server.ts new file mode 100644 index 0000000..de90623 --- /dev/null +++ b/src/routes/(app)/payments/+page.server.ts @@ -0,0 +1,42 @@ +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ locals, parent }) => { + const { member } = await parent(); + + // Fetch payment history + const { data: payments } = await locals.supabase + .from('dues_payments') + .select('*') + .eq('member_id', member?.id) + .order('payment_date', { ascending: false }); + + // Fetch payment settings + const { data: settings } = await locals.supabase + .from('app_settings') + .select('setting_key, setting_value') + .eq('category', 'dues'); + + // Convert settings array to object + const paymentSettings: Record = {}; + if (settings) { + for (const setting of settings) { + const key = setting.setting_key.replace('payment_', ''); + const value = setting.setting_value; + // Handle JSON-encoded strings + if (typeof value === 'string' && value.startsWith('"')) { + try { + paymentSettings[key] = JSON.parse(value); + } catch { + paymentSettings[key] = value; + } + } else { + paymentSettings[key] = String(value); + } + } + } + + return { + payments: payments || [], + paymentSettings + }; +}; diff --git a/src/routes/(app)/payments/+page.svelte b/src/routes/(app)/payments/+page.svelte new file mode 100644 index 0000000..417d4dd --- /dev/null +++ b/src/routes/(app)/payments/+page.svelte @@ -0,0 +1,286 @@ + + + + Payments | Monaco USA + + +
+
+

Payments

+

View your dues status and payment history

+
+ +
+ +
+
+

+ + Dues Status +

+ +
+ +
+

{duesInfo.label}

+

{duesInfo.description}

+
+
+ +
+
+

Annual Dues

+

+ €{(member?.annual_dues || 50).toFixed(2)} +

+
+
+

Membership Type

+

+ {member?.membership_type_name || 'Regular'} +

+
+
+

Last Payment

+

+ {formatDate(member?.last_payment_date)} +

+
+
+

Next Due Date

+

+ {formatDate(member?.current_due_date)} +

+
+
+
+
+ + +
+
+

+ + Payment Details +

+ +

+ Please make your payment via bank transfer to: +

+ +
+ {#if paymentSettings?.bank_name} +
+

Bank

+

{paymentSettings.bank_name}

+
+ {/if} + +
+

Account Holder

+

+ {paymentSettings?.account_holder || 'ASSOCIATION MONACO USA'} +

+
+ +
+

IBAN

+
+ + {paymentSettings?.iban || 'MC58 1756 9000 0104 0050 1001 860'} + + +
+
+ +
+

Reference

+
+ + {member?.member_id} + + +
+
+
+ +

+ Please include your Member ID ({member?.member_id}) in the payment reference. +

+
+
+
+ + +
+
+

+ + Payment History +

+
+ + {#if payments && payments.length > 0} +
+ + + + + + + + + + + + {#each payments as payment} + + + + + + + + {/each} + +
+ Date + + Amount + + Period Covered + + Reference + + Method +
+ {formatDate(payment.payment_date)} + + €{payment.amount.toFixed(2)} + + Until {formatDate(payment.due_date)} + + {payment.reference || '-'} + + {payment.payment_method?.replace('_', ' ') || 'Bank Transfer'} +
+
+ {:else} +
+ +

No payments yet

+

+ Your payment history will appear here once you make your first payment. +

+
+ {/if} +
+
diff --git a/src/routes/(app)/profile/+page.server.ts b/src/routes/(app)/profile/+page.server.ts new file mode 100644 index 0000000..abb2668 --- /dev/null +++ b/src/routes/(app)/profile/+page.server.ts @@ -0,0 +1,167 @@ +import { fail } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; +import { uploadAvatar, deleteAvatar, isS3Enabled, getActiveAvatarUrl } from '$lib/server/storage'; +import { supabaseAdmin } from '$lib/server/supabase'; + +export const load: PageServerLoad = async ({ parent }) => { + const { member } = await parent(); + + // Resolve the correct avatar URL based on current storage settings + if (member) { + const activeAvatarUrl = await getActiveAvatarUrl(member); + return { + member: { + ...member, + avatar_url: activeAvatarUrl + } + }; + } + + return { member }; +}; + +export const actions: Actions = { + updateProfile: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member) { + return fail(401, { error: 'Not authenticated' }); + } + + const formData = await request.formData(); + const firstName = formData.get('first_name') as string; + const lastName = formData.get('last_name') as string; + const phone = formData.get('phone') as string; + const address = formData.get('address') as string; + const nationalityString = formData.get('nationality') as string; + + // Validation + if (!firstName || firstName.length < 2) { + return fail(400, { error: 'First name must be at least 2 characters' }); + } + + if (!lastName || lastName.length < 2) { + return fail(400, { error: 'Last name must be at least 2 characters' }); + } + + if (!phone) { + return fail(400, { error: 'Phone number is required' }); + } + + if (!address || address.length < 10) { + return fail(400, { error: 'Please enter a complete address' }); + } + + const nationality = nationalityString ? nationalityString.split(',').filter(Boolean) : []; + if (nationality.length === 0) { + return fail(400, { error: 'Please select at least one nationality' }); + } + + // Update member profile (use admin client to bypass RLS) + const { error } = await supabaseAdmin + .from('members') + .update({ + first_name: firstName, + last_name: lastName, + phone, + address, + nationality, + updated_at: new Date().toISOString() + }) + .eq('id', member.id); + + if (error) { + console.error('Failed to update profile:', error); + return fail(500, { error: 'Failed to update profile. Please try again.' }); + } + + return { success: 'Profile updated successfully!' }; + }, + + uploadAvatar: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member) { + return fail(401, { error: 'Not authenticated' }); + } + + const formData = await request.formData(); + const file = formData.get('avatar') as File; + + if (!file || !file.size) { + return fail(400, { error: 'Please select an image to upload' }); + } + + // First delete any existing avatar from both storage backends + if (member.avatar_path) { + await deleteAvatar(member.id, member.avatar_path); + } else { + await deleteAvatar(member.id); + } + + // Upload the avatar to appropriate storage (or both) + const result = await uploadAvatar(member.id, file); + + if (!result.success) { + return fail(400, { error: result.error || 'Failed to upload avatar' }); + } + + // Determine active URL based on current S3 setting + const s3Active = await isS3Enabled(); + const activeUrl = s3Active ? result.s3Url : result.localUrl; + + // Update member record with all avatar URLs (use admin client to bypass RLS) + const { error: updateError } = await supabaseAdmin + .from('members') + .update({ + avatar_url: activeUrl || result.publicUrl, + avatar_url_local: result.localUrl || null, + avatar_url_s3: result.s3Url || null, + avatar_path: result.path, + updated_at: new Date().toISOString() + }) + .eq('id', member.id); + + if (updateError) { + console.error('Failed to update avatar URL:', updateError); + return fail(500, { error: 'Failed to update profile with new avatar' }); + } + + return { success: 'Avatar uploaded successfully!' }; + }, + + removeAvatar: async ({ locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member) { + return fail(401, { error: 'Not authenticated' }); + } + + // Delete the avatar from BOTH storage backends using the stored path + if (member.avatar_path) { + await deleteAvatar(member.id, member.avatar_path); + } else { + // Fallback: try to delete common extensions + await deleteAvatar(member.id); + } + + // Update member record to clear all avatar URLs (use admin client to bypass RLS) + const { error: updateError } = await supabaseAdmin + .from('members') + .update({ + avatar_url: null, + avatar_url_local: null, + avatar_url_s3: null, + avatar_path: null, + updated_at: new Date().toISOString() + }) + .eq('id', member.id); + + if (updateError) { + console.error('Failed to remove avatar URL:', updateError); + return fail(500, { error: 'Failed to update profile' }); + } + + return { success: 'Avatar removed successfully!' }; + } +}; diff --git a/src/routes/(app)/profile/+page.svelte b/src/routes/(app)/profile/+page.svelte new file mode 100644 index 0000000..039c996 --- /dev/null +++ b/src/routes/(app)/profile/+page.svelte @@ -0,0 +1,374 @@ + + + + My Profile | Monaco USA + + +
+ +
+
+ +
+ {#if member?.avatar_url} + {`${member.first_name} + {:else} +
+ {member?.first_name[0]}{member?.last_name[0]} +
+ {/if} + + +
{ + avatarLoading = true; + return async ({ update }) => { + await invalidateAll(); + avatarLoading = false; + await update(); + }; + }} + class="absolute bottom-0 right-0" + > + e.currentTarget.form?.requestSubmit()} + class="hidden" + /> + +
+ + + {#if member?.avatar_url} +
{ + avatarLoading = true; + return async ({ update }) => { + await invalidateAll(); + avatarLoading = false; + await update(); + }; + }} + class="absolute -bottom-2 -right-2" + > + +
+ {/if} +
+ +
+

+ {member?.first_name} + {member?.last_name} +

+

{member?.email}

+
+ + {member?.member_id} + + + {member?.status_display_name || 'Pending'} + + {#if member?.role !== 'member'} + + {member?.role} + + {/if} +
+
+
+
+ + +
+

Personal Information

+ + {#if form?.error} +
+ +
+ {/if} + + {#if form?.success} +
+ +
+ {/if} + +
{ + loading = true; + return async ({ update }) => { + await invalidateAll(); + loading = false; + await update(); + }; + }} + class="space-y-6" + > + +
+
+ + +
+
+ + +
+
+ + + + + +
+ + +
+ + +
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + + + + +
+ + +
+ +
+ +
+
+
+ + +
+

Membership Details

+ +
+
+
Member ID
+
{member?.member_id}
+
+
+
Membership Type
+
{member?.membership_type_name || 'Regular'}
+
+
+
Member Since
+
+ {member?.member_since + ? new Date(member.member_since).toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric' + }) + : 'N/A'} +
+
+
+
Date of Birth
+
+ {member?.date_of_birth + ? new Date(member.date_of_birth).toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric' + }) + : 'N/A'} +
+
+
+
+
diff --git a/src/routes/(app)/settings/+page.server.ts b/src/routes/(app)/settings/+page.server.ts new file mode 100644 index 0000000..b45e978 --- /dev/null +++ b/src/routes/(app)/settings/+page.server.ts @@ -0,0 +1,422 @@ +import { fail } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; +import { uploadAvatar, deleteAvatar } from '$lib/server/storage'; +import { sendTemplatedEmail, wrapInMonacoTemplate, sendEmail } from '$lib/server/email'; +import { getMailbox, updateMailbox, type PosteConfig } from '$lib/server/poste'; + +export const load: PageServerLoad = async ({ parent, locals }) => { + const { member } = await parent(); + + // Load notification preferences + const { data: notificationPrefs } = await locals.supabase + .from('user_notification_preferences') + .select('*') + .eq('member_id', member.id) + .single(); + + // Check if member is board/admin and has a monacousa.org email + let monacoEmail: string | null = null; + let hasMonacoEmailAccount = false; + + if (member.role === 'board' || member.role === 'admin') { + // Check if they have a monacousa.org email stored + const { data: emailRecord } = await locals.supabase + .from('members') + .select('monaco_email') + .eq('id', member.id) + .single(); + + if (emailRecord?.monaco_email) { + monacoEmail = emailRecord.monaco_email; + hasMonacoEmailAccount = true; + } else if (member.email?.endsWith('@monacousa.org')) { + // Their primary email is a monacousa.org email + monacoEmail = member.email; + hasMonacoEmailAccount = true; + } + } + + return { + member, + notificationPrefs: notificationPrefs || { + email_event_rsvp_confirmation: true, + email_event_reminder: true, + email_event_updates: true, + email_waitlist_promotion: true, + email_dues_reminder: true, + email_payment_confirmation: true, + email_membership_updates: true, + email_announcements: true, + email_newsletter: true, + newsletter_frequency: 'monthly' + }, + monacoEmail, + hasMonacoEmailAccount + }; +}; + +export const actions: Actions = { + updateProfile: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member) { + return fail(401, { error: 'Not authenticated' }); + } + + const formData = await request.formData(); + const firstName = formData.get('first_name') as string; + const lastName = formData.get('last_name') as string; + const phone = formData.get('phone') as string; + const address = formData.get('address') as string; + const nationalityString = formData.get('nationality') as string; + + // Validation + if (!firstName || firstName.length < 2) { + return fail(400, { error: 'First name must be at least 2 characters' }); + } + + if (!lastName || lastName.length < 2) { + return fail(400, { error: 'Last name must be at least 2 characters' }); + } + + const nationality = nationalityString ? nationalityString.split(',').filter(Boolean) : []; + + // Update member profile + const { error } = await locals.supabase + .from('members') + .update({ + first_name: firstName, + last_name: lastName, + phone: phone || null, + address: address || null, + nationality, + updated_at: new Date().toISOString() + }) + .eq('id', member.id); + + if (error) { + console.error('Failed to update profile:', error); + return fail(500, { error: 'Failed to update profile. Please try again.' }); + } + + return { success: 'Profile updated successfully!' }; + }, + + uploadAvatar: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member) { + return fail(401, { error: 'Not authenticated' }); + } + + const formData = await request.formData(); + const file = formData.get('avatar') as File; + + if (!file || !file.size) { + return fail(400, { error: 'Please select an image to upload' }); + } + + // Validate file type + const allowedTypes = ['image/jpeg', 'image/png', 'image/webp', 'image/gif']; + if (!allowedTypes.includes(file.type)) { + return fail(400, { error: 'Please upload a valid image (JPEG, PNG, WebP, or GIF)' }); + } + + // Validate file size (max 5MB) + if (file.size > 5 * 1024 * 1024) { + return fail(400, { error: 'Image must be less than 5MB' }); + } + + // Upload the avatar - pass user's supabase client for RLS + const result = await uploadAvatar(member.id, file, locals.supabase); + + if (!result.success) { + return fail(400, { error: result.error || 'Failed to upload avatar' }); + } + + // Update member record with avatar URL + const { error: updateError } = await locals.supabase + .from('members') + .update({ + avatar_url: result.publicUrl, + updated_at: new Date().toISOString() + }) + .eq('id', member.id); + + if (updateError) { + console.error('Failed to update avatar URL:', updateError); + return fail(500, { error: 'Failed to update profile with new avatar' }); + } + + return { success: 'Profile picture updated successfully!' }; + }, + + removeAvatar: async ({ locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member) { + return fail(401, { error: 'Not authenticated' }); + } + + // Delete the avatar from storage - pass user's supabase client for RLS + await deleteAvatar(member.id, locals.supabase); + + // Update member record to remove avatar URL + const { error: updateError } = await locals.supabase + .from('members') + .update({ + avatar_url: null, + updated_at: new Date().toISOString() + }) + .eq('id', member.id); + + if (updateError) { + console.error('Failed to remove avatar URL:', updateError); + return fail(500, { error: 'Failed to update profile' }); + } + + return { success: 'Profile picture removed!' }; + }, + + updateNotifications: async ({ request, locals }) => { + const { member } = await locals.safeGetSession(); + + if (!member) { + return fail(401, { error: 'Not authenticated' }); + } + + const formData = await request.formData(); + + const notificationPrefs = { + email_event_rsvp_confirmation: formData.get('email_event_rsvp_confirmation') === 'on', + email_event_reminder: formData.get('email_event_reminder') === 'on', + email_event_updates: formData.get('email_event_updates') === 'on', + email_waitlist_promotion: formData.get('email_waitlist_promotion') === 'on', + email_dues_reminder: formData.get('email_dues_reminder') === 'on', + email_payment_confirmation: formData.get('email_payment_confirmation') === 'on', + email_membership_updates: formData.get('email_membership_updates') === 'on', + email_announcements: formData.get('email_announcements') === 'on', + email_newsletter: formData.get('email_newsletter') === 'on', + newsletter_frequency: formData.get('newsletter_frequency') as string || 'monthly' + }; + + // Upsert notification preferences + const { error } = await locals.supabase + .from('user_notification_preferences') + .upsert({ + member_id: member.id, + ...notificationPrefs, + updated_at: new Date().toISOString() + }, { + onConflict: 'member_id' + }); + + if (error) { + console.error('Failed to update notification preferences:', error); + return fail(500, { error: 'Failed to update notification preferences' }); + } + + return { success: 'Notification preferences saved!' }; + }, + + updateEmail: async ({ request, locals }) => { + const { member, session } = await locals.safeGetSession(); + + if (!member || !session) { + return fail(401, { error: 'Not authenticated' }); + } + + const formData = await request.formData(); + const newEmail = formData.get('email') as string; + + if (!newEmail || !newEmail.includes('@')) { + return fail(400, { error: 'Please enter a valid email address' }); + } + + if (newEmail === member.email) { + return fail(400, { error: 'New email is the same as current email' }); + } + + // Update email in Supabase Auth (will send verification email) + const { error } = await locals.supabase.auth.updateUser({ + email: newEmail + }); + + if (error) { + console.error('Failed to update email:', error); + if (error.message.includes('already registered')) { + return fail(400, { error: 'This email is already in use by another account' }); + } + return fail(500, { error: 'Failed to update email. Please try again.' }); + } + + return { success: 'Verification email sent to your new address. Please check your inbox.' }; + }, + + updatePassword: async ({ request, locals }) => { + const { member, session } = await locals.safeGetSession(); + + if (!member || !session) { + return fail(401, { error: 'Not authenticated' }); + } + + const formData = await request.formData(); + const currentPassword = formData.get('current_password') as string; + const newPassword = formData.get('new_password') as string; + const confirmPassword = formData.get('confirm_password') as string; + + // Validate current password is provided + if (!currentPassword) { + return fail(400, { error: 'Current password is required' }); + } + + if (!newPassword || newPassword.length < 8) { + return fail(400, { error: 'New password must be at least 8 characters' }); + } + + if (newPassword !== confirmPassword) { + return fail(400, { error: 'New passwords do not match' }); + } + + // Verify current password by re-authenticating + const { error: authError } = await locals.supabase.auth.signInWithPassword({ + email: member.email, + password: currentPassword + }); + + if (authError) { + return fail(400, { error: 'Current password is incorrect' }); + } + + // Update password in Supabase Auth + const { error } = await locals.supabase.auth.updateUser({ + password: newPassword + }); + + if (error) { + console.error('Failed to update password:', error); + return fail(500, { error: 'Failed to update password. Please try again.' }); + } + + // Send password changed notification email + const changedAt = new Date().toLocaleString('en-US', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + timeZoneName: 'short' + }); + + // Try to send templated email, fall back to inline email if template doesn't exist + const templateResult = await sendTemplatedEmail( + 'password_changed', + member.email, + { + first_name: member.first_name, + changed_at: changedAt + }, + { + recipientId: member.id, + recipientName: `${member.first_name} ${member.last_name}` + } + ); + + // If template doesn't exist, send a fallback email + if (!templateResult.success && templateResult.error?.includes('not found')) { + const fallbackContent = ` +

Hi ${member.first_name},

+

Your Monaco USA account password was successfully changed on ${changedAt}.

+
+

⚠️ Didn't make this change?

+

If you did not change your password, please contact us immediately at info@monacousa.org.

+
+

This is an automated security notification.

`; + + await sendEmail({ + to: member.email, + subject: 'Your Monaco USA Password Was Changed', + html: wrapInMonacoTemplate({ + title: 'Password Changed', + content: fallbackContent + }), + recipientId: member.id, + recipientName: `${member.first_name} ${member.last_name}`, + emailType: 'account' + }); + } + + return { success: 'Password updated successfully!' }; + }, + + updateMonacoEmailPassword: async ({ request, locals }) => { + const { member, session } = await locals.safeGetSession(); + + if (!member || !session) { + return fail(401, { error: 'Not authenticated' }); + } + + // Check if member has access to Monaco email + if (member.role !== 'board' && member.role !== 'admin') { + return fail(403, { error: 'Monaco email is only available for board members and admins' }); + } + + const formData = await request.formData(); + const monacoEmail = formData.get('monaco_email') as string; + const newPassword = formData.get('monaco_new_password') as string; + const confirmPassword = formData.get('monaco_confirm_password') as string; + + if (!monacoEmail || !monacoEmail.endsWith('@monacousa.org')) { + return fail(400, { error: 'Invalid Monaco USA email address' }); + } + + if (!newPassword || newPassword.length < 8) { + return fail(400, { error: 'Password must be at least 8 characters' }); + } + + if (newPassword !== confirmPassword) { + return fail(400, { error: 'Passwords do not match' }); + } + + // Get Poste configuration from app_settings + const { data: posteSettings } = await locals.supabase + .from('app_settings') + .select('setting_key, setting_value') + .eq('category', 'poste'); + + if (!posteSettings || posteSettings.length === 0) { + return fail(500, { error: 'Email server not configured. Please contact an administrator.' }); + } + + const config: PosteConfig = { + host: '', + adminEmail: '', + adminPassword: '' + }; + + for (const setting of posteSettings) { + let value = setting.setting_value; + if (typeof value === 'string') { + value = value.replace(/^"|"$/g, ''); + } + if (setting.setting_key === 'poste_api_host') config.host = value as string; + if (setting.setting_key === 'poste_admin_email') config.adminEmail = value as string; + if (setting.setting_key === 'poste_admin_password') config.adminPassword = value as string; + } + + if (!config.host || !config.adminEmail || !config.adminPassword) { + return fail(500, { error: 'Email server not properly configured. Please contact an administrator.' }); + } + + // Update the mailbox password + const result = await updateMailbox(config, monacoEmail, { password: newPassword }); + + if (!result.success) { + console.error('Failed to update Monaco email password:', result.error); + return fail(500, { error: result.error || 'Failed to update email password' }); + } + + return { success: 'Monaco USA email password updated successfully!' }; + } +}; diff --git a/src/routes/(app)/settings/+page.svelte b/src/routes/(app)/settings/+page.svelte new file mode 100644 index 0000000..411f83a --- /dev/null +++ b/src/routes/(app)/settings/+page.svelte @@ -0,0 +1,1186 @@ + + + + + + Settings | Monaco USA + + +
+
+

Settings

+

Manage your profile, notifications, and account security

+
+ + {#if form?.error} +
+ {form.error} +
+ {/if} + + {#if form?.success} +
+ {form.success} +
+ {/if} + + +
+ +
+ + + {#if activeTab === 'profile'} +
+ +
+

Profile Picture

+
+
+ {#if avatarPreview || member?.avatar_url} + Profile + {:else} +
+ {getInitials(member?.first_name || '', member?.last_name || '')} +
+ {/if} +
+ +
+
{ + isSubmitting = true; + return async ({ update }) => { + await invalidateAll(); + await update(); + isSubmitting = false; + avatarPreview = null; + }; + }} + > + + {#if avatarPreview} + + {:else} + + {/if} +
+ + {#if member?.avatar_url} +
{ + isSubmitting = true; + return async ({ update }) => { + await invalidateAll(); + await update(); + isSubmitting = false; + }; + }} + > + +
+ {/if} +
+

+ JPG, PNG, WebP or GIF. Max 5MB. +

+
+
+ + +
+

Personal Information

+
{ + isSubmitting = true; + return async ({ update }) => { + await invalidateAll(); + await update(); + isSubmitting = false; + }; + }} + class="space-y-4" + > +
+
+ + +
+
+ + +
+
+ + +
+ +

Select all nationalities/citizenships that apply

+ + + + {#if selectedNationalities.length > 0} +
+ {#each selectedNationalities as code} + {@const lowerCode = code.toLowerCase()} + + + {getCountryName(code)} + + + {/each} +
+ {/if} + + +
+ + + {#if nationalityDropdownOpen} +
+ +
+
+ + +
+
+ + +
+ {#each filteredCountries as country} + + {/each} + {#if filteredCountries.length === 0} +

No countries found

+ {/if} +
+
+ {/if} +
+
+ +
+ + +
+ +
+ + +
+ +
+
+ + +
+
+ + +
+
+ + + + +
+ +
+
+
+
+ {/if} + + + {#if activeTab === 'notifications'} +
{ + isSubmitting = true; + return async ({ update }) => { + await invalidateAll(); + await update(); + isSubmitting = false; + }; + }} + class="space-y-6" + > + +
+
+
+ +
+
+

Event Notifications

+

Control emails about events and RSVPs

+
+
+ +
+ + + + + + + +
+
+ + +
+
+
+ +
+
+

Membership & Payments

+

Notifications about your membership and dues

+
+
+ +
+ + + + + +
+
+ + +
+
+
+ +
+
+

News & Updates

+

Stay informed about Monaco USA activities

+
+
+ +
+ + + +
+
+ +
+ +
+
+ {/if} + + + {#if activeTab === 'account'} +
+ + {#if data.hasMonacoEmailAccount && data.monacoEmail} +
+
+
+ +
+
+

Monaco USA Email

+

Manage your @monacousa.org email account

+
+
+ +
+
+ + {data.monacoEmail} +
+

+ Access your email at mail.monacousa.org +

+
+ +
{ + isSubmitting = true; + return async ({ update }) => { + await invalidateAll(); + await update(); + isSubmitting = false; + }; + }} + class="space-y-4" + > + + +
+ +
+ + +
+
+ +
+ +
+ + +
+

+ Password must be at least 8 characters long. +

+
+ + +
+
+ {/if} + + +
+
+
+ +
+
+

Email Address

+

Update your email address

+
+
+ +
{ + isSubmitting = true; + return async ({ update }) => { + await invalidateAll(); + await update(); + isSubmitting = false; + }; + }} + class="space-y-4" + > +
+ + +
+ +
+ + +

+ A verification link will be sent to your new email address. +

+
+ + +
+
+ + +
+
+
+ +
+
+

Password

+

Change your account password

+
+
+ +
{ + isSubmitting = true; + return async ({ update }) => { + await invalidateAll(); + await update(); + isSubmitting = false; + }; + }} + class="space-y-4" + > +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+

+ Password must be at least 8 characters long. +

+
+ + +
+
+ + +
+

Membership Information

+
+
+

Member ID

+

{member?.member_id || 'N/A'}

+
+
+

Membership Type

+

{member?.membership_type?.display_name || 'N/A'}

+
+
+

Member Since

+

+ {member?.member_since + ? new Date(member.member_since).toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric' + }) + : 'N/A'} +

+
+
+

Status

+

{member?.membership_status?.display_name || 'N/A'}

+
+
+
+
+ {/if} +
diff --git a/src/routes/(auth)/+layout.svelte b/src/routes/(auth)/+layout.svelte new file mode 100644 index 0000000..4a673fa --- /dev/null +++ b/src/routes/(auth)/+layout.svelte @@ -0,0 +1,57 @@ + + +
+ +
+ +
+
+ + +
+
+
+
+
+ +
+ + + + +
+ {@render children()} +
+ + +

+ © 2026 Monaco USA. All rights reserved. +

+
+
diff --git a/src/routes/(auth)/forgot-password/+page.server.ts b/src/routes/(auth)/forgot-password/+page.server.ts new file mode 100644 index 0000000..22734f7 --- /dev/null +++ b/src/routes/(auth)/forgot-password/+page.server.ts @@ -0,0 +1,34 @@ +import { fail } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; + +export const load: PageServerLoad = async () => { + return {}; +}; + +export const actions: Actions = { + default: async ({ request, locals, url }) => { + const formData = await request.formData(); + const email = formData.get('email') as string; + + if (!email || !email.includes('@')) { + return fail(400, { + error: 'Please enter a valid email address', + email + }); + } + + const { error } = await locals.supabase.auth.resetPasswordForEmail(email, { + redirectTo: `${url.origin}/auth/reset-password` + }); + + if (error) { + // Don't reveal if email exists or not for security + console.error('Password reset error:', error); + } + + // Always show success message (don't reveal if email exists) + return { + success: 'If an account exists with this email, you will receive a password reset link shortly.' + }; + } +}; diff --git a/src/routes/(auth)/forgot-password/+page.svelte b/src/routes/(auth)/forgot-password/+page.svelte new file mode 100644 index 0000000..d242b31 --- /dev/null +++ b/src/routes/(auth)/forgot-password/+page.svelte @@ -0,0 +1,83 @@ + + + + Forgot Password | Monaco USA + + +
+
+

Forgot your password?

+

+ Enter your email and we'll send you a reset link +

+
+ + {#if form?.error} + + {/if} + + {#if form?.success} + + + {:else} +
{ + loading = true; + return async ({ update }) => { + loading = false; + await update(); + }; + }} + class="space-y-4" + > + + + + + + + {/if} +
diff --git a/src/routes/(auth)/login/+page.server.ts b/src/routes/(auth)/login/+page.server.ts new file mode 100644 index 0000000..b2cd18c --- /dev/null +++ b/src/routes/(auth)/login/+page.server.ts @@ -0,0 +1,90 @@ +import { fail, redirect } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ url, locals }) => { + const { session } = await locals.safeGetSession(); + + // If already logged in, redirect to dashboard + if (session) { + throw redirect(303, '/dashboard'); + } + + // Handle URL-based error messages + const errorCode = url.searchParams.get('error'); + let errorMessage: string | null = null; + + if (errorCode === 'no_profile') { + errorMessage = 'Your account is not properly configured. Please contact support or try signing up again.'; + } else if (errorCode === 'expired') { + errorMessage = 'Your session has expired. Please sign in again.'; + } else if (errorCode) { + errorMessage = decodeURIComponent(errorCode); + } + + return { + redirectTo: url.searchParams.get('redirectTo') || '/dashboard', + urlError: errorMessage + }; +}; + +export const actions: Actions = { + default: async ({ request, locals, url }) => { + const formData = await request.formData(); + const email = formData.get('email') as string; + const password = formData.get('password') as string; + const redirectTo = url.searchParams.get('redirectTo') || '/dashboard'; + + if (!email || !password) { + return fail(400, { + error: 'Please enter your email and password', + email + }); + } + + const { data, error } = await locals.supabase.auth.signInWithPassword({ + email, + password + }); + + if (error) { + // Handle specific error cases + if (error.message.includes('Invalid login credentials')) { + return fail(400, { + error: 'Invalid email or password. Please try again.', + email + }); + } + + if (error.message.includes('Email not confirmed')) { + return fail(400, { + error: 'Please verify your email address before signing in. Check your inbox for the verification link.', + email + }); + } + + return fail(400, { + error: error.message, + email + }); + } + + // Check if member profile exists + const { data: member } = await locals.supabase + .from('members') + .select('id') + .eq('id', data.user.id) + .single(); + + if (!member) { + // User exists in auth but not in members table - unusual situation + // They may have been deleted or there was a signup issue + await locals.supabase.auth.signOut(); + return fail(400, { + error: 'Your account is not properly configured. Please contact support.', + email + }); + } + + throw redirect(303, redirectTo); + } +}; diff --git a/src/routes/(auth)/login/+page.svelte b/src/routes/(auth)/login/+page.svelte new file mode 100644 index 0000000..0929262 --- /dev/null +++ b/src/routes/(auth)/login/+page.svelte @@ -0,0 +1,110 @@ + + + + Sign In | Monaco USA + + +
+
+

Welcome back

+

Sign in to your member account

+
+ + {#if data.urlError} + + {/if} + + {#if form?.error} + + {/if} + + {#if form?.success} + + {/if} + +
{ + loading = true; + return async ({ update }) => { + loading = false; + await update(); + }; + }} + class="space-y-4" + > + + + + +
+ + + + Forgot password? + +
+ + + + +
+

+ Don't have an account? + + Sign up + +

+
+
diff --git a/src/routes/(auth)/signup/+page.server.ts b/src/routes/(auth)/signup/+page.server.ts new file mode 100644 index 0000000..1b5cf88 --- /dev/null +++ b/src/routes/(auth)/signup/+page.server.ts @@ -0,0 +1,235 @@ +import { fail, redirect } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; +import { supabaseAdmin } from '$lib/server/supabase'; + +export const load: PageServerLoad = async ({ locals }) => { + const { session } = await locals.safeGetSession(); + + // If already logged in, redirect to dashboard + if (session) { + throw redirect(303, '/dashboard'); + } + + return {}; +}; + +export const actions: Actions = { + default: async ({ request, locals, url }) => { + const formData = await request.formData(); + + // Extract form fields + const firstName = formData.get('first_name') as string; + const lastName = formData.get('last_name') as string; + const email = formData.get('email') as string; + const phone = formData.get('phone') as string; + const dateOfBirth = formData.get('date_of_birth') as string; + const address = formData.get('address') as string; + const nationalityString = formData.get('nationality') as string; + const password = formData.get('password') as string; + const confirmPassword = formData.get('confirm_password') as string; + const terms = formData.get('terms'); + + // Validation + const errors: Record = {}; + + if (!firstName || firstName.length < 2) { + errors.first_name = 'First name must be at least 2 characters'; + } + + if (!lastName || lastName.length < 2) { + errors.last_name = 'Last name must be at least 2 characters'; + } + + if (!email || !email.includes('@')) { + errors.email = 'Please enter a valid email address'; + } + + if (!phone) { + errors.phone = 'Phone number is required'; + } + + if (!dateOfBirth) { + errors.date_of_birth = 'Date of birth is required'; + } else { + // Check if 18+ + const birthDate = new Date(dateOfBirth); + const today = new Date(); + const age = today.getFullYear() - birthDate.getFullYear(); + const monthDiff = today.getMonth() - birthDate.getMonth(); + const dayDiff = today.getDate() - birthDate.getDate(); + const actualAge = monthDiff < 0 || (monthDiff === 0 && dayDiff < 0) ? age - 1 : age; + + if (actualAge < 18) { + errors.date_of_birth = 'You must be at least 18 years old to join'; + } + } + + if (!address || address.length < 10) { + errors.address = 'Please enter a complete address'; + } + + const nationality = nationalityString ? nationalityString.split(',').filter(Boolean) : []; + if (nationality.length === 0) { + errors.nationality = 'Please select at least one nationality'; + } + + if (!password || password.length < 8) { + errors.password = 'Password must be at least 8 characters'; + } + + if (password !== confirmPassword) { + errors.confirm_password = 'Passwords do not match'; + } + + if (!terms) { + errors.terms = 'You must accept the terms and conditions'; + } + + // Return validation errors + if (Object.keys(errors).length > 0) { + return fail(400, { + error: Object.values(errors)[0], + first_name: firstName, + last_name: lastName, + email, + phone, + date_of_birth: dateOfBirth, + address + }); + } + + // Create Supabase auth user + const { data: authData, error: authError } = await locals.supabase.auth.signUp({ + email, + password, + options: { + emailRedirectTo: `${url.origin}/auth/callback`, + data: { + first_name: firstName, + last_name: lastName + } + } + }); + + if (authError) { + if (authError.message.includes('already registered')) { + return fail(400, { + error: 'An account with this email already exists. Try signing in instead.', + first_name: firstName, + last_name: lastName, + email, + phone, + date_of_birth: dateOfBirth, + address + }); + } + + return fail(400, { + error: authError.message, + first_name: firstName, + last_name: lastName, + email, + phone, + date_of_birth: dateOfBirth, + address + }); + } + + if (!authData.user) { + return fail(500, { + error: 'Failed to create account. Please try again.', + first_name: firstName, + last_name: lastName, + email, + phone, + date_of_birth: dateOfBirth, + address + }); + } + + // Get the default membership status (pending) + const { data: defaultStatus, error: statusError } = await locals.supabase + .from('membership_statuses') + .select('id') + .eq('is_default', true) + .single(); + + // Get the default membership type + const { data: defaultType, error: typeError } = await locals.supabase + .from('membership_types') + .select('id') + .eq('is_default', true) + .single(); + + // Validate that default status and type exist + if (statusError || !defaultStatus?.id) { + console.error('No default membership status found:', statusError); + // Clean up the auth user since we can't complete registration + await supabaseAdmin.auth.admin.deleteUser(authData.user.id); + return fail(500, { + error: 'System configuration error. Please contact support.', + first_name: firstName, + last_name: lastName, + email, + phone, + date_of_birth: dateOfBirth, + address + }); + } + + if (typeError || !defaultType?.id) { + console.error('No default membership type found:', typeError); + // Clean up the auth user since we can't complete registration + await supabaseAdmin.auth.admin.deleteUser(authData.user.id); + return fail(500, { + error: 'System configuration error. Please contact support.', + first_name: firstName, + last_name: lastName, + email, + phone, + date_of_birth: dateOfBirth, + address + }); + } + + // Create member profile + const { error: memberError } = await locals.supabase.from('members').insert({ + id: authData.user.id, + first_name: firstName, + last_name: lastName, + email, + phone, + date_of_birth: dateOfBirth, + address, + nationality, + role: 'member', + membership_status_id: defaultStatus.id, + membership_type_id: defaultType.id + }); + + if (memberError) { + // Clean up the auth user since member profile creation failed + console.error('Failed to create member profile:', memberError); + try { + await supabaseAdmin.auth.admin.deleteUser(authData.user.id); + } catch (deleteError) { + console.error('Failed to clean up auth user:', deleteError); + } + return fail(500, { + error: 'Failed to create member profile. Please try again or contact support.', + first_name: firstName, + last_name: lastName, + email, + phone, + date_of_birth: dateOfBirth, + address + }); + } + + // Return success - user needs to verify email + return { + success: + 'Account created! Please check your email to verify your account before signing in.' + }; + } +}; diff --git a/src/routes/(auth)/signup/+page.svelte b/src/routes/(auth)/signup/+page.svelte new file mode 100644 index 0000000..fec2221 --- /dev/null +++ b/src/routes/(auth)/signup/+page.svelte @@ -0,0 +1,256 @@ + + + + Sign Up | Monaco USA + + +
+
+

Create your account

+

Join the Monaco USA community

+
+ + {#if form?.error} + + {/if} + + {#if form?.success} + + {:else} +
{ + loading = true; + return async ({ update }) => { + loading = false; + await update(); + }; + }} + class="space-y-4" + > + +
+
+ + +
+
+ + +
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +

You must be at least 18 years old to join.

+
+ + +
+ + +
+ + +
+ + + {#if selectedNationalities.length === 0} +

Select at least one nationality.

+ {/if} +
+ + +
+ + +

At least 8 characters.

+
+ + +
+ + +
+ + +
+ + +
+ + +
+ {/if} + +
+

+ Already have an account? + Sign in +

+
+
diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte new file mode 100644 index 0000000..a42a112 --- /dev/null +++ b/src/routes/+error.svelte @@ -0,0 +1,143 @@ + + + + {status} - {errorInfo.title} | Monaco USA + + +
+ +
+ +
+
+ + +
+
+
+
+
+ +
+ + + + +
+ +
+ + + +
+ + +
{status}
+ + +

{errorInfo.title}

+ + +

{errorInfo.message}

+ + +
+ + + +
+
+ + +

+ Need help? + + Contact support + +

+ + +

© 2026 Monaco USA. All rights reserved.

+
+
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..a424b90 --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,22 @@ + + + + + Monaco USA Portal + + + + + + +
+ {@render children()} +
diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts new file mode 100644 index 0000000..915bea8 --- /dev/null +++ b/src/routes/+page.server.ts @@ -0,0 +1,13 @@ +import { redirect } from '@sveltejs/kit'; +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ locals }) => { + const { session } = await locals.safeGetSession(); + + // If logged in, go to dashboard; otherwise go to login + if (session) { + throw redirect(303, '/dashboard'); + } else { + throw redirect(303, '/login'); + } +}; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..50beda5 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,222 @@ + + +
+ +
+
+
+
+
+ + +
+ +
+
+ Member Portal 2026 +
+ +

+ Monaco USA +

+ +

+ Americans in Monaco - Your gateway to community events, member resources, and association + management. +

+ +
+ + +
+
+ + +
+ + +
+ + + +
+ Member Directory + + Connect with fellow Americans in Monaco through our comprehensive member directory. + +
+
+ + + +
+ + + +
+ Events Calendar + + Stay updated with social gatherings, meetings, and special events in the community. + +
+
+ + + +
+ + + +
+ Documents & Resources + + Access meeting minutes, bylaws, and important association documents anytime. + +
+
+ + + +
+ + + +
+ Dues Management + + Track your membership dues, view payment history, and manage your subscription. + +
+
+ + + +
+ + + +
+ Notifications + + Receive timely reminders about events, dues, and important announcements. + +
+
+ + + +
+ + + +
+ Secure Access + + Role-based access ensures members, board, and admins see exactly what they need. + +
+
+
+ + +
+
+
+

150+

+

Active Members

+
+
+

50+

+

Events Per Year

+
+
+

25+

+

Years Active

+
+
+

100%

+

Community Driven

+
+
+
+ + +
+

© 2026 Monaco USA. All rights reserved.

+

Americans in Monaco since 1999

+
+
+
diff --git a/src/routes/api/auth/check-verification/+server.ts b/src/routes/api/auth/check-verification/+server.ts new file mode 100644 index 0000000..b781e4e --- /dev/null +++ b/src/routes/api/auth/check-verification/+server.ts @@ -0,0 +1,16 @@ +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; + +export const GET: RequestHandler = async ({ locals }) => { + const { session, user } = await locals.safeGetSession(); + + if (!session || !user) { + return json({ verified: false, error: 'Not authenticated' }, { status: 401 }); + } + + // Check if email is verified + // In Supabase, this is stored in user metadata + const emailVerified = user.email_confirmed_at !== null; + + return json({ verified: emailVerified }); +}; diff --git a/src/routes/api/auth/resend-verification/+server.ts b/src/routes/api/auth/resend-verification/+server.ts new file mode 100644 index 0000000..36b1de7 --- /dev/null +++ b/src/routes/api/auth/resend-verification/+server.ts @@ -0,0 +1,30 @@ +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; + +export const POST: RequestHandler = async ({ locals, url }) => { + const { session, user } = await locals.safeGetSession(); + + if (!session || !user) { + return json({ error: 'Not authenticated' }, { status: 401 }); + } + + if (!user.email) { + return json({ error: 'No email associated with account' }, { status: 400 }); + } + + // Resend verification email + const { error } = await locals.supabase.auth.resend({ + type: 'signup', + email: user.email, + options: { + emailRedirectTo: `${url.origin}/join?verified=true` + } + }); + + if (error) { + console.error('Failed to resend verification email:', error); + return json({ error: error.message }, { status: 500 }); + } + + return json({ success: true, message: 'Verification email sent' }); +}; diff --git a/src/routes/api/calendar/events/[id]/+server.ts b/src/routes/api/calendar/events/[id]/+server.ts new file mode 100644 index 0000000..c4c8c5f --- /dev/null +++ b/src/routes/api/calendar/events/[id]/+server.ts @@ -0,0 +1,97 @@ +/** + * API endpoint for downloading a single event as an .ics file + * Requires authentication for non-public events + */ + +import { error } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { generateSingleEventIcal } from '$lib/server/ical'; + +export const GET: RequestHandler = async ({ params, locals, url }) => { + const eventId = params.id; + + // Get user session + const { member } = await locals.safeGetSession(); + + // Fetch the event + const { data: event, error: fetchError } = await locals.supabase + .from('events') + .select(` + id, + title, + description, + start_datetime, + end_datetime, + location, + location_url, + timezone, + status, + visibility, + all_day, + event_type:event_types(name) + `) + .eq('id', eventId) + .single(); + + if (fetchError || !event) { + throw error(404, 'Event not found'); + } + + // Check visibility permissions + const canView = checkVisibility(event.visibility, member?.role); + if (!canView) { + throw error(403, 'You do not have permission to view this event'); + } + + // Generate iCal content + const baseUrl = url.origin || 'https://monacousa.org'; + const icalContent = generateSingleEventIcal( + { + id: event.id, + title: event.title, + description: event.description || undefined, + start_datetime: event.start_datetime, + end_datetime: event.end_datetime, + location: event.location, + location_url: event.location_url, + timezone: event.timezone || 'Europe/Monaco', + status: event.status as 'published' | 'cancelled' | 'draft', + event_type_name: (event.event_type as { name: string } | null)?.name, + organizer_name: 'Monaco USA', + organizer_email: 'events@monacousa.org', + all_day: event.all_day || false + }, + baseUrl + ); + + // Generate filename + const sanitizedTitle = event.title + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-|-$/g, '') + .substring(0, 50); + const filename = `monaco-usa-${sanitizedTitle}.ics`; + + return new Response(icalContent, { + headers: { + 'Content-Type': 'text/calendar; charset=utf-8', + 'Content-Disposition': `attachment; filename="${filename}"`, + 'Cache-Control': 'no-cache, no-store, must-revalidate' + } + }); +}; + +function checkVisibility(visibility: string, role?: string): boolean { + switch (visibility) { + case 'public': + return true; + case 'members': + return !!role; // Any authenticated member + case 'board': + return role === 'board' || role === 'admin'; + case 'admin': + return role === 'admin'; + default: + return false; + } +} diff --git a/src/routes/api/calendar/feed/+server.ts b/src/routes/api/calendar/feed/+server.ts new file mode 100644 index 0000000..0fa16bf --- /dev/null +++ b/src/routes/api/calendar/feed/+server.ts @@ -0,0 +1,117 @@ +/** + * API endpoint for subscribing to Monaco USA events calendar feed + * Returns iCal feed of upcoming events + * + * Usage: + * - /api/calendar/feed - Public events only (no auth required) + * - /api/calendar/feed?token=xxx - Member events with auth token + * + * Subscribe URL: webcal://yourdomain.com/api/calendar/feed + */ + +import type { RequestHandler } from './$types'; +import { generateCalendarFeed, type ICalEvent } from '$lib/server/ical'; +import { supabaseAdmin } from '$lib/server/supabase'; + +export const GET: RequestHandler = async ({ url, locals }) => { + const token = url.searchParams.get('token'); + const includePrivate = url.searchParams.get('private') === 'true'; + + // Determine visibility level based on authentication + let visibilityLevels = ['public']; + let calendarName = 'Monaco USA Public Events'; + + // Check if user is authenticated (via session or token) + const { member } = await locals.safeGetSession(); + + if (member) { + // Authenticated user - include member events + visibilityLevels = getVisibilityLevels(member.role); + calendarName = 'Monaco USA Events'; + } else if (token) { + // Token-based access (for calendar subscriptions) + // Verify the token against a member's calendar token + const { data: memberWithToken } = await supabaseAdmin + .from('members') + .select('id, role') + .eq('calendar_token', token) + .single(); + + if (memberWithToken) { + visibilityLevels = getVisibilityLevels(memberWithToken.role); + calendarName = 'Monaco USA Events'; + } + } + + // Fetch upcoming events + const now = new Date(); + const threeMonthsFromNow = new Date(now.getTime() + 90 * 24 * 60 * 60 * 1000); + + const { data: events, error: fetchError } = await supabaseAdmin + .from('events') + .select(` + id, + title, + description, + start_datetime, + end_datetime, + location, + location_url, + timezone, + status, + visibility, + all_day, + event_type:event_types(name) + `) + .in('visibility', visibilityLevels) + .eq('status', 'published') + .gte('start_datetime', now.toISOString()) + .lte('start_datetime', threeMonthsFromNow.toISOString()) + .order('start_datetime', { ascending: true }); + + if (fetchError) { + console.error('Error fetching events for feed:', fetchError); + return new Response('Error fetching events', { status: 500 }); + } + + // Convert to ICalEvent format + const baseUrl = url.origin || 'https://monacousa.org'; + const icalEvents: ICalEvent[] = (events || []).map(event => ({ + id: event.id, + title: event.title, + description: event.description || undefined, + start_datetime: event.start_datetime, + end_datetime: event.end_datetime, + location: event.location, + location_url: event.location_url, + timezone: event.timezone || 'Europe/Monaco', + status: event.status as 'published' | 'cancelled' | 'draft', + event_type_name: (event.event_type as { name: string } | null)?.name, + organizer_name: 'Monaco USA', + organizer_email: 'events@monacousa.org', + all_day: event.all_day || false + })); + + // Generate iCal feed + const icalContent = generateCalendarFeed(icalEvents, calendarName, baseUrl); + + return new Response(icalContent, { + headers: { + 'Content-Type': 'text/calendar; charset=utf-8', + 'Cache-Control': 'public, max-age=3600', // Cache for 1 hour + 'X-WR-CALNAME': calendarName + } + }); +}; + +function getVisibilityLevels(role?: string): string[] { + switch (role) { + case 'admin': + return ['public', 'members', 'board', 'admin']; + case 'board': + return ['public', 'members', 'board']; + case 'member': + default: + return ['public', 'members']; + } +} diff --git a/src/routes/api/calendar/public/events/[id]/+server.ts b/src/routes/api/calendar/public/events/[id]/+server.ts new file mode 100644 index 0000000..689b53b --- /dev/null +++ b/src/routes/api/calendar/public/events/[id]/+server.ts @@ -0,0 +1,77 @@ +/** + * API endpoint for downloading a public event as an .ics file + * No authentication required - only works for public visibility events + */ + +import { error } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { generateSingleEventIcal } from '$lib/server/ical'; + +export const GET: RequestHandler = async ({ params, url }) => { + const eventId = params.id; + + // Fetch the event using supabaseAdmin since this is a public endpoint + const { supabaseAdmin } = await import('$lib/server/supabase'); + + const { data: event, error: fetchError } = await supabaseAdmin + .from('events') + .select(` + id, + title, + description, + start_datetime, + end_datetime, + location, + location_url, + timezone, + status, + visibility, + all_day, + event_type:event_types(name) + `) + .eq('id', eventId) + .eq('visibility', 'public') + .eq('status', 'published') + .single(); + + if (fetchError || !event) { + throw error(404, 'Event not found or not publicly accessible'); + } + + // Generate iCal content + const baseUrl = url.origin || 'https://monacousa.org'; + const icalContent = generateSingleEventIcal( + { + id: event.id, + title: event.title, + description: event.description || undefined, + start_datetime: event.start_datetime, + end_datetime: event.end_datetime, + location: event.location, + location_url: event.location_url, + timezone: event.timezone || 'Europe/Monaco', + status: event.status as 'published' | 'cancelled' | 'draft', + event_type_name: (event.event_type as { name: string } | null)?.name, + organizer_name: 'Monaco USA', + organizer_email: 'events@monacousa.org', + all_day: event.all_day || false + }, + baseUrl + ); + + // Generate filename + const sanitizedTitle = event.title + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-|-$/g, '') + .substring(0, 50); + const filename = `monaco-usa-${sanitizedTitle}.ics`; + + return new Response(icalContent, { + headers: { + 'Content-Type': 'text/calendar; charset=utf-8', + 'Content-Disposition': `attachment; filename="${filename}"`, + 'Cache-Control': 'public, max-age=300' // Cache for 5 minutes + } + }); +}; diff --git a/src/routes/api/cron/dues-reminders/+server.ts b/src/routes/api/cron/dues-reminders/+server.ts new file mode 100644 index 0000000..1a7902d --- /dev/null +++ b/src/routes/api/cron/dues-reminders/+server.ts @@ -0,0 +1,256 @@ +/** + * Cron API Endpoint for Automated Dues Reminders + * + * This endpoint should be called daily by an external cron service + * (e.g., Vercel Cron, GitHub Actions, or a server cron job) + * + * Security: Requires CRON_SECRET header for authentication + * + * Example cron setup (daily at 9 AM): + * 0 9 * * * curl -X POST https://yourdomain.com/api/cron/dues-reminders \ + * -H "Authorization: Bearer YOUR_CRON_SECRET" + */ + +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { env } from '$env/dynamic/private'; +import { + getDuesSettings, + sendBulkReminders, + processGracePeriodExpirations, + getMembersNeedingReminder, + getMembersNeedingOnboardingReminder, + sendOnboardingReminders, + processOnboardingExpirations, + type ReminderType, + type OnboardingReminderType +} from '$lib/server/dues'; + +const CRON_SECRET = env.CRON_SECRET; + +export const POST: RequestHandler = async ({ request, url }) => { + // Verify cron secret + const authHeader = request.headers.get('authorization'); + const token = authHeader?.replace('Bearer ', ''); + + if (!CRON_SECRET) { + console.error('CRON_SECRET not configured'); + return json({ error: 'Server not configured for cron jobs' }, { status: 500 }); + } + + if (token !== CRON_SECRET) { + return json({ error: 'Unauthorized' }, { status: 401 }); + } + + const baseUrl = url.origin || env.SITE_URL || 'https://monacousa.org'; + const dryRun = url.searchParams.get('dry_run') === 'true'; + + try { + // Load reminder settings + const settings = await getDuesSettings(); + const reminderDays = settings.reminder_days_before || [30, 7, 1]; + + const results = { + timestamp: new Date().toISOString(), + dryRun, + settings: { + reminder_days_before: reminderDays, + grace_period_days: settings.grace_period_days, + auto_inactive_enabled: settings.auto_inactive_enabled + }, + reminders: { + due_soon_30: { eligible: 0, sent: 0, skipped: 0, errors: [] as string[] }, + due_soon_7: { eligible: 0, sent: 0, skipped: 0, errors: [] as string[] }, + due_soon_1: { eligible: 0, sent: 0, skipped: 0, errors: [] as string[] } + } as Record, + overdue: { eligible: 0, sent: 0, skipped: 0, errors: [] as string[] }, + graceWarning: { eligible: 0, sent: 0, skipped: 0, errors: [] as string[] }, + // Onboarding reminders for new members with payment_deadline + onboarding: { + reminder_7: { eligible: 0, sent: 0, skipped: 0, errors: [] as string[] }, + reminder_1: { eligible: 0, sent: 0, skipped: 0, errors: [] as string[] }, + expired: { eligible: 0, sent: 0, skipped: 0, errors: [] as string[] } + }, + inactivated: [] as Array<{ id: string; name: string; email: string }>, + onboardingInactivated: [] as Array<{ id: string; name: string; email: string }>, + summary: { + totalRemindersSent: 0, + totalErrors: 0 + } + }; + + // Process each reminder tier + for (const days of reminderDays) { + const reminderType = `due_soon_${days}` as ReminderType; + + // Get eligible members + const eligibleMembers = await getMembersNeedingReminder(reminderType); + results.reminders[reminderType] = { + eligible: eligibleMembers.length, + sent: 0, + skipped: 0, + errors: [] + }; + + if (!dryRun && eligibleMembers.length > 0) { + const result = await sendBulkReminders(reminderType, baseUrl); + results.reminders[reminderType].sent = result.sent; + results.reminders[reminderType].skipped = result.skipped; + results.reminders[reminderType].errors = result.errors; + results.summary.totalRemindersSent += result.sent; + results.summary.totalErrors += result.errors.length; + } + } + + // Process overdue notifications + const overdueMembers = await getMembersNeedingReminder('overdue'); + results.overdue.eligible = overdueMembers.length; + + if (!dryRun && overdueMembers.length > 0) { + const overdueResult = await sendBulkReminders('overdue', baseUrl); + results.overdue.sent = overdueResult.sent; + results.overdue.skipped = overdueResult.skipped; + results.overdue.errors = overdueResult.errors; + results.summary.totalRemindersSent += overdueResult.sent; + results.summary.totalErrors += overdueResult.errors.length; + } + + // Process grace period warnings + const graceMembers = await getMembersNeedingReminder('grace_period'); + results.graceWarning.eligible = graceMembers.length; + + if (!dryRun && graceMembers.length > 0) { + const graceResult = await sendBulkReminders('grace_period', baseUrl); + results.graceWarning.sent = graceResult.sent; + results.graceWarning.skipped = graceResult.skipped; + results.graceWarning.errors = graceResult.errors; + results.summary.totalRemindersSent += graceResult.sent; + results.summary.totalErrors += graceResult.errors.length; + } + + // Process grace period expirations (mark members as inactive) + if (!dryRun && settings.auto_inactive_enabled) { + const inactivationResult = await processGracePeriodExpirations(baseUrl); + results.inactivated = inactivationResult.members; + } + + // ============================================ + // ONBOARDING REMINDERS (new members with payment_deadline) + // ============================================ + + // Process 7-day onboarding reminders + const onboarding7Members = await getMembersNeedingOnboardingReminder('onboarding_reminder_7'); + results.onboarding.reminder_7.eligible = onboarding7Members.length; + + if (!dryRun && onboarding7Members.length > 0) { + const onboarding7Result = await sendOnboardingReminders('onboarding_reminder_7', baseUrl); + results.onboarding.reminder_7.sent = onboarding7Result.sent; + results.onboarding.reminder_7.skipped = onboarding7Result.skipped; + results.onboarding.reminder_7.errors = onboarding7Result.errors; + results.summary.totalRemindersSent += onboarding7Result.sent; + results.summary.totalErrors += onboarding7Result.errors.length; + } + + // Process 1-day onboarding reminders (final warning) + const onboarding1Members = await getMembersNeedingOnboardingReminder('onboarding_reminder_1'); + results.onboarding.reminder_1.eligible = onboarding1Members.length; + + if (!dryRun && onboarding1Members.length > 0) { + const onboarding1Result = await sendOnboardingReminders('onboarding_reminder_1', baseUrl); + results.onboarding.reminder_1.sent = onboarding1Result.sent; + results.onboarding.reminder_1.skipped = onboarding1Result.skipped; + results.onboarding.reminder_1.errors = onboarding1Result.errors; + results.summary.totalRemindersSent += onboarding1Result.sent; + results.summary.totalErrors += onboarding1Result.errors.length; + } + + // Process expired onboarding deadlines (mark as inactive) + if (!dryRun && settings.auto_inactive_enabled) { + const onboardingExpiredResult = await processOnboardingExpirations(baseUrl); + results.onboardingInactivated = onboardingExpiredResult.members; + } + + return json(results); + } catch (error) { + console.error('Cron job error:', error); + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + return json( + { + error: 'Internal server error', + message: errorMessage, + timestamp: new Date().toISOString() + }, + { status: 500 } + ); + } +}; + +/** + * GET endpoint for checking cron status and getting preview of pending actions + */ +export const GET: RequestHandler = async ({ request, url }) => { + // Verify cron secret + const authHeader = request.headers.get('authorization'); + const token = authHeader?.replace('Bearer ', ''); + + if (!CRON_SECRET || token !== CRON_SECRET) { + return json({ error: 'Unauthorized' }, { status: 401 }); + } + + try { + const settings = await getDuesSettings(); + const reminderDays = settings.reminder_days_before || [30, 7, 1]; + + const preview = { + timestamp: new Date().toISOString(), + settings: { + reminder_days_before: reminderDays, + grace_period_days: settings.grace_period_days, + auto_inactive_enabled: settings.auto_inactive_enabled + }, + pendingActions: { + due_soon_30: 0, + due_soon_7: 0, + due_soon_1: 0, + overdue: 0, + grace_period: 0 + } as Record, + pendingOnboarding: { + onboarding_reminder_7: 0, + onboarding_reminder_1: 0, + onboarding_expired: 0 + } as Record + }; + + // Count pending for each type + for (const days of reminderDays) { + const reminderType = `due_soon_${days}` as ReminderType; + const members = await getMembersNeedingReminder(reminderType); + preview.pendingActions[reminderType] = members.length; + } + + // Count overdue + const overdueMembers = await getMembersNeedingReminder('overdue'); + preview.pendingActions.overdue = overdueMembers.length; + + // Count grace period warnings + const graceMembers = await getMembersNeedingReminder('grace_period'); + preview.pendingActions.grace_period = graceMembers.length; + + // Count onboarding reminders + const onboarding7Members = await getMembersNeedingOnboardingReminder('onboarding_reminder_7'); + preview.pendingOnboarding.onboarding_reminder_7 = onboarding7Members.length; + + const onboarding1Members = await getMembersNeedingOnboardingReminder('onboarding_reminder_1'); + preview.pendingOnboarding.onboarding_reminder_1 = onboarding1Members.length; + + const onboardingExpiredMembers = await getMembersNeedingOnboardingReminder('onboarding_expired'); + preview.pendingOnboarding.onboarding_expired = onboardingExpiredMembers.length; + + return json(preview); + } catch (error) { + console.error('Cron preview error:', error); + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + return json({ error: 'Internal server error', message: errorMessage }, { status: 500 }); + } +}; diff --git a/src/routes/api/cron/event-reminders/+server.ts b/src/routes/api/cron/event-reminders/+server.ts new file mode 100644 index 0000000..cfbd32f --- /dev/null +++ b/src/routes/api/cron/event-reminders/+server.ts @@ -0,0 +1,158 @@ +/** + * Cron API Endpoint for Automated Event Reminders + * + * This endpoint should be called hourly by an external cron service + * to send reminder emails to members 24 hours before events. + * + * Security: Requires CRON_SECRET header for authentication + * + * Example cron setup (hourly): + * 0 * * * * curl -X POST https://yourdomain.com/api/cron/event-reminders \ + * -H "Authorization: Bearer YOUR_CRON_SECRET" + */ + +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { env } from '$env/dynamic/private'; +import { + getEventReminderSettings, + getEventsNeedingReminders, + sendEventReminders, + getEventReminderStats +} from '$lib/server/event-reminders'; + +const CRON_SECRET = env.CRON_SECRET; + +export const POST: RequestHandler = async ({ request, url }) => { + // Verify cron secret + const authHeader = request.headers.get('authorization'); + const token = authHeader?.replace('Bearer ', ''); + + if (!CRON_SECRET) { + console.error('CRON_SECRET not configured'); + return json({ error: 'Server not configured for cron jobs' }, { status: 500 }); + } + + if (token !== CRON_SECRET) { + return json({ error: 'Unauthorized' }, { status: 401 }); + } + + const baseUrl = url.origin || env.SITE_URL || 'https://monacousa.org'; + const dryRun = url.searchParams.get('dry_run') === 'true'; + + try { + // Load settings + const settings = await getEventReminderSettings(); + + const results = { + timestamp: new Date().toISOString(), + dryRun, + settings: { + event_reminders_enabled: settings.event_reminders_enabled, + event_reminder_hours_before: settings.event_reminder_hours_before + }, + eligible: 0, + sent: 0, + skipped: 0, + errors: [] as string[], + reminders: [] as Array<{ + eventId: string; + eventTitle: string; + memberId: string; + memberName: string; + email: string; + status: string; + error?: string; + }> + }; + + if (!settings.event_reminders_enabled) { + return json({ + ...results, + message: 'Event reminders are disabled' + }); + } + + // Get events needing reminders + const eventsNeeding = await getEventsNeedingReminders(); + results.eligible = eventsNeeding.length; + + if (dryRun) { + // Just show what would be sent + results.reminders = eventsNeeding.map(e => ({ + eventId: e.event_id, + eventTitle: e.event_title, + memberId: e.member_id, + memberName: `${e.first_name} ${e.last_name}`, + email: e.email, + status: 'would_send' + })); + return json(results); + } + + // Send the reminders + if (eventsNeeding.length > 0) { + const sendResult = await sendEventReminders(baseUrl); + results.sent = sendResult.sent; + results.skipped = sendResult.skipped; + results.errors = sendResult.errors; + results.reminders = sendResult.reminders; + } + + return json(results); + } catch (error) { + console.error('Event reminders cron job error:', error); + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + return json( + { + error: 'Internal server error', + message: errorMessage, + timestamp: new Date().toISOString() + }, + { status: 500 } + ); + } +}; + +/** + * GET endpoint for checking status and getting preview of pending reminders + */ +export const GET: RequestHandler = async ({ request }) => { + // Verify cron secret + const authHeader = request.headers.get('authorization'); + const token = authHeader?.replace('Bearer ', ''); + + if (!CRON_SECRET || token !== CRON_SECRET) { + return json({ error: 'Unauthorized' }, { status: 401 }); + } + + try { + const settings = await getEventReminderSettings(); + const eventsNeeding = await getEventsNeedingReminders(); + const stats = await getEventReminderStats(); + + const preview = { + timestamp: new Date().toISOString(), + settings: { + event_reminders_enabled: settings.event_reminders_enabled, + event_reminder_hours_before: settings.event_reminder_hours_before + }, + pendingReminders: eventsNeeding.length, + pendingDetails: eventsNeeding.map(e => ({ + eventId: e.event_id, + eventTitle: e.event_title, + eventStart: e.start_datetime, + memberName: `${e.first_name} ${e.last_name}`, + email: e.email, + guestCount: e.guest_count + })), + stats + }; + + return json(preview); + } catch (error) { + console.error('Event reminders preview error:', error); + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + return json({ error: 'Internal server error', message: errorMessage }, { status: 500 }); + } +}; diff --git a/src/routes/auth/callback/+server.ts b/src/routes/auth/callback/+server.ts new file mode 100644 index 0000000..ca00b0d --- /dev/null +++ b/src/routes/auth/callback/+server.ts @@ -0,0 +1,32 @@ +import { redirect } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; + +/** + * Auth callback handler for email verification and OAuth redirects + * This endpoint exchanges the auth code for a session + */ +export const GET: RequestHandler = async ({ url, locals }) => { + const code = url.searchParams.get('code'); + const next = url.searchParams.get('next') || '/dashboard'; + const error = url.searchParams.get('error'); + const errorDescription = url.searchParams.get('error_description'); + + // Handle error from Supabase auth + if (error) { + console.error('Auth callback error:', error, errorDescription); + throw redirect(303, `/login?error=${encodeURIComponent(errorDescription || error)}`); + } + + // Exchange the code for a session + if (code) { + const { error: exchangeError } = await locals.supabase.auth.exchangeCodeForSession(code); + + if (exchangeError) { + console.error('Failed to exchange code for session:', exchangeError); + throw redirect(303, `/login?error=${encodeURIComponent('Failed to verify email. Please try again.')}`); + } + } + + // Redirect to the next page or dashboard + throw redirect(303, next); +}; diff --git a/src/routes/auth/reset-password/+page.server.ts b/src/routes/auth/reset-password/+page.server.ts new file mode 100644 index 0000000..9c90f85 --- /dev/null +++ b/src/routes/auth/reset-password/+page.server.ts @@ -0,0 +1,111 @@ +import { fail, redirect } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ url, locals }) => { + // Check for token in URL (from email link via /auth/verify redirect) + const token = url.searchParams.get('token'); + const type = url.searchParams.get('type'); + const error = url.searchParams.get('error'); + + // If there's an error from a previous attempt, show it + if (error) { + return { error }; + } + + // If there's a token, we need to verify it to establish a session + if (token) { + try { + // For recovery/invite tokens, verify the OTP + const otpType = type === 'invite' ? 'invite' : 'recovery'; + + const { data, error: verifyError } = await locals.supabase.auth.verifyOtp({ + token_hash: token, + type: otpType + }); + + if (verifyError) { + console.error('Token verification error:', verifyError); + // Token invalid or expired + throw redirect( + 303, + `/forgot-password?error=${encodeURIComponent(verifyError.message || 'Invalid or expired reset link. Please request a new one.')}` + ); + } + + if (data.session) { + // Session established - user can now reset password + return { + isInvite: type === 'invite', + email: data.user?.email + }; + } + } catch (e) { + // Check if it's a redirect (which is expected) + if (e && typeof e === 'object' && 'status' in e) { + throw e; + } + console.error('Verification error:', e); + throw redirect(303, '/forgot-password?error=expired'); + } + } + + // No token - check if user has an existing session (from successful verification) + const { session } = await locals.safeGetSession(); + + if (!session) { + // No session and no token - invalid access + throw redirect(303, '/forgot-password?error=expired'); + } + + return { + email: session.user?.email + }; +}; + +export const actions: Actions = { + default: async ({ request, locals }) => { + const formData = await request.formData(); + const password = formData.get('password') as string; + const confirmPassword = formData.get('confirm_password') as string; + + // Validation + if (!password || password.length < 8) { + return fail(400, { + error: 'Password must be at least 8 characters long' + }); + } + + if (password !== confirmPassword) { + return fail(400, { + error: 'Passwords do not match' + }); + } + + // Check if user has a session + const { session } = await locals.safeGetSession(); + if (!session) { + return fail(401, { + error: 'Session expired. Please request a new password reset link.' + }); + } + + // Update the password + const { error } = await locals.supabase.auth.updateUser({ + password + }); + + if (error) { + console.error('Password update error:', error); + return fail(400, { + error: error.message + }); + } + + // Sign out after password change so they can sign in fresh + await locals.supabase.auth.signOut(); + + return { + success: 'Your password has been set successfully! You can now sign in with your new password.' + }; + } +}; diff --git a/src/routes/auth/reset-password/+page.svelte b/src/routes/auth/reset-password/+page.svelte new file mode 100644 index 0000000..0c42dd5 --- /dev/null +++ b/src/routes/auth/reset-password/+page.svelte @@ -0,0 +1,125 @@ + + + + {isInvite ? 'Set Your Password' : 'Reset Password'} | Monaco USA + + +
+ +
+
+
+
+ +
+ + + +
+
+
+

+ {isInvite ? 'Welcome to Monaco USA!' : 'Reset your password'} +

+

+ {#if isInvite} + Set a password to activate your account + {:else} + Enter a new password for your account + {/if} +

+ {#if email} +

{email}

+ {/if} +
+ + {#if form?.error} + + {/if} + + {#if form?.success} + + + {:else} +
{ + loading = true; + return async ({ update }) => { + loading = false; + await update(); + }; + }} + class="space-y-4" + > + + + + +

Password must be at least 8 characters long.

+ + + + {/if} +
+
+
+
diff --git a/src/routes/auth/verify/+server.ts b/src/routes/auth/verify/+server.ts new file mode 100644 index 0000000..40200cd --- /dev/null +++ b/src/routes/auth/verify/+server.ts @@ -0,0 +1,66 @@ +import { redirect } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; + +/** + * Auth verify handler for email links from Supabase/GoTrue + * This handles invite, recovery, confirmation, and email change tokens + * + * Flow: + * 1. User clicks link in email (e.g., password reset) + * 2. Link goes to /auth/verify?token=...&type=recovery&redirect_to=... + * 3. This handler extracts parameters and redirects to the appropriate SvelteKit page + */ +export const GET: RequestHandler = async ({ url, locals }) => { + const token = url.searchParams.get('token'); + const type = url.searchParams.get('type'); + const redirectTo = url.searchParams.get('redirect_to'); + + console.log('Auth verify handler:', { token: token?.substring(0, 20) + '...', type, redirectTo }); + + // Handle different verification types + if (type === 'recovery' || type === 'rec') { + // Password reset - redirect to reset password page with token + const resetUrl = new URL('/auth/reset-password', url.origin); + if (token) resetUrl.searchParams.set('token', token); + if (type) resetUrl.searchParams.set('type', type); + throw redirect(303, resetUrl.toString()); + } + + if (type === 'invite' || type === 'inv') { + // Member invitation - redirect to set password page + const resetUrl = new URL('/auth/reset-password', url.origin); + if (token) resetUrl.searchParams.set('token', token); + resetUrl.searchParams.set('type', 'invite'); + throw redirect(303, resetUrl.toString()); + } + + if (type === 'signup' || type === 'confirmation' || type === 'email_change') { + // Email confirmation - try to verify directly then redirect + if (token) { + try { + const { error } = await locals.supabase.auth.verifyOtp({ + token_hash: token, + type: type === 'email_change' ? 'email_change' : 'signup' + }); + + if (error) { + console.error('Email verification error:', error); + throw redirect(303, `/login?error=${encodeURIComponent(error.message)}`); + } + + // Success - redirect to dashboard + throw redirect(303, redirectTo || '/dashboard'); + } catch (e) { + if (e && typeof e === 'object' && 'status' in e) { + // This is a redirect, rethrow it + throw e; + } + console.error('Verification error:', e); + throw redirect(303, `/login?error=${encodeURIComponent('Verification failed. Please try again.')}`); + } + } + } + + // Default: redirect to login with error + throw redirect(303, `/login?error=${encodeURIComponent('Invalid verification link')}`); +}; diff --git a/src/routes/join/+layout.svelte b/src/routes/join/+layout.svelte new file mode 100644 index 0000000..911074a --- /dev/null +++ b/src/routes/join/+layout.svelte @@ -0,0 +1,57 @@ + + +
+ +
+ +
+
+ + +
+
+
+
+
+ +
+ + + + + {@render children()} + + +

+ © 2026 Monaco USA. All rights reserved. +

+
+
diff --git a/src/routes/join/+page.server.ts b/src/routes/join/+page.server.ts new file mode 100644 index 0000000..992871c --- /dev/null +++ b/src/routes/join/+page.server.ts @@ -0,0 +1,350 @@ +import { fail, redirect } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; +import { supabaseAdmin } from '$lib/server/supabase'; +import { sendTemplatedEmail } from '$lib/server/email'; + +export const load: PageServerLoad = async ({ locals, url }) => { + const { session } = await locals.safeGetSession(); + + // If already logged in, check if onboarding is completed + if (session) { + // Get member profile to check onboarding status + const { data: member } = await locals.supabase + .from('members') + .select('onboarding_completed_at') + .eq('id', session.user.id) + .single(); + + // Only redirect to dashboard if onboarding is completed + if (member?.onboarding_completed_at) { + throw redirect(303, '/dashboard'); + } + // Otherwise, let them continue the onboarding wizard + } + + // Get payment settings for the payment step + const { data: settings } = await locals.supabase + .from('app_settings') + .select('setting_key, setting_value') + .eq('category', 'dues'); + + const paymentSettings: Record = {}; + if (settings) { + for (const s of settings) { + let value = s.setting_value; + if (typeof value === 'string') { + value = value.replace(/^"|"$/g, ''); + } + paymentSettings[s.setting_key.replace('payment_', '')] = value as string; + } + } + + // Get default membership type for dues amount + const { data: defaultType } = await locals.supabase + .from('membership_types') + .select('annual_dues') + .eq('is_default', true) + .single(); + + // If logged in but not completed onboarding, get member data + let member = null; + if (session) { + const { data } = await locals.supabase + .from('members') + .select('id, first_name, email, member_id') + .eq('id', session.user.id) + .single(); + member = data; + } + + return { + paymentSettings, + duesAmount: defaultType?.annual_dues || 150, + session: session || null, + member + }; +}; + +export const actions: Actions = { + createAccount: async ({ request, locals, url }) => { + const formData = await request.formData(); + + // Extract form fields + const firstName = formData.get('first_name') as string; + const lastName = formData.get('last_name') as string; + const email = formData.get('email') as string; + const phone = formData.get('phone') as string; + const dateOfBirth = formData.get('date_of_birth') as string; + const address = formData.get('address') as string; + const nationalityString = formData.get('nationality') as string; + const password = formData.get('password') as string; + const confirmPassword = formData.get('confirm_password') as string; + const terms = formData.get('terms'); + + // Validation + if (!firstName || firstName.length < 2) { + return fail(400, { error: 'First name must be at least 2 characters', step: 2 }); + } + + if (!lastName || lastName.length < 2) { + return fail(400, { error: 'Last name must be at least 2 characters', step: 2 }); + } + + if (!email || !email.includes('@')) { + return fail(400, { error: 'Please enter a valid email address', step: 2 }); + } + + if (!phone) { + return fail(400, { error: 'Phone number is required', step: 2 }); + } + + if (!dateOfBirth) { + return fail(400, { error: 'Date of birth is required', step: 2 }); + } else { + // Check if 18+ + const birthDate = new Date(dateOfBirth); + const today = new Date(); + const age = today.getFullYear() - birthDate.getFullYear(); + const monthDiff = today.getMonth() - birthDate.getMonth(); + const dayDiff = today.getDate() - birthDate.getDate(); + const actualAge = monthDiff < 0 || (monthDiff === 0 && dayDiff < 0) ? age - 1 : age; + + if (actualAge < 18) { + return fail(400, { error: 'You must be at least 18 years old to join', step: 2 }); + } + } + + if (!address || address.length < 10) { + return fail(400, { error: 'Please enter a complete address', step: 2 }); + } + + const nationality = nationalityString ? nationalityString.split(',').filter(Boolean) : []; + if (nationality.length === 0) { + return fail(400, { error: 'Please select at least one nationality', step: 2 }); + } + + if (!password || password.length < 8) { + return fail(400, { error: 'Password must be at least 8 characters', step: 2 }); + } + + if (password !== confirmPassword) { + return fail(400, { error: 'Passwords do not match', step: 2 }); + } + + if (!terms) { + return fail(400, { error: 'You must accept the terms and conditions', step: 2 }); + } + + // Create Supabase auth user + const { data: authData, error: authError } = await locals.supabase.auth.signUp({ + email, + password, + options: { + emailRedirectTo: `${url.origin}/join?verified=true`, + data: { + first_name: firstName, + last_name: lastName + } + } + }); + + if (authError) { + if (authError.message.includes('already registered')) { + return fail(400, { + error: 'An account with this email already exists. Try signing in instead.', + step: 2 + }); + } + return fail(400, { error: authError.message, step: 2 }); + } + + if (!authData.user) { + return fail(500, { error: 'Failed to create account. Please try again.', step: 2 }); + } + + // Get the pending membership status + const { data: pendingStatus } = await locals.supabase + .from('membership_statuses') + .select('id') + .eq('name', 'pending') + .single(); + + // Get the default membership type + const { data: defaultType } = await locals.supabase + .from('membership_types') + .select('id') + .eq('is_default', true) + .single(); + + if (!pendingStatus?.id || !defaultType?.id) { + console.error('Missing default status or type'); + await supabaseAdmin.auth.admin.deleteUser(authData.user.id); + return fail(500, { error: 'System configuration error. Please contact support.', step: 2 }); + } + + // Generate member ID + const year = new Date().getFullYear(); + const { count } = await locals.supabase + .from('members') + .select('*', { count: 'exact', head: true }); + + const memberNumber = String((count || 0) + 1).padStart(4, '0'); + const memberId = `MUSA-${year}-${memberNumber}`; + + // Create member profile + const { error: memberError } = await locals.supabase.from('members').insert({ + id: authData.user.id, + first_name: firstName, + last_name: lastName, + email, + phone, + date_of_birth: dateOfBirth, + address, + nationality, + member_id: memberId, + role: 'member', + membership_status_id: pendingStatus.id, + membership_type_id: defaultType.id + }); + + if (memberError) { + console.error('Failed to create member profile:', memberError); + try { + await supabaseAdmin.auth.admin.deleteUser(authData.user.id); + } catch (deleteError) { + console.error('Failed to clean up auth user:', deleteError); + } + return fail(500, { + error: 'Failed to create member profile. Please try again.', + step: 2 + }); + } + + // Sign in the user so they can continue the wizard + const { error: signInError } = await locals.supabase.auth.signInWithPassword({ + email, + password + }); + + if (signInError) { + console.error('Failed to sign in after account creation:', signInError); + // Continue anyway - they can verify email and sign in later + } + + return { + success: true, + step: 2, + memberId, + email + }; + }, + + uploadPhoto: async ({ request, locals }) => { + const { session } = await locals.safeGetSession(); + if (!session) { + return fail(401, { error: 'Not authenticated', step: 3 }); + } + + // For now, just proceed to next step + // Avatar upload can be handled via the profile page later + // or we can add proper file handling here + + return { + success: true, + step: 3 + }; + }, + + complete: async ({ locals }) => { + const { session } = await locals.safeGetSession(); + if (!session) { + return fail(401, { error: 'Not authenticated', step: 6 }); + } + + // Set payment deadline (30 days from now) + const paymentDeadline = new Date(); + paymentDeadline.setDate(paymentDeadline.getDate() + 30); + + // Update member with onboarding completion + const { error: updateError } = await locals.supabase + .from('members') + .update({ + payment_deadline: paymentDeadline.toISOString(), + onboarding_completed_at: new Date().toISOString() + }) + .eq('id', session.user.id); + + if (updateError) { + console.error('Failed to update member:', updateError); + return fail(500, { error: 'Failed to complete onboarding', step: 6 }); + } + + // Get member data for email + const { data: member } = await locals.supabase + .from('members') + .select('first_name, member_id, email') + .eq('id', session.user.id) + .single(); + + // Get payment settings + const { data: settings } = await locals.supabase + .from('app_settings') + .select('setting_key, setting_value') + .eq('category', 'dues'); + + const paymentSettings: Record = {}; + if (settings) { + for (const s of settings) { + let value = s.setting_value; + if (typeof value === 'string') { + value = value.replace(/^"|"$/g, ''); + } + paymentSettings[s.setting_key.replace('payment_', '')] = value as string; + } + } + + // Get default membership dues amount + const { data: defaultType } = await locals.supabase + .from('membership_types') + .select('annual_dues') + .eq('is_default', true) + .single(); + + // Send welcome email with payment instructions + if (member) { + try { + await sendTemplatedEmail( + 'onboarding_welcome', + member.email, + { + first_name: member.first_name, + member_id: member.member_id || 'N/A', + amount: `€${defaultType?.annual_dues || 150}`, + payment_deadline: paymentDeadline.toLocaleDateString('en-US', { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric' + }), + account_holder: paymentSettings.account_holder || 'Monaco USA', + bank_name: paymentSettings.bank_name || 'Credit Foncier de Monaco', + iban: paymentSettings.iban || 'Contact for details' + }, + { + recipientId: session.user.id, + recipientName: `${member.first_name}`, + sentBy: 'system' + } + ); + } catch (emailError) { + console.error('Failed to send welcome email:', emailError); + // Continue anyway - not critical + } + } + + return { + success: true, + step: 6 + }; + } +}; diff --git a/src/routes/join/+page.svelte b/src/routes/join/+page.svelte new file mode 100644 index 0000000..2faae76 --- /dev/null +++ b/src/routes/join/+page.svelte @@ -0,0 +1,773 @@ + + + + Join Monaco USA + + + + +
+
+ {#each steps as step} +
+
+ {#if currentStep > step.num} + + {:else} + {step.num} + {/if} +
+ {#if step.num < 6} + + {/if} +
+ {/each} +
+

+ Step {currentStep} of 6: {steps[currentStep - 1].title} +

+
+ + +
+ {#key currentStep} +
+ + {#if currentStep === 1} +
+
+

Welcome to Monaco USA

+

Join our vibrant community of Americans in Monaco

+
+ +
+ {#each benefits as benefit, i} +
+
+ +
+

{benefit.title}

+

{benefit.description}

+
+ {/each} +
+ +
+ +
+ +

+ Already have an account? + Sign in +

+
+ {/if} + + + {#if currentStep === 2} +
+
+
+ +
+

Your Information

+

Tell us about yourself to create your account

+
+ + {#if form?.error} +
+ +
+ {/if} + +
{ + loading = true; + return async ({ update }) => { + loading = false; + await update(); + }; + }} + class="mt-4 space-y-3" + > + +
+
+ + +
+
+ + +
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +

You must be at least 18 years old.

+
+ + +
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + + + + +
+
+ + +
+
+ + +
+
+ + +
+ + +
+ +
+ + +
+
+
+ {/if} + + + {#if currentStep === 3} +
+
+

Add a Profile Photo

+

Help other members recognize you (optional)

+
+ +
+
+ {#if avatarPreview} + Profile preview + {:else} +
+ +
+ {/if} + +
+ +

+ JPEG, PNG, or WebP. Max 5MB. +

+ +
{ + avatarUploading = true; + return async ({ update }) => { + avatarUploading = false; + await update(); + }; + }} + class="mt-6 w-full" + > + {#if avatarFile} + + {/if} + +
+ + + {#if avatarFile} + + {/if} +
+
+
+
+ {/if} + + + {#if currentStep === 4} +
+
+

Explore Your New Home

+

Here's what you'll have access to as a member

+
+ +
+ {#each features as feature, i} +
+
+ +
+
+

{feature.title}

+

{feature.description}

+
+
+ {/each} +
+ +
+ + +
+
+ {/if} + + + {#if currentStep === 5} +
+
+
+ +
+

Verify Your Email

+

+ We sent a verification link to
+ {memberEmail || email} +

+
+ +
+

+ Click the link in your email to verify your address, then click the button below. +

+
+ +
+ + + +
+ +
+ +
+
+ {/if} + + + {#if currentStep === 6} +
+
+
+ +
+

You're Almost There!

+

+ Complete your membership by paying your annual dues within 30 days +

+
+ +
+
+

Annual Membership

+

€{data?.duesAmount || '150'}

+
+
+ +
+

Bank Transfer Details

+
+

+ Account Holder: + {data?.paymentSettings?.account_holder || 'Monaco USA'} +

+

+ Bank: + {data?.paymentSettings?.bank_name || 'Credit Foncier de Monaco'} +

+

+ IBAN: + {data?.paymentSettings?.iban || 'MC58...'} +

+

+ Reference: + {memberId || 'MUSA-2026-XXXX'} +

+
+
+ +
+

What Happens Next?

+
    +
  • • Check your email for confirmation
  • +
  • • Make your bank transfer within 30 days
  • +
  • • We'll activate your account once payment is received
  • +
+
+ +
{ + loading = true; + return async ({ update }) => { + loading = false; + await update(); + }; + }} + class="mt-4" + > + +
+
+ {/if} +
+ {/key} +
diff --git a/src/routes/logout/+server.ts b/src/routes/logout/+server.ts new file mode 100644 index 0000000..f0e03b2 --- /dev/null +++ b/src/routes/logout/+server.ts @@ -0,0 +1,12 @@ +import { redirect } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; + +export const POST: RequestHandler = async ({ locals }) => { + await locals.supabase.auth.signOut(); + throw redirect(303, '/login'); +}; + +export const GET: RequestHandler = async ({ locals }) => { + await locals.supabase.auth.signOut(); + throw redirect(303, '/login'); +}; diff --git a/src/routes/public/events/[id]/+page.server.ts b/src/routes/public/events/[id]/+page.server.ts new file mode 100644 index 0000000..79b8aab --- /dev/null +++ b/src/routes/public/events/[id]/+page.server.ts @@ -0,0 +1,105 @@ +import { error, fail } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ locals, params }) => { + // Fetch the event (only public events) + const { data: event } = await locals.supabase + .from('events_with_counts') + .select('*') + .eq('id', params.id) + .eq('visibility', 'public') + .eq('status', 'published') + .single(); + + if (!event) { + throw error(404, 'Event not found or not publicly accessible'); + } + + return { + event + }; +}; + +export const actions: Actions = { + rsvp: async ({ request, locals, params }) => { + const formData = await request.formData(); + const fullName = (formData.get('full_name') as string)?.trim(); + const email = (formData.get('email') as string)?.trim().toLowerCase(); + const phone = (formData.get('phone') as string)?.trim() || null; + const guestCount = parseInt(formData.get('guest_count') as string) || 0; + + // Validation + if (!fullName || fullName.length < 2) { + return fail(400, { error: 'Please enter your full name' }); + } + + if (!email) { + return fail(400, { error: 'Please enter your email address' }); + } + + // Email validation + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(email)) { + return fail(400, { error: 'Please enter a valid email address' }); + } + + // Fetch the event to check capacity + const { data: event } = await locals.supabase + .from('events_with_counts') + .select('*') + .eq('id', params.id) + .eq('visibility', 'public') + .eq('status', 'published') + .single(); + + if (!event) { + return fail(404, { error: 'Event not found' }); + } + + // Validate guest count + if (event.max_guests_per_member !== null && guestCount > event.max_guests_per_member) { + return fail(400, { + error: `Maximum ${event.max_guests_per_member} guest${event.max_guests_per_member === 1 ? '' : 's'} allowed` + }); + } + + // Check if this email already RSVP'd + const { data: existingRsvp } = await locals.supabase + .from('event_rsvps_public') + .select('id') + .eq('event_id', params.id) + .eq('email', email) + .single(); + + if (existingRsvp) { + return fail(400, { error: 'This email has already registered for this event' }); + } + + // Check if event is full + const totalAttending = event.total_attendees + 1 + guestCount; + const isFull = event.max_attendees && totalAttending > event.max_attendees; + + // Create public RSVP + const { error: rsvpError } = await locals.supabase.from('event_rsvps_public').insert({ + event_id: params.id, + full_name: fullName, + email, + phone, + status: isFull ? 'waitlist' : 'confirmed', + guest_count: guestCount, + payment_status: event.is_paid ? 'pending' : 'not_required', + payment_amount: event.is_paid ? event.non_member_price * (1 + guestCount) : null + }); + + if (rsvpError) { + console.error('Public RSVP error:', rsvpError); + return fail(500, { error: 'Failed to submit RSVP. Please try again.' }); + } + + return { + success: isFull + ? 'You have been added to the waitlist. We will notify you if a spot opens up.' + : 'Registration successful! We look forward to seeing you at the event.' + }; + } +}; diff --git a/src/routes/public/events/[id]/+page.svelte b/src/routes/public/events/[id]/+page.svelte new file mode 100644 index 0000000..891ef93 --- /dev/null +++ b/src/routes/public/events/[id]/+page.svelte @@ -0,0 +1,369 @@ + + + + {event.title} | Monaco USA + + + +
+ +
+
+
+ + + {#if event.event_type_name} + + {event.event_type_name} + + {/if} + +

{event.title}

+ +
+
+ + {formatDate(eventDate)} +
+ {#if !event.all_day} +
+ + {formatTime(eventDate)} - {formatTime(eventEndDate)} +
+ {/if} + {#if event.location} +
+ + {event.location} +
+ {/if} +
+
+
+ + +
+
+ +
+ + {#if event.description} +
+

About This Event

+
+ {@html event.description.replace(/\n/g, '
')} +
+
+ {/if} + + +
+
+

Event Details

+ +
+ +
+
+
+ +
+
+

Date & Time

+

+ {formatDate(eventDate)} + {#if !event.all_day} +
{formatTime(eventDate)} - {formatTime(eventEndDate)} ({event.timezone}) + {:else} +
All day event + {/if} +

+
+
+ + {#if event.location} +
+
+ +
+
+

Location

+

{event.location}

+ {#if event.location_url} + + View on map + + {/if} +
+
+ {/if} + + {#if event.is_paid} +
+
+ +
+
+

Price

+

+ Non-members: {formatCurrency(event.non_member_price)} + {#if event.pricing_notes} +
{event.pricing_notes} + {/if} +

+
+
+ {/if} + +
+
+ +
+
+

Attendance

+

+ {event.total_attendees} registered + {#if event.max_attendees} + / {event.max_attendees} capacity + {/if} +

+ {#if event.waitlist_count > 0} +

{event.waitlist_count} on waitlist

+ {/if} +
+
+
+
+
+ + +
+
+ {#if form?.success} +
+
+
+ +
+
+

You're Registered!

+

{form.success}

+
+ {:else} +

Register for This Event

+ + {#if spotsRemaining !== null && spotsRemaining <= 5} +
+ + + {#if spotsRemaining === 0} + Event is full - Join waitlist + {:else} + Only {spotsRemaining} spot{spotsRemaining === 1 ? '' : 's'} left! + {/if} + +
+ {/if} + + {#if form?.error} +
+ +
+ {/if} + +
{ + loading = true; + return async ({ update }) => { + loading = false; + await update(); + }; + }} + class="mt-6 space-y-4" + > +
+ + +
+ +
+ + +
+ +
+ + +
+ + {#if event.max_guests_per_member !== 0} +
+ + +
+ {/if} + + {#if event.is_paid} +
+
+ Total + + {formatCurrency(event.non_member_price * (1 + guestCount))} + +
+

Payment details will be provided after registration

+
+ {/if} + + + +

+ Already a Monaco USA member? + Sign in + to RSVP with your account. +

+
+ {/if} +
+
+
+
+ + +
+
+

+ © 2026 Monaco USA. All rights reserved. +

+

+ Home + | + Member Login +

+
+
+
diff --git a/static/MONACOUSA-Flags_376x376.png b/static/MONACOUSA-Flags_376x376.png new file mode 100644 index 0000000000000000000000000000000000000000..24314cffd750daf03e2f29f881a6bf1f2d4e48ca GIT binary patch literal 144854 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�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 IR(l}t-K;339@J%7Ex5fN`Qm} z!s|jXEH49!0*fLK5xs&^(Wn$wg%yo!Sy&8;2tjdu(12Q35+2I>#IbI-&L{bf$)C{ zOp>Gv*Zz$QN8rCtf+R^7^HkP?)YR11lM*AUGEx(Q9rFgg(k)uODpbHd3mO@_$;8o`7AY`p-?q?AlYO%Ea8< z)Y-sy+7_WhZo%EUnVVL{RvixyogDL)K?21QbK zXpWS<<|%=Gf#@$}L%J8|yE0+!W{o@uL~H`3)2bP*DvHvoqL`}nnK*1*V_w%w{)F>0 zn+exvFrHII$o;tC%4^vf%B|RpXL{j#;yM$dg&l{oX zi^I4z=^EeO_;5KC??lp?2o+-0YNRK{F-h@pl(Fz#d{mflJHOnp$f3q_>8Gzs_9`jL zNUzXE?JNF;^bO9Hz{ia~D~?uzCzd!=)bqMO@qEDo(t zQ~G?XjZ`8bTEh~WC?sjrNY-khTpod=4ZottYAewi6aKhfuQZjFB?XF`^M6R9Z-$dV zc0@o&Z(tzoQa}2Jrvzgj658%1;j`w!x#lgys7MCeEDzX!Iva<@9!SxOQIYG5>=<8G z5fTY?xDtdm8bpj5L`*bP5lXaGtikWETA2F-7G`i;89FlKo|<%uuQscL_BjdU%Kdvd zu+Q9mCha0AV{>H8XDz{qw=af%=85wjp16>##hqg&+`Rf*Xu{s23o|8D%rY4p6c7T1 zJRETv4Pv7-h}T481(AqBiwV}!TwK|;N>?y^dBtH@5*)mj?7_hx+BU0kjP%I5W zgggvtr3Qvr6|7b7;oh}#xM69*C2~D378$64jjK_ki|Td~Sd+G#yy)kT8y-Hiea^Jp zb9^!KrWblVJ<)62f^Yuz6%WiZ4Cp6QBpU0=p^tLI0evinns%eF{UDAu8L>7i2_b>O z*jl<8_M>~zm8gWZEEl6~O&GPbQn$LBQN5Db?<7!Oo2NPzx(H)#5@yIt2Ky`z^!>sO zmN*4Q`%Z%4&=?jBO#|$758y<*3CZCSTx{9}OT}6o)5oAYKMmI3)Z$>nHXK<;;EJ&v zpIzy~aC;L5DhhEnBau0i7LTd~MUs<%!e;(aeS+fQr$2XtRp!I=rNv_SlnLKVIz`O_y!vRwOcnKc; z;URWz$bz-G5gpr0nC9FR>QHtv+qJI>y?ZLqsaNCj{;jyhDbR8NeH+)(=M0J1re4Iq zBmAZ0xOPidh1P!g#W)w2;y_uN%bIl(;qbXeJ$a1VV>b5MrJl!aP1S5(q(9y#LMBal zscctGF>RN|IQ8Q(M4il>v~*2afBN0@4&8-%w1DAquEtJl5+k+ z*ijl&@#x`Ao&dv4?eTQp(^)gPHGJuD+Xq$VLp53IaQXaSW~#maRGk-ujO4|{@y$8! z)ajO+8}!P_&K*VQ*-z3Rr7GD=2di;!_#7_p-HfgT1!W0ah-%fsntv!@o>E}bd*Q^W zeSkxxIRaBzGhEgbLrq}#YWG#s{(?Zqxe<%~yeo2oCXUx>p$hU&<_7`chpkn9#^lH| z9~Y&;cJ>H$rYM!}N>t$b$q(^he2}_-{TztEm-{<~-xGjieD&5^FMk4>B0rvtk<-hRiH{hCZ%bGj+3zrHe~ zyRtZrC-AIsM7X}Vv-1ZZB&v(rbn0k%E0dz@*JaM<3BIU!1>pLkDuz?VQMSEQ xh4m69&=*q9(gOeh002ovPDHLkV1kr^^)LVc literal 0 HcmV?d00001 diff --git a/static/flags/ad.svg b/static/flags/ad.svg new file mode 100644 index 0000000..199ff19 --- /dev/null +++ b/static/flags/ad.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/ae.svg b/static/flags/ae.svg new file mode 100644 index 0000000..651ac85 --- /dev/null +++ b/static/flags/ae.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/af.svg b/static/flags/af.svg new file mode 100644 index 0000000..4dbe455 --- /dev/null +++ b/static/flags/af.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/ag.svg b/static/flags/ag.svg new file mode 100644 index 0000000..243c3d8 --- /dev/null +++ b/static/flags/ag.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/static/flags/ai.svg b/static/flags/ai.svg new file mode 100644 index 0000000..9c2ea33 --- /dev/null +++ b/static/flags/ai.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/al.svg b/static/flags/al.svg new file mode 100644 index 0000000..e85d95f --- /dev/null +++ b/static/flags/al.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/am.svg b/static/flags/am.svg new file mode 100644 index 0000000..99fa4dc --- /dev/null +++ b/static/flags/am.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/ao.svg b/static/flags/ao.svg new file mode 100644 index 0000000..b73b1ec --- /dev/null +++ b/static/flags/ao.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/aq.svg b/static/flags/aq.svg new file mode 100644 index 0000000..c7e3536 --- /dev/null +++ b/static/flags/aq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/ar.svg b/static/flags/ar.svg new file mode 100644 index 0000000..c753da1 --- /dev/null +++ b/static/flags/ar.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/arab.svg b/static/flags/arab.svg new file mode 100644 index 0000000..9ef079f --- /dev/null +++ b/static/flags/arab.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/as.svg b/static/flags/as.svg new file mode 100644 index 0000000..82459de --- /dev/null +++ b/static/flags/as.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/asean.svg b/static/flags/asean.svg new file mode 100644 index 0000000..189ae02 --- /dev/null +++ b/static/flags/asean.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/at.svg b/static/flags/at.svg new file mode 100644 index 0000000..9d2775c --- /dev/null +++ b/static/flags/at.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/au.svg b/static/flags/au.svg new file mode 100644 index 0000000..96e8076 --- /dev/null +++ b/static/flags/au.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/flags/aw.svg b/static/flags/aw.svg new file mode 100644 index 0000000..413b7c4 --- /dev/null +++ b/static/flags/aw.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/ax.svg b/static/flags/ax.svg new file mode 100644 index 0000000..0584d71 --- /dev/null +++ b/static/flags/ax.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/static/flags/az.svg b/static/flags/az.svg new file mode 100644 index 0000000..3557522 --- /dev/null +++ b/static/flags/az.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/flags/ba.svg b/static/flags/ba.svg new file mode 100644 index 0000000..93bd9cf --- /dev/null +++ b/static/flags/ba.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/static/flags/bb.svg b/static/flags/bb.svg new file mode 100644 index 0000000..cecd5cc --- /dev/null +++ b/static/flags/bb.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/bd.svg b/static/flags/bd.svg new file mode 100644 index 0000000..16b794d --- /dev/null +++ b/static/flags/bd.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/be.svg b/static/flags/be.svg new file mode 100644 index 0000000..ac706a0 --- /dev/null +++ b/static/flags/be.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/bf.svg b/static/flags/bf.svg new file mode 100644 index 0000000..4713822 --- /dev/null +++ b/static/flags/bf.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/bg.svg b/static/flags/bg.svg new file mode 100644 index 0000000..af2d0d0 --- /dev/null +++ b/static/flags/bg.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/bh.svg b/static/flags/bh.svg new file mode 100644 index 0000000..7a2ea54 --- /dev/null +++ b/static/flags/bh.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/bi.svg b/static/flags/bi.svg new file mode 100644 index 0000000..a4434a9 --- /dev/null +++ b/static/flags/bi.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/static/flags/bj.svg b/static/flags/bj.svg new file mode 100644 index 0000000..0846724 --- /dev/null +++ b/static/flags/bj.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/static/flags/bl.svg b/static/flags/bl.svg new file mode 100644 index 0000000..f84cbba --- /dev/null +++ b/static/flags/bl.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/bm.svg b/static/flags/bm.svg new file mode 100644 index 0000000..f43a5eb --- /dev/null +++ b/static/flags/bm.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/bn.svg b/static/flags/bn.svg new file mode 100644 index 0000000..f544c25 --- /dev/null +++ b/static/flags/bn.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/bo.svg b/static/flags/bo.svg new file mode 100644 index 0000000..7658e3f --- /dev/null +++ b/static/flags/bo.svg @@ -0,0 +1,673 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/bq.svg b/static/flags/bq.svg new file mode 100644 index 0000000..0e6bc76 --- /dev/null +++ b/static/flags/bq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/br.svg b/static/flags/br.svg new file mode 100644 index 0000000..719a763 --- /dev/null +++ b/static/flags/br.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/bs.svg b/static/flags/bs.svg new file mode 100644 index 0000000..5cc918e --- /dev/null +++ b/static/flags/bs.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/bt.svg b/static/flags/bt.svg new file mode 100644 index 0000000..20aef3a --- /dev/null +++ b/static/flags/bt.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/bv.svg b/static/flags/bv.svg new file mode 100644 index 0000000..40e16d9 --- /dev/null +++ b/static/flags/bv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/bw.svg b/static/flags/bw.svg new file mode 100644 index 0000000..3435608 --- /dev/null +++ b/static/flags/bw.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/by.svg b/static/flags/by.svg new file mode 100644 index 0000000..948784f --- /dev/null +++ b/static/flags/by.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/static/flags/bz.svg b/static/flags/bz.svg new file mode 100644 index 0000000..d81b16c --- /dev/null +++ b/static/flags/bz.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/ca.svg b/static/flags/ca.svg new file mode 100644 index 0000000..c9b23b4 --- /dev/null +++ b/static/flags/ca.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/cc.svg b/static/flags/cc.svg new file mode 100644 index 0000000..a42dec6 --- /dev/null +++ b/static/flags/cc.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/cd.svg b/static/flags/cd.svg new file mode 100644 index 0000000..b9cf528 --- /dev/null +++ b/static/flags/cd.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/cefta.svg b/static/flags/cefta.svg new file mode 100644 index 0000000..f748d08 --- /dev/null +++ b/static/flags/cefta.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/cf.svg b/static/flags/cf.svg new file mode 100644 index 0000000..a6cd367 --- /dev/null +++ b/static/flags/cf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/static/flags/cg.svg b/static/flags/cg.svg new file mode 100644 index 0000000..f5a0e42 --- /dev/null +++ b/static/flags/cg.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/static/flags/ch.svg b/static/flags/ch.svg new file mode 100644 index 0000000..b42d670 --- /dev/null +++ b/static/flags/ch.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/flags/ci.svg b/static/flags/ci.svg new file mode 100644 index 0000000..e400f0c --- /dev/null +++ b/static/flags/ci.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/ck.svg b/static/flags/ck.svg new file mode 100644 index 0000000..18e547b --- /dev/null +++ b/static/flags/ck.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/flags/cl.svg b/static/flags/cl.svg new file mode 100644 index 0000000..5b3c72f --- /dev/null +++ b/static/flags/cl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/cm.svg b/static/flags/cm.svg new file mode 100644 index 0000000..70adc8b --- /dev/null +++ b/static/flags/cm.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/static/flags/cn.svg b/static/flags/cn.svg new file mode 100644 index 0000000..10d3489 --- /dev/null +++ b/static/flags/cn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/flags/co.svg b/static/flags/co.svg new file mode 100644 index 0000000..ebd0a0f --- /dev/null +++ b/static/flags/co.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/cp.svg b/static/flags/cp.svg new file mode 100644 index 0000000..b8aa9cf --- /dev/null +++ b/static/flags/cp.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/cr.svg b/static/flags/cr.svg new file mode 100644 index 0000000..5a409ee --- /dev/null +++ b/static/flags/cr.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/cu.svg b/static/flags/cu.svg new file mode 100644 index 0000000..053c9ee --- /dev/null +++ b/static/flags/cu.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/cv.svg b/static/flags/cv.svg new file mode 100644 index 0000000..aec8994 --- /dev/null +++ b/static/flags/cv.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/cw.svg b/static/flags/cw.svg new file mode 100644 index 0000000..bb0ece2 --- /dev/null +++ b/static/flags/cw.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/static/flags/cx.svg b/static/flags/cx.svg new file mode 100644 index 0000000..3a83c23 --- /dev/null +++ b/static/flags/cx.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/static/flags/cy.svg b/static/flags/cy.svg new file mode 100644 index 0000000..ee4b0c7 --- /dev/null +++ b/static/flags/cy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/cz.svg b/static/flags/cz.svg new file mode 100644 index 0000000..7913de3 --- /dev/null +++ b/static/flags/cz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/de.svg b/static/flags/de.svg new file mode 100644 index 0000000..71aa2d2 --- /dev/null +++ b/static/flags/de.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/dg.svg b/static/flags/dg.svg new file mode 100644 index 0000000..dfee2bb --- /dev/null +++ b/static/flags/dg.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/dj.svg b/static/flags/dj.svg new file mode 100644 index 0000000..9b00a82 --- /dev/null +++ b/static/flags/dj.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/dk.svg b/static/flags/dk.svg new file mode 100644 index 0000000..563277f --- /dev/null +++ b/static/flags/dk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/dm.svg b/static/flags/dm.svg new file mode 100644 index 0000000..5aa9cea --- /dev/null +++ b/static/flags/dm.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/do.svg b/static/flags/do.svg new file mode 100644 index 0000000..6de2b26 --- /dev/null +++ b/static/flags/do.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/dz.svg b/static/flags/dz.svg new file mode 100644 index 0000000..5ff29a7 --- /dev/null +++ b/static/flags/dz.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/eac.svg b/static/flags/eac.svg new file mode 100644 index 0000000..59d02d2 --- /dev/null +++ b/static/flags/eac.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/ec.svg b/static/flags/ec.svg new file mode 100644 index 0000000..88c50bf --- /dev/null +++ b/static/flags/ec.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/ee.svg b/static/flags/ee.svg new file mode 100644 index 0000000..8b98c2c --- /dev/null +++ b/static/flags/ee.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/eg.svg b/static/flags/eg.svg new file mode 100644 index 0000000..88e32b3 --- /dev/null +++ b/static/flags/eg.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/eh.svg b/static/flags/eh.svg new file mode 100644 index 0000000..6aec728 --- /dev/null +++ b/static/flags/eh.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/static/flags/er.svg b/static/flags/er.svg new file mode 100644 index 0000000..48a13b4 --- /dev/null +++ b/static/flags/er.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/flags/es-ct.svg b/static/flags/es-ct.svg new file mode 100644 index 0000000..4d85911 --- /dev/null +++ b/static/flags/es-ct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/es-ga.svg b/static/flags/es-ga.svg new file mode 100644 index 0000000..573ca45 --- /dev/null +++ b/static/flags/es-ga.svg @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/es-pv.svg b/static/flags/es-pv.svg new file mode 100644 index 0000000..63c19f4 --- /dev/null +++ b/static/flags/es-pv.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/es.svg b/static/flags/es.svg new file mode 100644 index 0000000..a296ebf --- /dev/null +++ b/static/flags/es.svg @@ -0,0 +1,544 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/et.svg b/static/flags/et.svg new file mode 100644 index 0000000..3f99be4 --- /dev/null +++ b/static/flags/et.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/static/flags/eu.svg b/static/flags/eu.svg new file mode 100644 index 0000000..b0874c1 --- /dev/null +++ b/static/flags/eu.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/fi.svg b/static/flags/fi.svg new file mode 100644 index 0000000..470be2d --- /dev/null +++ b/static/flags/fi.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/fj.svg b/static/flags/fj.svg new file mode 100644 index 0000000..332ae61 --- /dev/null +++ b/static/flags/fj.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/fk.svg b/static/flags/fk.svg new file mode 100644 index 0000000..a0dace8 --- /dev/null +++ b/static/flags/fk.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/fm.svg b/static/flags/fm.svg new file mode 100644 index 0000000..c1b7c97 --- /dev/null +++ b/static/flags/fm.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/flags/fo.svg b/static/flags/fo.svg new file mode 100644 index 0000000..f802d28 --- /dev/null +++ b/static/flags/fo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/static/flags/fr.svg b/static/flags/fr.svg new file mode 100644 index 0000000..4110e59 --- /dev/null +++ b/static/flags/fr.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/ga.svg b/static/flags/ga.svg new file mode 100644 index 0000000..76edab4 --- /dev/null +++ b/static/flags/ga.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/gb-eng.svg b/static/flags/gb-eng.svg new file mode 100644 index 0000000..12e3b67 --- /dev/null +++ b/static/flags/gb-eng.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/gb-nir.svg b/static/flags/gb-nir.svg new file mode 100644 index 0000000..e22190a --- /dev/null +++ b/static/flags/gb-nir.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/gb-sct.svg b/static/flags/gb-sct.svg new file mode 100644 index 0000000..f50cd32 --- /dev/null +++ b/static/flags/gb-sct.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/gb-wls.svg b/static/flags/gb-wls.svg new file mode 100644 index 0000000..d7f5791 --- /dev/null +++ b/static/flags/gb-wls.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/flags/gb.svg b/static/flags/gb.svg new file mode 100644 index 0000000..7991383 --- /dev/null +++ b/static/flags/gb.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/gd.svg b/static/flags/gd.svg new file mode 100644 index 0000000..b3d250d --- /dev/null +++ b/static/flags/gd.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/ge.svg b/static/flags/ge.svg new file mode 100644 index 0000000..ab08a9a --- /dev/null +++ b/static/flags/ge.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/gf.svg b/static/flags/gf.svg new file mode 100644 index 0000000..f8fe94c --- /dev/null +++ b/static/flags/gf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/gg.svg b/static/flags/gg.svg new file mode 100644 index 0000000..f8216c8 --- /dev/null +++ b/static/flags/gg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/flags/gh.svg b/static/flags/gh.svg new file mode 100644 index 0000000..5c3e3e6 --- /dev/null +++ b/static/flags/gh.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/gi.svg b/static/flags/gi.svg new file mode 100644 index 0000000..a5d7570 --- /dev/null +++ b/static/flags/gi.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/gl.svg b/static/flags/gl.svg new file mode 100644 index 0000000..eb5a52e --- /dev/null +++ b/static/flags/gl.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/gm.svg b/static/flags/gm.svg new file mode 100644 index 0000000..8fe9d66 --- /dev/null +++ b/static/flags/gm.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/static/flags/gn.svg b/static/flags/gn.svg new file mode 100644 index 0000000..40d6ad4 --- /dev/null +++ b/static/flags/gn.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/gp.svg b/static/flags/gp.svg new file mode 100644 index 0000000..ee55c4b --- /dev/null +++ b/static/flags/gp.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/gq.svg b/static/flags/gq.svg new file mode 100644 index 0000000..64c8eb2 --- /dev/null +++ b/static/flags/gq.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/gr.svg b/static/flags/gr.svg new file mode 100644 index 0000000..599741e --- /dev/null +++ b/static/flags/gr.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/static/flags/gs.svg b/static/flags/gs.svg new file mode 100644 index 0000000..29db9b9 --- /dev/null +++ b/static/flags/gs.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/gt.svg b/static/flags/gt.svg new file mode 100644 index 0000000..7df9df5 --- /dev/null +++ b/static/flags/gt.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/gu.svg b/static/flags/gu.svg new file mode 100644 index 0000000..3b95219 --- /dev/null +++ b/static/flags/gu.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/gw.svg b/static/flags/gw.svg new file mode 100644 index 0000000..d470bac --- /dev/null +++ b/static/flags/gw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/gy.svg b/static/flags/gy.svg new file mode 100644 index 0000000..569fb56 --- /dev/null +++ b/static/flags/gy.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/flags/hk.svg b/static/flags/hk.svg new file mode 100644 index 0000000..4fd55bc --- /dev/null +++ b/static/flags/hk.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/flags/hm.svg b/static/flags/hm.svg new file mode 100644 index 0000000..815c482 --- /dev/null +++ b/static/flags/hm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/flags/hn.svg b/static/flags/hn.svg new file mode 100644 index 0000000..11fde67 --- /dev/null +++ b/static/flags/hn.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/static/flags/hr.svg b/static/flags/hr.svg new file mode 100644 index 0000000..dde825c --- /dev/null +++ b/static/flags/hr.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/ht.svg b/static/flags/ht.svg new file mode 100644 index 0000000..8e8efc4 --- /dev/null +++ b/static/flags/ht.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/hu.svg b/static/flags/hu.svg new file mode 100644 index 0000000..baddf7f --- /dev/null +++ b/static/flags/hu.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/ic.svg b/static/flags/ic.svg new file mode 100644 index 0000000..81e6ee2 --- /dev/null +++ b/static/flags/ic.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/id.svg b/static/flags/id.svg new file mode 100644 index 0000000..3b7c8fc --- /dev/null +++ b/static/flags/id.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/ie.svg b/static/flags/ie.svg new file mode 100644 index 0000000..049be14 --- /dev/null +++ b/static/flags/ie.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/il.svg b/static/flags/il.svg new file mode 100644 index 0000000..f43be7e --- /dev/null +++ b/static/flags/il.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/static/flags/im.svg b/static/flags/im.svg new file mode 100644 index 0000000..fe6a59a --- /dev/null +++ b/static/flags/im.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/in.svg b/static/flags/in.svg new file mode 100644 index 0000000..bc47d74 --- /dev/null +++ b/static/flags/in.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/io.svg b/static/flags/io.svg new file mode 100644 index 0000000..3058f7d --- /dev/null +++ b/static/flags/io.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/iq.svg b/static/flags/iq.svg new file mode 100644 index 0000000..8044514 --- /dev/null +++ b/static/flags/iq.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/flags/ir.svg b/static/flags/ir.svg new file mode 100644 index 0000000..8c6d516 --- /dev/null +++ b/static/flags/ir.svg @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/is.svg b/static/flags/is.svg new file mode 100644 index 0000000..a6588af --- /dev/null +++ b/static/flags/is.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/static/flags/it.svg b/static/flags/it.svg new file mode 100644 index 0000000..20a8bfd --- /dev/null +++ b/static/flags/it.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/je.svg b/static/flags/je.svg new file mode 100644 index 0000000..70a8754 --- /dev/null +++ b/static/flags/je.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/jm.svg b/static/flags/jm.svg new file mode 100644 index 0000000..269df03 --- /dev/null +++ b/static/flags/jm.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/flags/jo.svg b/static/flags/jo.svg new file mode 100644 index 0000000..d6f927d --- /dev/null +++ b/static/flags/jo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/static/flags/jp.svg b/static/flags/jp.svg new file mode 100644 index 0000000..cc1c181 --- /dev/null +++ b/static/flags/jp.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/flags/ke.svg b/static/flags/ke.svg new file mode 100644 index 0000000..3a67ca3 --- /dev/null +++ b/static/flags/ke.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/kg.svg b/static/flags/kg.svg new file mode 100644 index 0000000..e26db95 --- /dev/null +++ b/static/flags/kg.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/kh.svg b/static/flags/kh.svg new file mode 100644 index 0000000..a7d52f2 --- /dev/null +++ b/static/flags/kh.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/ki.svg b/static/flags/ki.svg new file mode 100644 index 0000000..fda03f3 --- /dev/null +++ b/static/flags/ki.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/km.svg b/static/flags/km.svg new file mode 100644 index 0000000..414d65e --- /dev/null +++ b/static/flags/km.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/static/flags/kn.svg b/static/flags/kn.svg new file mode 100644 index 0000000..47fe64d --- /dev/null +++ b/static/flags/kn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/static/flags/kp.svg b/static/flags/kp.svg new file mode 100644 index 0000000..ad1b713 --- /dev/null +++ b/static/flags/kp.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/static/flags/kr.svg b/static/flags/kr.svg new file mode 100644 index 0000000..6947eab --- /dev/null +++ b/static/flags/kr.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/kw.svg b/static/flags/kw.svg new file mode 100644 index 0000000..3dd89e9 --- /dev/null +++ b/static/flags/kw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/ky.svg b/static/flags/ky.svg new file mode 100644 index 0000000..aeaa7e0 --- /dev/null +++ b/static/flags/ky.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/kz.svg b/static/flags/kz.svg new file mode 100644 index 0000000..2fac45b --- /dev/null +++ b/static/flags/kz.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/la.svg b/static/flags/la.svg new file mode 100644 index 0000000..6aea6b7 --- /dev/null +++ b/static/flags/la.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/static/flags/lb.svg b/static/flags/lb.svg new file mode 100644 index 0000000..bde2581 --- /dev/null +++ b/static/flags/lb.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/static/flags/lc.svg b/static/flags/lc.svg new file mode 100644 index 0000000..bb25654 --- /dev/null +++ b/static/flags/lc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/flags/li.svg b/static/flags/li.svg new file mode 100644 index 0000000..7a4d183 --- /dev/null +++ b/static/flags/li.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/lk.svg b/static/flags/lk.svg new file mode 100644 index 0000000..cbd660a --- /dev/null +++ b/static/flags/lk.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/lr.svg b/static/flags/lr.svg new file mode 100644 index 0000000..e482ab9 --- /dev/null +++ b/static/flags/lr.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/static/flags/ls.svg b/static/flags/ls.svg new file mode 100644 index 0000000..a7c01a9 --- /dev/null +++ b/static/flags/ls.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/flags/lt.svg b/static/flags/lt.svg new file mode 100644 index 0000000..90ec5d2 --- /dev/null +++ b/static/flags/lt.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/lu.svg b/static/flags/lu.svg new file mode 100644 index 0000000..cc12206 --- /dev/null +++ b/static/flags/lu.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/lv.svg b/static/flags/lv.svg new file mode 100644 index 0000000..6a9e75e --- /dev/null +++ b/static/flags/lv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/ly.svg b/static/flags/ly.svg new file mode 100644 index 0000000..1eaa51e --- /dev/null +++ b/static/flags/ly.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/ma.svg b/static/flags/ma.svg new file mode 100644 index 0000000..7ce56ef --- /dev/null +++ b/static/flags/ma.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/mc.svg b/static/flags/mc.svg new file mode 100644 index 0000000..9cb6c9e --- /dev/null +++ b/static/flags/mc.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/md.svg b/static/flags/md.svg new file mode 100644 index 0000000..e9ba506 --- /dev/null +++ b/static/flags/md.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/me.svg b/static/flags/me.svg new file mode 100644 index 0000000..297888c --- /dev/null +++ b/static/flags/me.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/mf.svg b/static/flags/mf.svg new file mode 100644 index 0000000..6305edc --- /dev/null +++ b/static/flags/mf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/mg.svg b/static/flags/mg.svg new file mode 100644 index 0000000..5fa2d24 --- /dev/null +++ b/static/flags/mg.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/mh.svg b/static/flags/mh.svg new file mode 100644 index 0000000..7b9f490 --- /dev/null +++ b/static/flags/mh.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/mk.svg b/static/flags/mk.svg new file mode 100644 index 0000000..4f5cae7 --- /dev/null +++ b/static/flags/mk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/ml.svg b/static/flags/ml.svg new file mode 100644 index 0000000..6f6b716 --- /dev/null +++ b/static/flags/ml.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/mm.svg b/static/flags/mm.svg new file mode 100644 index 0000000..42b4dee --- /dev/null +++ b/static/flags/mm.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/static/flags/mn.svg b/static/flags/mn.svg new file mode 100644 index 0000000..6a38a71 --- /dev/null +++ b/static/flags/mn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/static/flags/mo.svg b/static/flags/mo.svg new file mode 100644 index 0000000..f638b6c --- /dev/null +++ b/static/flags/mo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/flags/mp.svg b/static/flags/mp.svg new file mode 100644 index 0000000..26bfa22 --- /dev/null +++ b/static/flags/mp.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/mq.svg b/static/flags/mq.svg new file mode 100644 index 0000000..b221951 --- /dev/null +++ b/static/flags/mq.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/mr.svg b/static/flags/mr.svg new file mode 100644 index 0000000..d859972 --- /dev/null +++ b/static/flags/mr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/ms.svg b/static/flags/ms.svg new file mode 100644 index 0000000..4367505 --- /dev/null +++ b/static/flags/ms.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/mt.svg b/static/flags/mt.svg new file mode 100644 index 0000000..5d5d7c8 --- /dev/null +++ b/static/flags/mt.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/mu.svg b/static/flags/mu.svg new file mode 100644 index 0000000..82d7a3b --- /dev/null +++ b/static/flags/mu.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/flags/mv.svg b/static/flags/mv.svg new file mode 100644 index 0000000..10450f9 --- /dev/null +++ b/static/flags/mv.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/mw.svg b/static/flags/mw.svg new file mode 100644 index 0000000..137ff87 --- /dev/null +++ b/static/flags/mw.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/flags/mx.svg b/static/flags/mx.svg new file mode 100644 index 0000000..e3ec2bc --- /dev/null +++ b/static/flags/mx.svg @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/my.svg b/static/flags/my.svg new file mode 100644 index 0000000..115f864 --- /dev/null +++ b/static/flags/my.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/mz.svg b/static/flags/mz.svg new file mode 100644 index 0000000..0f94c3a --- /dev/null +++ b/static/flags/mz.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/na.svg b/static/flags/na.svg new file mode 100644 index 0000000..35b9f78 --- /dev/null +++ b/static/flags/na.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/static/flags/nc.svg b/static/flags/nc.svg new file mode 100644 index 0000000..fa15551 --- /dev/null +++ b/static/flags/nc.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/ne.svg b/static/flags/ne.svg new file mode 100644 index 0000000..39a82b8 --- /dev/null +++ b/static/flags/ne.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/nf.svg b/static/flags/nf.svg new file mode 100644 index 0000000..fd61b25 --- /dev/null +++ b/static/flags/nf.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/flags/ng.svg b/static/flags/ng.svg new file mode 100644 index 0000000..81eb35f --- /dev/null +++ b/static/flags/ng.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/ni.svg b/static/flags/ni.svg new file mode 100644 index 0000000..e4861f5 --- /dev/null +++ b/static/flags/ni.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/nl.svg b/static/flags/nl.svg new file mode 100644 index 0000000..e90f5b0 --- /dev/null +++ b/static/flags/nl.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/no.svg b/static/flags/no.svg new file mode 100644 index 0000000..a5f2a15 --- /dev/null +++ b/static/flags/no.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/np.svg b/static/flags/np.svg new file mode 100644 index 0000000..6242856 --- /dev/null +++ b/static/flags/np.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/nr.svg b/static/flags/nr.svg new file mode 100644 index 0000000..ff394c4 --- /dev/null +++ b/static/flags/nr.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/static/flags/nu.svg b/static/flags/nu.svg new file mode 100644 index 0000000..4067baf --- /dev/null +++ b/static/flags/nu.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/flags/nz.svg b/static/flags/nz.svg new file mode 100644 index 0000000..935d8a7 --- /dev/null +++ b/static/flags/nz.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/om.svg b/static/flags/om.svg new file mode 100644 index 0000000..4f1461a --- /dev/null +++ b/static/flags/om.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/pa.svg b/static/flags/pa.svg new file mode 100644 index 0000000..8dc03bc --- /dev/null +++ b/static/flags/pa.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/static/flags/pc.svg b/static/flags/pc.svg new file mode 100644 index 0000000..5202d6d --- /dev/null +++ b/static/flags/pc.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/pe.svg b/static/flags/pe.svg new file mode 100644 index 0000000..33e6cfd --- /dev/null +++ b/static/flags/pe.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/pf.svg b/static/flags/pf.svg new file mode 100644 index 0000000..bea0354 --- /dev/null +++ b/static/flags/pf.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/pg.svg b/static/flags/pg.svg new file mode 100644 index 0000000..7b7e77a --- /dev/null +++ b/static/flags/pg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/flags/ph.svg b/static/flags/ph.svg new file mode 100644 index 0000000..b910e24 --- /dev/null +++ b/static/flags/ph.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/pk.svg b/static/flags/pk.svg new file mode 100644 index 0000000..4ddc19f --- /dev/null +++ b/static/flags/pk.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/static/flags/pl.svg b/static/flags/pl.svg new file mode 100644 index 0000000..0fa5145 --- /dev/null +++ b/static/flags/pl.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/pm.svg b/static/flags/pm.svg new file mode 100644 index 0000000..19a9330 --- /dev/null +++ b/static/flags/pm.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/pn.svg b/static/flags/pn.svg new file mode 100644 index 0000000..209ea71 --- /dev/null +++ b/static/flags/pn.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/pr.svg b/static/flags/pr.svg new file mode 100644 index 0000000..ec51831 --- /dev/null +++ b/static/flags/pr.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/ps.svg b/static/flags/ps.svg new file mode 100644 index 0000000..362d435 --- /dev/null +++ b/static/flags/ps.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/pt.svg b/static/flags/pt.svg new file mode 100644 index 0000000..2767cd4 --- /dev/null +++ b/static/flags/pt.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/pw.svg b/static/flags/pw.svg new file mode 100644 index 0000000..9f89c5f --- /dev/null +++ b/static/flags/pw.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/flags/py.svg b/static/flags/py.svg new file mode 100644 index 0000000..abccd87 --- /dev/null +++ b/static/flags/py.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/qa.svg b/static/flags/qa.svg new file mode 100644 index 0000000..901f3fa --- /dev/null +++ b/static/flags/qa.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/re.svg b/static/flags/re.svg new file mode 100644 index 0000000..64e788e --- /dev/null +++ b/static/flags/re.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/ro.svg b/static/flags/ro.svg new file mode 100644 index 0000000..fda0f7b --- /dev/null +++ b/static/flags/ro.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/rs.svg b/static/flags/rs.svg new file mode 100644 index 0000000..6d4f74d --- /dev/null +++ b/static/flags/rs.svg @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/ru.svg b/static/flags/ru.svg new file mode 100644 index 0000000..cf24301 --- /dev/null +++ b/static/flags/ru.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/rw.svg b/static/flags/rw.svg new file mode 100644 index 0000000..06e26ae --- /dev/null +++ b/static/flags/rw.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/sa.svg b/static/flags/sa.svg new file mode 100644 index 0000000..596cf48 --- /dev/null +++ b/static/flags/sa.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/sb.svg b/static/flags/sb.svg new file mode 100644 index 0000000..6066f94 --- /dev/null +++ b/static/flags/sb.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/sc.svg b/static/flags/sc.svg new file mode 100644 index 0000000..9a46b36 --- /dev/null +++ b/static/flags/sc.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/sd.svg b/static/flags/sd.svg new file mode 100644 index 0000000..12818b4 --- /dev/null +++ b/static/flags/sd.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/se.svg b/static/flags/se.svg new file mode 100644 index 0000000..8ba745a --- /dev/null +++ b/static/flags/se.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/sg.svg b/static/flags/sg.svg new file mode 100644 index 0000000..c4dd4ac --- /dev/null +++ b/static/flags/sg.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/sh-ac.svg b/static/flags/sh-ac.svg new file mode 100644 index 0000000..c43b301 --- /dev/null +++ b/static/flags/sh-ac.svg @@ -0,0 +1,689 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/sh-hl.svg b/static/flags/sh-hl.svg new file mode 100644 index 0000000..2150bf6 --- /dev/null +++ b/static/flags/sh-hl.svg @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/sh-ta.svg b/static/flags/sh-ta.svg new file mode 100644 index 0000000..ba39063 --- /dev/null +++ b/static/flags/sh-ta.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/sh.svg b/static/flags/sh.svg new file mode 100644 index 0000000..7aba0ae --- /dev/null +++ b/static/flags/sh.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/si.svg b/static/flags/si.svg new file mode 100644 index 0000000..1bbdd94 --- /dev/null +++ b/static/flags/si.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/static/flags/sj.svg b/static/flags/sj.svg new file mode 100644 index 0000000..bb2799c --- /dev/null +++ b/static/flags/sj.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/sk.svg b/static/flags/sk.svg new file mode 100644 index 0000000..676018e --- /dev/null +++ b/static/flags/sk.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/flags/sl.svg b/static/flags/sl.svg new file mode 100644 index 0000000..a07baf7 --- /dev/null +++ b/static/flags/sl.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/sm.svg b/static/flags/sm.svg new file mode 100644 index 0000000..e41d2f7 --- /dev/null +++ b/static/flags/sm.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/sn.svg b/static/flags/sn.svg new file mode 100644 index 0000000..7c0673d --- /dev/null +++ b/static/flags/sn.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/flags/so.svg b/static/flags/so.svg new file mode 100644 index 0000000..a581ac6 --- /dev/null +++ b/static/flags/so.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/flags/sr.svg b/static/flags/sr.svg new file mode 100644 index 0000000..5e71c40 --- /dev/null +++ b/static/flags/sr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/ss.svg b/static/flags/ss.svg new file mode 100644 index 0000000..b257aa0 --- /dev/null +++ b/static/flags/ss.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/flags/st.svg b/static/flags/st.svg new file mode 100644 index 0000000..1294bcb --- /dev/null +++ b/static/flags/st.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/static/flags/sv.svg b/static/flags/sv.svg new file mode 100644 index 0000000..cbc674a --- /dev/null +++ b/static/flags/sv.svg @@ -0,0 +1,593 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/sx.svg b/static/flags/sx.svg new file mode 100644 index 0000000..ac78561 --- /dev/null +++ b/static/flags/sx.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/sy.svg b/static/flags/sy.svg new file mode 100644 index 0000000..97c05cf --- /dev/null +++ b/static/flags/sy.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/sz.svg b/static/flags/sz.svg new file mode 100644 index 0000000..eb538e4 --- /dev/null +++ b/static/flags/sz.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/tc.svg b/static/flags/tc.svg new file mode 100644 index 0000000..1258971 --- /dev/null +++ b/static/flags/tc.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/td.svg b/static/flags/td.svg new file mode 100644 index 0000000..fa3bd92 --- /dev/null +++ b/static/flags/td.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/tf.svg b/static/flags/tf.svg new file mode 100644 index 0000000..fba2335 --- /dev/null +++ b/static/flags/tf.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/static/flags/tg.svg b/static/flags/tg.svg new file mode 100644 index 0000000..9d6ea6c --- /dev/null +++ b/static/flags/tg.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/static/flags/th.svg b/static/flags/th.svg new file mode 100644 index 0000000..1e93a61 --- /dev/null +++ b/static/flags/th.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/tj.svg b/static/flags/tj.svg new file mode 100644 index 0000000..f8c9a03 --- /dev/null +++ b/static/flags/tj.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/tk.svg b/static/flags/tk.svg new file mode 100644 index 0000000..05d3e86 --- /dev/null +++ b/static/flags/tk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/tl.svg b/static/flags/tl.svg new file mode 100644 index 0000000..3d0701a --- /dev/null +++ b/static/flags/tl.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/tm.svg b/static/flags/tm.svg new file mode 100644 index 0000000..4154ed7 --- /dev/null +++ b/static/flags/tm.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/tn.svg b/static/flags/tn.svg new file mode 100644 index 0000000..5735c19 --- /dev/null +++ b/static/flags/tn.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/to.svg b/static/flags/to.svg new file mode 100644 index 0000000..d072337 --- /dev/null +++ b/static/flags/to.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/static/flags/tr.svg b/static/flags/tr.svg new file mode 100644 index 0000000..b96da21 --- /dev/null +++ b/static/flags/tr.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/flags/tt.svg b/static/flags/tt.svg new file mode 100644 index 0000000..bc24938 --- /dev/null +++ b/static/flags/tt.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/tv.svg b/static/flags/tv.svg new file mode 100644 index 0000000..675210e --- /dev/null +++ b/static/flags/tv.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/flags/tw.svg b/static/flags/tw.svg new file mode 100644 index 0000000..57fd98b --- /dev/null +++ b/static/flags/tw.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/tz.svg b/static/flags/tz.svg new file mode 100644 index 0000000..a2cfbca --- /dev/null +++ b/static/flags/tz.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/static/flags/ua.svg b/static/flags/ua.svg new file mode 100644 index 0000000..a339eb1 --- /dev/null +++ b/static/flags/ua.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/flags/ug.svg b/static/flags/ug.svg new file mode 100644 index 0000000..520eee5 --- /dev/null +++ b/static/flags/ug.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/um.svg b/static/flags/um.svg new file mode 100644 index 0000000..9e9edda --- /dev/null +++ b/static/flags/um.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/flags/un.svg b/static/flags/un.svg new file mode 100644 index 0000000..632bbb4 --- /dev/null +++ b/static/flags/un.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/static/flags/us.svg b/static/flags/us.svg new file mode 100644 index 0000000..9cfd0c9 --- /dev/null +++ b/static/flags/us.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/flags/uy.svg b/static/flags/uy.svg new file mode 100644 index 0000000..62c36f8 --- /dev/null +++ b/static/flags/uy.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/uz.svg b/static/flags/uz.svg new file mode 100644 index 0000000..0ccca1b --- /dev/null +++ b/static/flags/uz.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/va.svg b/static/flags/va.svg new file mode 100644 index 0000000..3e297d6 --- /dev/null +++ b/static/flags/va.svg @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/vc.svg b/static/flags/vc.svg new file mode 100644 index 0000000..f26c2d8 --- /dev/null +++ b/static/flags/vc.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/flags/ve.svg b/static/flags/ve.svg new file mode 100644 index 0000000..314e7f5 --- /dev/null +++ b/static/flags/ve.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/vg.svg b/static/flags/vg.svg new file mode 100644 index 0000000..ac90088 --- /dev/null +++ b/static/flags/vg.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/vi.svg b/static/flags/vi.svg new file mode 100644 index 0000000..d88d68f --- /dev/null +++ b/static/flags/vi.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/vn.svg b/static/flags/vn.svg new file mode 100644 index 0000000..7e4bac8 --- /dev/null +++ b/static/flags/vn.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/flags/vu.svg b/static/flags/vu.svg new file mode 100644 index 0000000..326d29e --- /dev/null +++ b/static/flags/vu.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/wf.svg b/static/flags/wf.svg new file mode 100644 index 0000000..054c57d --- /dev/null +++ b/static/flags/wf.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/ws.svg b/static/flags/ws.svg new file mode 100644 index 0000000..0e758a7 --- /dev/null +++ b/static/flags/ws.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/xk.svg b/static/flags/xk.svg new file mode 100644 index 0000000..0e8958d --- /dev/null +++ b/static/flags/xk.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/xx.svg b/static/flags/xx.svg new file mode 100644 index 0000000..9333be3 --- /dev/null +++ b/static/flags/xx.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/flags/ye.svg b/static/flags/ye.svg new file mode 100644 index 0000000..1c9e6d6 --- /dev/null +++ b/static/flags/ye.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/flags/yt.svg b/static/flags/yt.svg new file mode 100644 index 0000000..e7776b3 --- /dev/null +++ b/static/flags/yt.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/flags/za.svg b/static/flags/za.svg new file mode 100644 index 0000000..d563adb --- /dev/null +++ b/static/flags/za.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/static/flags/zm.svg b/static/flags/zm.svg new file mode 100644 index 0000000..360f37a --- /dev/null +++ b/static/flags/zm.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/flags/zw.svg b/static/flags/zw.svg new file mode 100644 index 0000000..93aac4f --- /dev/null +++ b/static/flags/zw.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/static/icon-192x192.png b/static/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..203f49066c1d2f84f866881a47d62f9e5c12c968 GIT binary patch literal 40917 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%0AJ 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 z XrT2|ZJTAiQ%B2OEQ#&d!U^_c8kRuMNU6bG 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͊SwCwSGk)vK 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 Rss6v^l0Z4pDq(&9{{T9OxWoVe literal 0 HcmV?d00001 diff --git a/static/monaco_high_res.jpg b/static/monaco_high_res.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7fa65f36ed0d4707e181eb83eac5a47338abbc7e GIT binary patch literal 651114 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

nPM=fYDIC@#+?X%tvL+o5D0@Vy+ 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

P>hn;s-%W_62?iV=aSZJ2&^Kdmss~cf|}8T4LKP zHrT!J2!`UB>N8`=_toVHnK&IeF8-nkV`vu!@vd$Q zRn@QEL^UTys?XGaWj@+r3yf2m7e>{Cg0sqrK?CWQP<=G6DDxdJEwoh53(S-%($jY} zx_i;#j#^Q*na2ym8bz#2?$7jzBwLyFP$iodL3?sE3O)5H`cK?mu<9N)J357QEmBq4 zHs08*;fh84DJ%JdpqqI$g+J_+W}{6NL3C1JD{Qdpgc8mone2E0>D(EN!glgxB`Ztm z>W#QEI4MAXhagt~p&Ay-Z4PcN7|2W)QK`q?hPaC*)qV>j<&eG2rbzvuFnyOmPSWftCvGn_7k;#2y})OAEs1 zg}*PB%GwI9NvTE!A}|%M*Ee7vGdFLNUKJJ*wT<2kjEaQ#Ug=j*aqOn3H=5q1Gaz@s9;?4IGb%XvAVp>uYa`JUW)K{{Yyg1x0W2l-iT?Dcky$Xgoz(!G0yC z3jSpUScgfeM5hDs@Pna(UcWNn%8Ht0-$_d81+0bhkbSTYb|qm6cp+#3o+qsskDq~8 zh+$y?>LtL4M&R@aT

D3u#HB(KNGA$P84eLO@&8I6(nj(E-JV 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°sY>C}X}-65!hM?|5#95wUL}{{VAg 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 Vj}9Z;>TUUiCv*LvRCO39|Jep= CURRENT_DATE + THEN (dp.current_due_date - CURRENT_DATE)::INTEGER + ELSE NULL + END as days_until_due +FROM public.members m +LEFT JOIN public.membership_statuses ms ON m.membership_status_id = ms.id +LEFT JOIN public.membership_types mt ON m.membership_type_id = mt.id +LEFT JOIN LATERAL ( + SELECT + payment_date as last_payment_date, + due_date as current_due_date + FROM public.dues_payments + WHERE member_id = m.id + ORDER BY due_date DESC + LIMIT 1 +) dp ON true; + +-- Events with attendee counts +CREATE VIEW public.events_with_counts AS +SELECT + e.*, + et.display_name as event_type_name, + et.color as event_type_color, + et.icon as event_type_icon, + COALESCE(member_rsvps.confirmed_count, 0) + + COALESCE(member_rsvps.guest_count, 0) + + COALESCE(public_rsvps.confirmed_count, 0) + + COALESCE(public_rsvps.guest_count, 0) as total_attendees, + COALESCE(member_rsvps.confirmed_count, 0) as member_count, + COALESCE(public_rsvps.confirmed_count, 0) as non_member_count, + COALESCE(member_rsvps.waitlist_count, 0) + + COALESCE(public_rsvps.waitlist_count, 0) as waitlist_count, + CASE + WHEN e.max_attendees IS NULL THEN FALSE + WHEN (COALESCE(member_rsvps.confirmed_count, 0) + + COALESCE(member_rsvps.guest_count, 0) + + COALESCE(public_rsvps.confirmed_count, 0) + + COALESCE(public_rsvps.guest_count, 0)) >= e.max_attendees THEN TRUE + ELSE FALSE + END as is_full +FROM public.events e +LEFT JOIN public.event_types et ON e.event_type_id = et.id +LEFT JOIN LATERAL ( + SELECT + COUNT(*) FILTER (WHERE status = 'confirmed') as confirmed_count, + COALESCE(SUM(guest_count) FILTER (WHERE status = 'confirmed'), 0) as guest_count, + COUNT(*) FILTER (WHERE status = 'waitlist') as waitlist_count + FROM public.event_rsvps + WHERE event_id = e.id +) member_rsvps ON true +LEFT JOIN LATERAL ( + SELECT + COUNT(*) FILTER (WHERE status = 'confirmed') as confirmed_count, + COALESCE(SUM(guest_count) FILTER (WHERE status = 'confirmed'), 0) as guest_count, + COUNT(*) FILTER (WHERE status = 'waitlist') as waitlist_count + FROM public.event_rsvps_public + WHERE event_id = e.id +) public_rsvps ON true; + +-- ============================================ +-- ROW LEVEL SECURITY +-- ============================================ + +-- Enable RLS on all tables +ALTER TABLE public.members ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.dues_payments ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.events ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.event_rsvps ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.event_rsvps_public ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.documents ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.app_settings ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.email_templates ENABLE ROW LEVEL SECURITY; +ALTER TABLE public.email_logs ENABLE ROW LEVEL SECURITY; + +-- MEMBERS POLICIES +CREATE POLICY "Members viewable by authenticated users" + ON public.members FOR SELECT + TO authenticated + USING (true); + +CREATE POLICY "Users can update own profile" + ON public.members FOR UPDATE + TO authenticated + USING (auth.uid() = id); + +CREATE POLICY "Admins can insert members" + ON public.members FOR INSERT + TO authenticated + WITH CHECK ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin') + OR auth.uid() = id + ); + +CREATE POLICY "Admins can delete members" + ON public.members FOR DELETE + TO authenticated + USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin') + ); + +-- DUES PAYMENTS POLICIES +CREATE POLICY "Own payments viewable" + ON public.dues_payments FOR SELECT + TO authenticated + USING ( + member_id = auth.uid() + OR EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin')) + ); + +CREATE POLICY "Board can record payments" + ON public.dues_payments FOR INSERT + TO authenticated + WITH CHECK ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin')) + ); + +-- EVENTS POLICIES +CREATE POLICY "Events viewable based on visibility" + ON public.events FOR SELECT + TO authenticated + USING ( + visibility = 'members' + OR visibility = 'public' + OR (visibility = 'board' AND EXISTS ( + SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin') + )) + OR (visibility = 'admin' AND EXISTS ( + SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin' + )) + ); + +CREATE POLICY "Public events viewable by anyone" + ON public.events FOR SELECT + TO anon + USING (visibility = 'public' AND status = 'published'); + +CREATE POLICY "Board can manage events" + ON public.events FOR ALL + TO authenticated + USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin')) + ); + +-- EVENT RSVPs POLICIES +CREATE POLICY "RSVPs viewable by member and board" + ON public.event_rsvps FOR SELECT + TO authenticated + USING ( + member_id = auth.uid() + OR EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin')) + ); + +CREATE POLICY "Members can manage own RSVPs" + ON public.event_rsvps FOR ALL + TO authenticated + USING (member_id = auth.uid()) + WITH CHECK (member_id = auth.uid()); + +CREATE POLICY "Board can manage all RSVPs" + ON public.event_rsvps FOR ALL + TO authenticated + USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin')) + ); + +-- PUBLIC RSVPs POLICIES +CREATE POLICY "Public RSVPs viewable by board" + ON public.event_rsvps_public FOR SELECT + TO authenticated + USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin')) + ); + +CREATE POLICY "Anyone can create public RSVP" + ON public.event_rsvps_public FOR INSERT + TO anon, authenticated + WITH CHECK (true); + +CREATE POLICY "Board can manage public RSVPs" + ON public.event_rsvps_public FOR ALL + TO authenticated + USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin')) + ); + +-- DOCUMENTS POLICIES +CREATE POLICY "Documents viewable based on visibility" + ON public.documents FOR SELECT + TO authenticated + USING ( + visibility = 'members' + OR visibility = 'public' + OR (visibility = 'board' AND EXISTS ( + SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin') + )) + OR (visibility = 'admin' AND EXISTS ( + SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin' + )) + OR (allowed_member_ids IS NOT NULL AND auth.uid() = ANY(allowed_member_ids)) + ); + +CREATE POLICY "Board can upload documents" + ON public.documents FOR INSERT + TO authenticated + WITH CHECK ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin')) + ); + +CREATE POLICY "Admin can manage all documents" + ON public.documents FOR ALL + TO authenticated + USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin') + ); + +-- APP SETTINGS POLICIES +CREATE POLICY "Public settings viewable by anyone" + ON public.app_settings FOR SELECT + USING (is_public = true); + +CREATE POLICY "All settings viewable by admin" + ON public.app_settings FOR SELECT + TO authenticated + USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin') + ); + +CREATE POLICY "Admin can manage settings" + ON public.app_settings FOR ALL + TO authenticated + USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin') + ); + +-- EMAIL TEMPLATES POLICIES +CREATE POLICY "Admin can manage email templates" + ON public.email_templates FOR ALL + TO authenticated + USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin') + ); + +-- EMAIL LOGS POLICIES +CREATE POLICY "Own email logs viewable" + ON public.email_logs FOR SELECT + TO authenticated + USING ( + recipient_id = auth.uid() + OR EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin') + ); + +CREATE POLICY "Admin can manage email logs" + ON public.email_logs FOR ALL + TO authenticated + USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin') + ); + +-- ============================================ +-- INDEXES +-- ============================================ +CREATE INDEX idx_members_email ON public.members(email); +CREATE INDEX idx_members_member_id ON public.members(member_id); +CREATE INDEX idx_members_role ON public.members(role); +CREATE INDEX idx_members_status ON public.members(membership_status_id); + +CREATE INDEX idx_dues_payments_member ON public.dues_payments(member_id); +CREATE INDEX idx_dues_payments_date ON public.dues_payments(payment_date DESC); + +CREATE INDEX idx_events_start ON public.events(start_datetime); +CREATE INDEX idx_events_visibility ON public.events(visibility); +CREATE INDEX idx_events_status ON public.events(status); + +CREATE INDEX idx_event_rsvps_event ON public.event_rsvps(event_id); +CREATE INDEX idx_event_rsvps_member ON public.event_rsvps(member_id); + +CREATE INDEX idx_documents_category ON public.documents(category_id); +CREATE INDEX idx_documents_visibility ON public.documents(visibility); + +CREATE INDEX idx_app_settings_category ON public.app_settings(category, setting_key); + +CREATE INDEX idx_email_logs_recipient ON public.email_logs(recipient_id); +CREATE INDEX idx_email_logs_status ON public.email_logs(status); +CREATE INDEX idx_email_logs_created ON public.email_logs(created_at DESC); diff --git a/supabase/migrations/002_admin_integrations_settings.sql b/supabase/migrations/002_admin_integrations_settings.sql new file mode 100644 index 0000000..661f63d --- /dev/null +++ b/supabase/migrations/002_admin_integrations_settings.sql @@ -0,0 +1,35 @@ +-- ============================================ +-- ADMIN INTEGRATION SETTINGS +-- SMTP, S3/MinIO, and expanded system settings +-- ============================================ + +-- Add SMTP settings +INSERT INTO public.app_settings (category, setting_key, setting_value, setting_type, display_name, description, is_public) VALUES + -- Email/SMTP Configuration + ('email', 'smtp_host', '""', 'text', 'SMTP Host', 'SMTP server hostname (e.g., smtp.gmail.com)', false), + ('email', 'smtp_port', '587', 'number', 'SMTP Port', 'SMTP server port (25, 465, 587)', false), + ('email', 'smtp_secure', 'true', 'boolean', 'Use TLS/SSL', 'Enable secure connection (recommended)', false), + ('email', 'smtp_username', '""', 'text', 'SMTP Username', 'SMTP authentication username', false), + ('email', 'smtp_password', '""', 'text', 'SMTP Password', 'SMTP authentication password', false), + ('email', 'smtp_from_address', '"noreply@monacousa.org"', 'text', 'From Address', 'Default sender email address', false), + ('email', 'smtp_from_name', '"Monaco USA"', 'text', 'From Name', 'Default sender display name', false), + ('email', 'smtp_reply_to', '"contact@monacousa.org"', 'text', 'Reply-To Address', 'Reply-to email address', false), + ('email', 'smtp_enabled', 'false', 'boolean', 'Enable Email', 'Enable sending emails via SMTP', false), + + -- S3/MinIO Storage Configuration + ('storage', 's3_endpoint', '""', 'text', 'S3 Endpoint', 'S3-compatible endpoint URL (e.g., http://minio:9000)', false), + ('storage', 's3_bucket', '"monacousa-documents"', 'text', 'Bucket Name', 'S3 bucket name for file storage', false), + ('storage', 's3_access_key', '""', 'text', 'Access Key', 'S3 access key ID', false), + ('storage', 's3_secret_key', '""', 'text', 'Secret Key', 'S3 secret access key', false), + ('storage', 's3_region', '"us-east-1"', 'text', 'Region', 'S3 region (use us-east-1 for MinIO)', false), + ('storage', 's3_use_ssl', 'false', 'boolean', 'Use SSL', 'Enable SSL for S3 connections', false), + ('storage', 's3_force_path_style', 'true', 'boolean', 'Force Path Style', 'Use path-style URLs (required for MinIO)', false), + ('storage', 's3_enabled', 'false', 'boolean', 'Enable S3 Storage', 'Use external S3 instead of Supabase Storage', false), + + -- Additional System Settings + ('system', 'session_timeout_hours', '168', 'number', 'Session Timeout', 'Hours until session expires (default: 7 days)', false), + ('system', 'allowed_file_types', '["pdf","doc","docx","xls","xlsx","ppt","pptx","txt","jpg","jpeg","png","webp"]', 'array', 'Allowed File Types', 'Allowed file extensions for uploads', false), + ('system', 'maintenance_message', '"The portal is currently undergoing maintenance. Please check back soon."', 'text', 'Maintenance Message', 'Message shown during maintenance', false), + ('system', 'enable_public_events', 'true', 'boolean', 'Enable Public Events', 'Allow non-members to view public events', false), + ('system', 'enable_public_rsvp', 'true', 'boolean', 'Enable Public RSVP', 'Allow non-members to RSVP to public events', false) +ON CONFLICT (category, setting_key) DO NOTHING; diff --git a/supabase/migrations/003_storage_buckets_and_audit.sql b/supabase/migrations/003_storage_buckets_and_audit.sql new file mode 100644 index 0000000..f82d507 --- /dev/null +++ b/supabase/migrations/003_storage_buckets_and_audit.sql @@ -0,0 +1,504 @@ +-- Monaco USA Portal 2026 +-- Migration 003: Storage Buckets and Audit Logging +-- ================================================ + +-- ============================================ +-- STORAGE BUCKETS +-- ============================================ + +-- Documents bucket (public for direct URL access - visibility controlled at app level) +INSERT INTO storage.buckets (id, name, public, file_size_limit, allowed_mime_types) +VALUES ( + 'documents', + 'documents', + true, + 52428800, -- 50MB + ARRAY['application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'text/plain', 'text/csv', 'application/json', 'image/jpeg', 'image/png', 'image/webp', 'image/gif'] +) +ON CONFLICT (id) DO UPDATE SET + public = true, + file_size_limit = EXCLUDED.file_size_limit, + allowed_mime_types = EXCLUDED.allowed_mime_types; + +-- Avatars bucket (public for display) +INSERT INTO storage.buckets (id, name, public, file_size_limit, allowed_mime_types) +VALUES ( + 'avatars', + 'avatars', + true, + 5242880, -- 5MB + ARRAY['image/jpeg', 'image/png', 'image/webp', 'image/gif'] +) +ON CONFLICT (id) DO UPDATE SET + public = true, + file_size_limit = EXCLUDED.file_size_limit, + allowed_mime_types = EXCLUDED.allowed_mime_types; + +-- Event images bucket (public for display) +INSERT INTO storage.buckets (id, name, public, file_size_limit, allowed_mime_types) +VALUES ( + 'event-images', + 'event-images', + true, + 10485760, -- 10MB + ARRAY['image/jpeg', 'image/png', 'image/webp'] +) +ON CONFLICT (id) DO UPDATE SET + public = true, + file_size_limit = EXCLUDED.file_size_limit, + allowed_mime_types = EXCLUDED.allowed_mime_types; + +-- ============================================ +-- STORAGE POLICIES +-- ============================================ + +-- Documents bucket policies +DROP POLICY IF EXISTS "documents_read_policy" ON storage.objects; +CREATE POLICY "documents_read_policy" ON storage.objects FOR SELECT +USING (bucket_id = 'documents' AND auth.role() = 'authenticated'); + +DROP POLICY IF EXISTS "documents_insert_policy" ON storage.objects; +CREATE POLICY "documents_insert_policy" ON storage.objects FOR INSERT +WITH CHECK ( + bucket_id = 'documents' + AND auth.role() = 'authenticated' + AND EXISTS ( + SELECT 1 FROM public.members + WHERE id = auth.uid() + AND role IN ('board', 'admin') + ) +); + +DROP POLICY IF EXISTS "documents_delete_policy" ON storage.objects; +CREATE POLICY "documents_delete_policy" ON storage.objects FOR DELETE +USING ( + bucket_id = 'documents' + AND EXISTS ( + SELECT 1 FROM public.members + WHERE id = auth.uid() + AND role = 'admin' + ) +); + +-- Avatars bucket policies (public read, user-specific write) +DROP POLICY IF EXISTS "avatars_read_policy" ON storage.objects; +CREATE POLICY "avatars_read_policy" ON storage.objects FOR SELECT +USING (bucket_id = 'avatars'); + +DROP POLICY IF EXISTS "avatars_insert_policy" ON storage.objects; +CREATE POLICY "avatars_insert_policy" ON storage.objects FOR INSERT +WITH CHECK ( + bucket_id = 'avatars' + AND auth.role() = 'authenticated' + AND (storage.foldername(name))[1] = auth.uid()::text +); + +DROP POLICY IF EXISTS "avatars_update_policy" ON storage.objects; +CREATE POLICY "avatars_update_policy" ON storage.objects FOR UPDATE +USING ( + bucket_id = 'avatars' + AND auth.role() = 'authenticated' + AND (storage.foldername(name))[1] = auth.uid()::text +); + +DROP POLICY IF EXISTS "avatars_delete_policy" ON storage.objects; +CREATE POLICY "avatars_delete_policy" ON storage.objects FOR DELETE +USING ( + bucket_id = 'avatars' + AND auth.role() = 'authenticated' + AND (storage.foldername(name))[1] = auth.uid()::text +); + +-- Event images bucket policies +DROP POLICY IF EXISTS "event_images_read_policy" ON storage.objects; +CREATE POLICY "event_images_read_policy" ON storage.objects FOR SELECT +USING (bucket_id = 'event-images'); + +DROP POLICY IF EXISTS "event_images_insert_policy" ON storage.objects; +CREATE POLICY "event_images_insert_policy" ON storage.objects FOR INSERT +WITH CHECK ( + bucket_id = 'event-images' + AND auth.role() = 'authenticated' + AND EXISTS ( + SELECT 1 FROM public.members + WHERE id = auth.uid() + AND role IN ('board', 'admin') + ) +); + +DROP POLICY IF EXISTS "event_images_delete_policy" ON storage.objects; +CREATE POLICY "event_images_delete_policy" ON storage.objects FOR DELETE +USING ( + bucket_id = 'event-images' + AND EXISTS ( + SELECT 1 FROM public.members + WHERE id = auth.uid() + AND role IN ('board', 'admin') + ) +); + +-- ============================================ +-- AUDIT LOGS TABLE +-- ============================================ + +CREATE TABLE IF NOT EXISTS audit_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID REFERENCES auth.users(id) ON DELETE SET NULL, + user_email TEXT, + action TEXT NOT NULL, + resource_type TEXT, + resource_id TEXT, + details JSONB DEFAULT '{}', + ip_address TEXT, + user_agent TEXT, + created_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Index for querying audit logs +CREATE INDEX IF NOT EXISTS idx_audit_logs_user_id ON audit_logs(user_id); +CREATE INDEX IF NOT EXISTS idx_audit_logs_action ON audit_logs(action); +CREATE INDEX IF NOT EXISTS idx_audit_logs_resource_type ON audit_logs(resource_type); +CREATE INDEX IF NOT EXISTS idx_audit_logs_created_at ON audit_logs(created_at DESC); + +-- RLS for audit logs (only admins can read, service role can write) +ALTER TABLE audit_logs ENABLE ROW LEVEL SECURITY; + +DROP POLICY IF EXISTS "audit_logs_read_admin" ON audit_logs; +CREATE POLICY "audit_logs_read_admin" ON audit_logs FOR SELECT +USING ( + EXISTS ( + SELECT 1 FROM public.members + WHERE id = auth.uid() + AND role = 'admin' + ) +); + +-- ============================================ +-- DEFAULT EMAIL TEMPLATES +-- ============================================ + +-- Insert default email templates if they don't exist +-- Using Monaco-branded design matching the login screen +INSERT INTO email_templates (template_key, template_name, category, subject, body_html, body_text, is_system) +VALUES + ( + 'welcome', + 'Welcome Email', + 'member', + 'Welcome to Monaco USA, {{first_name}}!', + ' + + + + + + + + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

Welcome to Monaco USA!

+

Dear {{first_name}},

+

We are thrilled to welcome you to the Monaco USA community! Your membership has been created and you can now access all member features.

+

To get started:

+
    +
  1. Set up your password using the separate email we sent
  2. +
  3. Complete your profile with your details
  4. +
  5. Explore upcoming events and connect with fellow members
  6. +
+

If you have any questions, please don''t hesitate to reach out to our board members.

+

Best regards,
The Monaco USA Team

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+ +', + 'Welcome to Monaco USA, {{first_name}}! Your membership has been created. Please set up your password and complete your profile.', + true + ), + ( + 'waitlist_promotion', + 'Waitlist Promotion', + 'event', + 'Great news! You''re confirmed for {{event_title}}', + ' + + + + + + + + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

You''re In!

+

Dear {{first_name}},

+

Great news! A spot has opened up for {{event_title}} and you have been moved from the waitlist to confirmed!

+
+

Event Details

+

Date: {{event_date}}

+

Location: {{event_location}}

+
+

We look forward to seeing you there!

+

Best regards,
The Monaco USA Team

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+ +', + 'Great news! A spot has opened up for {{event_title}} and you''ve been confirmed. See you on {{event_date}} at {{event_location}}!', + true + ), + ( + 'rsvp_confirmation', + 'RSVP Confirmation', + 'event', + 'RSVP Confirmed: {{event_title}}', + ' + + + + + + + + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

RSVP Confirmed!

+

Dear {{first_name}},

+

Your RSVP for {{event_title}} has been confirmed.

+
+

Event Details

+

Date: {{event_date}}

+

Time: {{event_time}}

+

Location: {{event_location}}

+

Guests: {{guest_count}}

+
+

We look forward to seeing you!

+

Best regards,
The Monaco USA Team

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+ +', + 'Your RSVP for {{event_title}} is confirmed! See you on {{event_date}} at {{event_location}}.', + true + ), + ( + 'payment_received', + 'Payment Received', + 'dues', + 'Payment Received - Monaco USA', + ' + + + + + + + + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

Payment Received

+

Dear {{first_name}},

+

We have received your payment. Thank you!

+
+

Payment Details

+

Amount: ${{amount}}

+

Date: {{payment_date}}

+

Reference: {{reference}}

+
+

Your membership dues are now paid through {{due_date}}.

+

Thank you for your continued support of Monaco USA!

+

Best regards,
The Monaco USA Team

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+ +', + 'Payment of ${{amount}} received on {{payment_date}}. Your dues are paid through {{due_date}}. Thank you!', + true + ), + ( + 'dues_reminder', + 'Dues Reminder', + 'dues', + 'Monaco USA Membership Dues Reminder', + ' + + + + + + + + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

Membership Dues Reminder

+

Dear {{first_name}},

+

This is a friendly reminder that your Monaco USA membership dues {{status}}.

+
+

Dues Details

+

Amount Due: ${{amount}}

+

Due Date: {{due_date}}

+
+

Please log in to your member portal to view payment instructions or contact the treasurer for assistance.

+

Thank you for your continued membership!

+

Best regards,
The Monaco USA Team

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+ +', + 'Reminder: Your Monaco USA membership dues ({{amount}}) {{status}}. Due date: {{due_date}}. Please log in to your portal for payment instructions.', + true + ) +ON CONFLICT (template_key) DO NOTHING; + +-- Grant permissions +GRANT SELECT, INSERT, UPDATE, DELETE ON audit_logs TO authenticated; +GRANT ALL ON audit_logs TO service_role; diff --git a/supabase/migrations/004_user_notification_preferences.sql b/supabase/migrations/004_user_notification_preferences.sql new file mode 100644 index 0000000..1cb2ecd --- /dev/null +++ b/supabase/migrations/004_user_notification_preferences.sql @@ -0,0 +1,102 @@ +-- User Notification Preferences +-- Allows members to control what email notifications they receive + +-- Create user notification preferences table +CREATE TABLE IF NOT EXISTS user_notification_preferences ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + member_id UUID NOT NULL REFERENCES members(id) ON DELETE CASCADE UNIQUE, + + -- Event notifications + email_event_rsvp_confirmation BOOLEAN DEFAULT true, + email_event_reminder BOOLEAN DEFAULT true, + email_event_updates BOOLEAN DEFAULT true, + email_waitlist_promotion BOOLEAN DEFAULT true, + + -- Membership notifications + email_dues_reminder BOOLEAN DEFAULT true, + email_payment_confirmation BOOLEAN DEFAULT true, + email_membership_updates BOOLEAN DEFAULT true, + + -- General notifications + email_announcements BOOLEAN DEFAULT true, + email_newsletter BOOLEAN DEFAULT true, + + -- Newsletter frequency (if subscribed) + newsletter_frequency TEXT DEFAULT 'monthly' CHECK (newsletter_frequency IN ('weekly', 'monthly', 'quarterly', 'never')), + + -- Timestamps + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Create indexes +CREATE INDEX IF NOT EXISTS idx_notification_prefs_member ON user_notification_preferences(member_id); + +-- Enable RLS +ALTER TABLE user_notification_preferences ENABLE ROW LEVEL SECURITY; + +-- RLS Policies +-- Members can view their own preferences +CREATE POLICY "Members can view own notification preferences" +ON user_notification_preferences FOR SELECT +USING (member_id = auth.uid()); + +-- Members can insert their own preferences +CREATE POLICY "Members can insert own notification preferences" +ON user_notification_preferences FOR INSERT +WITH CHECK (member_id = auth.uid()); + +-- Members can update their own preferences +CREATE POLICY "Members can update own notification preferences" +ON user_notification_preferences FOR UPDATE +USING (member_id = auth.uid()) +WITH CHECK (member_id = auth.uid()); + +-- Admins can view all preferences (for admin reports) +CREATE POLICY "Admins can view all notification preferences" +ON user_notification_preferences FOR SELECT +USING ( + EXISTS ( + SELECT 1 FROM members + WHERE members.id = auth.uid() + AND members.role = 'admin' + ) +); + +-- Function to create default preferences for new members +CREATE OR REPLACE FUNCTION create_default_notification_preferences() +RETURNS TRIGGER AS $$ +BEGIN + INSERT INTO user_notification_preferences (member_id) + VALUES (NEW.id) + ON CONFLICT (member_id) DO NOTHING; + RETURN NEW; +END; +$$ LANGUAGE plpgsql SECURITY DEFINER; + +-- Trigger to create preferences when a new member is created +DROP TRIGGER IF EXISTS on_member_created_create_notification_prefs ON members; +CREATE TRIGGER on_member_created_create_notification_prefs + AFTER INSERT ON members + FOR EACH ROW + EXECUTE FUNCTION create_default_notification_preferences(); + +-- Create default preferences for existing members +INSERT INTO user_notification_preferences (member_id) +SELECT id FROM members +ON CONFLICT (member_id) DO NOTHING; + +-- Add updated_at trigger +CREATE OR REPLACE FUNCTION update_notification_prefs_updated_at() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = NOW(); + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS set_notification_prefs_updated_at ON user_notification_preferences; +CREATE TRIGGER set_notification_prefs_updated_at + BEFORE UPDATE ON user_notification_preferences + FOR EACH ROW + EXECUTE FUNCTION update_notification_prefs_updated_at(); diff --git a/supabase/migrations/005_fix_avatars_storage_policy.sql b/supabase/migrations/005_fix_avatars_storage_policy.sql new file mode 100644 index 0000000..b05afb2 --- /dev/null +++ b/supabase/migrations/005_fix_avatars_storage_policy.sql @@ -0,0 +1,37 @@ +-- Monaco USA Portal 2026 +-- Migration 005: Fix Avatars Storage Policy +-- ================================================ +-- This fixes the RLS policy for avatars bucket to allow authenticated users to upload + +-- Drop existing restrictive policies +DROP POLICY IF EXISTS "avatars_insert_policy" ON storage.objects; +DROP POLICY IF EXISTS "avatars_update_policy" ON storage.objects; +DROP POLICY IF EXISTS "avatars_delete_policy" ON storage.objects; + +-- Create new permissive policy for authenticated users +-- Avatars bucket is public for reading, so we just need to ensure authenticated users can upload +CREATE POLICY "avatars_insert_policy" ON storage.objects FOR INSERT +TO authenticated +WITH CHECK (bucket_id = 'avatars'); + +CREATE POLICY "avatars_update_policy" ON storage.objects FOR UPDATE +TO authenticated +USING (bucket_id = 'avatars'); + +CREATE POLICY "avatars_delete_policy" ON storage.objects FOR DELETE +TO authenticated +USING (bucket_id = 'avatars'); + +-- Ensure the avatars bucket exists and is public +INSERT INTO storage.buckets (id, name, public, file_size_limit, allowed_mime_types) +VALUES ( + 'avatars', + 'avatars', + true, + 5242880, -- 5MB + ARRAY['image/jpeg', 'image/png', 'image/webp', 'image/gif'] +) +ON CONFLICT (id) DO UPDATE SET + public = true, + file_size_limit = EXCLUDED.file_size_limit, + allowed_mime_types = EXCLUDED.allowed_mime_types; diff --git a/supabase/migrations/006_document_folders.sql b/supabase/migrations/006_document_folders.sql new file mode 100644 index 0000000..93d22db --- /dev/null +++ b/supabase/migrations/006_document_folders.sql @@ -0,0 +1,100 @@ +-- Monaco USA Portal 2026 - Document Folders +-- Adds hierarchical folder support for document organization + +-- ============================================ +-- DOCUMENT FOLDERS TABLE +-- ============================================ +CREATE TABLE public.document_folders ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + name TEXT NOT NULL, + parent_id UUID REFERENCES public.document_folders(id) ON DELETE CASCADE, + path TEXT, -- Full path for breadcrumb support + visibility TEXT NOT NULL DEFAULT 'members' + CHECK (visibility IN ('public', 'members', 'board', 'admin')), + created_by UUID REFERENCES public.members(id), + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW(), + + -- Ensure unique folder names within same parent + UNIQUE(name, parent_id) +); + +-- Add updated_at trigger +CREATE TRIGGER document_folders_updated_at + BEFORE UPDATE ON public.document_folders + FOR EACH ROW + EXECUTE FUNCTION update_updated_at(); + +-- ============================================ +-- ADD FOLDER_ID TO DOCUMENTS TABLE +-- ============================================ +ALTER TABLE public.documents +ADD COLUMN folder_id UUID REFERENCES public.document_folders(id) ON DELETE SET NULL; + +-- ============================================ +-- PATH UPDATE TRIGGER +-- ============================================ +CREATE OR REPLACE FUNCTION update_folder_path() +RETURNS TRIGGER AS $$ +DECLARE + parent_path TEXT; +BEGIN + IF NEW.parent_id IS NULL THEN + NEW.path = NEW.name; + ELSE + SELECT path INTO parent_path + FROM public.document_folders + WHERE id = NEW.parent_id; + + NEW.path = parent_path || '/' || NEW.name; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER folder_path_trigger + BEFORE INSERT OR UPDATE ON public.document_folders + FOR EACH ROW + EXECUTE FUNCTION update_folder_path(); + +-- ============================================ +-- RLS POLICIES FOR FOLDERS +-- ============================================ +ALTER TABLE public.document_folders ENABLE ROW LEVEL SECURITY; + +-- Everyone can view folders based on visibility +CREATE POLICY "Folders visible based on visibility" ON public.document_folders + FOR SELECT USING ( + visibility = 'public' OR + (visibility = 'members' AND auth.uid() IS NOT NULL) OR + (visibility = 'board' AND EXISTS ( + SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin') + )) OR + (visibility = 'admin' AND EXISTS ( + SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin' + )) + ); + +-- Board and admin can create folders +CREATE POLICY "Board/admin can create folders" ON public.document_folders + FOR INSERT WITH CHECK ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin')) + ); + +-- Board and admin can update folders +CREATE POLICY "Board/admin can update folders" ON public.document_folders + FOR UPDATE USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin')) + ); + +-- Only admin can delete folders +CREATE POLICY "Admin can delete folders" ON public.document_folders + FOR DELETE USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role = 'admin') + ); + +-- ============================================ +-- INDEX FOR FOLDER QUERIES +-- ============================================ +CREATE INDEX idx_document_folders_parent ON public.document_folders(parent_id); +CREATE INDEX idx_documents_folder ON public.documents(folder_id); diff --git a/supabase/migrations/007_dues_reminders.sql b/supabase/migrations/007_dues_reminders.sql new file mode 100644 index 0000000..21d58f0 --- /dev/null +++ b/supabase/migrations/007_dues_reminders.sql @@ -0,0 +1,307 @@ +-- Monaco USA Portal 2026 - Dues Reminders Enhancement +-- Track sent reminders to avoid duplicates and enable analytics + +-- ============================================ +-- DUES REMINDER LOGS TABLE +-- ============================================ +CREATE TABLE public.dues_reminder_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + member_id UUID NOT NULL REFERENCES public.members(id) ON DELETE CASCADE, + reminder_type TEXT NOT NULL CHECK (reminder_type IN ('due_soon_30', 'due_soon_7', 'due_soon_1', 'overdue', 'grace_period', 'inactive_notice')), + due_date DATE NOT NULL, + sent_at TIMESTAMPTZ DEFAULT NOW(), + email_log_id UUID REFERENCES public.email_logs(id), + -- Prevent duplicate reminders for same member/type/period + UNIQUE(member_id, reminder_type, due_date) +); + +-- Enable RLS +ALTER TABLE public.dues_reminder_logs ENABLE ROW LEVEL SECURITY; + +-- Board and admin can view reminder logs +CREATE POLICY "Board/admin can view reminder logs" ON public.dues_reminder_logs + FOR SELECT USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin')) + ); + +-- Only service role can insert reminder logs (from cron/server) +CREATE POLICY "Service role can manage reminder logs" ON public.dues_reminder_logs + FOR ALL USING (true) + WITH CHECK (true); + +-- Index for fast lookups +CREATE INDEX idx_reminder_logs_member_date ON public.dues_reminder_logs(member_id, due_date); +CREATE INDEX idx_reminder_logs_type_sent ON public.dues_reminder_logs(reminder_type, sent_at); + +-- ============================================ +-- ADD EMAIL TEMPLATES FOR DUES REMINDERS +-- ============================================ + +-- 30 days before due reminder +INSERT INTO public.email_templates (template_key, template_name, category, subject, body_html, body_text, is_active, is_system, variables_schema) VALUES +( + 'dues_reminder_30', + 'Dues Reminder - 30 Days', + 'payment', + 'Your Monaco USA Membership Dues Are Coming Up', + '

Dear {{first_name}},

+

This is a friendly reminder that your Monaco USA membership dues will be due on {{due_date}}.

+
+

Payment Details:

+

Amount Due: {{amount}}

+

Due Date: {{due_date}}

+

Member ID: {{member_id}}

+
+
+

Bank Transfer Details:

+

Account Holder: {{account_holder}}

+

Bank: {{bank_name}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

You can also view your payment status and history in the member portal:

+

+ View My Account +

+

Thank you for being a valued member of Monaco USA!

', + 'Dear {{first_name}}, + +This is a friendly reminder that your Monaco USA membership dues will be due on {{due_date}}. + +Payment Details: +- Amount Due: {{amount}} +- Due Date: {{due_date}} +- Member ID: {{member_id}} + +Bank Transfer Details: +- Account Holder: {{account_holder}} +- Bank: {{bank_name}} +- IBAN: {{iban}} +- Reference: {{member_id}} + +Visit the member portal to view your payment status: {{portal_url}} + +Thank you for being a valued member of Monaco USA!', + true, + true, + '{"first_name": "Member first name", "due_date": "Dues due date", "amount": "Amount due", "member_id": "Member ID for reference", "account_holder": "Bank account holder", "bank_name": "Bank name", "iban": "IBAN number", "portal_url": "Portal URL"}' +), +( + 'dues_reminder_7', + 'Dues Reminder - 7 Days', + 'payment', + 'Reminder: Monaco USA Dues Due in 7 Days', + '

Dear {{first_name}},

+

Your Monaco USA membership dues will be due in 7 days on {{due_date}}.

+
+

Payment Information:

+

Amount: {{amount}}

+

Due Date: {{due_date}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

+ Pay Now +

+

Questions? Contact us at contact@monacousa.org

', + 'Dear {{first_name}}, + +Your Monaco USA membership dues will be due in 7 days on {{due_date}}. + +Amount: {{amount}} +IBAN: {{iban}} +Reference: {{member_id}} + +Visit the portal to pay: {{portal_url}}', + true, + true, + '{"first_name": "Member first name", "due_date": "Dues due date", "amount": "Amount due", "member_id": "Member ID", "iban": "IBAN number", "portal_url": "Portal URL"}' +), +( + 'dues_reminder_1', + 'Dues Reminder - 1 Day', + 'payment', + 'URGENT: Monaco USA Dues Due Tomorrow', + '

Dear {{first_name}},

+

Your Monaco USA membership dues are due tomorrow ({{due_date}}).

+
+

Payment Required:

+

Amount: {{amount}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

To maintain your active membership status and continued access to member benefits, please ensure payment is made by the due date.

+

+ Pay Now +

', + 'Dear {{first_name}}, + +URGENT: Your Monaco USA membership dues are due tomorrow ({{due_date}}). + +Amount: {{amount}} +IBAN: {{iban}} +Reference: {{member_id}} + +To maintain your active membership, please pay by the due date. + +Pay now: {{portal_url}}', + true, + true, + '{"first_name": "Member first name", "due_date": "Dues due date", "amount": "Amount due", "member_id": "Member ID", "iban": "IBAN number", "portal_url": "Portal URL"}' +), +( + 'dues_overdue', + 'Dues Overdue Notice', + 'payment', + 'ACTION REQUIRED: Monaco USA Dues Are Now Overdue', + '

Dear {{first_name}},

+

Your Monaco USA membership dues are now {{days_overdue}} days overdue.

+
+

Overdue Payment:

+

Amount: {{amount}}

+

Original Due Date: {{due_date}}

+

Days Overdue: {{days_overdue}}

+
+
+

Grace Period: You have {{grace_days_remaining}} days remaining in your grace period. After this, your membership status will be changed to inactive.

+
+

Please remit payment as soon as possible to maintain your membership benefits.

+
+

Payment Details:

+

Account: {{account_holder}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

+ Pay Now +

', + 'Dear {{first_name}}, + +Your Monaco USA membership dues are now {{days_overdue}} days overdue. + +Amount: {{amount}} +Original Due Date: {{due_date}} +Days Overdue: {{days_overdue}} + +Grace Period: You have {{grace_days_remaining}} days remaining. After this, your membership will be marked inactive. + +Payment Details: +- Account: {{account_holder}} +- IBAN: {{iban}} +- Reference: {{member_id}} + +Pay now: {{portal_url}}', + true, + true, + '{"first_name": "Member first name", "due_date": "Original due date", "amount": "Amount due", "days_overdue": "Number of days overdue", "grace_days_remaining": "Days left in grace period", "member_id": "Member ID", "account_holder": "Account holder", "iban": "IBAN", "portal_url": "Portal URL"}' +), +( + 'dues_grace_warning', + 'Grace Period Ending Warning', + 'payment', + 'WARNING: Monaco USA Grace Period Ending Soon', + '

Dear {{first_name}},

+

Your grace period ends in {{grace_days_remaining}} days.

+

Your membership dues of {{amount}} were due on {{due_date}} and are now {{days_overdue}} days overdue.

+
+

If payment is not received by {{grace_end_date}}, your membership status will automatically change to INACTIVE and you will lose access to member benefits.

+
+

Please make your payment immediately to avoid interruption:

+
+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

+ Pay Now - Urgent +

', + 'Dear {{first_name}}, + +WARNING: Your grace period ends in {{grace_days_remaining}} days. + +Your dues of {{amount}} were due on {{due_date}} and are now {{days_overdue}} days overdue. + +If payment is not received by {{grace_end_date}}, your membership will become INACTIVE. + +IBAN: {{iban}} +Reference: {{member_id}} + +Pay now: {{portal_url}}', + true, + true, + '{"first_name": "Member first name", "due_date": "Original due date", "amount": "Amount due", "days_overdue": "Days overdue", "grace_days_remaining": "Days until grace period ends", "grace_end_date": "Date grace period ends", "member_id": "Member ID", "iban": "IBAN", "portal_url": "Portal URL"}' +), +( + 'dues_inactive_notice', + 'Membership Marked Inactive', + 'payment', + 'Notice: Your Monaco USA Membership Is Now Inactive', + '

Dear {{first_name}},

+

Due to non-payment of membership dues, your Monaco USA membership has been marked as INACTIVE.

+
+

Status Change:

+

Previous Status: Active

+

New Status: Inactive

+

Outstanding Amount: {{amount}}

+
+

As an inactive member, you will no longer have access to:

+
    +
  • Member-only events
  • +
  • Member directory
  • +
  • Member communications
  • +
  • Voting rights
  • +
+

To reactivate your membership, please pay your outstanding dues:

+
+

Account: {{account_holder}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

+ Reactivate My Membership +

+

If you believe this is an error or have questions, please contact us at contact@monacousa.org

', + 'Dear {{first_name}}, + +Due to non-payment of membership dues, your Monaco USA membership has been marked as INACTIVE. + +Outstanding Amount: {{amount}} + +As an inactive member, you no longer have access to member-only events, directory, communications, or voting rights. + +To reactivate, please pay your dues: +- Account: {{account_holder}} +- IBAN: {{iban}} +- Reference: {{member_id}} + +Reactivate: {{portal_url}} + +Questions? Contact contact@monacousa.org', + true, + true, + '{"first_name": "Member first name", "amount": "Outstanding amount", "member_id": "Member ID", "account_holder": "Account holder", "iban": "IBAN", "portal_url": "Portal URL"}' +) +ON CONFLICT (template_key) DO NOTHING; + +-- ============================================ +-- HELPER FUNCTION: Get dues settings +-- ============================================ +CREATE OR REPLACE FUNCTION get_dues_settings() +RETURNS TABLE ( + reminder_days_before INTEGER[], + grace_period_days INTEGER, + auto_inactive_enabled BOOLEAN, + payment_iban TEXT, + payment_account_holder TEXT, + payment_bank_name TEXT +) AS $$ +BEGIN + RETURN QUERY + SELECT + COALESCE((SELECT (setting_value)::INTEGER[] FROM app_settings WHERE category = 'dues' AND setting_key = 'reminder_days_before'), ARRAY[30, 7, 1])::INTEGER[], + COALESCE((SELECT (setting_value)::INTEGER FROM app_settings WHERE category = 'dues' AND setting_key = 'grace_period_days'), 30)::INTEGER, + COALESCE((SELECT (setting_value)::BOOLEAN FROM app_settings WHERE category = 'dues' AND setting_key = 'auto_inactive_enabled'), true)::BOOLEAN, + COALESCE((SELECT setting_value::TEXT FROM app_settings WHERE category = 'dues' AND setting_key = 'payment_iban'), '')::TEXT, + COALESCE((SELECT setting_value::TEXT FROM app_settings WHERE category = 'dues' AND setting_key = 'payment_account_holder'), '')::TEXT, + COALESCE((SELECT setting_value::TEXT FROM app_settings WHERE category = 'dues' AND setting_key = 'payment_bank_name'), '')::TEXT; +END; +$$ LANGUAGE plpgsql STABLE; diff --git a/supabase/migrations/008_s3_public_endpoint.sql b/supabase/migrations/008_s3_public_endpoint.sql new file mode 100644 index 0000000..c9489e0 --- /dev/null +++ b/supabase/migrations/008_s3_public_endpoint.sql @@ -0,0 +1,11 @@ +-- ============================================ +-- S3 PUBLIC ENDPOINT SETTING +-- Separate URL for browser-accessible S3 files +-- ============================================ + +-- Add S3 public endpoint setting for browser access +-- The regular s3_endpoint is for server-to-S3 communication (internal Docker) +-- The s3_public_endpoint is for browser access to files (external URL) +INSERT INTO public.app_settings (category, setting_key, setting_value, setting_type, display_name, description, is_public) VALUES + ('storage', 's3_public_endpoint', '""', 'text', 'Public Endpoint URL', 'Browser-accessible S3 URL (e.g., http://localhost:9000). Leave empty to use the same as S3 Endpoint.', false) +ON CONFLICT (category, setting_key) DO NOTHING; diff --git a/supabase/migrations/009_dual_avatar_urls.sql b/supabase/migrations/009_dual_avatar_urls.sql new file mode 100644 index 0000000..10a2f42 --- /dev/null +++ b/supabase/migrations/009_dual_avatar_urls.sql @@ -0,0 +1,22 @@ +-- ============================================ +-- DUAL AVATAR URL COLUMNS +-- Separate columns for S3 and local storage URLs +-- ============================================ + +-- Add separate columns for S3 and local (Supabase Storage) avatar URLs +-- This allows switching between storage backends without losing URLs + +-- Add local avatar URL column +ALTER TABLE public.members ADD COLUMN IF NOT EXISTS avatar_url_local TEXT; + +-- Add S3 avatar URL column +ALTER TABLE public.members ADD COLUMN IF NOT EXISTS avatar_url_s3 TEXT; + +-- Add avatar storage path column (for deletion purposes) +ALTER TABLE public.members ADD COLUMN IF NOT EXISTS avatar_path TEXT; + +-- Comment explaining the columns +COMMENT ON COLUMN public.members.avatar_url IS 'Current active avatar URL (computed based on storage setting)'; +COMMENT ON COLUMN public.members.avatar_url_local IS 'Avatar URL when stored in Supabase Storage'; +COMMENT ON COLUMN public.members.avatar_url_s3 IS 'Avatar URL when stored in S3/MinIO'; +COMMENT ON COLUMN public.members.avatar_path IS 'Storage path for avatar file (e.g., member_id/avatar.jpg)'; diff --git a/supabase/migrations/010_storage_service_role_policies.sql b/supabase/migrations/010_storage_service_role_policies.sql new file mode 100644 index 0000000..b251fcd --- /dev/null +++ b/supabase/migrations/010_storage_service_role_policies.sql @@ -0,0 +1,79 @@ +-- ============================================ +-- STORAGE SERVICE ROLE POLICIES +-- Allow service_role to perform all operations on avatars bucket +-- This fixes RLS issues when using supabaseAdmin for storage operations +-- ============================================ + +-- First, drop any existing service role policies (in case they exist with different names) +DROP POLICY IF EXISTS "Service role can insert avatars" ON storage.objects; +DROP POLICY IF EXISTS "Service role can update avatars" ON storage.objects; +DROP POLICY IF EXISTS "Service role can delete avatars" ON storage.objects; +DROP POLICY IF EXISTS "Service role can read avatars" ON storage.objects; +DROP POLICY IF EXISTS "service_role_insert_avatars" ON storage.objects; +DROP POLICY IF EXISTS "service_role_update_avatars" ON storage.objects; +DROP POLICY IF EXISTS "service_role_delete_avatars" ON storage.objects; +DROP POLICY IF EXISTS "service_role_select_avatars" ON storage.objects; + +-- Service role INSERT policy for avatars +CREATE POLICY "service_role_insert_avatars" ON storage.objects +FOR INSERT TO service_role +WITH CHECK (bucket_id = 'avatars'); + +-- Service role UPDATE policy for avatars +CREATE POLICY "service_role_update_avatars" ON storage.objects +FOR UPDATE TO service_role +USING (bucket_id = 'avatars'); + +-- Service role DELETE policy for avatars +CREATE POLICY "service_role_delete_avatars" ON storage.objects +FOR DELETE TO service_role +USING (bucket_id = 'avatars'); + +-- Service role SELECT policy for avatars +CREATE POLICY "service_role_select_avatars" ON storage.objects +FOR SELECT TO service_role +USING (bucket_id = 'avatars'); + +-- Also add service_role policies for documents bucket +DROP POLICY IF EXISTS "service_role_insert_documents" ON storage.objects; +DROP POLICY IF EXISTS "service_role_update_documents" ON storage.objects; +DROP POLICY IF EXISTS "service_role_delete_documents" ON storage.objects; +DROP POLICY IF EXISTS "service_role_select_documents" ON storage.objects; + +CREATE POLICY "service_role_insert_documents" ON storage.objects +FOR INSERT TO service_role +WITH CHECK (bucket_id = 'documents'); + +CREATE POLICY "service_role_update_documents" ON storage.objects +FOR UPDATE TO service_role +USING (bucket_id = 'documents'); + +CREATE POLICY "service_role_delete_documents" ON storage.objects +FOR DELETE TO service_role +USING (bucket_id = 'documents'); + +CREATE POLICY "service_role_select_documents" ON storage.objects +FOR SELECT TO service_role +USING (bucket_id = 'documents'); + +-- Also add service_role policies for event-images bucket +DROP POLICY IF EXISTS "service_role_insert_event_images" ON storage.objects; +DROP POLICY IF EXISTS "service_role_update_event_images" ON storage.objects; +DROP POLICY IF EXISTS "service_role_delete_event_images" ON storage.objects; +DROP POLICY IF EXISTS "service_role_select_event_images" ON storage.objects; + +CREATE POLICY "service_role_insert_event_images" ON storage.objects +FOR INSERT TO service_role +WITH CHECK (bucket_id = 'event-images'); + +CREATE POLICY "service_role_update_event_images" ON storage.objects +FOR UPDATE TO service_role +USING (bucket_id = 'event-images'); + +CREATE POLICY "service_role_delete_event_images" ON storage.objects +FOR DELETE TO service_role +USING (bucket_id = 'event-images'); + +CREATE POLICY "service_role_select_event_images" ON storage.objects +FOR SELECT TO service_role +USING (bucket_id = 'event-images'); diff --git a/supabase/migrations/011_fix_service_role_rls.sql b/supabase/migrations/011_fix_service_role_rls.sql new file mode 100644 index 0000000..7adb131 --- /dev/null +++ b/supabase/migrations/011_fix_service_role_rls.sql @@ -0,0 +1,98 @@ +-- ============================================ +-- FIX SERVICE ROLE RLS BYPASS +-- Ensure service_role can properly bypass RLS for storage operations +-- ============================================ + +-- The service_role should have BYPASSRLS attribute in Supabase +-- But in self-hosted setups, this might not be configured correctly +-- This migration ensures proper access through multiple approaches + +-- Approach 1: Grant service_role BYPASSRLS (if not already set) +-- Note: This requires superuser privileges, which the migration might not have +-- If this fails, the explicit policies below will still work +DO $$ +BEGIN + -- Check if service_role exists and doesn't have bypassrls + IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'service_role' AND NOT rolbypassrls) THEN + ALTER ROLE service_role BYPASSRLS; + RAISE NOTICE 'Granted BYPASSRLS to service_role'; + ELSE + RAISE NOTICE 'service_role already has BYPASSRLS or does not exist'; + END IF; +EXCEPTION + WHEN insufficient_privilege THEN + RAISE NOTICE 'Could not grant BYPASSRLS (insufficient privileges) - using explicit policies instead'; + WHEN OTHERS THEN + RAISE NOTICE 'Error granting BYPASSRLS: % - using explicit policies instead', SQLERRM; +END $$; + +-- Approach 2: Ensure RLS is properly configured on storage.objects +-- Check if RLS is enabled and ensure our policies exist +DO $$ +BEGIN + -- Ensure RLS is enabled on storage.objects (it should be by default) + IF NOT EXISTS ( + SELECT 1 FROM pg_tables + WHERE schemaname = 'storage' AND tablename = 'objects' AND rowsecurity = true + ) THEN + ALTER TABLE storage.objects ENABLE ROW LEVEL SECURITY; + RAISE NOTICE 'Enabled RLS on storage.objects'; + END IF; +END $$; + +-- Approach 3: Create permissive policies for service_role on ALL storage buckets +-- These use a single policy per operation type that covers all buckets + +-- First, clean up any existing service_role policies +DROP POLICY IF EXISTS "service_role_all_select" ON storage.objects; +DROP POLICY IF EXISTS "service_role_all_insert" ON storage.objects; +DROP POLICY IF EXISTS "service_role_all_update" ON storage.objects; +DROP POLICY IF EXISTS "service_role_all_delete" ON storage.objects; + +-- Create universal service_role policies (allow access to ALL buckets) +CREATE POLICY "service_role_all_select" ON storage.objects +FOR SELECT TO service_role +USING (true); + +CREATE POLICY "service_role_all_insert" ON storage.objects +FOR INSERT TO service_role +WITH CHECK (true); + +CREATE POLICY "service_role_all_update" ON storage.objects +FOR UPDATE TO service_role +USING (true); + +CREATE POLICY "service_role_all_delete" ON storage.objects +FOR DELETE TO service_role +USING (true); + +-- Approach 4: Grant necessary table permissions to service_role +GRANT ALL ON storage.objects TO service_role; +GRANT ALL ON storage.buckets TO service_role; +GRANT USAGE ON SCHEMA storage TO service_role; + +-- Also ensure service_role can use sequences in storage schema +DO $$ +DECLARE + seq_name text; +BEGIN + FOR seq_name IN + SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = 'storage' + LOOP + EXECUTE format('GRANT USAGE, SELECT ON SEQUENCE storage.%I TO service_role', seq_name); + END LOOP; +END $$; + +-- Verify the setup +DO $$ +DECLARE + policy_count int; +BEGIN + SELECT COUNT(*) INTO policy_count + FROM pg_policies + WHERE schemaname = 'storage' + AND tablename = 'objects' + AND roles @> ARRAY['service_role']::name[]; + + RAISE NOTICE 'service_role has % policies on storage.objects', policy_count; +END $$; diff --git a/supabase/migrations/012_dual_document_urls.sql b/supabase/migrations/012_dual_document_urls.sql new file mode 100644 index 0000000..a0d7628 --- /dev/null +++ b/supabase/migrations/012_dual_document_urls.sql @@ -0,0 +1,49 @@ +-- ============================================ +-- DUAL STORAGE SUPPORT FOR DOCUMENTS +-- Store URLs for both Supabase Storage and S3 backends +-- Mirrors the avatar dual-storage pattern from migration 009 +-- ============================================ + +-- Add local storage URL column +ALTER TABLE public.documents ADD COLUMN IF NOT EXISTS file_url_local TEXT; + +-- Add S3 storage URL column +ALTER TABLE public.documents ADD COLUMN IF NOT EXISTS file_url_s3 TEXT; + +-- Add storage path column (relative path used for both backends) +ALTER TABLE public.documents ADD COLUMN IF NOT EXISTS storage_path TEXT; + +-- Add comments for documentation +COMMENT ON COLUMN public.documents.file_path IS 'Current active file URL (computed based on storage setting) - kept for backwards compatibility'; +COMMENT ON COLUMN public.documents.file_url_local IS 'File URL when stored in Supabase Storage'; +COMMENT ON COLUMN public.documents.file_url_s3 IS 'File URL when stored in S3/MinIO'; +COMMENT ON COLUMN public.documents.storage_path IS 'Storage path for file (e.g., timestamp-random-filename.pdf)'; + +-- Migrate existing file_path values to storage_path and file_url_local +-- This handles documents uploaded before dual-storage was implemented +UPDATE public.documents +SET + storage_path = CASE + WHEN file_path LIKE 'http%' THEN + -- Extract filename from URL + CASE + WHEN file_path LIKE '%/storage/v1/object/public/documents/%' THEN + substring(file_path from '/storage/v1/object/public/documents/([^?]+)') + WHEN file_path LIKE '%/documents/%' THEN + substring(file_path from '/documents/([^?]+)') + ELSE file_path + END + ELSE file_path + END, + file_url_local = CASE + WHEN file_path LIKE 'http%' AND file_path LIKE '%/storage/v1/object/public/documents/%' THEN file_path + ELSE NULL + END, + file_url_s3 = CASE + WHEN file_path LIKE 'http%' AND file_path NOT LIKE '%/storage/v1/object/public/documents/%' THEN file_path + ELSE NULL + END +WHERE storage_path IS NULL; + +-- Create index for faster lookups +CREATE INDEX IF NOT EXISTS idx_documents_storage_path ON public.documents(storage_path); diff --git a/supabase/migrations/013_email_background_images.sql b/supabase/migrations/013_email_background_images.sql new file mode 100644 index 0000000..b07ac77 --- /dev/null +++ b/supabase/migrations/013_email_background_images.sql @@ -0,0 +1,671 @@ +-- ============================================ +-- Migration 013: Update Email Templates with Background Image +-- Adds S3-hosted Monaco background image to all email templates +-- Matches login screen styling: image + gradient overlay +-- ============================================ + +-- Background image URL +-- Using: https://s3.monacousa.org/public/monaco_high_res.jpg +-- Gradient overlay: from-slate-900/80 via-slate-900/60 to-monaco-900/70 + +-- ===================== +-- Update Welcome Email Template +-- ===================== +UPDATE public.email_templates +SET body_html = ' + + + + + + + + + + + + +
+
+ + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

Welcome to Monaco USA!

+

Dear {{first_name}},

+

We are thrilled to welcome you to the Monaco USA community! Your membership has been created and you can now access all member features.

+

To get started:

+
    +
  1. Set up your password using the separate email we sent
  2. +
  3. Complete your profile with your details
  4. +
  5. Explore upcoming events and connect with fellow members
  6. +
+

If you have any questions, please don''t hesitate to reach out to our board members.

+

Best regards,
The Monaco USA Team

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+
+
+ +' +WHERE template_key = 'welcome'; + +-- ===================== +-- Update RSVP Confirmation Template +-- ===================== +UPDATE public.email_templates +SET body_html = ' + + + + + + + + + + + + +
+
+ + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

RSVP Confirmed!

+

Dear {{first_name}},

+

Your RSVP has been confirmed for the following event:

+
+

{{event_title}}

+

Date: {{event_date}}

+

Location: {{event_location}}

+

Guests: {{guest_count}}

+
+

We look forward to seeing you there!

+

Best regards,
The Monaco USA Team

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+
+
+ +' +WHERE template_key = 'rsvp_confirmation'; + +-- ===================== +-- Update Payment Received Template +-- ===================== +UPDATE public.email_templates +SET body_html = ' + + + + + + + + + + + + +
+
+ + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

Payment Received

+

Dear {{first_name}},

+

Thank you! We have received your membership dues payment.

+
+

Payment Details:

+

Amount: {{amount}}

+

Payment Date: {{payment_date}}

+

Period: {{period_start}} - {{period_end}}

+

Member ID: {{member_id}}

+
+

Your membership is now active through {{period_end}}. Thank you for your continued support of Monaco USA!

+

Best regards,
The Monaco USA Team

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+
+
+ +' +WHERE template_key = 'payment_received'; + +-- ===================== +-- Update Waitlist Promotion Template +-- ===================== +UPDATE public.email_templates +SET body_html = ' + + + + + + + + + + + + +
+
+ + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

Great News!

+

Dear {{first_name}},

+

A spot has opened up! You have been promoted from the waitlist for:

+
+

{{event_title}}

+

Date: {{event_date}}

+

Location: {{event_location}}

+
+

Your attendance is now confirmed. We look forward to seeing you!

+

Best regards,
The Monaco USA Team

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+
+
+ +' +WHERE template_key = 'waitlist_promotion'; + +-- ===================== +-- Update Dues Reminder 30 Days Template +-- ===================== +UPDATE public.email_templates +SET body_html = ' + + + + + + + + + + + + +
+
+ + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

Dues Reminder

+

Dear {{first_name}},

+

This is a friendly reminder that your Monaco USA membership dues will be due on {{due_date}}.

+
+

Payment Details:

+

Amount Due: {{amount}}

+

Due Date: {{due_date}}

+

Member ID: {{member_id}}

+
+
+

Bank Transfer Details:

+

Account Holder: {{account_holder}}

+

Bank: {{bank_name}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

You can also view your payment status and history in the member portal:

+

+ View My Account +

+

Thank you for being a valued member of Monaco USA!

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+
+
+ +' +WHERE template_key = 'dues_reminder_30'; + +-- ===================== +-- Update Dues Reminder 7 Days Template +-- ===================== +UPDATE public.email_templates +SET body_html = ' + + + + + + + + + + + + +
+
+ + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

Dues Due Soon

+

Dear {{first_name}},

+

Your Monaco USA membership dues are due in 7 days on {{due_date}}.

+
+

Payment Details:

+

Amount Due: {{amount}}

+

Due Date: {{due_date}}

+

Member ID: {{member_id}}

+
+
+

Bank Transfer Details:

+

Account Holder: {{account_holder}}

+

Bank: {{bank_name}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

+ Pay Now +

+

Thank you for your continued support!

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+
+
+ +' +WHERE template_key = 'dues_reminder_7'; + +-- ===================== +-- Update Dues Reminder 1 Day Template +-- ===================== +UPDATE public.email_templates +SET body_html = ' + + + + + + + + + + + + +
+
+ + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

Final Reminder

+

Dear {{first_name}},

+

This is a final reminder that your Monaco USA membership dues are due tomorrow ({{due_date}}).

+
+

Urgent - Payment Required:

+

Amount Due: {{amount}}

+

Due Date: {{due_date}}

+

Member ID: {{member_id}}

+
+
+

Bank Transfer Details:

+

Account Holder: {{account_holder}}

+

Bank: {{bank_name}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

+ Pay Now +

+

Please disregard this email if you have already made your payment.

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+
+
+ +' +WHERE template_key = 'dues_reminder_1'; + +-- ===================== +-- Update Dues Reminder (Generic) Template if exists +-- ===================== +UPDATE public.email_templates +SET body_html = ' + + + + + + + + + + + + +
+
+ + + + +
+ + + + + +
+
+ Monaco USA +
+

Monaco USA

+

Americans in Monaco

+
+ + + + + + +
+

Membership Dues Reminder

+

Dear {{first_name}},

+

This is a reminder about your Monaco USA membership dues.

+
+

Payment Details:

+

Amount Due: {{amount}}

+

Due Date: {{due_date}}

+

Member ID: {{member_id}}

+
+

+ View My Account +

+

Thank you for being a valued member of Monaco USA!

+
+ + + + + + +
+

© 2026 Monaco USA. All rights reserved.

+
+
+
+
+ +' +WHERE template_key = 'dues_reminder'; diff --git a/supabase/migrations/014_event_reminders.sql b/supabase/migrations/014_event_reminders.sql new file mode 100644 index 0000000..ba3fc87 --- /dev/null +++ b/supabase/migrations/014_event_reminders.sql @@ -0,0 +1,133 @@ +-- Monaco USA Portal 2026 - Event Reminder Emails +-- Automated reminders sent 24 hours before events to RSVPed members + +-- ============================================ +-- EVENT REMINDER LOGS TABLE +-- ============================================ +CREATE TABLE public.event_reminder_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + event_id UUID NOT NULL REFERENCES public.events(id) ON DELETE CASCADE, + rsvp_id UUID NOT NULL REFERENCES public.event_rsvps(id) ON DELETE CASCADE, + member_id UUID NOT NULL REFERENCES public.members(id) ON DELETE CASCADE, + reminder_type TEXT NOT NULL DEFAULT '24hr' CHECK (reminder_type IN ('24hr', '1hr', 'day_of')), + sent_at TIMESTAMPTZ DEFAULT NOW(), + email_log_id UUID REFERENCES public.email_logs(id), + -- Prevent duplicate reminders for same event/member/type + UNIQUE(event_id, member_id, reminder_type) +); + +-- Enable RLS +ALTER TABLE public.event_reminder_logs ENABLE ROW LEVEL SECURITY; + +-- Board and admin can view reminder logs +CREATE POLICY "Board/admin can view event reminder logs" ON public.event_reminder_logs + FOR SELECT USING ( + EXISTS (SELECT 1 FROM public.members WHERE id = auth.uid() AND role IN ('board', 'admin')) + ); + +-- Service role can manage reminder logs (from cron/server) +CREATE POLICY "Service role can manage event reminder logs" ON public.event_reminder_logs + FOR ALL USING (true) + WITH CHECK (true); + +-- Indexes for fast lookups +CREATE INDEX idx_event_reminder_logs_event ON public.event_reminder_logs(event_id); +CREATE INDEX idx_event_reminder_logs_member ON public.event_reminder_logs(member_id); +CREATE INDEX idx_event_reminder_logs_sent ON public.event_reminder_logs(sent_at); + +-- ============================================ +-- ADD APP SETTINGS FOR EVENT REMINDERS +-- ============================================ +INSERT INTO public.app_settings (category, setting_key, setting_value, display_name, description, is_public) +VALUES + ('events', 'event_reminders_enabled', 'true', 'Event Reminders Enabled', 'Enable automated event reminder emails', false), + ('events', 'event_reminder_hours_before', '24', 'Reminder Hours Before', 'Hours before event to send reminder', false) +ON CONFLICT (category, setting_key) DO NOTHING; + +-- ============================================ +-- ADD EMAIL TEMPLATE FOR EVENT REMINDER +-- ============================================ +INSERT INTO public.email_templates (template_key, template_name, category, subject, body_html, body_text, is_active, is_system, variables_schema) VALUES +( + 'event_reminder_24hr', + 'Event Reminder - 24 Hours', + 'events', + 'Reminder: {{event_title}} is Tomorrow!', + '

Hi {{first_name}},

+

This is a friendly reminder that {{event_title}} is happening tomorrow!

+
+

Event Details:

+

Date: {{event_date}}

+

Time: {{event_time}}

+

Location: {{event_location}}

+ {{#if guest_count}} +

You''re bringing {{guest_count}} guest(s)

+ {{/if}} +
+

We look forward to seeing you there!

+

+ View Event Details +

+

Can''t make it? Please update your RSVP so we can offer your spot to someone on the waitlist.

', + 'Hi {{first_name}}, + +This is a friendly reminder that {{event_title}} is happening tomorrow! + +Event Details: +- Date: {{event_date}} +- Time: {{event_time}} +- Location: {{event_location}} +{{#if guest_count}} +- You''re bringing {{guest_count}} guest(s) +{{/if}} + +We look forward to seeing you there! + +View event: {{portal_url}} + +Can''t make it? Please update your RSVP so we can offer your spot to someone on the waitlist.', + true, + true, + '{"first_name": "Member first name", "event_title": "Event title", "event_date": "Event date", "event_time": "Event start time", "event_location": "Event location", "guest_count": "Number of guests", "portal_url": "Event URL in portal"}' +) +ON CONFLICT (template_key) DO NOTHING; + +-- ============================================ +-- VIEW: Events needing reminders +-- ============================================ +CREATE OR REPLACE VIEW public.events_needing_reminders AS +SELECT + e.id AS event_id, + e.title AS event_title, + e.start_datetime, + e.end_datetime, + e.location, + e.timezone, + r.id AS rsvp_id, + r.member_id, + r.guest_count, + r.status AS rsvp_status, + m.first_name, + m.last_name, + m.email +FROM public.events e +JOIN public.event_rsvps r ON r.event_id = e.id +JOIN public.members m ON m.id = r.member_id +WHERE + -- Event is published + e.status = 'published' + -- Event starts within 24-25 hours from now (hourly cron window) + AND e.start_datetime > NOW() + AND e.start_datetime <= NOW() + INTERVAL '25 hours' + AND e.start_datetime > NOW() + INTERVAL '23 hours' + -- Member has confirmed RSVP + AND r.status = 'confirmed' + -- No reminder already sent for this event/member + AND NOT EXISTS ( + SELECT 1 FROM public.event_reminder_logs erl + WHERE erl.event_id = e.id + AND erl.member_id = r.member_id + AND erl.reminder_type = '24hr' + ) + -- Member has email + AND m.email IS NOT NULL; diff --git a/supabase/migrations/015_fix_email_template_styling.sql b/supabase/migrations/015_fix_email_template_styling.sql new file mode 100644 index 0000000..88ae8b8 --- /dev/null +++ b/supabase/migrations/015_fix_email_template_styling.sql @@ -0,0 +1,192 @@ +-- Monaco USA Portal 2026 - Fix Email Template Styling +-- Update all email templates with proper text centering and styling + +-- ============================================ +-- UPDATE DUES REMINDER TEMPLATES +-- ============================================ + +-- 30 days before due reminder +UPDATE public.email_templates +SET body_html = '

Dear {{first_name}},

+

This is a friendly reminder that your Monaco USA membership dues will be due on {{due_date}}.

+
+

Payment Details:

+

Amount Due: {{amount}}

+

Due Date: {{due_date}}

+

Member ID: {{member_id}}

+
+
+

Bank Transfer Details:

+

Account Holder: {{account_holder}}

+

Bank: {{bank_name}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

You can also view your payment status and history in the member portal:

+

+ View My Account +

+

Thank you for being a valued member of Monaco USA!

' +WHERE template_key = 'dues_reminder_30'; + +-- 7 days before due reminder +UPDATE public.email_templates +SET body_html = '

Dear {{first_name}},

+

Your Monaco USA membership dues will be due in 7 days on {{due_date}}.

+
+

Payment Information:

+

Amount: {{amount}}

+

Due Date: {{due_date}}

+
+
+

Bank Transfer Details:

+

Account Holder: {{account_holder}}

+

Bank: {{bank_name}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

+ Pay Now +

+

Questions? Contact us at contact@monacousa.org

' +WHERE template_key = 'dues_reminder_7'; + +-- 1 day before due reminder +UPDATE public.email_templates +SET body_html = '

Dear {{first_name}},

+

Your Monaco USA membership dues are due tomorrow ({{due_date}}).

+
+

Payment Required:

+

Amount: {{amount}}

+
+
+

Bank Transfer Details:

+

Account Holder: {{account_holder}}

+

Bank: {{bank_name}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

To maintain your active membership status and continued access to member benefits, please ensure payment is made by the due date.

+

+ Pay Now +

' +WHERE template_key = 'dues_reminder_1'; + +-- Overdue notice +UPDATE public.email_templates +SET body_html = '

Dear {{first_name}},

+

Your Monaco USA membership dues are now {{days_overdue}} days overdue.

+
+

Overdue Payment:

+

Amount: {{amount}}

+

Original Due Date: {{due_date}}

+

Days Overdue: {{days_overdue}}

+
+
+

Grace Period: You have {{grace_days_remaining}} days remaining in your grace period. After this, your membership status will be changed to inactive.

+
+

Please remit payment as soon as possible to maintain your membership benefits.

+
+

Bank Transfer Details:

+

Account Holder: {{account_holder}}

+

Bank: {{bank_name}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

+ Pay Now +

' +WHERE template_key = 'dues_overdue'; + +-- Grace period warning +UPDATE public.email_templates +SET body_html = '

Dear {{first_name}},

+

Your grace period ends in {{grace_days_remaining}} days.

+

Your membership dues of {{amount}} were due on {{due_date}} and are now {{days_overdue}} days overdue.

+
+

If payment is not received by {{grace_end_date}}, your membership status will automatically change to INACTIVE and you will lose access to member benefits.

+
+

Please make your payment immediately to avoid interruption:

+
+

Bank Transfer Details:

+

Account Holder: {{account_holder}}

+

Bank: {{bank_name}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

+ Pay Now - Urgent +

' +WHERE template_key = 'dues_grace_warning'; + +-- Inactive notice +UPDATE public.email_templates +SET body_html = '

Dear {{first_name}},

+

Due to non-payment of membership dues, your Monaco USA membership has been marked as INACTIVE.

+
+

Status Change:

+

Previous Status: Active

+

New Status: Inactive

+

Outstanding Amount: {{amount}}

+
+

As an inactive member, you will no longer have access to:

+
    +
  • Member-only events
  • +
  • Member directory
  • +
  • Member communications
  • +
  • Voting rights
  • +
+

To reactivate your membership, please pay your outstanding dues:

+
+

Bank Transfer Details:

+

Account Holder: {{account_holder}}

+

Bank: {{bank_name}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

+ Reactivate My Membership +

+

If you believe this is an error or have questions, please contact us at contact@monacousa.org

' +WHERE template_key = 'dues_inactive_notice'; + +-- ============================================ +-- UPDATE EVENT REMINDER TEMPLATE +-- ============================================ +UPDATE public.email_templates +SET body_html = '

Hi {{first_name}},

+

This is a friendly reminder that {{event_title}} is happening tomorrow!

+
+

Event Details:

+

Date: {{event_date}}

+

Time: {{event_time}}

+

Location: {{event_location}}

+ {{#if guest_count}} +

You''re bringing {{guest_count}} guest(s)

+ {{/if}} +
+

We look forward to seeing you there!

+

+ View Event Details +

+

Can''t make it? Please update your RSVP so we can offer your spot to someone on the waitlist.

' +WHERE template_key = 'event_reminder_24hr'; + +-- ============================================ +-- UPDATE RSVP CONFIRMATION TEMPLATE (content-only version) +-- ============================================ +-- Note: The original is a full HTML template, so we'll create a content-only version +-- that works with wrapInMonacoTemplate + +-- Update waitlist promotion to be content-only with proper styling +UPDATE public.email_templates +SET body_html = '

Dear {{first_name}},

+

Great news! A spot has opened up for {{event_title}} and you have been moved from the waitlist to confirmed!

+
+

Event Details

+

Date: {{event_date}}

+

Location: {{event_location}}

+
+

We look forward to seeing you there!

+

Best regards,
The Monaco USA Team

' +WHERE template_key = 'waitlist_promotion'; diff --git a/supabase/migrations/016_onboarding_payment_tracking.sql b/supabase/migrations/016_onboarding_payment_tracking.sql new file mode 100644 index 0000000..8af7ad0 --- /dev/null +++ b/supabase/migrations/016_onboarding_payment_tracking.sql @@ -0,0 +1,237 @@ +-- Monaco USA Portal 2026 - Onboarding Payment Tracking +-- Track new member payment deadlines for the 30-day payment window + +-- ============================================ +-- ADD PAYMENT TRACKING COLUMNS TO MEMBERS +-- ============================================ + +-- Payment deadline for new signups (30 days from onboarding completion) +ALTER TABLE public.members ADD COLUMN IF NOT EXISTS payment_deadline TIMESTAMPTZ; + +-- Track when onboarding was completed +ALTER TABLE public.members ADD COLUMN IF NOT EXISTS onboarding_completed_at TIMESTAMPTZ; + +-- Index for efficient reminder queries (only index non-null deadlines) +CREATE INDEX IF NOT EXISTS idx_members_payment_deadline ON public.members(payment_deadline) + WHERE payment_deadline IS NOT NULL; + +-- ============================================ +-- ADD ONBOARDING REMINDER TYPES TO LOGS TABLE +-- ============================================ + +-- Update the check constraint on dues_reminder_logs to include onboarding types +ALTER TABLE public.dues_reminder_logs DROP CONSTRAINT IF EXISTS dues_reminder_logs_reminder_type_check; +ALTER TABLE public.dues_reminder_logs ADD CONSTRAINT dues_reminder_logs_reminder_type_check + CHECK (reminder_type IN ( + 'due_soon_30', 'due_soon_7', 'due_soon_1', 'overdue', 'grace_period', 'inactive_notice', + 'onboarding_welcome', 'onboarding_reminder_7', 'onboarding_reminder_1', 'onboarding_expired' + )); + +-- ============================================ +-- ADD EMAIL TEMPLATES FOR ONBOARDING REMINDERS +-- ============================================ + +-- Welcome email with payment instructions (sent immediately after onboarding) +INSERT INTO public.email_templates (template_key, template_name, category, subject, body_html, body_text, is_active, is_system, variables_schema) VALUES +( + 'onboarding_welcome', + 'Welcome - Complete Your Membership', + 'onboarding', + 'Welcome to Monaco USA - Complete Your Membership', + '

Dear {{first_name}},

+

Welcome to Monaco USA! We''re thrilled to have you join our community of Americans living in and connected to Monaco.

+

Your account has been created and you now have 30 days to complete your membership by paying your annual dues.

+
+

Your Membership Details:

+

Member ID: {{member_id}}

+

Annual Dues: {{amount}}

+

Payment Deadline: {{payment_deadline}}

+
+
+

Bank Transfer Details:

+

Account Holder: {{account_holder}}

+

Bank: {{bank_name}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

In the meantime, explore your new member dashboard and connect with our community:

+

+ Go to Dashboard +

+

Questions? Contact us at contact@monacousa.org

', + 'Dear {{first_name}}, + +Welcome to Monaco USA! We''re thrilled to have you join our community of Americans living in and connected to Monaco. + +Your account has been created and you now have 30 days to complete your membership by paying your annual dues. + +Your Membership Details: +- Member ID: {{member_id}} +- Annual Dues: {{amount}} +- Payment Deadline: {{payment_deadline}} + +Bank Transfer Details: +- Account Holder: {{account_holder}} +- Bank: {{bank_name}} +- IBAN: {{iban}} +- Reference: {{member_id}} + +Visit your dashboard: {{portal_url}} + +Questions? Contact us at contact@monacousa.org', + true, + true, + '{"first_name": "Member first name", "member_id": "Member ID", "amount": "Annual dues amount", "payment_deadline": "Payment deadline date", "account_holder": "Bank account holder", "bank_name": "Bank name", "iban": "IBAN number", "portal_url": "Portal URL"}' +) ON CONFLICT (template_key) DO NOTHING; + +-- 7 days left reminder +INSERT INTO public.email_templates (template_key, template_name, category, subject, body_html, body_text, is_active, is_system, variables_schema) VALUES +( + 'onboarding_reminder_7', + 'Onboarding Reminder - 7 Days Left', + 'onboarding', + '7 Days Left to Complete Your Monaco USA Membership', + '

Dear {{first_name}},

+

You have 7 days left to complete your Monaco USA membership by paying your annual dues.

+
+

Payment Due:

+

Amount: {{amount}}

+

Deadline: {{payment_deadline}}

+
+
+

Bank Transfer Details:

+

Account Holder: {{account_holder}}

+

Bank: {{bank_name}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

After the deadline, your account will be marked as inactive and you''ll lose access to member features.

+

+ View My Account +

', + 'Dear {{first_name}}, + +You have 7 days left to complete your Monaco USA membership by paying your annual dues. + +Payment Due: +- Amount: {{amount}} +- Deadline: {{payment_deadline}} + +Bank Transfer Details: +- Account Holder: {{account_holder}} +- Bank: {{bank_name}} +- IBAN: {{iban}} +- Reference: {{member_id}} + +After the deadline, your account will be marked as inactive. + +Visit: {{portal_url}}', + true, + true, + '{"first_name": "Member first name", "member_id": "Member ID", "amount": "Annual dues amount", "payment_deadline": "Payment deadline date", "account_holder": "Bank account holder", "bank_name": "Bank name", "iban": "IBAN number", "portal_url": "Portal URL"}' +) ON CONFLICT (template_key) DO NOTHING; + +-- Last day reminder (urgent) +INSERT INTO public.email_templates (template_key, template_name, category, subject, body_html, body_text, is_active, is_system, variables_schema) VALUES +( + 'onboarding_reminder_1', + 'Onboarding Reminder - Last Day', + 'onboarding', + 'URGENT: Last Day to Complete Your Monaco USA Membership', + '

Dear {{first_name}},

+

Today is your last day to complete your Monaco USA membership payment.

+
+

Payment Required Today:

+

Amount: {{amount}}

+

Deadline: {{payment_deadline}}

+
+
+

Bank Transfer Details:

+

Account Holder: {{account_holder}}

+

Bank: {{bank_name}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

If we don''t receive your payment today, your account will be marked as inactive tomorrow.

+

+ Complete Payment Now +

', + 'Dear {{first_name}}, + +TODAY IS YOUR LAST DAY to complete your Monaco USA membership payment. + +Payment Required Today: +- Amount: {{amount}} +- Deadline: {{payment_deadline}} + +Bank Transfer Details: +- Account Holder: {{account_holder}} +- Bank: {{bank_name}} +- IBAN: {{iban}} +- Reference: {{member_id}} + +If we don''t receive your payment today, your account will be marked as inactive tomorrow. + +Visit: {{portal_url}}', + true, + true, + '{"first_name": "Member first name", "member_id": "Member ID", "amount": "Annual dues amount", "payment_deadline": "Payment deadline date", "account_holder": "Bank account holder", "bank_name": "Bank name", "iban": "IBAN number", "portal_url": "Portal URL"}' +) ON CONFLICT (template_key) DO NOTHING; + +-- Account marked inactive (deadline passed) +INSERT INTO public.email_templates (template_key, template_name, category, subject, body_html, body_text, is_active, is_system, variables_schema) VALUES +( + 'onboarding_expired', + 'Onboarding Expired - Account Inactive', + 'onboarding', + 'Your Monaco USA Account Has Been Marked Inactive', + '

Dear {{first_name}},

+

Your 30-day payment window has expired and your Monaco USA account has been marked as INACTIVE.

+
+

Account Status:

+

Status: Inactive

+

Outstanding Amount: {{amount}}

+
+

As an inactive member, you no longer have access to:

+
    +
  • Member-only events
  • +
  • Member directory
  • +
  • Member communications
  • +
+

To reactivate your membership, please complete your dues payment:

+
+

Bank Transfer Details:

+

Account Holder: {{account_holder}}

+

Bank: {{bank_name}}

+

IBAN: {{iban}}

+

Reference: {{member_id}}

+
+

+ Reactivate My Account +

+

Questions? Contact us at contact@monacousa.org

', + 'Dear {{first_name}}, + +Your 30-day payment window has expired and your Monaco USA account has been marked as INACTIVE. + +Account Status: +- Status: Inactive +- Outstanding Amount: {{amount}} + +As an inactive member, you no longer have access to member-only events, directory, and communications. + +To reactivate your membership, please pay your dues: + +Bank Transfer Details: +- Account Holder: {{account_holder}} +- Bank: {{bank_name}} +- IBAN: {{iban}} +- Reference: {{member_id}} + +Visit: {{portal_url}} + +Questions? Contact us at contact@monacousa.org', + true, + true, + '{"first_name": "Member first name", "member_id": "Member ID", "amount": "Annual dues amount", "account_holder": "Bank account holder", "bank_name": "Bank name", "iban": "IBAN number", "portal_url": "Portal URL"}' +) ON CONFLICT (template_key) DO NOTHING; diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..e0a641e --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,18 @@ +import adapter from '@sveltejs/adapter-node'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://svelte.dev/docs/kit/integrations + // for more information about preprocessors + preprocess: vitePreprocess(), + + kit: { + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. + // See https://svelte.dev/docs/kit/adapters for more information about adapters. + adapter: adapter() + } +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..2c2ed3c --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "rewriteRelativeImportExtensions": true, + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // To make changes to top-level options such as include and exclude, we recommend extending + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..9b140e6 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,11 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import tailwindcss from '@tailwindcss/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [tailwindcss(), sveltekit()], + css: { + // Prevent Vite from picking up postcss config from parent directories + postcss: {} + } +});

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 c8h=X_my*0 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