Skip to content

Commit

Permalink
refactor: Refactor user command module and add form validation
Browse files Browse the repository at this point in the history
  • Loading branch information
seonghunYang committed Mar 19, 2024
1 parent 9c49969 commit 397f150
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 37 deletions.
38 changes: 1 addition & 37 deletions app/business/user/user.command.ts
Original file line number Diff line number Diff line change
@@ -1,47 +1,11 @@
'use server';

import { FormState } from '@/app/ui/view/molecule/form/form-root';
import { z } from 'zod';
import { API_PATH } from '../api-path';
import { SignUpRequestBody } from './user.type';
import { httpErrorHandler } from '@/app/utils/http/http-error-handler';
import { BadRequestError } from '@/app/utils/http/http-error';
import { redirect } from 'next/navigation';

const SignUpFormSchema = z
.object({
authId: z
.string()
.min(6, {
message: '아이디는 6자 이상 20자 이하여야 합니다.',
})
.max(20, {
message: 'User ID must be at most 20 characters',
}),
password: z
.string()
.min(8, { message: '비밀번호는 8자 이상이어야 합니다.' })
.regex(/^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,}$/, {
message: '비밀번호는 문자, 숫자, 특수문자(!@#$%^&*)를 포함해야 합니다.',
})
.max(20, { message: '비밀번호는 20자 이하여야 합니다.' }),
confirmPassword: z.string(),
studentNumber: z.string().length(8, { message: '학번은 8자리여야 합니다.' }).startsWith('60', {
message: '학번은 60으로 시작해야 합니다.',
}),
engLv: z.enum(['basic', 'ENG12', 'ENG34', 'bypass'], {
invalid_type_error: '올바른 영어 레벨을 선택해주세요.',
}),
})
.superRefine(({ confirmPassword, password }, ctx) => {
if (confirmPassword !== password) {
ctx.addIssue({
code: 'custom',
message: '비밀번호가 일치하지 않습니다.',
path: ['confirmPassword'],
});
}
});
import { SignUpFormSchema } from './user.validation';

export async function createUser(prevState: FormState, formData: FormData): Promise<FormState> {
const validatedFields = SignUpFormSchema.safeParse({
Expand Down
36 changes: 36 additions & 0 deletions app/business/user/user.validation.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { z } from 'zod';

export const SignUpFormSchema = z
.object({
authId: z
.string()
.min(6, {
message: '아이디는 6자 이상 20자 이하여야 합니다.',
})
.max(20, {
message: 'User ID must be at most 20 characters',
}),
password: z
.string()
.min(8, { message: '비밀번호는 8자 이상이어야 합니다.' })
.regex(/^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,}$/, {
message: '비밀번호는 문자, 숫자, 특수문자(!@#$%^&*)를 포함해야 합니다.',
})
.max(20, { message: '비밀번호는 20자 이하여야 합니다.' }),
confirmPassword: z.string(),
studentNumber: z.string().length(8, { message: '학번은 8자리여야 합니다.' }).startsWith('60', {
message: '학번은 60으로 시작해야 합니다.',
}),
engLv: z.enum(['basic', 'ENG12', 'ENG34', 'bypass'], {
invalid_type_error: '올바른 영어 레벨을 선택해주세요.',
}),
})
.superRefine(({ confirmPassword, password }, ctx) => {
if (confirmPassword !== password) {
ctx.addIssue({
code: 'custom',
message: '비밀번호가 일치하지 않습니다.',
path: ['confirmPassword'],
});
}
});

0 comments on commit 397f150

Please sign in to comment.