53 lines
1.5 KiB
TypeScript
53 lines
1.5 KiB
TypeScript
import { z } from 'astro:schema';
|
|
import { db } from '@db/database.ts';
|
|
import { externalApi } from '../_api.ts';
|
|
|
|
export const POST = externalApi({
|
|
auth: true,
|
|
input: z.object({
|
|
firstname: z.string().trim(),
|
|
lastname: z.string().trim(),
|
|
birthday: z.string().date(),
|
|
phone: z.string().trim().nullable(),
|
|
username: z.string().trim(),
|
|
uuid: z.string(),
|
|
edition: z.enum(['java', 'bedrock']),
|
|
code: z.string().nullish()
|
|
}),
|
|
handler: async ({ input }) => {
|
|
if (input.code) {
|
|
const directSignup = await db.getDirectSignupByCode({ code: input.code });
|
|
|
|
// check if direct signup code exists
|
|
if (!directSignup) return new Response(null, { status: 404 });
|
|
// check if direct signup code was already used
|
|
else if (directSignup.user) return new Response(null, { status: 409 });
|
|
}
|
|
|
|
const existing = await db.existsUser({
|
|
username: input.username,
|
|
uuid: input.uuid
|
|
});
|
|
// check if user is already registered
|
|
if (existing) return new Response(null, { status: 409 });
|
|
|
|
await db.transaction(async (tx) => {
|
|
const user = await tx.addUser({
|
|
firstname: input.firstname,
|
|
lastname: input.lastname,
|
|
birthday: input.birthday,
|
|
telephone: input.phone,
|
|
username: input.username,
|
|
edition: input.edition,
|
|
uuid: input.uuid
|
|
});
|
|
|
|
if (input.code) {
|
|
await tx.setDirectSignupUser({ code: input.code, userId: user.id });
|
|
}
|
|
});
|
|
|
|
return new Response(null, { status: 201 });
|
|
}
|
|
});
|