회원가입 시 vehicles 테이블 연동 및 차량 타입 필드 추가
This commit is contained in:
parent
0c897ad8fd
commit
c38153eff1
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>>({});
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ export interface SignupFormData {
|
|||
phoneNumber: string;
|
||||
licenseNumber: string;
|
||||
vehicleNumber: string;
|
||||
vehicleType: string; // 차량 타입 (예: 1톤, 5톤, 11톤)
|
||||
}
|
||||
|
||||
export interface LoginResponse {
|
||||
|
|
|
|||
Loading…
Reference in New Issue