guardia-hrm/frontend/src/api/client.ts

50 lines
2.2 KiB
TypeScript

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`)