회원가입 시 vehicles 테이블 연동 및 차량 타입 필드 추가

This commit is contained in:
dohyeons 2025-11-28 17:24:18 +09:00
parent 0c897ad8fd
commit c38153eff1
5 changed files with 78 additions and 7 deletions

View File

@ -387,14 +387,14 @@ export class AuthController {
/**
* POST /api/auth/signup
* API
* API ()
*/
static async signup(req: Request, res: Response): Promise<void> {
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) {

View File

@ -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<any>(
@ -370,11 +373,24 @@ export class AuthService {
};
}
// 2. 비밀번호 암호화
// 2. 중복 차량번호 확인
const existingVehicle = await query<any>(
`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,

View File

@ -209,6 +209,26 @@ export function SignupForm({
)}
</div>
{/* 차량 타입 */}
<div className="space-y-2">
<Label htmlFor="vehicleType"> *</Label>
<Input
id="vehicleType"
name="vehicleType"
type="text"
placeholder="예: 1톤, 5톤, 11톤, 25톤"
value={formData.vehicleType}
onChange={onInputChange}
onBlur={onBlur}
disabled={isLoading}
className="h-11"
required
/>
{touchedFields?.vehicleType && validationErrors.vehicleType && (
<p className="text-destructive text-xs">{validationErrors.vehicleType}</p>
)}
</div>
{/* 회원가입 버튼 */}
<Button
type="submit"

View File

@ -32,6 +32,13 @@ const validators = {
return null;
},
// 차량 타입: 필수 입력
vehicleType: (value: string): string | null => {
if (!value) return "차량 타입을 입력해주세요";
if (value.length < 2) return "차량 타입은 2자 이상이어야 합니다";
return null;
},
// 아이디: 4자 이상
userId: (value: string): string | null => {
if (!value) return "아이디를 입력해주세요";
@ -79,6 +86,7 @@ export function useSignup() {
phoneNumber: "",
licenseNumber: "",
vehicleNumber: "",
vehicleType: "",
});
const [validationErrors, setValidationErrors] = useState<Record<string, string>>({});

View File

@ -15,6 +15,7 @@ export interface SignupFormData {
phoneNumber: string;
licenseNumber: string;
vehicleNumber: string;
vehicleType: string; // 차량 타입 (예: 1톤, 5톤, 11톤)
}
export interface LoginResponse {