diff --git a/controller/board.ts b/controller/board.ts index 93d1920..409c94d 100644 --- a/controller/board.ts +++ b/controller/board.ts @@ -1,24 +1,78 @@ import { Request, Response } from 'express'; import { Boards } from '../src/db/models/board'; +import { Users } from '../src/db/models/user'; const boardController = { - boardAll: (req: Request, res: Response) => { + boardAll: async (req: Request, res: Response) => { // 게시판 글 목록 데이터 보내주기 + console.log('💜boardAll'); + let boardList = await Boards.findAll(); + res.status(200).json({ + boardList, + }); }, - boardOne: (req: Request, res: Response) => { + boardOne: async (req: Request, res: Response) => { // 게시글 상세 내용 + 댓글 데이터 보내주기 + console.log('💜boardOne ', req.params); + const board_id = Number(req.params.board_id); + const boardData = await Boards.findOne({ + where: { + id: board_id, + }, + }); + if (boardData === null) { + res.status(403).json({ + message: 'no board data Error!', + }); + } else { + // board_id를 key로 가지는 칸반보드 데이터 불러오기 + // board_id를 key로 가지는 댓글 데이터 불러오기 + res.status(200).json({ + ...boardData, // 여기 좀더 고민 + //content + //comment + }); + } }, - boardAdd: (req: Request, res: Response) => { + boardAdd: async (req: Request, res: Response) => { // 게시글 등록하기 + 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; + const newBoard = await Boards.create({ + id: undefined, + title, + writer, + user_id, + }); + const board_id = newBoard.get('id'); + // board_id를 key로 가지는 칸반보드 데이터 저장 + // board_id를 key로 가지는 댓글 데이터 저장(빈파일? 생성) + res.status(200).json({ + board_id, + }); + } else { + res.status(400).json({ + message: 'no input title Error!', + }); + } }, - boardDelete: (req: Request, res: Response) => { + boardDelete: async (req: Request, res: Response) => { // 게시글 삭제하기 - }, - commentAdd: (req: Request, res: Response) => { - // 댓글 추가하기 - }, - commentDelete: (req: Request, res: Response) => { - // 댓글 삭제하기 + console.log('💜boardDelete ', req.params); + const board_id = Number(req.params.board_id); + await Boards.destroy({ + where: { + id: board_id, + }, + }); + // board_id를 key로 가지는 칸반보드 데이터 삭제 + // board_id를 key로 가지는 댓글 데이터 삭제 + res.status(200).json({ + message: `delete ${board_id} complete`, + }); }, }; diff --git a/controller/board_comment.ts b/controller/board_comment.ts new file mode 100644 index 0000000..49e9d6d --- /dev/null +++ b/controller/board_comment.ts @@ -0,0 +1,13 @@ +import { Request, Response } from 'express'; +import { Boards } from '../src/db/models/board'; + +const commentController = { + commentAdd: (req: Request, res: Response) => { + // 댓글 추가하기 + }, + commentDelete: (req: Request, res: Response) => { + // 댓글 삭제하기 + }, +}; + +export { commentController }; diff --git a/middleware/authChecker.ts b/middleware/authChecker.ts index 548c2a0..de5926b 100644 --- a/middleware/authChecker.ts +++ b/middleware/authChecker.ts @@ -2,6 +2,7 @@ import jwt, { VerifyErrors } from 'jsonwebtoken'; import axios from 'axios'; import { Request, Response, NextFunction } from 'express'; import { accessTokenGenerator } from '../Auth/GenerateAccessToken'; +import { Users } from '../src/db/models/user'; import * as dotenv from 'dotenv'; dotenv.config(); @@ -40,6 +41,7 @@ export const authChecker = async (req: Request, res: Response, next: NextFunctio const email = decoded.email; const newAccessToken = await accessTokenGenerator(id, email); req.newAccessToken = newAccessToken; + req.user_id = id; req.user_email = email; } }, @@ -92,7 +94,19 @@ export const authChecker = async (req: Request, res: Response, next: NextFunctio console.log(err.message); res.redirect(`${process.env.CLIENT_URL}/login`); }); - req.user_email = resInfo; + const userInfo = await Users.findOne({ + where: { + email: resInfo, + }, + }); + if (userInfo !== null) { + console.log('find userInfo', userInfo); + req.user_email = resInfo; + req.user_id = userInfo.get('id') as number; + } else { + // 유저 정보를 찾을 수 없음 -> 인증 불가 -> 다시 로그인해야함 + res.redirect(`${process.env.CLIENT_URL}/login`); + } } else if (LoginType === 'github') { // 로그인 방식 - github // refresh token이 없음, 로그아웃 하기 전까지 access token 계속 사용 가능 @@ -114,11 +128,25 @@ export const authChecker = async (req: Request, res: Response, next: NextFunctio console.log(err.message); res.redirect(`${process.env.CLIENT_URL}/login`); }); - req.user_email = `${resInfo}@github.com`; + const email = `${resInfo}@github.com`; + const userInfo = await Users.findOne({ + where: { + email, + }, + }); + if (userInfo !== null) { + console.log('find userInfo', userInfo); + req.user_email = email; + req.user_id = userInfo.get('id') as number; + } else { + // 유저 정보를 찾을 수 없음 -> 인증 불가 -> 다시 로그인해야함 + 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); next(); } else { // access token이 없을 때 -> 로그인 페이지로 돌아감 diff --git a/routes/board.ts b/routes/board.ts index df6766f..0f3cdf2 100644 --- a/routes/board.ts +++ b/routes/board.ts @@ -1,24 +1,29 @@ import app from '../app'; import { authChecker } from './../middleware/authChecker'; import { boardController } from '../controller/board'; +import { commentController } from '../controller/board_comment'; import express from 'express'; const boardRouter = express.Router(); -// 실제 요청 처리하기 전 access token 확인 -boardRouter.use('/board', authChecker); + +// authChecker - 실제 요청 처리하기 전 access token 확인 +//boardRouter.use('/board', authChecker); // 게시판 글 목록 데이터 보내주기 -boardRouter.get('/board', boardController.boardAll); +boardRouter.get('/board', authChecker, boardController.boardAll); + +// 게시글 등록하기 +boardRouter.post('/board', authChecker, boardController.boardAdd); // 게시글 상세 내용 + 댓글 데이터 보내주기 -boardRouter.get('/board/:board_id', boardController.boardOne); +boardRouter.get('/board/:board_id', authChecker, boardController.boardOne); // 게시글 삭제하기 -boardRouter.delete('/board/:board_id', boardController.boardDelete); +boardRouter.delete('/board/:board_id', authChecker, boardController.boardDelete); // 댓글 추가하기 -boardRouter.post('/board/:board_id/comment', boardController.commentAdd); +boardRouter.post('/board/:board_id/comment', authChecker, commentController.commentAdd); // 댓글 삭제하기 -boardRouter.delete('/board/:board_id/:comment_id', boardController.commentDelete); +boardRouter.delete('/board/:board_id/:comment_id', authChecker, commentController.commentDelete); export default boardRouter; diff --git a/routes/user.ts b/routes/user.ts index f81e95d..a8eec4e 100644 --- a/routes/user.ts +++ b/routes/user.ts @@ -5,8 +5,10 @@ import { emailAuthController } from '../controller/emailauth'; import { oauthController } from '../controller/loginOAuth'; import { userController } from '../controller/user'; const userRouter = express.Router(); + // 로그인 userRouter.post('/login', userController.login); +// 로그인 - nodemailer userRouter.post('/mail', emailController); userRouter.post('/emailauth', emailAuthController.authorizationCode); // 로그인 - OAuth 방식: google, github diff --git a/routes/workspace.ts b/routes/workspace.ts index f12a1ab..c4db9e6 100644 --- a/routes/workspace.ts +++ b/routes/workspace.ts @@ -3,6 +3,7 @@ import { authChecker } from './../middleware/authChecker'; import { workspaceController } from '../controller/workspace'; import express from 'express'; const workspaceRouter = express.Router(); + // 실제 요청 처리하기 전 access token 확인 workspaceRouter.use('/workspace', authChecker); diff --git a/src/customType/express.d.ts b/src/customType/express.d.ts index b868f69..e8a4bdf 100644 --- a/src/customType/express.d.ts +++ b/src/customType/express.d.ts @@ -2,7 +2,8 @@ export declare global { namespace Express { interface Request { newAccessToken?: string; - user_email?: string; + user_id?: number | undefined; + user_email?: string | undefined; } } } diff --git a/src/db/models/board.ts b/src/db/models/board.ts index 8f70e36..ddb6ce3 100644 --- a/src/db/models/board.ts +++ b/src/db/models/board.ts @@ -14,10 +14,15 @@ import { import { sequelize } from './index'; import { Users } from './user'; interface BoardAttributes { + id: number | undefined; + writer: string | undefined; title: string; + user_id: number | undefined; } export class Boards extends Model { + public readonly id!: number; + public writer!: string; public title!: string; static associations: { boardBelongsToUser: Association; @@ -26,7 +31,14 @@ export class Boards extends Model { } Boards.init( { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + writer: DataTypes.STRING, title: DataTypes.STRING, + user_id: DataTypes.INTEGER, }, { sequelize, @@ -35,7 +47,7 @@ Boards.init( ); Boards.belongsTo(Users, { - foreignKey: 'writer', + foreignKey: 'user_id', targetKey: 'id', });