diff --git a/app/(dashboard)/layout.tsx b/app/(dashboard)/layout.tsx index 7f3eda8..d861ece 100644 --- a/app/(dashboard)/layout.tsx +++ b/app/(dashboard)/layout.tsx @@ -233,7 +233,7 @@ export default function DashboardLayout({ Chambers

NU Student Gov. Association

-

v1.12.0

+

v1.12.1

{userName && (

{getGreeting()},
{userName}

diff --git a/app/(dashboard)/sga-spaces/space-calendar.tsx b/app/(dashboard)/sga-spaces/space-calendar.tsx index 12193e7..e5cea41 100644 --- a/app/(dashboard)/sga-spaces/space-calendar.tsx +++ b/app/(dashboard)/sga-spaces/space-calendar.tsx @@ -302,10 +302,10 @@ export default function SpaceCalendar({ const totalHeight = TOTAL_SLOTS * SLOT_HEIGHT return ( -
+
{/* Sticky day header */} -
+
{dayLabels.map((dl, i) => (
0) { + return NextResponse.json( + { error: 'A deactivated account already exists for this email. Reactivate the account instead of sending a new invite.' }, + { status: 400 } + ) + } + const otp = randomBytes(8).toString('base64url').slice(0, 12) const otpHash = createHash('sha256').update(otp).digest('hex') const otpExpiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString() diff --git a/app/api/onboarding/profile/route.ts b/app/api/onboarding/profile/route.ts index 4c28bc3..b6464ec 100644 --- a/app/api/onboarding/profile/route.ts +++ b/app/api/onboarding/profile/route.ts @@ -34,5 +34,11 @@ export async function PATCH(request: Request) { if (error) return NextResponse.json({ error: error.message }, { status: 500 }) + const { error: metaError } = await adminSupabase.auth.admin.updateUserById(user.id, { + user_metadata: { full_name }, + }) + + if (metaError) return NextResponse.json({ error: metaError.message }, { status: 500 }) + return NextResponse.json({ success: true }) } diff --git a/app/api/signup/request/route.ts b/app/api/signup/request/route.ts index 13d5a40..d422998 100644 --- a/app/api/signup/request/route.ts +++ b/app/api/signup/request/route.ts @@ -23,6 +23,20 @@ export async function POST(request: Request) { const normalizedEmail = email.trim().toLowerCase() + // Block deactivated accounts — generic message to avoid leaking account status + const { count: deactivatedCount } = await adminSupabase + .from('users') + .select('id', { count: 'exact', head: true }) + .eq('email', normalizedEmail) + .eq('is_active', false) + + if (deactivatedCount && deactivatedCount > 0) { + return NextResponse.json( + { error: 'This email is not eligible for registration. Please contact an administrator.' }, + { status: 400 } + ) + } + // Check if a fully set-up account already exists (head-only, no data returned) const { count: existingCount } = await adminSupabase .from('users') diff --git a/package-lock.json b/package-lock.json index 015a6f6..9cc594b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "chambers", - "version": "1.12.0", + "version": "1.12.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "chambers", - "version": "1.12.0", + "version": "1.12.1", "dependencies": { "@supabase/ssr": "^0.9.0", "@supabase/supabase-js": "^2.99.1", diff --git a/package.json b/package.json index 2b342cc..cdd75a4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chambers", - "version": "1.12.0", + "version": "1.12.1", "private": true, "scripts": { "dev": "next dev",