diff --git a/controller/board.ts b/controller/board.ts index ffebb65..072f7bb 100644 --- a/controller/board.ts +++ b/controller/board.ts @@ -10,7 +10,7 @@ import commentModel from '../src/db/models/comment'; const boardController = { boardAll: async (req: Request, res: Response) => { // 게시판 글 목록 데이터 보내주기 - console.log('💜boardAll'); + console.log('💜boardAll - 게시판 글 목록 보기'); let boardList = await Boards.findAll(); res.status(200).json({ boardList, @@ -18,7 +18,7 @@ const boardController = { }, boardOne: async (req: Request, res: Response) => { // 게시글 상세 내용 + 댓글 데이터 보내주기 - console.log('💜boardOne ', req.params); + console.log('💜boardOne - ', req.params); const board_id = Number(req.params.board_id); const boardData = await Boards.findOne({ where: { @@ -26,15 +26,16 @@ const boardController = { }, }); if (boardData === null) { + console.log('💜boardOne - ERROR// no board data ', board_id); res.status(403).json({ message: 'no board data Error!', }); } else { + console.log('💜boardOne - board data ', board_id); // board_id를 key로 가지는 칸반보드 데이터 불러오기 let foundContent = await contentModel.findOne({ board_id }); // board_id를 key로 가지는 댓글 데이터 불러오기 let foundComment = await commentModel.find({ board_id }); - // 게시글 상세내용 응답으로 보내주기 if (foundContent) { res.status(200).json({ @@ -45,6 +46,7 @@ const boardController = { commentAll: foundComment, }); } else { + console.log('💜boardOne - ERROR// no content ', board_id); res.status(404).json({ message: 'no content Error!', }); @@ -53,12 +55,11 @@ const boardController = { }, boardAdd: async (req: Request, res: Response) => { // 게시글 등록하기 - console.log('💜boardAdd ', req.body, req.user_email, req.user_id); + console.log('💜boardAdd - ', req.body, req.user_email, req.user_id); const title = req.body.title; if (title !== '') { const writer = req.user_email; const user_id = req.user_id; - console.log('chekcheakdjfkldaf - ', writer, user_id); const newBoard = await Boards.create({ id: undefined, title, @@ -67,7 +68,7 @@ const boardController = { }); const board_id = newBoard.get('id'); // board_id를 key로 가지는 칸반보드 데이터 저장 - //----------------------------------------- 아래는 유저가 소유한 칸반보드를 데이터화해주는 과정 + // 유저가 소유한 칸반보드를 데이터화해주는 과정 const email = req.user_email; // 유저 정보 어스체커에서 받아옴 const user = await Users.findOne({ where: { email: email } }); // 유저정보 조회 유저객체 if (user) { @@ -76,9 +77,7 @@ const boardController = { where: { user_id }, order: [['index', 'ASC']], }); - // console.log(workspace); const tasks = await Tasks.findAll({ where: { user_id }, order: [['index', 'ASC']] }); - // console.log(tasks); const res_taskList = []; for (let i = 0; i < workspace.length; i++) { const id = workspace[i].get('id'); @@ -87,22 +86,16 @@ const boardController = { .map(el => { return el.get('id'); }); - // console.log('🥵', taskArr); res_taskList.push( Object.assign({}, { title: workspace[i].get('title'), tasks: taskArr }), ); } - const res_taskItem: { [index: number]: any; } = {}; - // console.log(res_taskList); - for (let i = 0; i < tasks.length; i++) { let id = tasks[i].get('id') as number; - console.log('🥺', id); const checkList = await checkListModel.findOne({ tasksId: id }); - console.log('🥵', checkList); if (checkList) { res_taskItem[id] = Object.assign( {}, @@ -133,23 +126,24 @@ const boardController = { }); Mboard_data.save() .then(result => { - console.log(result); + //console.log(result); }) - .catch(error => { - return res.status(500).json({ - message: error.message, - error, + .catch(err => { + console.log('💜boardAdd - ERROR// ', err.message); + res.status(500).json({ + message: err.message, }); }); - // res.send({ Mboard_data }); } - // board_id를 key로 가지는 댓글 데이터 저장(빈파일? 생성) + // board_id를 key로 가지는 댓글 데이터 저장(빈파일? 생성) -> 필요없음 + // 새로 생성된 게시판 글 목록 데이터 보내줌 let boardList = await Boards.findAll(); res.status(200).json({ new_board_id: board_id, boardList, }); } else { + console.log('💜boardAdd - ERROR// no input title ', title); res.status(400).json({ message: 'no input title Error!', }); @@ -157,7 +151,7 @@ const boardController = { }, boardDelete: async (req: Request, res: Response) => { // 게시글 삭제하기 - console.log('💜boardDelete ', req.params); + console.log('💜boardDelete - ', req.params); const board_id = Number(req.params.board_id); await Boards.destroy({ where: { @@ -165,7 +159,10 @@ const boardController = { }, }); // board_id를 key로 가지는 칸반보드 데이터 삭제 + contentModel.deleteOne({ board_id }); // board_id를 key로 가지는 댓글 데이터 삭제 + commentModel.deleteMany({ board_id }); + // 삭제되었다는 메시지 보내기 res.status(200).json({ message: `delete ${board_id} complete`, }); diff --git a/controller/board_comment.ts b/controller/board_comment.ts index b94089e..6003ddd 100644 --- a/controller/board_comment.ts +++ b/controller/board_comment.ts @@ -1,21 +1,19 @@ import { Request, Response } from 'express'; -import { Boards } from '../src/db/models/board'; import mongoose from 'mongoose'; import commentModel from '../src/db/models/comment'; import { commentDisplay } from './commentDisplay'; -// interface + interface Comment extends mongoose.Document { user_id: string; user_email: string; comment_body: string; - // children: Array; board_id: number; } + const commentController = { commentAdd: (req: Request, res: Response) => { // 댓글 추가하기 - console.log(req.body); - console.log('💜commentAdd ', req.params); + console.log('💚commentAdd - ', req.params, req.body); const user_id = req.user_id; const user_email = req.user_email; const board_id = Number(req.params.board_id); @@ -27,47 +25,42 @@ const commentController = { comment_body, parent_id, }); - // new mongoose.Types.ObjectId 유니크값 생성기 같은 느낌이다. 아이디생성용 return comment .save() .then(async result => { - //console.log(result); const commentData = await commentModel.find({ board_id }); - console.log('🤎', commentData); const commentAll = commentDisplay(commentData); return res.status(201).json({ commentAll, - //commentData, }); }) - .catch(error => { + .catch(err => { + console.log('💚commentAdd - ERROR// ', err.message); return res.status(500).json({ - message: error.message, + message: 'comment Error ' + err.message, }); }); }, commentDelete: async (req: Request, res: Response) => { // 댓글 삭제하기 - console.log('💜commentDelete ', req.params); + console.log('💚commentDelete - ', req.params); const board_id = Number(req.params.board_id); const comment_id = String(req.params.comment_id); const user_id = req.user_id; - const user_email = req.user_email; - console.log(user_id); commentModel .deleteOne() .and([{ _id: comment_id }, { user_id }]) .then(async data => { const commentData = await commentModel.find({ board_id }); - console.log('🤎', commentData); const commentAll = commentDisplay(commentData); res.status(200).json({ commentAll, }); }) .catch(err => { - res.status(500).json({ - message: err.message, + console.log('💚commentDelete - ERROR// ', err.message); + return res.status(500).json({ + message: 'comment Error ' + err.message, }); }); }, diff --git a/controller/emailauth.ts b/controller/emailauth.ts index 2215ede..7e0b64f 100644 --- a/controller/emailauth.ts +++ b/controller/emailauth.ts @@ -6,36 +6,37 @@ import { Users } from '../src/db/models/user'; import { accessTokenGenerator } from '../Auth/GenerateAccessToken'; import { refreshTokenGenerator } from '../Auth/GenerateRefreshToken'; const url = require('url'); -// const Users = require('../src/db/models/user'); const emailAuthController = { authorizationCode: async (req: Request, res: Response) => { - //오소리코드 확인 - - // console.log(req.query); + console.log('💙login: email- ', req.body); const authorizationCode: string = (await req.body.authorizationCode) as string; const email: string = (await req.body.email) as string; - // console.log(authorizationCode); + // authorization code를 이용해 access token을 발급 jwt.verify( authorizationCode, process.env.AUTHORIZATION_SECRET, async (err: Error | null, decoded: any) => { - // console.log(authorizationCode); try { if (err) { throw new Error('not decoded!'); } else { - //디코딩 됬음 + // decoded const exp = new Date(decoded.exp * 1000); const now = new Date(Date.now()); console.log(exp, ' vs ', now); if (exp > now) { - //액세스토큰 만들어줌,리프레시토큰만들어줌 - let data = await Users.findOrCreate({ where: { email } }); + // access token, refresh token 생성 + let data = await Users.findOrCreate({ + where: { + email, + }, + }); let id: number = data[0].get('id') as number; const accessToken = await accessTokenGenerator(id, email); const refreshToken = await refreshTokenGenerator(id, email); - console.log('at: ', accessToken, ', rt: ', refreshToken); + console.log('💙email: at - ', accessToken, '\n💙email: rt - ', refreshToken); + // refresh token 저장 res.cookie('refreshToken', refreshToken as string, { maxAge: 1000 * 60 * 60 * 24 * 7, httpOnly: true, @@ -43,19 +44,6 @@ const emailAuthController = { // sameOrigin: 'none', }); // access token과 loginType을 응답으로 보내줌 - // res.status(200).json({ - // accessToken, - // LoginType: 'email', - // }); - // res.redirect( - // url.format({ - // pathname: 'http://9351eda07173.ngrok.io/', - // query: { - // accessToken: accessToken, - // }, - // }), - // ); - // res.redirect('/?' + query); res.status(200).json({ accessToken, email, @@ -69,9 +57,9 @@ const emailAuthController = { } } } catch (err) { - console.log(err); + console.log('💙email: ', err.message); res.status(401).json({ - message: 'authorizationCode Error!', + message: 'authorizationCode Error!' + err.message, }); } }, diff --git a/controller/loginOAuth.ts b/controller/loginOAuth.ts index 2b6adfe..185b283 100644 --- a/controller/loginOAuth.ts +++ b/controller/loginOAuth.ts @@ -7,7 +7,7 @@ import { Users } from '../src/db/models/user'; const oauthController = { google: async (req: Request, res: Response) => { //로그인 - OAuth 방식: google - console.log('💙google- ', req.body); + console.log('💙login: google- ', req.body); const googleLoginURL = 'https://accounts.google.com/o/oauth2/token'; const googleInfoURL = 'https://www.googleapis.com/oauth2/v3/userinfo'; // authorization code를 이용해 access token을 발급받음 @@ -16,7 +16,7 @@ const oauthController = { client_id: process.env.GOOGLE_CLIENT_ID, client_secret: process.env.GOOGLE_CLIENT_SECRET, code: req.body.authorizationCode, - redirect_uri: process.env.CLIENT_URL, + redirect_uri: `${process.env.CLIENT_URL}/login`, grant_type: 'authorization_code', }) .then(async result => { @@ -50,7 +50,7 @@ const oauthController = { httpOnly: true, }); // access token과 loginType, email을 응답으로 보내줌 - console.log('🧡response - ', accessToken); + console.log('💙google: at - ', accessToken, '\n💙google: rt - ', refreshToken); res.status(200).json({ accessToken, LoginType: 'google', @@ -58,15 +58,15 @@ const oauthController = { }); }) .catch(err => { - console.log(err.message); + console.log('💙google: ', err.message); res.status(401).json({ - message: 'authorizationCode Error!', + message: 'authorizationCode Error!' + err.message, }); }); }, github: async (req: Request, res: Response) => { //로그인 - OAuth 방식: github - console.log('💙github- ', req.body); + console.log('💙login: github- ', req.body); const githubLoginURL = 'https://github.com/login/oauth/access_token'; const githubInfoURL = 'https://api.github.com/user'; // authorization code를 이용해 access token을 발급받음 @@ -93,10 +93,7 @@ const oauthController = { authorization: `Bearer ${accessToken}`, }, }) - .then(result => { - //console.log('result.data - ', result.data); - return result.data.login; - }) + .then(result => result.data.login) .catch(err => { console.log(err.message); }); @@ -112,7 +109,7 @@ const oauthController = { }); } // access token과 loginType을 응답으로 보내줌 - console.log('🧡response - ', accessToken); + console.log('💙github: at - ', accessToken); res.status(200).json({ accessToken, LoginType: 'github', @@ -120,7 +117,7 @@ const oauthController = { }); }) .catch(err => { - console.log(err.message); + console.log('💙github: ', err.message); res.status(401).json({ message: 'authorizationCode Error!', }); diff --git a/controller/workspace.ts b/controller/workspace.ts index ed078d5..bf505d3 100644 --- a/controller/workspace.ts +++ b/controller/workspace.ts @@ -7,9 +7,8 @@ import { Mongoose } from 'mongoose'; import mongoose from 'mongoose'; const workspaceController = { get: async (req: Request, res: Response) => { - // console.log(req.pro) - // workspace(칸반보드) 데이터 보내주기 + console.log('🧡workspaceGet - workspace(칸반보드) 데이터 보기'); // response에 {taskList , taskItem} 으로 내려줘야함. //테스크리스트 모양만들기에 필요한 데이터들 : title,tasks:[](안에 taskid) const email = req.user_email; @@ -73,8 +72,10 @@ const workspaceController = { } }, post: async (req: Request, res: Response) => { - // console.log('👻dddd', res.locals.email); // 생성, 수정, 삭제된 workspace(칸반보드) 데이터 저장하기 + console.log('🧡workspacePost - workspace(칸반보드) 데이터 저장'); + // console.log('👻dddd', res.locals.email); + const email = req.user_email; const { taskList, taskItem } = req.body; //테스크리스트 : [ {id,타이틀, 테스크스(배열= 테스크아이템에 매칭되는 키값이 들어있음)} , ... ] diff --git a/middleware/authChecker.ts b/middleware/authChecker.ts index f9da428..03cad6f 100644 --- a/middleware/authChecker.ts +++ b/middleware/authChecker.ts @@ -7,12 +7,10 @@ import * as dotenv from 'dotenv'; dotenv.config(); export const authChecker = async (req: Request, res: Response, next: NextFunction) => { - console.log('어스체커 실행중'); - console.log(req.headers); + console.log('🔒authChecker 실행합니다 - headers: ', req.headers); if (req.headers.authorization) { const accessToken = req.headers.authorization.split('Bearer ')[1]; const LoginType = req.headers.logintype; - console.log(accessToken, LoginType); if (LoginType === 'email') { // 로그인 방식 - email jwt.verify( @@ -20,45 +18,34 @@ export const authChecker = async (req: Request, res: Response, next: NextFunctio process.env.ACCESS_SECRET as string, (err: VerifyErrors | null, decoded: any | null) => { if (err) { - // 기간만료 ? 맞다. - // 그럼이제 리프레시토큰을 이용해서 액세스토큰 재발급 - // 그럼 두가지 분기처리를 해야한다, 리프레시토큰이없거나,만료되었거나해서 리다이렉트 로그인페이지 - // 다시 액세스토큰을 내려주거나 - // res.status(401).json({ error: 'expired!' }); + // access toekn : 기간 만료 const refreshToken = req.cookies.refreshToken; if (refreshToken) { - // refresh token 존재 + // refresh token : 존재 -> 정상인지 확인해야함 jwt.verify( refreshToken, process.env.REFRESH_SECRET as string, async (err: VerifyErrors | null, decoded: any | undefined) => { if (err) { - // refresh token 정상적이지않음 + // refresh token : 정상적이지 않음 -> 로그인으로 돌아감 res.redirect(`${process.env.CLIENT_URL}/login`); } else { - // 새로운 access token을 발급받음 + // 새로운 access token을 발급 받음 const id = decoded.userId; const email = decoded.email; const newAccessToken = await accessTokenGenerator(id, email); req.newAccessToken = newAccessToken; - req.user_id = id; - req.user_email = email; - res.send({ newAccessToken }); } }, ); } else { - // refresh token 없음 + // refresh token : 없음 res.redirect(`${process.env.CLIENT_URL}/login`); } } else { - // access token 만료되지 않음 - req.newAccessToken = accessToken; - // console.log('여기까지 도달했음'); + // access token : 만료되지 않음 req.user_email = decoded.email; req.user_id = decoded.userId; - // res.locals.email = decoded.email; - // res.body.user_email = decoded.email; } }, ); @@ -79,7 +66,7 @@ export const authChecker = async (req: Request, res: Response, next: NextFunctio }) .catch(err => { // 에러 발생 -> 인증 불가 -> 다시 로그인해야함 - console.log(err.message); + console.log('🔒error:google', err.message); res.redirect(`${process.env.CLIENT_URL}/login`); }); // access token으로 유저 정보 가져오기 @@ -93,7 +80,7 @@ export const authChecker = async (req: Request, res: Response, next: NextFunctio .then(result => result.data.email) .catch(err => { // 에러 발생 -> 인증 불가 -> 다시 로그인해야함 - console.log(err.message); + console.log('🔒error:google', err.message); res.redirect(`${process.env.CLIENT_URL}/login`); }); const userInfo = await Users.findOne({ @@ -102,7 +89,6 @@ export const authChecker = async (req: Request, res: Response, next: NextFunctio }, }); if (userInfo !== null) { - console.log('find userInfo', userInfo); req.user_email = resInfo; req.user_id = userInfo.get('id') as number; } else { @@ -121,13 +107,10 @@ export const authChecker = async (req: Request, res: Response, next: NextFunctio authorization: `Bearer ${accessToken}`, }, }) - .then(result => { - console.log('result.data - ', result.data); - return result.data.login; - }) + .then(result => result.data.login) .catch(err => { // 에러 발생 -> 인증 불가 -> 다시 로그인해야함 - console.log(err.message); + console.log('🔒error:github', err.message); res.redirect(`${process.env.CLIENT_URL}/login`); }); const email = `${resInfo}@github.com`; @@ -137,7 +120,6 @@ export const authChecker = async (req: Request, res: Response, next: NextFunctio }, }); if (userInfo !== null) { - console.log('find userInfo', userInfo); req.user_email = email; req.user_id = userInfo.get('id') as number; } else { @@ -145,10 +127,27 @@ export const authChecker = async (req: Request, res: Response, next: NextFunctio res.redirect(`${process.env.CLIENT_URL}/login`); } } - // 실제 요청으로 넘어감 - // req.user_email: 유저 이메일 정보 저장, 실제 요청에서 사용 가능 - // 나중에 응답 보낼때 accessToken에 req.newAccessToken을 넣어주면 됨 - console.log('💖authChecker ', LoginType, req.user_id, req.user_email, req.newAccessToken); + // access token을 확인한 결과를 토대로 결정 + console.log( + '🔒authChecker result - ', + LoginType, + req.user_id, + req.user_email, + req.newAccessToken, + ); + if (req.newAccessToken !== undefined) { + // 새로운 access token 생성됨 -> 응답으로 보내주어야 함 + res.status(200).json({ + newAccessToken: req.newAccessToken, + }); + } else if (req.user_id !== undefined && req.user_email !== undefined) { + // 실제 요청으로 넘어감 + console.log('🔒go next function!!'); + next(); + } else { + // 에러 발생 -> 로그인 페이지로 돌아감 + res.redirect(`${process.env.CLIENT_URL}/login`); + } next(); } else { // access token이 없을 때 -> 로그인 페이지로 돌아감 diff --git a/src/customType/express.d.ts b/src/customType/express.d.ts index e8a4bdf..c5962fe 100644 --- a/src/customType/express.d.ts +++ b/src/customType/express.d.ts @@ -1,7 +1,7 @@ export declare global { namespace Express { interface Request { - newAccessToken?: string; + newAccessToken?: string | undefined; user_id?: number | undefined; user_email?: string | undefined; }