Some checks failed
Docker Deploy / build-and-push (push) Has been cancelled
58 lines
1.4 KiB
TypeScript
58 lines
1.4 KiB
TypeScript
import type { APIRoute } from "astro";
|
|
import { db } from "../../../../db";
|
|
import { apiTokens } from "../../../../db/schema";
|
|
import { generateApiToken, hashToken } from "../../../../lib/api-auth";
|
|
|
|
export const POST: APIRoute = async ({ request, locals }) => {
|
|
const user = locals.user;
|
|
if (!user) {
|
|
return new Response(JSON.stringify({ error: "Unauthorized" }), {
|
|
status: 401,
|
|
headers: { "Content-Type": "application/json" },
|
|
});
|
|
}
|
|
|
|
let name: string | undefined;
|
|
|
|
const contentType = request.headers.get("content-type");
|
|
if (contentType?.includes("application/json")) {
|
|
const body = await request.json();
|
|
name = body.name;
|
|
} else {
|
|
const formData = await request.formData();
|
|
name = formData.get("name")?.toString();
|
|
}
|
|
|
|
if (!name) {
|
|
return new Response(JSON.stringify({ error: "Name is required" }), {
|
|
status: 400,
|
|
headers: { "Content-Type": "application/json" },
|
|
});
|
|
}
|
|
|
|
const rawToken = generateApiToken();
|
|
const hashedToken = hashToken(rawToken);
|
|
|
|
const [newToken] = await db
|
|
.insert(apiTokens)
|
|
.values({
|
|
userId: user.id,
|
|
name,
|
|
token: hashedToken,
|
|
})
|
|
.returning();
|
|
|
|
return new Response(
|
|
JSON.stringify({
|
|
...newToken,
|
|
token: rawToken,
|
|
}),
|
|
{
|
|
status: 201,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
},
|
|
);
|
|
};
|