Files
hackerspace.sh/app/(app)/import/page.tsx
T
Moheeb Zara 7054b35ddb fix(import): route member CSV import through the server action (security/data)
The members branch was inserting space_members directly from the
browser with user_id: crypto.randomUUID() -- a fabricated id that
violates the auth.users FK (offline members must be user_id NULL) and
bypassed all server-side validation. Now maps columns and calls the
existing admin-gated, Zod-validated, batched importMembers action;
surfaces count + skipped. Dropped the now-unused spaceId prop.
2026-05-17 01:18:05 -07:00

33 lines
1.2 KiB
TypeScript

import { createClient } from '@/lib/supabase/server'
import ImportClient from './import-client'
import { PageTitle } from '@/components/ui/page-title'
export default async function ImportPage() {
const supabase = await createClient()
const { data: { user } } = await supabase.auth.getUser()
if (!user) return null
const { data: member } = await supabase
.from('space_members').select('space_id, role').eq('user_id', user.id).in('status', ['current', 'unverified', 'late']).single()
const isAdmin = member?.role === 'admin' || member?.role === 'board' || member?.role === 'treasurer'
if (!isAdmin) {
return (
<div className="min-h-screen bg-background flex items-center justify-center">
<p className="font-sans text-sm text-muted-foreground">Admin or Treasurer access required</p>
</div>
)
}
return (
<div className="min-h-screen bg-background">
<div className="bg-sidebar px-6 py-3 flex items-center justify-between">
<PageTitle>Import & Sync</PageTitle>
<p className="font-mono text-xs text-sidebar-foreground/50">CSV import · member & payment data</p>
</div>
<ImportClient role={member!.role} />
</div>
)
}