Fix signin SQL value handling
This commit is contained in:
parent
1f8cf74188
commit
31d2c5a29f
1 changed files with 25 additions and 30 deletions
|
|
@ -3,14 +3,15 @@ import { sql } from "@/db";
|
||||||
import { cookies } from "next/headers";
|
import { cookies } from "next/headers";
|
||||||
|
|
||||||
export async function POST(request: Request) {
|
export async function POST(request: Request) {
|
||||||
const { email } = await request.json();
|
const body = await request.json();
|
||||||
|
const email = body?.email;
|
||||||
|
|
||||||
if (!email) {
|
if (!email) {
|
||||||
return NextResponse.json({ error: "Email required" }, { status: 400 });
|
return NextResponse.json({ error: "Email required" }, { status: 400 });
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Find user
|
// Find user - use parameterized query
|
||||||
const users = await sql`
|
const users = await sql`
|
||||||
SELECT u.id, u.email, fm.family_id as family_id
|
SELECT u.id, u.email, fm.family_id as family_id
|
||||||
FROM users u
|
FROM users u
|
||||||
|
|
@ -19,51 +20,48 @@ export async function POST(request: Request) {
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
`;
|
`;
|
||||||
|
|
||||||
if (!users || users.length === 0) {
|
const user = users?.[0];
|
||||||
|
|
||||||
|
if (!user) {
|
||||||
return NextResponse.json({ error: "User not found" }, { status: 404 });
|
return NextResponse.json({ error: "User not found" }, { status: 404 });
|
||||||
}
|
}
|
||||||
|
|
||||||
const user = users[0];
|
// Create session token
|
||||||
const userId = user.id;
|
|
||||||
const familyId = user.family_id;
|
|
||||||
|
|
||||||
// Create session in database
|
|
||||||
const sessionToken = crypto.randomUUID();
|
const sessionToken = crypto.randomUUID();
|
||||||
const expires = new Date();
|
const expires = new Date();
|
||||||
expires.setDate(expires.getDate() + 30); // 30 days
|
expires.setDate(expires.getDate() + 30);
|
||||||
|
|
||||||
|
// Insert session
|
||||||
await sql`
|
await sql`
|
||||||
INSERT INTO sessions (session_token, user_id, expires)
|
INSERT INTO sessions (session_token, user_id, expires)
|
||||||
VALUES ${sql(sessionToken, userId, expires)}
|
VALUES (${sessionToken}, ${user.id}, ${expires.toISOString()})
|
||||||
`;
|
`;
|
||||||
|
|
||||||
// Get family info
|
// Get family info
|
||||||
let family = null;
|
let family = null;
|
||||||
if (familyId) {
|
if (user.family_id) {
|
||||||
const families = await sql`
|
const families = await sql`
|
||||||
SELECT id, name, tier, max_children, max_members
|
SELECT id, name, tier, max_children, max_members
|
||||||
FROM families WHERE id = ${familyId}
|
FROM families WHERE id = ${user.family_id}
|
||||||
`;
|
`;
|
||||||
if (families.length > 0) {
|
family = families?.[0];
|
||||||
family = families[0];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create response with cookie
|
// Create response
|
||||||
const response = NextResponse.json({
|
const response = NextResponse.json({
|
||||||
success: true,
|
success: true,
|
||||||
userId: user.id,
|
userId: user.id,
|
||||||
email: user.email,
|
email: user.email,
|
||||||
familyId: familyId,
|
familyId: user.family_id,
|
||||||
family: family,
|
family: family,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Set session cookie (httpOnly, secure, sameSite)
|
// Set cookie
|
||||||
response.cookies.set("session", sessionToken, {
|
response.cookies.set("tia_session", sessionToken, {
|
||||||
httpOnly: true,
|
httpOnly: true,
|
||||||
secure: process.env.NODE_ENV === "production",
|
secure: process.env.NODE_ENV === "production",
|
||||||
sameSite: "lax",
|
sameSite: "lax",
|
||||||
maxAge: 60 * 60 * 24 * 30, // 30 days
|
maxAge: 60 * 60 * 24 * 30,
|
||||||
path: "/",
|
path: "/",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -74,17 +72,15 @@ export async function POST(request: Request) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GET current session
|
|
||||||
export async function GET() {
|
export async function GET() {
|
||||||
try {
|
try {
|
||||||
const cookieStore = await cookies();
|
const cookieStore = await cookies();
|
||||||
const sessionToken = cookieStore.get("session")?.value;
|
const sessionToken = cookieStore.get("tia_session")?.value;
|
||||||
|
|
||||||
if (!sessionToken) {
|
if (!sessionToken) {
|
||||||
return NextResponse.json({ authenticated: false });
|
return NextResponse.json({ authenticated: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Look up session
|
|
||||||
const sessions = await sql`
|
const sessions = await sql`
|
||||||
SELECT s.user_id, s.expires, u.email
|
SELECT s.user_id, s.expires, u.email
|
||||||
FROM sessions s
|
FROM sessions s
|
||||||
|
|
@ -93,13 +89,12 @@ export async function GET() {
|
||||||
AND s.expires > NOW()
|
AND s.expires > NOW()
|
||||||
`;
|
`;
|
||||||
|
|
||||||
if (!sessions || sessions.length === 0) {
|
const session = sessions?.[0];
|
||||||
|
|
||||||
|
if (!session) {
|
||||||
return NextResponse.json({ authenticated: false });
|
return NextResponse.json({ authenticated: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
const session = sessions[0];
|
|
||||||
|
|
||||||
// Get family via family_members
|
|
||||||
const members = await sql`
|
const members = await sql`
|
||||||
SELECT fm.family_id, f.name as family_name, f.tier
|
SELECT fm.family_id, f.name as family_name, f.tier
|
||||||
FROM family_members fm
|
FROM family_members fm
|
||||||
|
|
@ -111,9 +106,9 @@ export async function GET() {
|
||||||
authenticated: true,
|
authenticated: true,
|
||||||
userId: session.user_id,
|
userId: session.user_id,
|
||||||
email: session.email,
|
email: session.email,
|
||||||
familyId: members[0]?.family_id,
|
familyId: members?.[0]?.family_id,
|
||||||
familyName: members[0]?.family_name,
|
familyName: members?.[0]?.family_name,
|
||||||
tier: members[0]?.tier,
|
tier: members?.[0]?.tier,
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return NextResponse.json({ authenticated: false });
|
return NextResponse.json({ authenticated: false });
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue