Add rider/driver role selection after sign-up

- users.role column (+ migration in seed script)
- /(api)/user: GET role by clerkId, PATCH to set role
- Role selection screen; drivers get placeholder driver-home
- Root index routes by role; hardened location handling on home
This commit is contained in:
Krikorios
2026-08-22 16:13:59 +03:00
parent fdc1664cce
commit fbe92c9d16
9 changed files with 243 additions and 19 deletions
+49
View File
@@ -1,5 +1,26 @@
import { neon } from "@neondatabase/serverless";
export async function GET(req: Request) {
const sql = neon(process.env.DATABASE_URL!);
const clerkId = new URL(req.url).searchParams.get("clerkId");
if (!clerkId) {
return Response.json({ error: "Missing clerkId" }, { status: 400 });
}
try {
const response = await sql`
SELECT id, name, email, role FROM users WHERE clerk_id = ${clerkId}
`;
return Response.json({ data: response[0] ?? null });
} catch (error) {
console.log("[GET_USER]: ", error);
return Response.json({ error }, { status: 500 });
}
}
export async function POST(req: Request) {
const sql = neon(process.env.DATABASE_URL!);
const { name, email, clerkId } = await req.json();
@@ -36,3 +57,31 @@ export async function POST(req: Request) {
return Response.json({ error }, { status: 500 });
}
}
export async function PATCH(req: Request) {
const sql = neon(process.env.DATABASE_URL!);
const { clerkId, role } = await req.json();
if (!clerkId || !["rider", "driver"].includes(role)) {
return Response.json(
{ error: "Missing clerkId or invalid role." },
{ status: 400 },
);
}
try {
const response = await sql`
UPDATE users SET role = ${role} WHERE clerk_id = ${clerkId} RETURNING id, role
`;
if (response.length === 0) {
return Response.json({ error: "User not found." }, { status: 404 });
}
return Response.json({ data: response[0] });
} catch (error) {
console.log("[PATCH_USER]: ", error);
return Response.json({ error }, { status: 500 });
}
}