97 lines
2.7 KiB
TypeScript
97 lines
2.7 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
||
import { cookies } from "next/headers";
|
||
import {
|
||
COOKIE_ACCESS,
|
||
COOKIE_REFRESH,
|
||
COOKIE_OPTS,
|
||
ACCESS_MAX_AGE,
|
||
REFRESH_MAX_AGE,
|
||
} from "@/lib/auth-cookies";
|
||
|
||
const BASE_URL =
|
||
process.env.BASE_API_URL ??
|
||
process.env.NEXT_PUBLIC_BASE_API_URL ??
|
||
"http://127.0.0.1:8080";
|
||
|
||
export async function POST(request: NextRequest) {
|
||
try {
|
||
const body = await request.json();
|
||
const { email, password } = body as { email?: string; password?: string };
|
||
if (!email || !password) {
|
||
return NextResponse.json(
|
||
{ error: "E-posta ve şifre gerekli." },
|
||
{ status: 400 }
|
||
);
|
||
}
|
||
|
||
let res: Response;
|
||
try {
|
||
res = await fetch(`${BASE_URL}/api/v1/auth/login`, {
|
||
method: "POST",
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
accept: "application/json",
|
||
},
|
||
body: JSON.stringify({ email: String(email).trim(), password }),
|
||
});
|
||
} catch (fetchErr) {
|
||
const msg =
|
||
process.env.NODE_ENV === "development" && fetchErr instanceof Error
|
||
? `Backend erişilemedi: ${fetchErr.message} (URL: ${BASE_URL})`
|
||
: "Giriş servisi şu an kullanılamıyor.";
|
||
return NextResponse.json({ error: msg }, { status: 502 });
|
||
}
|
||
|
||
let data: unknown;
|
||
try {
|
||
const text = await res.text();
|
||
data = text ? JSON.parse(text) : {};
|
||
} catch {
|
||
data = {};
|
||
}
|
||
|
||
if (!res.ok) {
|
||
const message =
|
||
(data as { detail?: string })?.detail ?? "Giriş başarısız";
|
||
return NextResponse.json(
|
||
{ error: message },
|
||
{ status: res.status >= 400 ? res.status : 500 }
|
||
);
|
||
}
|
||
|
||
const access_token = (data as { access_token?: string })?.access_token;
|
||
const refresh_token = (data as { refresh_token?: string })?.refresh_token;
|
||
const user = (data as { user?: unknown })?.user;
|
||
|
||
if (!access_token || !refresh_token) {
|
||
return NextResponse.json(
|
||
{
|
||
error:
|
||
process.env.NODE_ENV === "development"
|
||
? "Backend token döndürmedi."
|
||
: "Giriş yanıtı geçersiz.",
|
||
},
|
||
{ status: 502 }
|
||
);
|
||
}
|
||
|
||
const cookieStore = await cookies();
|
||
cookieStore.set(COOKIE_ACCESS, access_token, {
|
||
...COOKIE_OPTS,
|
||
maxAge: ACCESS_MAX_AGE,
|
||
});
|
||
cookieStore.set(COOKIE_REFRESH, refresh_token, {
|
||
...COOKIE_OPTS,
|
||
maxAge: REFRESH_MAX_AGE,
|
||
});
|
||
|
||
return NextResponse.json({ user });
|
||
} catch (e) {
|
||
const message =
|
||
process.env.NODE_ENV === "development" && e instanceof Error
|
||
? e.message
|
||
: "Sunucu hatası.";
|
||
return NextResponse.json({ error: message }, { status: 500 });
|
||
}
|
||
}
|