68 lines
1.4 KiB
TypeScript
68 lines
1.4 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
|
|
import {
|
|
getHermesUrl,
|
|
readJson,
|
|
setAuthCookie,
|
|
upstreamConfigurationErrorResponse,
|
|
upstreamUnavailableResponse,
|
|
} from "@/lib/server/hermes";
|
|
import { assertSameOrigin } from "@/lib/server/request-guards";
|
|
|
|
type HermesLoginResponse = {
|
|
access_token: string;
|
|
expires_in: number;
|
|
user: {
|
|
id: number;
|
|
username: string;
|
|
email: string;
|
|
};
|
|
};
|
|
|
|
export async function POST(request: NextRequest) {
|
|
const originError = assertSameOrigin(request);
|
|
|
|
if (originError) {
|
|
return originError;
|
|
}
|
|
|
|
const credentials = await request.json();
|
|
const hermesUrl = getHermesUrl();
|
|
|
|
if (!hermesUrl) {
|
|
return upstreamConfigurationErrorResponse();
|
|
}
|
|
|
|
let hermesResponse: Response;
|
|
|
|
try {
|
|
hermesResponse = await fetch(`${hermesUrl}/auth/login`, {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
Accept: "application/json",
|
|
},
|
|
body: JSON.stringify(credentials),
|
|
cache: "no-store",
|
|
});
|
|
} catch {
|
|
return upstreamUnavailableResponse();
|
|
}
|
|
|
|
const data = await readJson(hermesResponse);
|
|
|
|
if (!hermesResponse.ok) {
|
|
return NextResponse.json(data, {
|
|
status: hermesResponse.status,
|
|
});
|
|
}
|
|
|
|
const loginData = data as HermesLoginResponse;
|
|
const response = NextResponse.json({
|
|
user: loginData.user,
|
|
});
|
|
|
|
setAuthCookie(response, loginData.access_token, loginData.expires_in);
|
|
|
|
return response;
|
|
}
|