Feat: Update user validation schema to include username/email check

The validation schema will throw an error if the username or email is already found in the database.
This commit is contained in:
Aaron William Po
2023-05-11 22:21:49 -04:00
parent 2eb2626d54
commit 9574bbaeb9
9 changed files with 226 additions and 59 deletions

View File

@@ -0,0 +1,43 @@
import NextConnectOptions from '@/config/nextConnect/NextConnectOptions';
import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema';
import { NextApiRequest, NextApiResponse } from 'next';
import { createRouter } from 'next-connect';
import { z } from 'zod';
import validateRequest from '@/config/nextConnect/middleware/validateRequest';
import findUserByEmail from '@/services/User/findUserByEmail';
const CheckEmailRequestQuerySchema = z.object({
email: z.string(),
});
interface CheckEmailRequestSchema extends NextApiRequest {
query: z.infer<typeof CheckEmailRequestQuerySchema>;
}
const router = createRouter<
CheckEmailRequestSchema,
NextApiResponse<z.infer<typeof APIResponseValidationSchema>>
>();
const checkEmail = async (req: NextApiRequest, res: NextApiResponse) => {
const { email: emailToCheck } = req.query;
const email = await findUserByEmail(emailToCheck as string);
res.json({
success: true,
payload: { emailIsTaken: !!email },
statusCode: 200,
message: 'Getting username availability.',
});
};
router.get(
validateRequest({ querySchema: z.object({ email: z.string().email() }) }),
checkEmail,
);
const handler = router.handler(NextConnectOptions);
export default handler;

View File

@@ -0,0 +1,43 @@
import NextConnectOptions from '@/config/nextConnect/NextConnectOptions';
import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema';
import { NextApiRequest, NextApiResponse } from 'next';
import { createRouter } from 'next-connect';
import { z } from 'zod';
import validateRequest from '@/config/nextConnect/middleware/validateRequest';
import findUserByUsername from '@/services/User/findUserByUsername';
const CheckUsernameRequestQuerySchema = z.object({
username: z.string(),
});
interface CheckUsernameRequestSchema extends NextApiRequest {
query: z.infer<typeof CheckUsernameRequestQuerySchema>;
}
const router = createRouter<
CheckUsernameRequestSchema,
NextApiResponse<z.infer<typeof APIResponseValidationSchema>>
>();
const checkUsername = async (req: NextApiRequest, res: NextApiResponse) => {
const { username: usernameToCheck } = req.query;
const user = await findUserByUsername(usernameToCheck as string);
res.json({
success: true,
payload: { usernameIsTaken: !!user },
statusCode: 200,
message: 'Getting username availability.',
});
};
router.get(
validateRequest({ querySchema: z.object({ username: z.string() }) }),
checkUsername,
);
const handler = router.handler(NextConnectOptions);
export default handler;