Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/origin/dev'
Browse files Browse the repository at this point in the history
# Conflicts:
#	yarn.lock
  • Loading branch information
JangHwanPark committed Jul 9, 2024
2 parents 74552af + 7935e05 commit 8e430fa
Show file tree
Hide file tree
Showing 25 changed files with 837 additions and 1,655 deletions.
7 changes: 7 additions & 0 deletions .idea/dataSources.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"express-session": "^1.18.0",
"jsonwebtoken": "^9.0.2",
"mysql2": "^3.9.7",
"nodemon": "^3.1.0",
"nodemon": "^3.1.4",
"passport": "^0.7.0",
"passport-google-oauth20": "^2.0.0",
"redis": "^4.6.15",
Expand Down Expand Up @@ -59,4 +59,4 @@
"keywords": [],
"license": "ISC",
"description": ""
}
}
57 changes: 57 additions & 0 deletions src/controllers/viewController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// controllers/viewController.js
import dotenv from "dotenv";
dotenv.config();

export const renderIndexPage = (req, res) => {
const data = {
title: "학술",
message: "MOCK",
endpoints: [
{ method: "GET", url: `${process.env.DOMAIN}/admin/users`, description: "전체 유저 조회", id: "user-count" },
{ method: "GET", url: `${process.env.DOMAIN}/books/book`, description: "전체 책 조회", id: "book-count" },
{ method: "GET", url: `${process.env.DOMAIN}/coupang_products/all`, description: "전체 쿠팡 제품 조회", id: "coupang-count" }
],
specificEndpoints: [
{ method: "GET", url: `${process.env.DOMAIN}/admin/user/000043c2-b919-4281-9dab-f2a5b446973b`, description: "특정 유저 조회" },
{ method: "GET", url: `${process.env.DOMAIN}/books/info/1`, description: "특정 책 조회" },
{ method: "GET", url: `${process.env.DOMAIN}/coupang_products/product/1`, description: "특정 제품 조회" },
{ method: "GET", url: `${process.env.DOMAIN}/coupang_products/food`, description: "특정 카테고리 조회" }
],
inputSections: [
{ type: "users", label: "/admin/user/", placeholder: "유저의 ID를 입력하세요" },
{ type: "books", label: "/books/info/", placeholder: "책의 ID를 입력하세요" },
{ type: "products", label: "/coupang_products/product/", placeholder: "제품의 ID를 입력하세요" },
{ type: "github", label: "/github/repos/", placeholder: "유저 ID/레포지트리 이름" }
]
};

res.render("index", data);
};

export const renderGuidePage = (req, res) => {
const data = {
message: "MOCK",
};
res.render('guide/index', data);
};

export const renderCoupangPage = (req, res) => {
const data = {
message: "MOCK",
};
res.render('guide/coupang', data);
}

export const renderBookPage = (req, res) => {
const data = {
message: "MOCK",
};
res.render('guide/books', data);
}

export const renderUserPage = (req, res) => {
const data = {
message: "MOCK",
};
res.render('guide/users', data);
}
8 changes: 4 additions & 4 deletions src/middlewares/authenticate.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
const jwt = require('jsonwebtoken');
const { blacklist } = require('../routes/logout'); // 블랙리스트 가져오기
import jwt from "jsonwebtoken";
import {isTokenBlacklisted} from "../service/auth/LoginService.js";

