refactor: worker_id 잔재 제거 - user_id 기반으로 완전 전환
- workerModel: remove()를 user_id 기반 cascading delete로 전환 - workerController: 계정 생성/해제를 workers.user_id 연결 방식으로 변경 - userController: JOIN 방향 전환 (u.worker_id→w.worker_id 에서 w.user_id→u.user_id) - authController, systemController, authRoutes: 모든 CRUD에서 worker_id 참조 제거 - DB: UNIQUE KEY 5개 교체, FK 7개 삭제, daily_worker_summary user_id 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -28,7 +28,7 @@ exports.createWorker = asyncHandler(async (req, res) => {
|
||||
|
||||
const lastID = await workerModel.create(workerData);
|
||||
|
||||
// 계정 생성 요청이 있으면 users 테이블에 계정 생성
|
||||
// 계정 생성 요청이 있으면 users 테이블에 계정 생성 + workers.user_id 연결
|
||||
if (createAccount && workerData.worker_name) {
|
||||
try {
|
||||
const db = await getDb();
|
||||
@@ -39,13 +39,17 @@ exports.createWorker = asyncHandler(async (req, res) => {
|
||||
const [userRole] = await db.query('SELECT id FROM roles WHERE name = ?', ['User']);
|
||||
|
||||
if (userRole && userRole.length > 0) {
|
||||
await db.query(
|
||||
`INSERT INTO users (username, password, name, worker_id, role_id, created_at, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?, NOW(), NOW())`,
|
||||
[username, hashedPassword, workerData.worker_name, lastID, userRole[0].id]
|
||||
const [insertResult] = await db.query(
|
||||
`INSERT INTO users (username, password, name, role_id, created_at, updated_at)
|
||||
VALUES (?, ?, ?, ?, NOW(), NOW())`,
|
||||
[username, hashedPassword, workerData.worker_name, userRole[0].id]
|
||||
);
|
||||
|
||||
logger.info('작업자 계정 자동 생성 성공', { worker_id: lastID, username });
|
||||
// workers.user_id 연결
|
||||
const newUserId = insertResult.insertId;
|
||||
await db.query('UPDATE workers SET user_id = ? WHERE worker_id = ?', [newUserId, lastID]);
|
||||
|
||||
logger.info('작업자 계정 자동 생성 성공', { worker_id: lastID, user_id: newUserId, username });
|
||||
}
|
||||
} catch (accountError) {
|
||||
logger.error('계정 생성 실패 (작업자는 생성됨)', { worker_id: lastID, error: accountError.message });
|
||||
@@ -109,7 +113,7 @@ exports.getWorkerById = asyncHandler(async (req, res) => {
|
||||
throw new ValidationError('유효하지 않은 작업자 ID입니다');
|
||||
}
|
||||
|
||||
const row = await workerModel.getById(id);
|
||||
const row = await workerModel.getByUserId(id);
|
||||
|
||||
if (!row) {
|
||||
throw new NotFoundError('작업자를 찾을 수 없습니다');
|
||||
@@ -132,18 +136,18 @@ exports.updateWorker = asyncHandler(async (req, res) => {
|
||||
throw new ValidationError('유효하지 않은 작업자 ID입니다');
|
||||
}
|
||||
|
||||
const workerData = { ...req.body, worker_id: id };
|
||||
const workerData = { ...req.body, user_id: id };
|
||||
const createAccount = req.body.create_account;
|
||||
|
||||
console.log('🔧 작업자 수정 요청:', {
|
||||
worker_id: id,
|
||||
user_id: id,
|
||||
받은데이터: req.body,
|
||||
처리할데이터: workerData,
|
||||
create_account: createAccount
|
||||
});
|
||||
|
||||
// 먼저 현재 작업자 정보 조회 (계정 여부 확인용)
|
||||
const currentWorker = await workerModel.getById(id);
|
||||
// 먼저 현재 작업자 정보 조회 (계정 여부 확인용, user_id 기준)
|
||||
const currentWorker = await workerModel.getByUserId(id);
|
||||
|
||||
if (!currentWorker) {
|
||||
throw new NotFoundError('작업자를 찾을 수 없습니다');
|
||||
@@ -158,61 +162,43 @@ exports.updateWorker = asyncHandler(async (req, res) => {
|
||||
let accountAction = null;
|
||||
let accountUsername = null;
|
||||
|
||||
console.log('🔍 계정 생성 체크:', {
|
||||
createAccount,
|
||||
hasAccount,
|
||||
currentWorker_user_id: currentWorker.user_id,
|
||||
worker_name: workerData.worker_name
|
||||
});
|
||||
|
||||
if (createAccount && !hasAccount && workerData.worker_name) {
|
||||
// 계정 생성
|
||||
console.log('✅ 계정 생성 로직 시작');
|
||||
try {
|
||||
console.log('🔑 사용자명 생성 중...');
|
||||
const username = await generateUniqueUsername(workerData.worker_name, db);
|
||||
console.log('🔑 생성된 사용자명:', username);
|
||||
|
||||
const hashedPassword = await bcrypt.hash('1234', 10);
|
||||
console.log('🔒 비밀번호 해싱 완료');
|
||||
|
||||
// User 역할 조회
|
||||
console.log('👤 User 역할 조회 중...');
|
||||
const [userRole] = await db.query('SELECT id FROM roles WHERE name = ?', ['User']);
|
||||
console.log('👤 User 역할 조회 결과:', userRole);
|
||||
|
||||
if (userRole && userRole.length > 0) {
|
||||
console.log('💾 계정 DB 삽입 시작...');
|
||||
await db.query(
|
||||
`INSERT INTO users (username, password, name, worker_id, role_id, created_at, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?, NOW(), NOW())`,
|
||||
[username, hashedPassword, workerData.worker_name, id, userRole[0].id]
|
||||
const [insertResult] = await db.query(
|
||||
`INSERT INTO users (username, password, name, role_id, created_at, updated_at)
|
||||
VALUES (?, ?, ?, ?, NOW(), NOW())`,
|
||||
[username, hashedPassword, workerData.worker_name, userRole[0].id]
|
||||
);
|
||||
console.log('✅ 계정 DB 삽입 완료');
|
||||
|
||||
// workers.user_id 연결
|
||||
const newUserId = insertResult.insertId;
|
||||
await db.query('UPDATE workers SET user_id = ? WHERE user_id = ?', [newUserId, id]);
|
||||
|
||||
accountAction = 'created';
|
||||
accountUsername = username;
|
||||
logger.info('작업자 계정 생성 성공', { worker_id: id, username });
|
||||
} else {
|
||||
console.log('❌ User 역할을 찾을 수 없음');
|
||||
logger.info('작업자 계정 생성 성공', { user_id: id, new_user_id: newUserId, username });
|
||||
}
|
||||
} catch (accountError) {
|
||||
console.error('❌ 계정 생성 오류:', accountError);
|
||||
logger.error('계정 생성 실패', { worker_id: id, error: accountError.message });
|
||||
logger.error('계정 생성 실패', { user_id: id, error: accountError.message });
|
||||
accountAction = 'failed';
|
||||
}
|
||||
} else {
|
||||
console.log('⏭️ 계정 생성 조건 불만족:', { createAccount, hasAccount, hasWorkerName: !!workerData.worker_name });
|
||||
}
|
||||
|
||||
if (!createAccount && hasAccount) {
|
||||
// 계정 연동 해제 (users.worker_id = NULL)
|
||||
// 계정 연동 해제 (workers.user_id = NULL)
|
||||
try {
|
||||
await db.query('UPDATE users SET worker_id = NULL WHERE worker_id = ?', [id]);
|
||||
await db.query('UPDATE workers SET user_id = NULL WHERE user_id = ?', [id]);
|
||||
accountAction = 'unlinked';
|
||||
logger.info('작업자 계정 연동 해제 성공', { worker_id: id });
|
||||
logger.info('작업자 계정 연동 해제 성공', { user_id: id });
|
||||
} catch (unlinkError) {
|
||||
logger.error('계정 연동 해제 실패', { worker_id: id, error: unlinkError.message });
|
||||
logger.error('계정 연동 해제 실패', { user_id: id, error: unlinkError.message });
|
||||
accountAction = 'unlink_failed';
|
||||
}
|
||||
} else if (createAccount && hasAccount) {
|
||||
@@ -220,10 +206,10 @@ exports.updateWorker = asyncHandler(async (req, res) => {
|
||||
}
|
||||
|
||||
// 작업자 관련 캐시 무효화
|
||||
logger.info('작업자 수정 후 캐시 무효화', { worker_id: id });
|
||||
logger.info('작업자 수정 후 캐시 무효화', { user_id: id });
|
||||
await cache.invalidateCache.worker();
|
||||
|
||||
logger.info('작업자 수정 성공', { worker_id: id });
|
||||
logger.info('작업자 수정 성공', { user_id: id });
|
||||
|
||||
// 응답 메시지 구성
|
||||
let message = '작업자 정보가 성공적으로 수정되었습니다';
|
||||
@@ -265,11 +251,11 @@ exports.removeWorker = asyncHandler(async (req, res) => {
|
||||
}
|
||||
|
||||
// 작업자 관련 캐시 무효화
|
||||
logger.info('작업자 삭제 후 캐시 무효화 시작', { worker_id: id });
|
||||
logger.info('작업자 삭제 후 캐시 무효화 시작', { user_id: id });
|
||||
await cache.invalidateCache.worker();
|
||||
await cache.delPattern('workers:*');
|
||||
await cache.flush();
|
||||
logger.info('작업자 삭제 후 캐시 무효화 완료', { worker_id: id });
|
||||
logger.info('작업자 삭제 후 캐시 무효화 완료', { user_id: id });
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
|
||||
Reference in New Issue
Block a user