50 lines
2.2 KiB
TypeScript
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`)
|