feat: 초기 프로젝트 설정 및 룰.md 파일 추가

This commit is contained in:
2025-07-28 09:53:31 +09:00
commit 09a4d38512
8165 changed files with 1021855 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
// utils/access.js
exports.requireAccess = (...allowed) => {
return (req, res, next) => {
if (!req.user || !allowed.includes(req.user.access_level)) {
return res.status(403).json({ error: '접근 권한이 없습니다' });
}
next();
};
};

View File

@@ -0,0 +1,33 @@
// middlewares/accessMiddleware.js
// 권한 레벨 정의
const ACCESS_LEVELS = {
worker: 1,
group_leader: 2,
support_team: 3,
admin: 4,
system: 5
};
const requireAccess = (requiredLevel) => {
return (req, res, next) => {
if (!req.user) {
return res.status(401).json({ error: '인증이 필요합니다.' });
}
const userLevel = ACCESS_LEVELS[req.user.access_level] || 0;
const required = ACCESS_LEVELS[requiredLevel] || 999;
if (userLevel < required) {
return res.status(403).json({
error: '접근 권한이 없습니다.',
required: requiredLevel,
current: req.user.access_level
});
}
next();
};
};
module.exports = { requireAccess, ACCESS_LEVELS };

View File

@@ -0,0 +1,20 @@
// 📁 middlewares/auth.js
const jwt = require('jsonwebtoken');
require('dotenv').config();
module.exports = (req, res, next) => {
const authHeader = req.headers['authorization'];
const token = authHeader?.split(' ')[1];
if (!token) {
return res.status(401).json({ message: 'Access token required' });
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded; // 다른 미들웨어에서 사용할 수 있게 설정
next();
} catch (err) {
return res.status(403).json({ message: 'Invalid token' });
}
};

View File

@@ -0,0 +1,22 @@
const jwt = require('jsonwebtoken');
exports.verifyToken = (req, res, next) => {
try {
const authHeader = req.headers['authorization'];
if (!authHeader) {
return res.status(401).json({ error: '토큰 없음' });
}
const token = authHeader.split(' ')[1];
if (!token) {
return res.status(401).json({ error: '토큰 누락' });
}
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next(); // ✅ 반드시 next 호출
} catch (err) {
console.error('[verifyToken 오류]', err.message);
return res.status(403).json({ error: '토큰 검증 실패', detail: err.message });
}
};

View File

@@ -0,0 +1,16 @@
// middlewares/errorHandler.js
exports.errorHandler = (err, req, res, next) => {
console.error('Error:', err);
if (process.env.NODE_ENV === 'development') {
res.status(500).json({
error: '서버 오류가 발생했습니다.',
details: err.message,
stack: err.stack
});
} else {
res.status(500).json({
error: '서버 오류가 발생했습니다.'
});
}
};