diff --git a/src/app/api/register/route.ts b/src/app/api/register/route.ts index e5a3207..3248cfc 100644 --- a/src/app/api/register/route.ts +++ b/src/app/api/register/route.ts @@ -1,8 +1,8 @@ import BaseError from "@/core/error/BaseError"; import applicationJsonOnly from "@/core/utils/applicationJsonOnly"; import handleCatchApi from "@/core/utils/handleCatchApi"; +import nonAdminRegisterAction from "@/modules/auth/actions/nonAdminRegisterAction"; import { createUserSchema } from "@/modules/auth/formSchemas/CreateUserFormSchema"; -import createUser from "@/modules/auth/services/createUser"; import mapObjectToFirstValue from "@/utils/mapObjectToFirstValue"; import { NextRequest, NextResponse } from "next/server"; @@ -24,11 +24,10 @@ export async function POST(request: NextRequest) { }); } - const result = await createUser({ + const result = await nonAdminRegisterAction({ email: data.data.email, name: data.data.name, password: data.data.password, - passwordConfirmation: data.data.passwordConfirmation ?? "", }); return NextResponse.json(result); diff --git a/src/modules/auth/actions/nonAdminRegisterAction.ts b/src/modules/auth/actions/nonAdminRegisterAction.ts new file mode 100644 index 0000000..df7d0a2 --- /dev/null +++ b/src/modules/auth/actions/nonAdminRegisterAction.ts @@ -0,0 +1,27 @@ +"use server"; +import { cookies } from "next/headers"; +import { redirect } from "next/navigation"; +import ServerResponseAction from "@/modules/dashboard/types/ServerResponseAction"; +import handleCatch from "@/modules/dashboard/utils/handleCatch"; +import nonAdminRegisterFormType from "../types/NonAdminRegisterFormType"; +import nonAdminRegister from "../services/nonAdminRegister"; + +/** + * Creates a new user in the system. + * + * @param formData - The form data containing user details. + * @returns An object indicating the result of the operation. + */ +export default async function nonAdminRegisterAction( + formData: nonAdminRegisterFormType +): Promise { + //TODO: Add Throttling + + try { + const result = await nonAdminRegister(formData); + cookies().set("token", result.token); + redirect("/dashboard"); + } catch (e) { + return handleCatch(e); + } +} diff --git a/src/modules/auth/services/getMyDetail.ts b/src/modules/auth/services/getMyDetail.ts index 4b3b9d0..b13edb1 100644 --- a/src/modules/auth/services/getMyDetail.ts +++ b/src/modules/auth/services/getMyDetail.ts @@ -1,4 +1,3 @@ -import { cookies } from "next/headers"; import getUserFromToken from "../utils/getUserFromToken"; import AuthError from "../error/AuthError"; diff --git a/src/modules/auth/services/nonAdminRegister.ts b/src/modules/auth/services/nonAdminRegister.ts new file mode 100644 index 0000000..dd07164 --- /dev/null +++ b/src/modules/auth/services/nonAdminRegister.ts @@ -0,0 +1,38 @@ +import unauthorized from "@/modules/dashboard/utils/unauthorized"; +import checkPermission from "../utils/checkPermission"; +import nonAdminRegisterFormType from "../types/NonAdminRegisterFormType"; +import db from "@/core/db"; +import AuthError from "../error/AuthError"; +import hashPassword from "../utils/hashPassword"; +import "server-only"; +import { createJwtToken } from "../utils/createJwtToken"; + +export default async function nonAdminRegister(data: nonAdminRegisterFormType) { + if (!(await checkPermission("guest-only"))) unauthorized(); + + const existingUser = await db.user.findFirst({ + where: { + email: data.email, + }, + }); + + if (existingUser) + throw new AuthError({ + errorCode: "USER_ALREADY_EXISTS", + message: + 'This email has been registered before. If you forgot your password, you can click "Forgot Password"', + statusCode: 401, + }); + + const user = await db.user.create({ + data: { + email: data.email, + name: data.name, + passwordHash: await hashPassword(data.password), + }, + }); + + const token = createJwtToken({id: user.id}) + + return {user, token }; +} diff --git a/src/modules/auth/types/NonAdminRegisterFormType.d.ts b/src/modules/auth/types/NonAdminRegisterFormType.d.ts new file mode 100644 index 0000000..06e9230 --- /dev/null +++ b/src/modules/auth/types/NonAdminRegisterFormType.d.ts @@ -0,0 +1,5 @@ +export default interface nonAdminRegisterFormType { + name: string, + email: string, + password: string, +} \ No newline at end of file