62 lines
1.5 KiB
TypeScript
62 lines
1.5 KiB
TypeScript
"use server";
|
|
|
|
import * as ldap from "@/ldap";
|
|
import prisma from "@/prisma";
|
|
import { getUser } from "@/auth/auth";
|
|
import { getLogger } from "@/logger";
|
|
import { RegisterSchema, registerSchema } from "@/schemas";
|
|
import { ActionResponse } from ".";
|
|
|
|
const logger = getLogger("/actions/register");
|
|
|
|
export default async function register(
|
|
data: RegisterSchema
|
|
): Promise<ActionResponse> {
|
|
const user = await getUser();
|
|
|
|
if (user == null) {
|
|
return { ok: false, error: "invalidAuth" };
|
|
}
|
|
|
|
if (user.username != null) {
|
|
logger.info(
|
|
{ username: user.username, id: user.id },
|
|
`user tried to register twice`
|
|
);
|
|
return { ok: false, error: "invalidAuth" };
|
|
}
|
|
|
|
const { username, displayName, email, password, avatar } =
|
|
await registerSchema.parse(data);
|
|
let avatarBuf = null;
|
|
if (avatar != null) {
|
|
const parts = avatar.split(",");
|
|
const data = parts.length === 2 ? parts[1] : parts[0];
|
|
avatarBuf = Buffer.from(data, "base64");
|
|
}
|
|
|
|
const users = await ldap.getUsers();
|
|
for (const user of users) {
|
|
if (user.id.toLowerCase() === username.toLowerCase()) {
|
|
return {
|
|
ok: false,
|
|
error: "usernameTaken"
|
|
};
|
|
}
|
|
}
|
|
|
|
await ldap.createUser(username, displayName, email, avatarBuf ?? undefined);
|
|
await ldap.setPassword(username, password);
|
|
|
|
const outputUser = await prisma.user.update({
|
|
where: {
|
|
id: user.id
|
|
},
|
|
data: {
|
|
username
|
|
}
|
|
});
|
|
|
|
logger.info(outputUser, "registered user");
|
|
return { ok: true };
|
|
}
|