import axios from 'axios' const api = axios.create({ baseURL: '/api/hrm' }) api.interceptors.request.use(cfg => { const token = localStorage.getItem('hrm_token') if (token) cfg.headers.Authorization = `Bearer ${token}` return cfg }) api.interceptors.response.use( r => r, err => { if (err.response?.status === 401) { localStorage.removeItem('hrm_token') window.location.href = '/login' } return Promise.reject(err) } ) export default api // ── WISE AI (중앙 guardia-rag 프록시) ────────────────────────────────── // 별도 baseURL(/api/wise) — 공용 api(/api/hrm)와 경로가 다르므로 전용 인스턴스. // 인증 사용자 전용(로그인 JWT). 응답은 ApiResponse 봉투(r.data.data 에 rag 결과). const wiseApi = axios.create({ baseURL: '/api/wise' }) wiseApi.interceptors.request.use(cfg => { const token = localStorage.getItem('hrm_token') if (token) cfg.headers.Authorization = `Bearer ${token}` return cfg }) export const wiseAsk = (query: string) => wiseApi.post('/ask', { query }) // ── Auth / Me ───────────────────────────────────────────────────────── // client baseURL='/api/hrm' → 경로는 상대(/auth/...·/admin/...). export const getMe = () => api.get('/auth/me') // ── 2FA / OTP / 계정 보안 (마이페이지, access 토큰 필요) ──────────────── // 보안 불변: setup 응답(secret/qrImage)은 화면 표시용만 — 로그/저장 금지. export const otpSetup = () => api.post('/auth/otp/setup') export const otpConfirm = (code: string) => api.post('/auth/otp/confirm', { code }) export const otpDisable = () => api.post('/auth/otp/disable') export const changePassword = (currentPassword: string, newPassword: string) => api.post('/auth/change-password', { currentPassword, newPassword }) // ── Admin: OTP 초기화 (SUPERADMIN — /api/hrm/admin/users/** 게이트) ───── // 대상 사용자 OTP 해제(다음 로그인 시 OTP_SETUP 재등록). 시크릿 미조회. export const adminOtpReset = (id: number) => api.post(`/admin/users/${id}/otp-reset`)