Files
TK-FB-Project/web-ui/js/api-helper.js

86 lines
2.0 KiB
JavaScript

// /public/js/api-helper.js
// API 기본 URL 설정
const API_BASE = location.hostname.includes('localhost')
? 'http://localhost:3005/api'
: 'https://api.hyungi.net/api';
// 인증된 fetch 함수
async function authFetch(url, options = {}) {
const token = localStorage.getItem('token');
if (!token) {
console.error('토큰이 없습니다. 로그인이 필요합니다.');
window.location.href = '/index.html';
return;
}
const defaultHeaders = {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
};
const response = await fetch(url, {
...options,
headers: {
...defaultHeaders,
...options.headers
}
});
// 401 에러 시 로그인 페이지로
if (response.status === 401) {
console.error('인증 실패. 다시 로그인해주세요.');
localStorage.removeItem('token');
window.location.href = '/index.html';
return;
}
return response;
}
// GET 요청 헬퍼
async function apiGet(endpoint) {
const response = await authFetch(`${API_BASE}${endpoint}`);
if (!response) return null;
return response.json();
}
// POST 요청 헬퍼
async function apiPost(endpoint, data) {
const response = await authFetch(`${API_BASE}${endpoint}`, {
method: 'POST',
body: JSON.stringify(data)
});
if (!response) return null;
return response.json();
}
// PUT 요청 헬퍼
async function apiPut(endpoint, data) {
const response = await authFetch(`${API_BASE}${endpoint}`, {
method: 'PUT',
body: JSON.stringify(data)
});
if (!response) return null;
return response.json();
}
// DELETE 요청 헬퍼
async function apiDelete(endpoint) {
const response = await authFetch(`${API_BASE}${endpoint}`, {
method: 'DELETE'
});
if (!response) return null;
return response.json();
}
// 내보내기 (다른 파일에서 사용 가능)
window.API = {
get: apiGet,
post: apiPost,
put: apiPut,
delete: apiDelete,
fetch: authFetch,
BASE: API_BASE
};