Skip to content

Commit 3ce9ac7

Browse files
authored
Add validation for registration details on user service (#79)
1 parent ccd3d92 commit 3ce9ac7

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed

services/user/src/controller/user-controller.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@ import {
1414
import { Request, Response } from 'express';
1515
import { User } from '../model/user-model';
1616
import { handleBadRequest, handleConflict, handleInternalError, handleNotFound, handleSuccess } from '../utils/helper';
17+
import { userSchema, UserValidationErrors } from '../types/custom';
1718

1819
export async function createUser(req: Request, res: Response) {
1920
try {
20-
const { username, email, password } = req.body;
21-
if (username && email && password) {
21+
const parseResult = userSchema.safeParse(req.body);
22+
23+
if (parseResult.success) {
24+
const { username, email, password } = req.body;
2225
const existingUser = await _findUserByUsernameOrEmail(username, email);
2326
if (existingUser) {
2427
handleConflict(res, 'username or email already exists');
@@ -29,7 +32,13 @@ export async function createUser(req: Request, res: Response) {
2932
const createdUser = await _createUser(username, email, hashedPassword);
3033
handleSuccess(res, 201, `Created new user ${username} successfully`, formatUserResponse(createdUser));
3134
} else {
32-
handleBadRequest(res, 'username and/or email and/or password are missing');
35+
const required_errors = parseResult.error.errors.filter(
36+
err => err.message == UserValidationErrors.REQUIRED,
37+
);
38+
if (required_errors.length > 0) {
39+
handleBadRequest(res, 'username and/or email and/or password are missing');
40+
}
41+
handleBadRequest(res, 'invalid username and/or email and/or password');
3342
}
3443
} catch (err) {
3544
console.error(err);

services/user/src/types/custom.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,38 @@
11
import { Types } from 'mongoose';
2+
import { z } from 'zod';
3+
4+
export enum UserValidationErrors {
5+
REQUIRED = 'REQUIRED',
6+
INVALID = 'INVALID',
7+
}
28

39
export interface RequestUser {
410
id: Types.ObjectId | string;
511
username: string;
612
email: string;
713
isAdmin: boolean;
814
}
15+
16+
export const userSchema = z.object({
17+
username: z
18+
.string({
19+
invalid_type_error: UserValidationErrors.INVALID,
20+
required_error: UserValidationErrors.REQUIRED,
21+
})
22+
.regex(/^[a-zA-Z0-9._-]+$/, UserValidationErrors.INVALID),
23+
email: z
24+
.string({
25+
invalid_type_error: UserValidationErrors.INVALID,
26+
required_error: UserValidationErrors.REQUIRED,
27+
})
28+
.email(UserValidationErrors.INVALID),
29+
password: z
30+
.string({
31+
invalid_type_error: UserValidationErrors.INVALID,
32+
required_error: UserValidationErrors.REQUIRED,
33+
})
34+
.regex(
35+
/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.{8,})(?=.*[!"#$%&'()*+,-.:;<=>?@\\/\\[\]^_`{|}~])/,
36+
UserValidationErrors.INVALID,
37+
),
38+
});

0 commit comments

Comments
 (0)