Skip to content
Snippets Groups Projects
Commit d0561270 authored by 김기창's avatar 김기창
Browse files

engineeo migration

parent c284640a
No related branches found
No related tags found
No related merge requests found
Pipeline #7132 failed
Showing with 937 additions and 0 deletions
# compiled output
/dist
/node_modules
# env files
.env
.env.production
.env.dev
# Logs
logs
*.log
npm-debug.log*
pnpm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
/log
# OS
.DS_Store
# Tests
/coverage
/.nyc_output
# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
import { UserEntity } from '../src/user/entities/user.entity';
declare global {
namespace Express {
export interface Request {
user?: UserEntity;
}
namespace MulterS3 {
interface File {
location: string;
}
}
}
}
FROM node:18-alpine
EXPOSE 3000
ENV PORT=3000
ENV NODE_ENV=production
WORKDIR /app
COPY package.json ./
COPY package-lock.json ./
COPY /dist ./dist
COPY prisma ./prisma/
COPY /.platform/nginx/conf.d /etc/nginx/conf.d
RUN npm install
RUN npx prisma generate
CMD npm run start:prod
\ No newline at end of file
<p align="center">
<a href="http://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo-small.svg" width="200" alt="Nest Logo" /></a>
</p>
[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456
[circleci-url]: https://circleci.com/gh/nestjs/nest
<p align="center">A progressive <a href="http://nodejs.org" target="_blank">Node.js</a> framework for building efficient and scalable server-side applications.</p>
<p align="center">
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/v/@nestjs/core.svg" alt="NPM Version" /></a>
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a>
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/common.svg" alt="NPM Downloads" /></a>
<a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a>
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#9" alt="Coverage" /></a>
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://opencollective.com/nest/sponsors/badge.svg" alt="Sponsors on Open Collective" /></a>
<a href="https://paypal.me/kamilmysliwiec" target="_blank"><img src="https://img.shields.io/badge/Donate-PayPal-ff3f59.svg"/></a>
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a>
<a href="https://twitter.com/nestframework" target="_blank"><img src="https://img.shields.io/twitter/follow/nestframework.svg?style=social&label=Follow"></a>
</p>
<!--[![Backers on Open Collective](https://opencollective.com/nest/backers/badge.svg)](https://opencollective.com/nest#backer)
[![Sponsors on Open Collective](https://opencollective.com/nest/sponsors/badge.svg)](https://opencollective.com/nest#sponsor)-->
## Description
[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository.
## Installation
```bash
$ npm install
```
## Running the app
```bash
# development
$ npm run start
# watch mode
$ npm run start:dev
# production mode
$ npm run start:prod
```
## Test
```bash
# unit tests
$ npm run test
# e2e tests
$ npm run test:e2e
# test coverage
$ npm run test:cov
```
## Support
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support).
## Stay in touch
- Author - [Kamil Myśliwiec](https://kamilmysliwiec.com)
- Website - [https://nestjs.com](https://nestjs.com/)
- Twitter - [@nestframework](https://twitter.com/nestframework)
## License
Nest is [MIT licensed](LICENSE).
**/node_modules/
node_modules/
**/dist
.git
npm-debug.log
.coverage
.coverage.*
.env
.aws
node_modules/*
log/*
config/secret.js
config/email.js
config/swagger.js
index.js
.env
config/crawling.js
config/easyelec.pem
.DS_Store
.idea/*
{
"semi": true,
"printWidth": 120,
"endOfLine": "auto",
"singleQuote": false,
"useTabs": true,
"tabWidth": 2,
"trailingComma": "all",
"arrowParens": "always"
}
FROM node:18-alpine3.16
WORKDIR /app
COPY ./package.json ./
RUN npm install
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /app && cp -a /tmp/node_modules /app/
COPY . .
CMD ["npm", "run", "start"]
\ No newline at end of file
FROM node:18-alpine3.16
WORKDIR /app
COPY ./package.json ./
RUN npm install
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /app && cp -a /tmp/node_modules /app/
COPY . .
CMD ["npm", "run", "backend"]
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/engineeo-server/
hooks:
AfterInstall:
- location: /install.sh
runas: root
file_exists_behavior: OVERWRITE
File added
const restoreProvider = require("../src/Restore/restoreProvider");
const { resultResponse } = require("./response");
const { basickResponse } = require("./response");
const baseResponse = require("./baseResponseStatus");
const admissionMiddleware = async (req, res, next) => {
// read restoreExamDetailIdx from url
const userIdx = req.verifiedToken.userIdx;
const restoreExamDetailIdx = req.query.restoreExamDetailIdx;
// restoreExamDetailIdx does not exist
if (!restoreExamDetailIdx) {
return next();
}
await restoreProvider.restoreExamDetailIdxCheck(restoreExamDetailIdx);
const admissionTicketResult = await restoreProvider.getExamAdmissionTicket(userIdx, restoreExamDetailIdx);
if (admissionTicketResult.isSuccess && admissionTicketResult.result)
req.admissionAuthStatus = admissionTicketResult.result.auth;
next();
};
module.exports = admissionMiddleware;
const storeProvider = require("../src/Store/storeProvider");
const userProvider = require("../src/User/userProvider");
const adminProvider = require("../src/Admin/adminProvider");
const examProvider = require("../src/Exam/examProvider");
const secret_config = require("./secret");
const baseResponse = require("./baseResponseStatus");
const { basickResponse } = require("./response");
const jwt = require("jsonwebtoken");
const userService = require("../src/User/userService");
const authCheck = (req, res, next) => {
let examDetailIdx = req.params.examDetailIdx;
let examIdx = req.params.examIdx;
const examRecordIdx = req.params.examRecordIdx;
const token = req.headers["x-access-token"];
// console.log("req.query : ", req.query);
// console.log("examDetailIdx : ", examDetailIdx);
// console.log("examIdx : ", examIdx);
// console.log("examRecordIdx : ", examRecordIdx);
// console.log("token : ", token);
if (!token) return res.send(basickResponse(baseResponse.TOKEN_EMPTY));
if (token && token.length > 9) {
const promiseAuth = new Promise((resolve, reject) => {
jwt.verify(token, secret_config.jwtsecret, (err, verifiedToken) => {
if (err) reject(err);
resolve(verifiedToken);
});
});
promiseAuth
.then(async (verifiedToken) => {
let authResult;
let publicLevel;
const userIdx = String(verifiedToken.userIdx);
// console.log("userIdx : ", userIdx);
if (examRecordIdx) {
const examDetailInfo = await userProvider.userExamRecordToExamDetail(examRecordIdx);
examDetailIdx = examDetailInfo.length ? examDetailInfo[0].examDetailIdx : null;
}
if (examDetailIdx) {
if (typeof examDetailIdx == "object") throw "userExamRecordToExamDetail Error";
// console.log("test 통과");
const value = await storeProvider.checkUserExamDetailAuth(examDetailIdx, userIdx);
authResult = value[0].exist;
const examDetailInfo = await examProvider.examDetailCheck(examDetailIdx);
// 무료 회차라면 권한 부여
publicLevel = examDetailInfo[0].publicLevel;
if (publicLevel == 0) authResult = 1;
} else {
if (examIdx) {
const value = await storeProvider.checkUserExamAuth(examIdx, userIdx);
authResult = value[0].exist;
}
}
// else throw "P arameter is null";
const adminIdxCheckResult = await adminProvider.adminCheck(userIdx);
// console.log("adminIdxCheckResult : ", adminIdxCheckResult[0].exist);
// console.log("authResult : ", authResult);
req.isAuth = authResult == 1 || adminIdxCheckResult[0].exist == 1 ? 1 : 0;
// console.log("test");
if (req.isAuth && !adminIdxCheckResult[0].exist) {
//관리자는 로그 제외
if (examDetailIdx || examIdx) {
if (!examDetailIdx) await userService.insertUserAuthLogExamIdx(userIdx, examIdx);
else await userService.insertUserAuthLogDetailIdx(userIdx, examDetailIdx);
}
}
//req.isAuth = 1; // 모두 무료상태
req.verifiedToken = verifiedToken;
next();
})
.catch((err) => {
console.log("Wrong Prameters " + examDetailIdx, examIdx, examRecordIdx);
return res.send(basickResponse(baseResponse.TOKEN_VERIFICATION_FAILURE));
});
// 시험 문제 구매 검사 (결제 구현후 수정)
// await promiseAuth.then(async (data) => {
// userIdx = data.userIdx;
// const userAuthCheckResult = await examProvider.userExamDetailAuthCheck(userIdx, examDetailIdx);
// isAuth = userAuthCheckResult[0].exist;
// });
// const today = new Date();
// const nowDate =
// today.getFullYear() + ("0" + (today.getMonth() + 1)).slice(-2) + ("0" + today.getDate()).slice(-2);
}
};
module.exports = authCheck;
This diff is collapsed.
const LRU = require("lru-cache");
const options = {
max: 300,
maxAge: 1000 * 60 * 60,
length(n, key) {
return 1;
},
dispose(key, n) {
/* 데이터가 삭제된 후 호출 */
},
};
// 추후 번호 인증외에 캐싱을 사용하면 maxAge변경
const cache = new LRU(options);
module.exports = cache;
module.exports = {
DEFAULT_COMPANY_NAME: "공기업",
DEFAULT_CERTIFICATE_NAME: "자격증",
DEFAULT_EXAMSORT_ALL: "전체",
DEFAULT_DIVISION_NAME: "전기",
DEFAULT_ROOT_LEVEL: "L",
DEFAULT_DIVISION_LEVEL: "M",
POINT_TYPE_ADD: "A",
POINT_TYPE_USE: "U",
POINT_TYPE_CANCEL: "C",
};
const mysql = require("mysql2/promise");
const pool = mysql.createPool({
host: process.env.DATABASE_HOST,
port: process.env.DATABASE_PORT,
user: process.env.DATABASE_USER,
database: process.env.DATABASE_NAME,
password: process.env.DATABASE_PASSWORD,
connectionLimit: 15,
});
module.exports = {
pool: pool,
};
const express = require("express");
const compression = require("compression");
const methodOverride = require("method-override");
const cors = require("cors");
const swaggerDoc = require("./swagger.json");
const swaggerUi = require("swagger-ui-express");
const cookieParser = require("cookie-parser");
const redis = require("redis");
const secret_config = require("./secret");
const dotenv = require("dotenv");
dotenv.config();
module.exports = function () {
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(methodOverride());
app.use(cors());
app.use(cookieParser());
app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerDoc, { explorer: true }));
/* App (Android, iOS) */
// 도메인을 추가할 경우 이곳에 Route를 추가하세요.
const examRouter = require("../src/Exam/examRoute")(app);
const userRouter = require("../src/User/userRoute")(app);
const adminRouter = require("../src/Admin/adminRoute")(app);
const calendarRouter = require("../src/Calendar/calendarRoute")(app);
const restoreRouter = require("../src/Restore/restoreRoute")(app);
const storeRouter = require("../src/Store/storeRoute")(app);
const communityRouter = require("../src/Community/communityRoute")(app);
const channelTalkRouter = require("../src/ChannelTalk/channelTalkRoute")(app);
// 로드 밸런서를 통해서 어떤 ip 그룹으로 가게 되는지
app.get("/elbIpAddress", function (req, res) {
const ipAddress = req.socket.remoteAddress;
res.send(ipAddress);
});
//app.use("/api/exams", examRouter);
//require("./crawling")(app);
return app;
};
{
"type": "service_account",
"project_id": "engineeo-323305",
"private_key_id": "4751fdf5f63d5154997d080c42713aea0b3b907b",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC8dH7LIY4iQKsa\ns/dGOxR5J0cdP3OLjlCH65jhfFn+RYn19+aS23zZzLrGAmdPcsFFOlzFfJmjeB5+\nyavFJkCnCPS4G/T8PtfoFQZurm15V9d3cSCln6TBYi/6aKn0Ig8hpx+bePCaiwtz\nWB3PhNl5hjwwVYaIG2RIyOb3aORNfDA71deJ3LDNXMDeV6qtEJ78xfLRsu26tA5o\nGAoAJ+snMSPwz1g+AS5KdflfFSJQnYcIMBNCcp7kO04tYr2VclGXxM4qJseV04ho\n3IC2W+5Yb8WL7tF/59mrrD3nnyXr1jz6rWhWEYUb0zGoYeT/IjEAUfRl8tZp9Tkd\nmgGiU1MvAgMBAAECggEACIuqM23df+iGZo4u/ux8HJS1lDolwPgYGltXMf2TwYSU\nh/NqbWuUhfY5qSbzJlaIZ91vCk/nHtMgluE9CV79r+70O33RDLf3NGfxRCDJ7nNK\nqvjierNgvJnGN5WtanIGiG3t1smTwRff0gz2qEu+5m4G2eFwjOJCshlu5I/8e+Lu\ncjXB+cavSrYnhVgw3uDZ60fjqQABW+Yyd/Lfg5JZkY4pjsrm0ULaMcly8QUqaO2v\nGUxARRPgOoMs/R6kGlD507mDJitDNzkFWg67HuyflvjKQJht1eZMbYmXB+2j0Wyf\nEWfvTF1BZR98uv/KRz6F5o+JjrSLhSaBCpvO0s+BuQKBgQDcLqNn3JajNUKdW2bx\nm1NBRU3ZWDfeT2FJyj8jZ5X7eIuhN1cYae6McBN6aN2nTeXFsMEwDezAuq9u8cAv\nyedvRu4hh/F1PSzct6VIkpoL+B4U6jjBGiIs2+deR0AMoQ8uv49n4U/5KUrQn3+E\nD831r2L6GrK9w4agGsCJkhXmAwKBgQDbHJlceP8vmo/TGNY9whTRmimca+qIbIzi\nB87rhP4r6+9GGdMCQazbptU+pDMEBY1sFCR624qzLYsE4vCC7XEQL9na9FGhLVXN\nPzCJVVibjMDhoZD8Q3DzciFF+LJM50vPtLduTBVQ0hWLs9nGX77hr4hWMA4HGmm5\nAx7zAVfcZQKBgQCQSnADbGe7ZPfWr0NzKdsRdx1hRZK3OUYEWWmvBf8f4QuABwgo\nk6MknX3mRjqbnUzqlL7FgxqX4r988SiFKMdmARGlH7V4ozJ3IlJKkOgq19q+0g+H\nXFzxENs6yW6L2DBe7mJILTt/iTPiK+Qg40qRqvIt/LkN6siau21ZukZniQKBgHZ9\nq83fPRkQO7EL4Gf7eeiztsb5cRafpTxivpqNDCrSZ04AjyTMQV9zhCRhBZmqKwWE\niwnJieNFwMU+uJQFNbxsNCL9NtuzuY/KGURbXBSadIBQMCjLi9yLHsVJLZr7Bfto\nHj5OdMSFJ9Opyh5GDuLbWx5I1H0w4nWD44vEcTAlAoGAP9vNzY1VpsTKcEFhtTIK\nIJZCrLm0bVtgl+YWixvPrLP98chGmHVoSEvVg0o0viecHw7SAel2nEjqZ8u2lwan\nfi/d7iOnRPv22m6X9F844Hm+2diy842lWhn35EwrZNdsdcoC27MWTRu9NzkI383K\n6uXbIfX8BkIJfDNFEzVXXyY=\n-----END PRIVATE KEY-----\n",
"client_email": "firebase-adminsdk-smnmw@engineeo-323305.iam.gserviceaccount.com",
"client_id": "112719187215767417193",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-smnmw%40engineeo-323305.iam.gserviceaccount.com"
}
const secret = require("./secret");
const { basickResponse } = require("./response");
const baseResponse = require("./baseResponseStatus");
const axios = require("axios").default;
const getImPortToken = async (req, res, next) => {
// 액세스 토큰(access token) 발급 받기
try {
const getToken = await axios({
url: "https://api.iamport.kr/users/getToken",
method: "post", // POST method
headers: { "Content-Type": "application/json" }, // "Content-Type": "application/json"
data: {
imp_key: secret.importApiKey, // REST API 키
imp_secret: secret.importApiSecret, // REST API Secret
},
});
req.imPortToken = getToken.data.response; // 인증 토큰
next();
} catch (error) {
console.log(error);
logger.error(`App - getImPort Middleware error\n: ${error.message}`);
return res.send(basickResponse(baseResponse.IMPORT_TOKEN_ERROR));
}
};
module.exports = getImPortToken;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment