diff --git a/app/api/projects/create/route.ts b/app/api/projects/create/route.ts index f5d89e4..134f1bb 100644 --- a/app/api/projects/create/route.ts +++ b/app/api/projects/create/route.ts @@ -24,22 +24,27 @@ export async function POST(request: Request) { const workspace = email.split('@')[0].toLowerCase().replace(/[^a-z0-9]+/g, '-') + '-account'; // Upsert user into fs_users — guarantees the FK target exists - await query(` - INSERT INTO fs_users (id, user_id, data) - VALUES (gen_random_uuid()::text, $1, $2::jsonb) - ON CONFLICT ((data->>'email')) DO UPDATE - SET user_id = EXCLUDED.user_id, - data = fs_users.data || EXCLUDED.data, - updated_at = NOW() - `, [ - session.user.id, - JSON.stringify({ - email, - name: session.user.name, - image: session.user.image, - workspace, - }), - ]); + const userData = JSON.stringify({ + email, + name: session.user.name, + image: session.user.image, + workspace, + }); + const existingUser = await query<{ id: string; data: any }>( + `SELECT id, data FROM fs_users WHERE data->>'email' = $1 LIMIT 1`, + [email] + ); + if (existingUser.length === 0) { + await query( + `INSERT INTO fs_users (id, user_id, data) VALUES (gen_random_uuid()::text, $1, $2::jsonb)`, + [session.user.id, userData] + ); + } else { + await query( + `UPDATE fs_users SET user_id = $1, data = data || $2::jsonb, updated_at = NOW() WHERE id = $3`, + [session.user.id, userData, existingUser[0].id] + ); + } // Fetch the canonical fs_users row (now guaranteed to exist) const users = await query<{ id: string; data: any }>(` @@ -47,7 +52,6 @@ export async function POST(request: Request) { `, [email]); const firebaseUserId = users[0]!.id; - const userData = users[0]!.data || {}; const body = await request.json(); const { diff --git a/entrypoint.sh b/entrypoint.sh index 7f6dc50..54eecb5 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -2,7 +2,9 @@ set -e echo "=== Syncing NextAuth schema ===" -npx prisma db push --accept-data-loss --skip-generate +# NOTE: Do NOT use --accept-data-loss — it drops tables not in the Prisma schema, +# which destroys fs_users, fs_projects etc. Use --skip-generate only. +npx prisma db push --skip-generate || echo "Prisma push failed (non-fatal — tables may already be correct)" echo "=== Ensuring app tables exist ===" node -e "