RESTAPI_SERVER/routes/api.js

166 lines
3.9 KiB
JavaScript

const express = require('express');
const router = express.Router();
const {
getAllData,
getDataById,
insertData,
updateData,
deleteData
} = require('../database/queries');
const { verifyApiKey, optionalAuth, requirePermission } = require('../middleware/auth');
// 모든 데이터 조회 (API 키 + 읽기 권한 필요)
router.get('/data', verifyApiKey, requirePermission('read'), async (req, res) => {
try {
const data = await getAllData();
res.json({
success: true,
message: '데이터 조회 성공',
data: data
});
} catch (error) {
res.status(500).json({
success: false,
message: '데이터 조회 실패',
error: error.message
});
}
});
// 특정 ID 데이터 조회 (API 키 + 읽기 권한 필요)
router.get('/data/:id', verifyApiKey, requirePermission('read'), async (req, res) => {
try {
const { id } = req.params;
const data = await getDataById(id);
if (!data) {
return res.status(404).json({
success: false,
message: '데이터를 찾을 수 없습니다'
});
}
res.json({
success: true,
message: '데이터 조회 성공',
data: data
});
} catch (error) {
res.status(500).json({
success: false,
message: '데이터 조회 실패',
error: error.message
});
}
});
// 데이터 생성 (API 키 + 쓰기 권한 필요)
router.post('/data', verifyApiKey, requirePermission('write'), async (req, res) => {
try {
const { name, description, dataValue } = req.body;
if (!name) {
return res.status(400).json({
success: false,
message: 'name 필드는 필수입니다'
});
}
const result = await insertData({
name,
description,
dataValue
});
res.status(201).json({
success: true,
message: '데이터 생성 성공',
rowsAffected: result
});
} catch (error) {
res.status(500).json({
success: false,
message: '데이터 생성 실패',
error: error.message
});
}
});
// 데이터 업데이트 (API 키 + 쓰기 권한 필요)
router.put('/data/:id', verifyApiKey, requirePermission('write'), async (req, res) => {
try {
const { id } = req.params;
const { name, description, dataValue } = req.body;
if (!name) {
return res.status(400).json({
success: false,
message: 'name 필드는 필수입니다'
});
}
const result = await updateData(id, {
name,
description,
dataValue
});
if (result === 0) {
return res.status(404).json({
success: false,
message: '업데이트할 데이터를 찾을 수 없습니다'
});
}
res.json({
success: true,
message: '데이터 업데이트 성공',
rowsAffected: result
});
} catch (error) {
res.status(500).json({
success: false,
message: '데이터 업데이트 실패',
error: error.message
});
}
});
// 데이터 삭제 (API 키 + 삭제 권한 필요)
router.delete('/data/:id', verifyApiKey, requirePermission('delete'), async (req, res) => {
try {
const { id } = req.params;
const result = await deleteData(id);
if (result === 0) {
return res.status(404).json({
success: false,
message: '삭제할 데이터를 찾을 수 없습니다'
});
}
res.json({
success: true,
message: '데이터 삭제 성공',
rowsAffected: result
});
} catch (error) {
res.status(500).json({
success: false,
message: '데이터 삭제 실패',
error: error.message
});
}
});
// 헬스 체크
router.get('/health', (req, res) => {
res.json({
success: true,
message: 'API 서버가 정상적으로 작동중입니다',
timestamp: new Date().toISOString()
});
});
module.exports = router;