const authenticate = (req, res, next) => {
const token = req.header('Authorization').replace('Bearer ', '');

if (blacklist.includes(token)) {
if (isTokenBlacklisted.includes(token)) {
return res.status(401).json({
errorCode: 101,
errorMessage: "Unauthorized Exception",
Expand All @@ -24,4 +24,4 @@ const authenticate = (req, res, next) => {
}
};

module.exports = authenticate;
export default authenticate;
20 changes: 10 additions & 10 deletions src/middlewares/errorHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,61 +9,61 @@ function errorHandler(err, req, res, next) {
statusCode = 400;
errorCode = 100;
errorMessage = 'Bad Request Exception';
description = err.message;
description = err.message || 'Validation error occurred';
break;
case 'AuthenticationError':
statusCode = 401;
errorCode = 200;
errorMessage = 'Authentication Failed';
description = err.message;
description = err.message || 'Authentication failed';
break;
case 'PermissionError':
statusCode = 403;
errorCode = 210;
errorMessage = 'Permission Denied';
description = err.message;
description = err.message || 'Permission denied';
break;
case 'NotFoundError':
statusCode = 404;
errorCode = 300;
errorMessage = 'Not Found Exception';
description = err.message;
description = err.message || 'Resource not found';
break;
case 'QuotaExceededError':
statusCode = 429;
errorCode = 400;
errorMessage = 'Quota Exceeded';
description = err.message;
description = err.message || 'Quota exceeded';
break;
case 'RateLimitError':
statusCode = 429;
errorCode = 420;
errorMessage = 'Rate Limited';
description = err.message;
description = err.message || 'Rate limit exceeded';
break;
case 'RequestEntityTooLargeError':
statusCode = 413;
errorCode = 430;
errorMessage = 'Request Entity Too Large';
description = err.message;
description = err.message || 'Request entity too large';
break;
case 'ServiceUnavailableError':
statusCode = 503;
errorCode = 500;
errorMessage = 'Service Unavailable';
description = err.message;
description = err.message || 'Service unavailable';
break;
case 'GatewayTimeoutError':
statusCode = 504;
errorCode = 510;
errorMessage = 'Gateway Timeout';
description = err.message;
description = err.message || 'Gateway timeout';
break;
default:
statusCode = 500;
errorCode = 900;
errorMessage = 'Unexpected Error';
description = err.message;
description = err.message || 'An unexpected error occurred';
break;
}

Expand Down
13 changes: 13 additions & 0 deletions src/middlewares/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// src/middlewares/index.js
import { retryMiddleware, timeoutMiddleware } from './retry.js';
import authenticate from './authenticate.js';
import errorHandler from './errorHandler.js';

const applyMiddlewares = (app) => {
app.use(authenticate);
app.use(timeoutMiddleware);
app.use(retryMiddleware);
app.use(errorHandler);
};

export default applyMiddlewares;
49 changes: 49 additions & 0 deletions src/public/error.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
.error-section {
margin: 2rem 0;
padding: 1rem;
}

.error-title {
font-size: 1.8rem;
color: #333;
margin-bottom: 1rem;
}

.error-table {
width: 100%;
border-collapse: collapse;
font-size: 0.9rem;
border: 2px solid #ddd;
}

.error-table th,
.error-table td {
padding: 0.75rem;
text-align: left;
border: 1px solid #ddd;
}

.error-table th {
background-color: #f2f2f2;
font-weight: bold;
color: #333;
}

.error-table tr:nth-child(even) {
background-color: #f9f9f9;
}

.error-table tr:hover {
background-color: #f5f5f5;
}

@media (max-width: 768px) {
.error-table {
font-size: 0.8rem;
}

.error-table th,
.error-table td {
padding: 0.5rem;
}
}
41 changes: 41 additions & 0 deletions src/public/guide.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
.api-guide-container {
max-width: 800px;
margin: 0 auto;
padding: 2rem;
}

.api-guide-title {
font-size: 2.5rem;
color: #333;
text-align: center;
margin-bottom: 2rem;
}

.api-guide-nav {
background-color: #f5f5f5;
border-radius: 8px;
padding: 1rem;
}

.api-guide-list {
list-style-type: none;
padding: 0;
}

.api-guide-item {
margin-bottom: 1rem;
}

.api-guide-link {
display: block;
padding: 1rem;
background-color: #ffffff;
color: #333;
text-decoration: none;
border-radius: 4px;
transition: background-color 0.3s ease;
}

.api-guide-link:hover {
background-color: #e6efff;
}
25 changes: 25 additions & 0 deletions src/public/header.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
.main_header {
background-color: #086fb6;
}

.main_header .logo {
color: #fff;
}

.header-wrapper {
padding: 1rem;
display: flex;
justify-content: space-between;
align-items: center;
}

.main_header h1 {
margin: 0 0 0 25px;
}

.main_nav a {
margin-right: 25px;
color: #fff;
font-size: 20px;
font-weight: 400;
}
28 changes: 4 additions & 24 deletions src/public/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ body {
color: #333;
}

.logo {
color: #fff;
}

p {
font-weight: bold;
padding-right: 1rem;
Expand All @@ -15,27 +19,7 @@ span {
padding-left: 1rem;
}

.main_header {
background-color: #086fb6;
color: white;
padding: 1rem;
display: flex;
justify-content: space-between;
align-items: center;
}

.main_header h1 {
margin: 0 0 0 25px;
}

.modal-button {
font-size: 1.2rem;
background-color: transparent;
color: #ffffff;
border: none;
margin-right: 25px;
cursor: pointer;
}


section {
Expand Down Expand Up @@ -87,10 +71,6 @@ a {
background-color: #0056b3;

}
a:hover {
text-decoration: underline;
}


input {
padding: 0.5rem;
Expand Down
1 change: 1 addition & 0 deletions src/routes/github/issue.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ const githubApi = axios.create({
}
})


// 리포지토리 정보
router.get("/repos/:owner/:repo", async (req, res, next) => {
const { owner, repo } = req.params;
Expand Down
16 changes: 16 additions & 0 deletions src/routes/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import express from 'express';
import authRouter from './auth/auth.js';
import booksRouter from './products/books.js';
import coupangRouter from './products/coupang.js';
import adminRouter from './users.js';
import githubRouter from './github/issue.js';

const router = express.Router();

router.use('/auth', authRouter);
router.use('/books', booksRouter);
router.use('/users', adminRouter);
router.use('/coupang-products', coupangRouter);
router.use('/github', githubRouter);

export default router;
Loading

0 comments on commit 8e430fa

Please sign in to comment.