From 59798a8b8ce37b7c7ef2bd9f2e908e823d9ec4f8 Mon Sep 17 00:00:00 2001 From: uommou <90598552+uommou@users.noreply.github.com> Date: Sat, 23 Mar 2024 17:42:46 +0900 Subject: [PATCH] =?UTF-8?q?Revert=20"[feat]=20mypage=20=EC=99=84=EC=84=B1"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cicd.yml | 24 +----- controller/chatGpt.js | 54 ++++---------- controller/user.js | 148 ++++++++++--------------------------- results.json | 36 +++++---- server.js | 49 ++++++------ 5 files changed, 106 insertions(+), 205 deletions(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index bd01827..520e0a6 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -2,7 +2,7 @@ name: Node.js CI/CD on: push: - branches: [ main, dev, feat/cicd ] + branches: [ main, feat/cicd ] pull_request: branches: [ main ] @@ -52,30 +52,14 @@ jobs: uses: docker/build-push-action@v2 with: push: true - tags: asia-northeast3-docker.pkg.dev/ancient-ivy-416408/groom/${{ github.ref == 'refs/heads/main' && 'decalcomanie' || 'decalcomanie-dev' }}:latest + tags: asia-northeast3-docker.pkg.dev/ancient-ivy-416408/groom/decalcomanie:latest file: Dockerfile context: . - name: Deploy to Cloud Run uses: google-github-actions/deploy-cloudrun@v0.5.0 with: - service: ${{ github.ref == 'refs/heads/main' && 'decalcomanie' || 'decalcomanie-dev' }} - image: asia-northeast3-docker.pkg.dev/ancient-ivy-416408/groom/${{ github.ref == 'refs/heads/main' && 'decalcomanie' || 'decalcomanie-dev' }}:latest + service: decalcomanie + image: asia-northeast3-docker.pkg.dev/ancient-ivy-416408/groom/decalcomanie:latest region: asia-northeast3 credentials: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }} - - # - name: Build and push Docker image - # uses: docker/build-push-action@v2 - # with: - # push: true - # tags: asia-northeast3-docker.pkg.dev/ancient-ivy-416408/groom/decalcomanie:latest - # file: Dockerfile - # context: . - - # - name: Deploy to Cloud Run - # uses: google-github-actions/deploy-cloudrun@v0.5.0 - # with: - # service: decalcomanie - # image: asia-northeast3-docker.pkg.dev/ancient-ivy-416408/groom/decalcomanie:latest - # region: asia-northeast3 - # credentials: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }} diff --git a/controller/chatGpt.js b/controller/chatGpt.js index 8c25cd7..e242b6b 100644 --- a/controller/chatGpt.js +++ b/controller/chatGpt.js @@ -48,9 +48,9 @@ const chatGpiApi = async (req, res) => { const query_comments = crawlResult.comments.map((comment, index) => `comment ${index + 1}: ${comment}`).join('\n'); // console.log(query_comments); - //const message = prompt + query_comments; + const message = prompt + query_comments; // 죄종 버전은 원샷 추가하기 - const message = prompt + oneShot + query_comments; + //const message = prompt + oneShot + query_comments; // ChatGPT API에 요청을 보내기 위한 데이터 준비 const data = { @@ -81,51 +81,25 @@ const chatGpiApi = async (req, res) => { feedback: contentOnly }; - const userId = req.id; // 인증 미들웨어에서 추가된 사용자 ID - - // 웹툰 생성 또는 찾기 - const [createdWebtoon, created] = await models.webtoon.findOrCreate({ - where: { webtoon_title: crawlResult.title }, - defaults: { - webtoon_title: crawlResult.title, - user_id: userId // 웹툰과 관련된 사용자 ID 추가 - } + // 웹툰 생성 + const createdWebtoon = await models.webtoon.create({ + webtoon_title: crawlResult.title }); // 생성된 웹툰의 ID 가져오기 const webtoonId = createdWebtoon.id; - // 데이터베이스에 피드백 저장 또는 업데이트 - const feedbackExists = await models.feedback.findOne({ - where: { - subtitle: crawlResult.subtitle, - webtoon_id: webtoonId - } + // 데이터베이스에 저장 + models.feedback.create({ + link: url, // 링크 + feedback: contentOnly, // 필터링된 댓글 + subtitle: crawlResult.subtitle, // 소제목 + webtoon_id: webtoonId // 웹툰 ID 추가 }); - if (feedbackExists) { - // 동일한 소제목을 가진 피드백이 존재한다면, 업데이트 - await models.feedback.update({ - link: url, // 링크 업데이트 - feedback: contentOnly, // 필터링된 댓글 업데이트 - number: crawlResult.number, - comments: query_comments, // 댓글들 업데이트 - }, { - where: { - id: feedbackExists.id // 업데이트할 피드백 ID 지정 - } - }); - } else { - // 존재하지 않는다면, 새로운 피드백 생성 - await models.feedback.create({ - link: url, // 링크 - feedback: contentOnly, // 필터링된 댓글 - number: crawlResult.number, - subtitle: crawlResult.subtitle, // 소제목 - comments: query_comments, // 댓글들 - webtoon_id: webtoonId, // 웹툰 ID 추가 - }); - } + models.webtoon.create({ + webtoon_title: crawlResult.title + }); // 클라이언트에 응답 반환 res.json(gptFeedback); diff --git a/controller/user.js b/controller/user.js index 84424bf..8704950 100644 --- a/controller/user.js +++ b/controller/user.js @@ -40,120 +40,52 @@ const signupApi = (req, res) => { }); } -const loginApi = async (req, res) => { - try { - const foundData = await models.user.findOne({ - where: { - email: req.body.email - } - }); - +const loginApi = (req, res) => { + models.user.findOne({ + where: { + email: req.body.email + } + }) + .then((foundData) => { if (!foundData) { return res.status(404).json({ error: "해당 이메일이 없습니다." }); - } - - const passwordMatch = await bcrypt.compare(req.body.password, foundData.password); - - if (passwordMatch) { - const accessToken = jwt.sign({ - id: foundData.id, - email: foundData.email, - name: foundData.name, - }, "accesstoken", { - expiresIn: '1d', // 여기에서 토큰 만료 시간을 1일로 설정 - issuer: "About Tech", - }); - - // 액세스 토큰을 응답 본문에 포함시킴 - return res.status(200).json({ message: "success login!", accessToken }); } else { - return res.status(401).json({ error: "비밀번호가 일치하지 않습니다." }); - } - } catch (error) { - console.error('로그인 중 에러 발생:', error); - return res.status(500).send(error); - } -} - -const feedbackListApi = async (req, res) => { - try { - const userId = req.id; // 요청에서 사용자 ID 가져오기 - - // webtoon TB에서 가져오기 - const userWebtoons = await models.webtoon.findAll({ - where: { - user_id: userId - }, - attributes: ['id', 'webtoon_title'] // 'webtoon_title'을 'title'로 변경, 데이터베이스 스키마에 맞게 조정 필요 - }); - - const feedbacks_array = []; - - for (const userWebtoon of userWebtoons) { - const webtoonId = userWebtoon.id; - - // feedback TB에서 가져오기 - const webtoonFeedbacks = await models.feedback.findAll({ - where: { - webtoon_id: webtoonId - }, - attributes: ['number', 'subtitle'] // 필요한 속성만 지정 + bcrypt.compare(req.body.password, foundData.password, function(err, result) { + if (err) throw err; + if (result) { + console.log("로그인 성공!"); + try { + const accessToken = jwt.sign({ // jwt생성 + id: foundData.id, + email: foundData.email, + name: foundData.name, + }, "accesstoken", { + expiresIn: '1h', + issuer: "About Tech", + }); + + res.cookie("accessToken", accessToken, { // 클라이언트에게 쿠키 전달 + secure: false, // https면 true + httpOnly: true, + }); + return res.status(200).json({ message: "success login!" }); + } catch (error) { + console.log(error); + return res.status(500).send(error); + } + } else { + return res.status(401).json({ error: "비밀번호가 일치하지 않습니다." }); + } }); - - // 각 웹툰의 feedbacks를 조정하여 원하는 형식으로 만들기 - const feedbacksFormatted = webtoonFeedbacks.map(feedback => ({ - title: userWebtoon.webtoon_title, // 각 feedback에 웹툰 제목 추가 - number: feedback.number, - subtitle: feedback.subtitle - })); - - feedbacks_array.push(...feedbacksFormatted); // 수정된 feedbacks를 최종 배열에 추가 } - - // 최종 결과 객체 생성 - const result = { - id: req.id, - name: req.name, - email: req.email, - webtoons: feedbacks_array - }; - - // JSON 형태로 반환 - return res.json(result); - } catch (error) { - console.error("Error fetching user webtoons:", error); - return res.status(500).send("Internal Server Error"); - } + }) } -const feedbackSingleApi = async (req, res) => { - const { webtoon_title, feedback_number } = req.body; - try { - const webtoon = await models.webtoon.findOne({ - where: { webtoon_title: webtoon_title } - }); - - if (!webtoon) { - return res.status(404).json({ error: "웹툰을 찾을 수 없습니다." }); - } - - const feedback = await models.feedback.findOne({ - where: { - webtoon_id: webtoon.id, - number: feedback_number - } - }); - - if (!feedback) { - return res.status(404).json({ error: "해당 회차의 피드백을 찾을 수 없습니다." }); - } - - res.json({ feedback: feedback.feedback }); // 수정된 응답 방식 - } catch (error) { - console.error("피드백 조회 중 오류 발생:", error); - res.status(500).json({ error: "서버 내부 오류가 발생했습니다." }); - } -} +// const myPageApi = (req, res) => { +// const userInfo = { name: req.name, email: req.email }; +// // 추가로 필터링된 댓글도 포함하기 +// return res.json(userInfo); +// } const testApi = (req, res) => { const name = req.body.name; @@ -166,4 +98,4 @@ const testApi = (req, res) => { } } -module.exports = {hiApi, loginApi, signupApi, testApi, feedbackListApi, feedbackSingleApi}; \ No newline at end of file +module.exports = {hiApi, loginApi, signupApi, testApi }; \ No newline at end of file diff --git a/results.json b/results.json index be69909..71ec7c5 100644 --- a/results.json +++ b/results.json @@ -1,17 +1,27 @@ { - "title": "99대장", - "number": "016", - "subtitle": "16화", + "title": "경이로운 소문", + "number": "179", + "subtitle": "[시즌3] 43화", "comments": [ - "ㅋㅋㅋㅋㅋㅋㅋ 내 웹툰 역사상 댓글 4개 웹툰은 처음이다", - "1분컷 내용 잘봤습니다~", - "대사 9할이 욕이네...", - "지렷다 Ga!!!!!!!!", - "핫 열번째 댓글", - "....너는 이딱았니....;;;;;", - "나선욱 신격화 쩐다ㅋㅋㅋㅋ", - "캐쉬가 남아서 안볼려다 안볼려다 보는데\n진짜 별 내용 없네요 ㅡㅡ \n진짜 제 손꾸락을 원망합니다 흑흑 \n찐독자분들 화이팅요 전 남은편 마져 보고 \n갑니다", - "님들 님들은 며칠 후나 몇주 뒤 보겠지만 전 아니랍니다 호홓", - "Ga라고 했다고 다 Ga고 댓글도없네 ㅋㅋㅋㅋ" + "진짜 도정우..가족은 건들지마라;;\n양심 뒤진건 아는데 예로부터 가좍이나 친구들을 건드리는 건 각성제라고도 불렸다..\n니 죽을때 조금 더 편히 가려면 적당히 하고 자수해라 호구 자슥아..,", + "적봉이한테 땅 버프 걸면 감지거리 더 늘지 않나?", + "진짜 가족은 건들지 말자^^", + "도정우 이래 건들면 죽여버린다(소문이가)", + "오늘 화를 보니\nHIH가 매우 체계적인 조직으로\n6악인 지부장 위 수뇌도 있을 법함\n 시즌4에서 길게 풀어 주실 듯", + "대륙을 관리하는 6명의 지부장 폼 미쳤다...! \n시즌 넘어간다고 뇌절로 안가고 세계관 확장 \n너무 스무스하네요", + "도정우가 이래 잡으러 움직일텐데, 작품 특성상 비극적인 결말일리는 없지만 뻔한 클리셰도 항상 예측 불가능하게 전개하셔서 이번에도 전혀 예상이 안 되네", + "도정우가 어떻게 이 작면들을 본거죠? 누구 기억을 본거에요? 건물 위에 있어서 못봤었는데", + "정우얀;;이래 건들면 너는 그때 소문이한테 죽는거야..상황파확안 되니..?", + "아 참말로다가 저거 도정우 진짜 쓰레기 저거 지옥가도 모자를 녀석이 이제 이래까지 건드냐 진짜 너 그러면 안돼", + "자가님 \n몇편까지 \n시원하게 백편가시죠\n충전도 만땅했는데", + "가 족같네....", + "나만 썸네일에 있는 눈 회장님이라고 생각함..?\n회장님 각성하는 줄 알았는데…ㅜㅜ", + "정우야 이래 건들면 죽여버린다", + "도정우 이♪♪♬, 이래 죽이러 가나보다. 애들이 빨리 알아차려야돼. 늦으면 안돼~", + "도정우 가족 건들면 소문이가 잡으러 간다", + "가족 건들지 마라", + "와 도정우시키 끝까지... 소문이가 얼마나 더 강해져서 어떤식으로 융으로 보내버릴지 기대된다", + "사람이 각성하는 상황 top 5\n1.가족 건들때\n2.연인 건들때\n3.동생이나 형,언니 등 이 라면 한입만이라 할때\n4.화장실에서 볼일볼때\n5.롤 승급전 할때", + "저런 학폭의 가해자는 절대로 바뀌지 않는다. 판사나부랭이들아 “반성의 여지가 있고, 초범인 점을 감안해…” 이딴 판결은 장발장에게 하고, 도정우나 은진이년 같은 경우는 병으로 간주하여 영구히 격리병동 수준의 감옥으로 보내는 것이 마땅하다." ] } \ No newline at end of file diff --git a/server.js b/server.js index 2403ae8..ccda9b7 100644 --- a/server.js +++ b/server.js @@ -15,35 +15,36 @@ const userController = require('./controller/user.js'); const chatController = require('./controller/chatGpt.js'); const crawlController = require('./controller/crawl.js'); +// 미들 웨어 function verifyToken(req, res, next) { - try { - // 'Authorization' 헤더에서 토큰을 추출 - const authHeader = req.headers['authorization']; + const token = req.cookies['accessToken']; // accessToken추출 - // 'Authorization' 헤더 값이 Bearer 토큰 형식인지 확인 - if (!authHeader || !authHeader.startsWith('Bearer ')) { - return res.status(403).json({ error: '토큰이 제공되지 않았거나, Bearer 타입이 아닙니다.' }); - } + console.log(token); - // 'Bearer '를 제거하고 실제 토큰 값만 추출 - const token = authHeader.substring(7, authHeader.length); + // token이 존재하지 않으면 + if (!token) { + return res.status(403).json('notoken'); + } + // token이 존재하면 + else { + const secretKey = "accesstoken"; // jwt를 사용하여 토큰 유효성 검증 - jwt.verify(token, 'accesstoken', (err, decoded) => { + jwt.verify(token, secretKey, (err, decoded) => { if (err) { - // 토큰이 유효하지 않으면 - return res.status(401).json({message: 'TokenFail'}); - } else { - // 검증된 토큰에서 사용자 정보를 추출하여 요청 객체에 저장 - req.id = decoded.id; + res.clearCookie('accessToken', {path: '/', exprise: new Date(0)}); + return res.status(401).json({message:'TokenFail'}); + } + else { + // 복호화된 토큰의 내용 확인 + console.log('이메일: ', decoded.email); + console.log('사용자 이름: ', decoded.name); req.email = decoded.email; req.name = decoded.name; - next(); // 다음 미들웨어로 제어를 넘깁니다. + req.email = decoded.email; + next(); } - }); - } catch (error) { - console.error('토큰 검증 중 에러 발생:', error); - return res.status(500).json({ error: '서버 에러' }); + }) } } @@ -62,11 +63,11 @@ app.post('/signup', userController.signupApi); // 로그인 API app.post('/login', userController.loginApi); -// 마이페이지 리스트 API -app.get('/feedback/list', verifyToken, userController.feedbackListApi); +// 마이페이지 API +//app.get('/mypage', verifyToken, userController.myPageApi); -// 마이페이지 싱글 코멘트 API -app.post('/feedback/single', userController.feedbackSingleApi); +// test API +//app.post('/test', userController.testApi); app.listen(port, () => { console.log(`Server is running at ${port}!`);