import { API, getAuthHeaders, ensureAuthenticated } from '/js/api-config.js'; // 인증 확인 const token = ensureAuthenticated(); const accessLabels = { worker: '작업자', group_leader: '그룹장', support_team: '지원팀', admin: '관리자', system: '시스템' }; // 현재 사용자 정보 가져오기 const currentUser = JSON.parse(localStorage.getItem('user') || '{}'); const isSystemUser = currentUser.access_level === 'system'; function createRow(item, cols, delHandler) { const tr = document.createElement('tr'); cols.forEach(key => { const td = document.createElement('td'); td.textContent = item[key] || '-'; tr.appendChild(td); }); const delBtn = document.createElement('button'); delBtn.textContent = '삭제'; delBtn.className = 'btn-delete'; delBtn.onclick = () => delHandler(item); const td = document.createElement('td'); td.appendChild(delBtn); tr.appendChild(td); return tr; } // 내 비밀번호 변경 const myPasswordForm = document.getElementById('myPasswordForm'); myPasswordForm?.addEventListener('submit', async e => { e.preventDefault(); const currentPassword = document.getElementById('currentPassword').value; const newPassword = document.getElementById('newPassword').value; const confirmPassword = document.getElementById('confirmPassword').value; // 새 비밀번호 확인 if (newPassword !== confirmPassword) { alert('❌ 새 비밀번호가 일치하지 않습니다.'); return; } // 비밀번호 강도 검사 if (newPassword.length < 6) { alert('❌ 비밀번호는 최소 6자 이상이어야 합니다.'); return; } try { const res = await fetch(`${API}/auth/change-password`, { method: 'POST', headers: getAuthHeaders(), body: JSON.stringify({ currentPassword, newPassword }) }); const result = await res.json(); if (res.ok && result.success) { showToast('✅ 비밀번호가 변경되었습니다.'); myPasswordForm.reset(); // 3초 후 로그인 페이지로 이동 setTimeout(() => { alert('비밀번호가 변경되어 다시 로그인해주세요.'); localStorage.removeItem('token'); localStorage.removeItem('user'); window.location.href = '/index.html'; }, 2000); } else { alert('❌ 비밀번호 변경 실패: ' + (result.error || '현재 비밀번호가 올바르지 않습니다.')); } } catch (error) { console.error('Password change error:', error); alert('🚨 서버 오류: ' + error.message); } }); // 시스템 권한자만 볼 수 있는 사용자 비밀번호 변경 섹션 if (isSystemUser) { const systemCard = document.getElementById('systemPasswordChangeCard'); if (systemCard) { systemCard.style.display = 'block'; } // 사용자 비밀번호 변경 (시스템 권한자) const userPasswordForm = document.getElementById('userPasswordForm'); userPasswordForm?.addEventListener('submit', async e => { e.preventDefault(); const targetUserId = document.getElementById('targetUserId').value; const newPassword = document.getElementById('targetNewPassword').value; if (!targetUserId) { alert('❌ 사용자를 선택해주세요.'); return; } if (newPassword.length < 6) { alert('❌ 비밀번호는 최소 6자 이상이어야 합니다.'); return; } if (!confirm('정말로 이 사용자의 비밀번호를 변경하시겠습니까?')) { return; } try { const res = await fetch(`${API}/auth/admin/change-password`, { method: 'POST', headers: getAuthHeaders(), body: JSON.stringify({ userId: targetUserId, newPassword }) }); const result = await res.json(); if (res.ok && result.success) { showToast('✅ 사용자 비밀번호가 변경되었습니다.'); userPasswordForm.reset(); } else { alert('❌ 비밀번호 변경 실패: ' + (result.error || '권한이 없습니다.')); } } catch (error) { console.error('Admin password change error:', error); alert('🚨 서버 오류: ' + error.message); } }); } // 사용자 등록 const userForm = document.getElementById('userForm'); userForm?.addEventListener('submit', async e => { e.preventDefault(); const body = { username: document.getElementById('username').value.trim(), password: document.getElementById('password').value.trim(), name: document.getElementById('name').value.trim(), access_level: document.getElementById('access_level').value, worker_id: document.getElementById('worker_id').value || null }; try { const res = await fetch(`${API}/auth/register`, { method: 'POST', headers: getAuthHeaders(), body: JSON.stringify(body) }); const result = await res.json(); if (res.ok && result.success) { showToast('✅ 등록 완료'); userForm.reset(); loadUsers(); } else { alert('❌ 실패: ' + (result.error || '알 수 없는 오류')); } } catch (error) { console.error('Registration error:', error); alert('🚨 서버 오류: ' + error.message); } }); async function loadUsers() { const tbody = document.getElementById('userTableBody'); tbody.innerHTML = '