From c38153eff14e909611771870bd26898c43a4e1fd Mon Sep 17 00:00:00 2001 From: dohyeons Date: Fri, 28 Nov 2025 17:24:18 +0900 Subject: [PATCH] =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20?= =?UTF-8?q?=EC=8B=9C=20vehicles=20=ED=85=8C=EC=9D=B4=EB=B8=94=20=EC=97=B0?= =?UTF-8?q?=EB=8F=99=20=EB=B0=8F=20=EC=B0=A8=EB=9F=89=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controllers/authController.ts | 7 +-- backend-node/src/services/authService.ts | 49 +++++++++++++++++-- frontend/components/auth/SignupForm.tsx | 20 ++++++++ frontend/hooks/useSignup.ts | 8 +++ frontend/types/auth.ts | 1 + 5 files changed, 78 insertions(+), 7 deletions(-) diff --git a/backend-node/src/controllers/authController.ts b/backend-node/src/controllers/authController.ts index 2d574cc7..4e557a20 100644 --- a/backend-node/src/controllers/authController.ts +++ b/backend-node/src/controllers/authController.ts @@ -387,14 +387,14 @@ export class AuthController { /** * POST /api/auth/signup - * 회원가입 API + * 회원가입 API (공차중계용) */ static async signup(req: Request, res: Response): Promise { try { - const { userId, password, userName, phoneNumber, licenseNumber, vehicleNumber } = req.body; + const { userId, password, userName, phoneNumber, licenseNumber, vehicleNumber, vehicleType } = req.body; logger.info(`=== 회원가입 API 호출 ===`); - logger.info(`userId: ${userId}`); + logger.info(`userId: ${userId}, vehicleNumber: ${vehicleNumber}, vehicleType: ${vehicleType}`); // 입력값 검증 if (!userId || !password || !userName || !phoneNumber || !licenseNumber || !vehicleNumber) { @@ -417,6 +417,7 @@ export class AuthController { phoneNumber, licenseNumber, vehicleNumber, + vehicleType, // 차량 타입 추가 }); if (signupResult.success) { diff --git a/backend-node/src/services/authService.ts b/backend-node/src/services/authService.ts index 1bf4dd40..3d85fe88 100644 --- a/backend-node/src/services/authService.ts +++ b/backend-node/src/services/authService.ts @@ -345,6 +345,8 @@ export class AuthService { /** * 회원가입 처리 + * - user_info 테이블에 사용자 정보 저장 + * - vehicles 테이블에 차량 정보 저장 (공차중계용) */ static async signupUser(data: { userId: string; @@ -353,9 +355,10 @@ export class AuthService { phoneNumber: string; licenseNumber: string; vehicleNumber: string; + vehicleType?: string; }): Promise<{ success: boolean; message?: string }> { try { - const { userId, password, userName, phoneNumber, licenseNumber, vehicleNumber } = data; + const { userId, password, userName, phoneNumber, licenseNumber, vehicleNumber, vehicleType } = data; // 1. 중복 사용자 확인 const existingUser = await query( @@ -370,11 +373,24 @@ export class AuthService { }; } - // 2. 비밀번호 암호화 + // 2. 중복 차량번호 확인 + const existingVehicle = await query( + `SELECT vehicle_number FROM vehicles WHERE vehicle_number = $1`, + [vehicleNumber] + ); + + if (existingVehicle.length > 0) { + return { + success: false, + message: "이미 등록된 차량번호입니다.", + }; + } + + // 3. 비밀번호 암호화 const bcrypt = require("bcryptjs"); const hashedPassword = await bcrypt.hash(password, 10); - // 3. 사용자 정보 저장 + // 4. 사용자 정보 저장 (user_info) await query( `INSERT INTO user_info ( user_id, @@ -401,7 +417,32 @@ export class AuthService { ] ); - logger.info(`회원가입 성공: ${userId}`); + // 5. 차량 정보 저장 (vehicles) - 공차중계용 + // status = 'off': 앱 미사용/로그아웃 상태 + await query( + `INSERT INTO vehicles ( + vehicle_number, + vehicle_type, + driver_name, + driver_phone, + status, + company_code, + user_id, + created_at, + updated_at + ) VALUES ($1, $2, $3, $4, $5, $6, $7, NOW(), NOW())`, + [ + vehicleNumber, + vehicleType || null, + userName, + phoneNumber, + "off", // 초기 상태: off (앱 미사용) + "*", // 기본 회사 코드 + userId, // 사용자 ID 연결 + ] + ); + + logger.info(`회원가입 성공: ${userId}, 차량번호: ${vehicleNumber}`); return { success: true, diff --git a/frontend/components/auth/SignupForm.tsx b/frontend/components/auth/SignupForm.tsx index 7ed5e846..856436bf 100644 --- a/frontend/components/auth/SignupForm.tsx +++ b/frontend/components/auth/SignupForm.tsx @@ -209,6 +209,26 @@ export function SignupForm({ )} + {/* 차량 타입 */} +
+ + + {touchedFields?.vehicleType && validationErrors.vehicleType && ( +

{validationErrors.vehicleType}

+ )} +
+ {/* 회원가입 버튼 */}