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.
33 lines
1.2 KiB
TypeScript
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>
|
|
)
|
|
}
|