From 6a041daa665b23cf4e6b9b5b81b2744e70de842b Mon Sep 17 00:00:00 2001 From: jinsil Date: Mon, 14 Oct 2024 14:54:06 +0900 Subject: [PATCH 01/18] =?UTF-8?q?fix:=20=EB=AA=A8=EC=A7=91=20=EB=A7=88?= =?UTF-8?q?=EA=B0=90=20->=20=EC=A2=85=EB=A3=8C=EB=90=9C=20=EB=B0=A9?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/shared/roomList/RoomList.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/shared/roomList/RoomList.tsx b/frontend/src/components/shared/roomList/RoomList.tsx index dd6f4e26c..4b58e269a 100644 --- a/frontend/src/components/shared/roomList/RoomList.tsx +++ b/frontend/src/components/shared/roomList/RoomList.tsx @@ -19,7 +19,7 @@ const RoomEmptyText = { participated: "참여한 방이 없습니다.", progress: "진행 중인 방이 없습니다.", opened: "모집 중인 방이 없습니다.", - closed: "모집 마감된 방이 없습니다.", + closed: "종료된 방이 없습니다.", }; const RoomList = ({ From 22cffc387e067aa5dd1a68f7fe038328444974af Mon Sep 17 00:00:00 2001 From: jinsil Date: Mon, 14 Oct 2024 15:13:32 +0900 Subject: [PATCH 02/18] =?UTF-8?q?fix:=20=EB=A7=A4=EC=B9=AD=20=ED=9B=84=20p?= =?UTF-8?q?r=20=EC=A0=9C=EC=B6=9C=20=EC=95=88=20=ED=95=B4=EC=84=9C=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=ED=96=88=EC=9D=84=20=EB=95=8C=20=EB=B0=94?= =?UTF-8?q?=EB=A1=9C=20=EB=AC=B8=EA=B5=AC=20=EB=9D=84=EC=9A=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomDetailPage/myReviewee/MyReviewee.tsx | 15 ++++++++++----- .../roomDetailPage/myReviewer/MyReviewer.tsx | 15 ++++++++++----- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/frontend/src/components/roomDetailPage/myReviewee/MyReviewee.tsx b/frontend/src/components/roomDetailPage/myReviewee/MyReviewee.tsx index 2226f12f8..8a6b9e440 100644 --- a/frontend/src/components/roomDetailPage/myReviewee/MyReviewee.tsx +++ b/frontend/src/components/roomDetailPage/myReviewee/MyReviewee.tsx @@ -96,15 +96,20 @@ const MyReviewee = ({ roomInfo }: MyReviewerProps) => { ); } + // 매칭 후 PR 제출 안 해서 매칭 실패했을 때 보여줄 화면 + if (roomInfo.participationStatus === "PULL_REQUEST_NOT_SUBMITTED") { + return ( + +

{MESSAGES.GUIDANCE.PULL_REQUEST_NOT_SUBMITTED}

+
+ ); + } + // 방 종료 후 실패했을 때 보여줄 화면 if (roomInfo.roomStatus === "CLOSE" && revieweeData.length === 0) { return ( -

- {roomInfo.participationStatus === "PULL_REQUEST_NOT_SUBMITTED" - ? MESSAGES.GUIDANCE.PULL_REQUEST_NOT_SUBMITTED - : MESSAGES.GUIDANCE.FAIL_MATCHED} -

+

{MESSAGES.GUIDANCE.FAIL_MATCHED}

); } diff --git a/frontend/src/components/roomDetailPage/myReviewer/MyReviewer.tsx b/frontend/src/components/roomDetailPage/myReviewer/MyReviewer.tsx index 48c57d644..674715251 100644 --- a/frontend/src/components/roomDetailPage/myReviewer/MyReviewer.tsx +++ b/frontend/src/components/roomDetailPage/myReviewer/MyReviewer.tsx @@ -84,15 +84,20 @@ const MyReviewer = ({ roomInfo }: MyReviewerProps) => { ); } + // 매칭 후 PR 제출 안 해서 매칭 실패했을 때 보여줄 화면 + if (roomInfo.participationStatus === "PULL_REQUEST_NOT_SUBMITTED") { + return ( + +

{MESSAGES.GUIDANCE.PULL_REQUEST_NOT_SUBMITTED}

+
+ ); + } + // 방 종료 후 실패했을 때 보여줄 화면 if (roomInfo.roomStatus === "CLOSE" && reviewerData.length === 0) { return ( -

- {roomInfo.participationStatus === "PULL_REQUEST_NOT_SUBMITTED" - ? MESSAGES.GUIDANCE.PULL_REQUEST_NOT_SUBMITTED - : MESSAGES.GUIDANCE.FAIL_MATCHED} -

+

{MESSAGES.GUIDANCE.FAIL_MATCHED}

); } From 17b125eb1c5879eb585f1920f9e97b8fed83d3d0 Mon Sep 17 00:00:00 2001 From: jinsil Date: Mon, 14 Oct 2024 15:29:23 +0900 Subject: [PATCH 03/18] =?UTF-8?q?design:=20=EB=AA=A8=EB=8B=AC=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=97=90=20width=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/shared/roomCardModal/RoomCardModal.style.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/components/shared/roomCardModal/RoomCardModal.style.ts b/frontend/src/components/shared/roomCardModal/RoomCardModal.style.ts index f66998b63..e028aafbe 100644 --- a/frontend/src/components/shared/roomCardModal/RoomCardModal.style.ts +++ b/frontend/src/components/shared/roomCardModal/RoomCardModal.style.ts @@ -75,7 +75,7 @@ export const ProfileContainer = styled.div` } span { - width: 168px; + max-width: 168px; font: ${({ theme }) => theme.TEXT.small}; text-overflow: ellipsis; white-space: nowrap; From 84c1aa3207c151772d0f3b3359bae81af1f33e13 Mon Sep 17 00:00:00 2001 From: jinsil Date: Mon, 14 Oct 2024 15:45:54 +0900 Subject: [PATCH 04/18] =?UTF-8?q?design:=20=ED=94=84=EB=A1=9C=ED=95=84=20?= =?UTF-8?q?=EB=93=9C=EB=A1=AD=EB=8B=A4=EC=9A=B4=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=8B=A4=20=EB=B3=B4=EC=97=AC=EC=A7=80?= =?UTF-8?q?=EA=B2=8C=20=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/common/header/ProfileDropdown.style.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/common/header/ProfileDropdown.style.ts b/frontend/src/components/common/header/ProfileDropdown.style.ts index 307c5c685..5ffa6f122 100644 --- a/frontend/src/components/common/header/ProfileDropdown.style.ts +++ b/frontend/src/components/common/header/ProfileDropdown.style.ts @@ -25,11 +25,12 @@ export const DropdownMenu = styled.div<{ show: boolean }>` min-width: 200px; padding: 1rem; - animation: ${dropdown} 0.4s ease; background-color: white; border-radius: 12px; box-shadow: 0 0 7px 1px ${({ theme }) => theme.COLOR.primary2}; + + animation: ${dropdown} 0.4s ease; `; export const ProfileWrapper = styled.div` @@ -42,6 +43,7 @@ export const ProfileInfo = styled.div` display: flex; flex-direction: column; gap: 0.4rem; + width: fit-content; strong { font: ${({ theme }) => theme.TEXT.medium_bold}; From d7dd326aff7562c3752312c503471e2b5ea584fb Mon Sep 17 00:00:00 2001 From: jinsil Date: Mon, 14 Oct 2024 15:55:40 +0900 Subject: [PATCH 05/18] =?UTF-8?q?design:=20=EB=B0=B0=EB=84=88=20medium?= =?UTF-8?q?=EC=9D=BC=20=EB=95=8C=20=EB=86=92=EC=9D=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/main/banner/CyclingClasses.style.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/main/banner/CyclingClasses.style.ts b/frontend/src/components/main/banner/CyclingClasses.style.ts index 08bb7edbb..2453f29b6 100644 --- a/frontend/src/components/main/banner/CyclingClasses.style.ts +++ b/frontend/src/components/main/banner/CyclingClasses.style.ts @@ -3,7 +3,11 @@ import media from "@/styles/media"; export const CyclingContainer = styled.div` overflow: hidden; - height: 54px; + height: 60px; + + ${media.medium` + height: 42px; + `} `; export const CyclingList = styled.ul` @@ -13,9 +17,9 @@ export const CyclingList = styled.ul` flex-direction: column; align-items: flex-end; - width: 160px; + width: 180px; height: 52px; - padding: 0.2rem; + padding: 1rem; font-family: "Do Hyeon", sans-serif; font-size: 8rem; @@ -42,7 +46,7 @@ export const CyclingList = styled.ul` } ${media.medium` - width: 120px; + width: 150px; height: 40px; font-size: 6.4rem; `} From 7c29869ba661a1c49f4ee0b76be85fb75f7c27d0 Mon Sep 17 00:00:00 2001 From: jinsil Date: Mon, 14 Oct 2024 16:03:12 +0900 Subject: [PATCH 06/18] =?UTF-8?q?feat:=20timeDropdown=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=EB=90=9C=20=EC=8B=9C=EA=B0=84=EC=9D=B4=20?= =?UTF-8?q?=EC=A0=9C=EC=9D=BC=20=EC=9C=84=EC=97=90=20=EB=96=A0=EC=9E=88?= =?UTF-8?q?=EA=B2=8C=20=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/timeDropdown/TimeDropdown.tsx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/common/timeDropdown/TimeDropdown.tsx b/frontend/src/components/common/timeDropdown/TimeDropdown.tsx index af2b209a4..8b9214b78 100644 --- a/frontend/src/components/common/timeDropdown/TimeDropdown.tsx +++ b/frontend/src/components/common/timeDropdown/TimeDropdown.tsx @@ -1,4 +1,4 @@ -import { InputHTMLAttributes } from "react"; +import React, { InputHTMLAttributes, useEffect, useRef } from "react"; import useDropdown from "@/hooks/common/useDropdown"; import * as S from "@/components/common/timeDropdown/TimeDropdown.style"; import { formatTime } from "@/utils/dateFormatter"; @@ -21,6 +21,18 @@ const TimePicker = ({ time: Date; onTimeInputChange: (event: TimeDropdownChangeProps) => void; }) => { + const hourRef = useRef(null); + const minuteRef = useRef(null); + + useEffect(() => { + if (hourRef.current) { + hourRef.current.scrollIntoView({ block: "start" }); + } + if (minuteRef.current) { + minuteRef.current.scrollIntoView({ block: "start" }); + } + }, [time]); + return ( @@ -28,6 +40,7 @@ const TimePicker = ({ { const newTime = new Date(time); newTime.setHours(hour); @@ -44,6 +57,7 @@ const TimePicker = ({ { const newTime = new Date(time); newTime.setMinutes(minute); From eadd44781ed92dffc02355bcf2980127f5b60408 Mon Sep 17 00:00:00 2001 From: jinsil Date: Mon, 14 Oct 2024 16:18:05 +0900 Subject: [PATCH 07/18] =?UTF-8?q?feat:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EB=AA=A8=EC=95=84=EB=B3=B4=EA=B8=B0=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=84=B8=EB=B6=80=20=ED=94=BC=EB=93=9C=EB=B0=B1=EC=97=90=20scr?= =?UTF-8?q?oll=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/feedback/feedbackCard/FeedbackCard.style.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/src/components/feedback/feedbackCard/FeedbackCard.style.ts b/frontend/src/components/feedback/feedbackCard/FeedbackCard.style.ts index 83c81d5a2..9a7bb096e 100644 --- a/frontend/src/components/feedback/feedbackCard/FeedbackCard.style.ts +++ b/frontend/src/components/feedback/feedbackCard/FeedbackCard.style.ts @@ -101,9 +101,7 @@ export const FeedbackDetailContainer = styled.div` `; export const FeedbackDetail = styled.p` - overflow: hidden; - - height: 120px; + overflow: hidden auto; font: ${({ theme }) => theme.TEXT.small}; line-height: 2rem; From 9a45c8e5a3aae0d15915f97fa4e757dbe7819c74 Mon Sep 17 00:00:00 2001 From: jinsil Date: Mon, 14 Oct 2024 16:20:22 +0900 Subject: [PATCH 08/18] =?UTF-8?q?design:=20=EC=84=B8=EB=B6=80=20=ED=94=BC?= =?UTF-8?q?=EB=93=9C=EB=B0=B1=20=EB=86=92=EC=9D=B4=20=EC=A7=80=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/feedback/feedbackCard/FeedbackCard.style.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/components/feedback/feedbackCard/FeedbackCard.style.ts b/frontend/src/components/feedback/feedbackCard/FeedbackCard.style.ts index 9a7bb096e..233278e6c 100644 --- a/frontend/src/components/feedback/feedbackCard/FeedbackCard.style.ts +++ b/frontend/src/components/feedback/feedbackCard/FeedbackCard.style.ts @@ -103,6 +103,8 @@ export const FeedbackDetailContainer = styled.div` export const FeedbackDetail = styled.p` overflow: hidden auto; + height: 172px; + font: ${({ theme }) => theme.TEXT.small}; line-height: 2rem; text-overflow: ellipsis; From 2fa16e5c1937dedf5115dbddb5965f3798a93168 Mon Sep 17 00:00:00 2001 From: jinsil Date: Mon, 14 Oct 2024 17:03:40 +0900 Subject: [PATCH 09/18] =?UTF-8?q?fix:=20content=20=EA=B8=B8=EC=9D=B4=20?= =?UTF-8?q?=EA=B8=B8=EC=96=B4=EC=A1=8C=EC=9D=84=20=EB=95=8C=20...=20?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=B4=EC=9D=B4=EA=B2=8C=20=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../profile/profileCard/ProfileCard.style.ts | 10 +++++-- .../myReviewee/MyReviewee.style.ts | 26 +++++++++++++++- .../roomDetailPage/myReviewee/MyReviewee.tsx | 2 +- .../myReviewer/MyReviewer.style.ts | 30 +++++++++++++++++-- .../roomDetailPage/myReviewer/MyReviewer.tsx | 2 +- .../participantList/ParticipantList.style.ts | 6 ++++ .../roomInfoCard/RoomInfoCard.style.ts | 14 +++++++-- .../roomInfoCard/RoomInfoCard.tsx | 2 +- .../roomCardModal/RoomCardModal.style.ts | 3 ++ 9 files changed, 84 insertions(+), 11 deletions(-) diff --git a/frontend/src/components/profile/profileCard/ProfileCard.style.ts b/frontend/src/components/profile/profileCard/ProfileCard.style.ts index b7a0b74de..82193b116 100644 --- a/frontend/src/components/profile/profileCard/ProfileCard.style.ts +++ b/frontend/src/components/profile/profileCard/ProfileCard.style.ts @@ -1,11 +1,10 @@ -import { decorators } from "./../../../../.storybook/preview"; import styled from "styled-components"; export const ProfileCardContainer = styled.div` width: 100%; + padding: 1rem; border: 1px solid ${({ theme }) => theme.COLOR.grey1}; border-radius: 20px; - padding: 1rem; `; export const ProfileTitle = styled.div` @@ -30,10 +29,17 @@ export const ProfileWrapper = styled.div` `; export const ProfileNickname = styled.div` + overflow: hidden; + + max-width: 108px; + height: 24px; + font: ${({ theme }) => theme.TEXT.medium_bold}; color: ${({ theme }) => theme.COLOR.grey3}; text-align: center; text-decoration: underline; + text-overflow: ellipsis; + white-space: nowrap; &:hover { color: ${({ theme }) => theme.COLOR.primary2}; diff --git a/frontend/src/components/roomDetailPage/myReviewee/MyReviewee.style.ts b/frontend/src/components/roomDetailPage/myReviewee/MyReviewee.style.ts index 63f61460e..a694d1cb1 100644 --- a/frontend/src/components/roomDetailPage/myReviewee/MyReviewee.style.ts +++ b/frontend/src/components/roomDetailPage/myReviewee/MyReviewee.style.ts @@ -43,6 +43,30 @@ export const MyRevieweeContent = styled.span` } `; +export const MyRevieweeId = styled.span` + overflow: hidden; + display: block; + + box-sizing: border-box; + width: 100%; + max-width: 100px; + height: 40px; + + font: ${({ theme }) => theme.TEXT.semiSmall}; + line-height: 40px; + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; + + ${media.medium` + max-width: 120px; + `} + + ${media.large` + max-width: 100%; + `} +`; + export const PRLink = styled.a` cursor: pointer; @@ -63,7 +87,7 @@ export const PRLink = styled.a` export const IconWrapper = styled.span` ${media.small` display: none; -`} + `} `; export const GuidanceWrapper = styled.div` diff --git a/frontend/src/components/roomDetailPage/myReviewee/MyReviewee.tsx b/frontend/src/components/roomDetailPage/myReviewee/MyReviewee.tsx index 8a6b9e440..86df259ee 100644 --- a/frontend/src/components/roomDetailPage/myReviewee/MyReviewee.tsx +++ b/frontend/src/components/roomDetailPage/myReviewee/MyReviewee.tsx @@ -143,7 +143,7 @@ const MyReviewee = ({ roomInfo }: MyReviewerProps) => { {revieweeData?.map((reviewee) => ( - {reviewee.username} + {reviewee.username} diff --git a/frontend/src/components/roomDetailPage/myReviewer/MyReviewer.style.ts b/frontend/src/components/roomDetailPage/myReviewer/MyReviewer.style.ts index 7e243af19..d2dc190a4 100644 --- a/frontend/src/components/roomDetailPage/myReviewer/MyReviewer.style.ts +++ b/frontend/src/components/roomDetailPage/myReviewer/MyReviewer.style.ts @@ -12,9 +12,10 @@ export const MyReviewerWrapper = styled.div` display: grid; grid-template-columns: 1fr 1fr 1fr; place-items: center center; - padding: 0.7rem 1rem; - height: 40px; + box-sizing: content-box; + height: 40px; + padding: 0.7rem 1rem; &:not(:last-child) { border-bottom: 1px solid ${({ theme }) => theme.COLOR.grey1}; @@ -32,6 +33,7 @@ export const MyReviewerContent = styled.span` display: flex; align-items: center; justify-content: center; + height: 40px; font: ${({ theme }) => theme.TEXT.semiSmall}; @@ -43,6 +45,30 @@ export const MyReviewerContent = styled.span` } `; +export const MyReviewerId = styled.span` + overflow: hidden; + display: block; + + box-sizing: border-box; + width: 100%; + max-width: 100px; + height: 40px; + + font: ${({ theme }) => theme.TEXT.semiSmall}; + line-height: 40px; + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; + + ${media.medium` + max-width: 120px; + `} + + ${media.large` + max-width: 100%; + `} +`; + export const PRLink = styled.a` cursor: pointer; diff --git a/frontend/src/components/roomDetailPage/myReviewer/MyReviewer.tsx b/frontend/src/components/roomDetailPage/myReviewer/MyReviewer.tsx index 674715251..06086dc0c 100644 --- a/frontend/src/components/roomDetailPage/myReviewer/MyReviewer.tsx +++ b/frontend/src/components/roomDetailPage/myReviewer/MyReviewer.tsx @@ -132,7 +132,7 @@ const MyReviewer = ({ roomInfo }: MyReviewerProps) => { return ( - {reviewer.username} + {reviewer.username} {reviewer.link.length !== 0 ? ( diff --git a/frontend/src/components/roomDetailPage/participantList/ParticipantList.style.ts b/frontend/src/components/roomDetailPage/participantList/ParticipantList.style.ts index 06d484495..ac4fefdd6 100644 --- a/frontend/src/components/roomDetailPage/participantList/ParticipantList.style.ts +++ b/frontend/src/components/roomDetailPage/participantList/ParticipantList.style.ts @@ -68,8 +68,14 @@ export const ProfileWrapper = styled.div` `; export const ProfileNickname = styled.div` + overflow: hidden; + + max-width: 80rem; + font: ${({ theme }) => theme.TEXT.small}; text-align: center; + text-overflow: ellipsis; + white-space: nowrap; `; export const PRLink = styled.a` diff --git a/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.style.ts b/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.style.ts index e97b3e300..585814bf4 100644 --- a/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.style.ts +++ b/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.style.ts @@ -102,13 +102,22 @@ export const RoomContentSmall = styled.span` font: ${({ theme }) => theme.TEXT.small_bold}; line-height: 2rem; color: ${({ theme }) => theme.COLOR.black}; - white-space: pre-line; span { font: ${({ theme }) => theme.TEXT.small}; color: ${({ theme }) => theme.COLOR.grey4}; } + span#githubid { + overflow: hidden; + + max-width: 210px; + + font: ${({ theme }) => theme.TEXT.small_bold}; + text-overflow: ellipsis; + white-space: nowrap; + } + div { display: flex; flex-direction: row; @@ -123,8 +132,7 @@ export const RoomContentSmall = styled.span` export const ContentLineBreak = styled.div` display: flex; - flex-direction: row; - flex-wrap: wrap; + flex-flow: row wrap; `; export const DateTimeText = styled.p` diff --git a/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.tsx b/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.tsx index 8dcc7f7cd..1c869fdb0 100644 --- a/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.tsx +++ b/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.tsx @@ -42,7 +42,7 @@ const RoomInfoCard = ({ roomInfo }: { roomInfo: RoomInfo }) => { 방 생성자 : - {roomInfo.manager} + {roomInfo.manager} diff --git a/frontend/src/components/shared/roomCardModal/RoomCardModal.style.ts b/frontend/src/components/shared/roomCardModal/RoomCardModal.style.ts index e028aafbe..f6d05cbb2 100644 --- a/frontend/src/components/shared/roomCardModal/RoomCardModal.style.ts +++ b/frontend/src/components/shared/roomCardModal/RoomCardModal.style.ts @@ -75,7 +75,10 @@ export const ProfileContainer = styled.div` } span { + overflow: hidden; + max-width: 168px; + font: ${({ theme }) => theme.TEXT.small}; text-overflow: ellipsis; white-space: nowrap; From 1bcb99030f82b3a547f382bdf73d089373f4cf24 Mon Sep 17 00:00:00 2001 From: jinsil Date: Mon, 14 Oct 2024 17:16:34 +0900 Subject: [PATCH 10/18] =?UTF-8?q?design:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EB=AA=A8=EB=8B=AC=20=EC=97=94=ED=84=B0=EC=B2=98=EB=A6=AC,=20li?= =?UTF-8?q?ne-height=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/common/textarea/Textarea.style.ts | 1 + .../components/feedback/feedbackCard/FeedbackCard.style.ts | 2 +- .../components/feedback/feedbackForm/FeedbackForm.style.ts | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/common/textarea/Textarea.style.ts b/frontend/src/components/common/textarea/Textarea.style.ts index 3091d8ae6..518a570e7 100644 --- a/frontend/src/components/common/textarea/Textarea.style.ts +++ b/frontend/src/components/common/textarea/Textarea.style.ts @@ -14,6 +14,7 @@ export const StyledTextarea = styled.textarea<{ $error: boolean }>` padding: 0.6rem 1.1rem; font: ${({ theme }) => theme.TEXT.semiSmall}; + line-height: 2.2rem; border: 1px solid ${(props) => (props.$error ? props.theme.COLOR.error : props.theme.COLOR.grey1)}; border-radius: 6px; diff --git a/frontend/src/components/feedback/feedbackCard/FeedbackCard.style.ts b/frontend/src/components/feedback/feedbackCard/FeedbackCard.style.ts index 233278e6c..5d29f09fa 100644 --- a/frontend/src/components/feedback/feedbackCard/FeedbackCard.style.ts +++ b/frontend/src/components/feedback/feedbackCard/FeedbackCard.style.ts @@ -106,7 +106,7 @@ export const FeedbackDetail = styled.p` height: 172px; font: ${({ theme }) => theme.TEXT.small}; - line-height: 2rem; + line-height: 2.2rem; text-overflow: ellipsis; white-space: break-spaces; `; diff --git a/frontend/src/components/feedback/feedbackForm/FeedbackForm.style.ts b/frontend/src/components/feedback/feedbackForm/FeedbackForm.style.ts index 0933014a4..749ea82e7 100644 --- a/frontend/src/components/feedback/feedbackForm/FeedbackForm.style.ts +++ b/frontend/src/components/feedback/feedbackForm/FeedbackForm.style.ts @@ -33,6 +33,11 @@ export const ModalQuestion = styled.p` export const StyledTextarea = styled.p` display: flex; + width: 100%; + font: ${({ theme }) => theme.TEXT.small}; + line-height: 2.2rem; + overflow-wrap: break-word; + white-space: pre-wrap; `; From 97ab74b70d9cb5e6a04e1514ccc0ad1f5376c31b Mon Sep 17 00:00:00 2001 From: jinsil Date: Mon, 14 Oct 2024 17:47:10 +0900 Subject: [PATCH 11/18] =?UTF-8?q?feat:=20=EB=B6=84=EB=A5=98=20=EB=93=9C?= =?UTF-8?q?=EB=A1=AD=EB=8B=A4=EC=9A=B4=EC=9C=BC=EB=A1=9C=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=ED=95=98=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/dropdown/Dropdown.style.ts | 12 ++++---- .../components/common/dropdown/Dropdown.tsx | 28 +++++++++---------- .../src/pages/roomCreate/RoomCreatePage.tsx | 28 +++++++++++++------ 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/frontend/src/components/common/dropdown/Dropdown.style.ts b/frontend/src/components/common/dropdown/Dropdown.style.ts index 53245b002..50a81323a 100644 --- a/frontend/src/components/common/dropdown/Dropdown.style.ts +++ b/frontend/src/components/common/dropdown/Dropdown.style.ts @@ -12,11 +12,10 @@ const dropdown = keyframes` `; export const DropdownContainer = styled.div` + cursor: pointer; position: relative; width: 160px; height: 40px; - - cursor: pointer; `; export const DropdownToggle = styled.div` @@ -31,16 +30,16 @@ export const DropdownToggle = styled.div` font: ${({ theme }) => theme.TEXT.small}; color: ${({ theme }) => theme.COLOR.grey4}; - border: 1px solid ${({ theme }) => theme.COLOR.grey2}; - border-radius: 4px; + border: 1px solid ${({ theme }) => theme.COLOR.grey1}; + border-radius: 6px; `; -export const DropdownMenu = styled.div<{ show: boolean }>` +export const DropdownMenu = styled.div` position: absolute; z-index: 1; right: 0; - display: ${({ show }) => (show ? "flex" : "none")}; + display: flex; flex-direction: column; width: 100%; @@ -48,6 +47,7 @@ export const DropdownMenu = styled.div<{ show: boolean }>` background-color: white; border: 1px solid ${({ theme }) => theme.COLOR.grey1}; border-radius: 4px; + animation: ${dropdown} 0.4s ease; `; diff --git a/frontend/src/components/common/dropdown/Dropdown.tsx b/frontend/src/components/common/dropdown/Dropdown.tsx index 443114464..cf84d0c9a 100644 --- a/frontend/src/components/common/dropdown/Dropdown.tsx +++ b/frontend/src/components/common/dropdown/Dropdown.tsx @@ -21,24 +21,24 @@ const Dropdown = ({ dropdownItems, onSelectCategory, selectedCategory }: Dropdow handleToggleDropdown(); }; - const selectedItem = - dropdownItems.find((item) => item.value === selectedCategory) || dropdownItems[0]; - return ( - {selectedItem.text} - {isDropdownOpen ? : } + {dropdownItems.find((item) => item.value === selectedCategory)?.text || "선택해주세요"} + - - - {dropdownItems.map((item) => ( - handleDropdownItemClick(item.value)}> - {item.text} - - ))} - - + + {isDropdownOpen && ( + + + {dropdownItems.map((item) => ( + handleDropdownItemClick(item.value)}> + {item.text} + + ))} + + + )} ); }; diff --git a/frontend/src/pages/roomCreate/RoomCreatePage.tsx b/frontend/src/pages/roomCreate/RoomCreatePage.tsx index 1cdd3d550..571952981 100644 --- a/frontend/src/pages/roomCreate/RoomCreatePage.tsx +++ b/frontend/src/pages/roomCreate/RoomCreatePage.tsx @@ -5,12 +5,13 @@ import useMutateRoom from "@/hooks/mutations/useMutateRoom"; import Button from "@/components/common/button/Button"; import CalendarDropdown from "@/components/common/calendarDropdown/CalendarDropdown"; import ContentSection from "@/components/common/contentSection/ContentSection"; +import Dropdown, { DropdownItem } from "@/components/common/dropdown/Dropdown"; import { Input } from "@/components/common/input/Input"; import ConfirmModal from "@/components/common/modal/confirmModal/ConfirmModal"; import { Textarea } from "@/components/common/textarea/Textarea"; import { TimeDropdown } from "@/components/common/timeDropdown/TimeDropdown"; import * as S from "@/pages/roomCreate/RoomCreatePage.style"; -import { CreateRoomInfo } from "@/@types/roomInfo"; +import { Classification, CreateRoomInfo } from "@/@types/roomInfo"; import MESSAGES from "@/constants/message"; import { formatCombinedDateTime } from "@/utils/dateFormatter"; @@ -27,6 +28,12 @@ const initialFormState: CreateRoomInfo = { classification: "", }; +const dropdownItems: DropdownItem[] = [ + { text: "안드로이드", value: "ANDROID" }, + { text: "백엔드", value: "BACKEND" }, + { text: "프론트엔드", value: "FRONTEND" }, +]; + const RoomCreatePage = () => { const navigate = useNavigate(); @@ -110,7 +117,7 @@ const RoomCreatePage = () => { - 제목*필수입력 + 제목 *필수입력 { - 분류(FRONTEND, BACKEND, ANDROID) *필수입력 + 분류 *필수입력 - + setFormState((prevState) => ({ + ...prevState, + classification: value as Classification, + })) + } /> From 67224c337fbdedf0a3315aa4e68e42756feb0f2d Mon Sep 17 00:00:00 2001 From: jinsil Date: Mon, 14 Oct 2024 17:51:42 +0900 Subject: [PATCH 12/18] =?UTF-8?q?feat:=20=ED=82=A4=EC=9B=8C=EB=93=9C=20?= =?UTF-8?q?=EC=97=86=EC=9D=84=20=EB=95=8C=20ui=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/@types/roomInfo.ts | 2 +- .../roomInfoCard/RoomInfoCard.style.ts | 5 +++++ .../roomInfoCard/RoomInfoCard.tsx | 22 +++++++++++-------- .../shared/roomCard/RoomCard.style.ts | 10 +++++++-- .../components/shared/roomCard/RoomCard.tsx | 10 ++++++--- 5 files changed, 34 insertions(+), 15 deletions(-) diff --git a/frontend/src/@types/roomInfo.ts b/frontend/src/@types/roomInfo.ts index e947b5cb2..77c9ac83e 100644 --- a/frontend/src/@types/roomInfo.ts +++ b/frontend/src/@types/roomInfo.ts @@ -1,4 +1,4 @@ -export type Classification = "ALL" | "FRONTEND" | "BACKEND" | "ANDROID"; +export type Classification = "FRONTEND" | "BACKEND" | "ANDROID"; export type RoomStatus = "OPEN" | "CLOSE" | "PROGRESS" | "FAIL"; diff --git a/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.style.ts b/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.style.ts index 585814bf4..e20f61574 100644 --- a/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.style.ts +++ b/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.style.ts @@ -94,6 +94,11 @@ export const RoomTagBox = styled.div` gap: 1rem; `; +export const NoKeywordText = styled.span` + font: ${({ theme }) => theme.TEXT.semiSmall}; + color: ${({ theme }) => theme.COLOR.grey2}; +`; + export const RoomContentSmall = styled.span` display: flex; gap: 1rem; diff --git a/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.tsx b/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.tsx index 1c869fdb0..04ac35649 100644 --- a/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.tsx +++ b/frontend/src/components/roomDetailPage/roomInfoCard/RoomInfoCard.tsx @@ -25,15 +25,19 @@ const RoomInfoCard = ({ roomInfo }: { roomInfo: RoomInfo }) => { - {roomInfo.keywords.map((keyword) => ( - {roomInfo.content} diff --git a/frontend/src/components/shared/roomCard/RoomCard.style.ts b/frontend/src/components/shared/roomCard/RoomCard.style.ts index d4b6596b4..662b650d7 100644 --- a/frontend/src/components/shared/roomCard/RoomCard.style.ts +++ b/frontend/src/components/shared/roomCard/RoomCard.style.ts @@ -78,13 +78,14 @@ export const RoomTitle = styled.h2` export const KeywordsContainer = styled.div` display: flex; gap: 2px; + height: 33px; `; export const KeywordWrapper = styled.div` display: flex; - flex-direction: row; + flex-wrap: wrap; gap: 0.5rem; - align-items: center; + align-items: flex-start; `; export const KeywordText = styled.span` @@ -92,6 +93,11 @@ export const KeywordText = styled.span` color: ${({ theme }) => theme.COLOR.grey3}; `; +export const NoKeywordText = styled.span` + font: ${({ theme }) => theme.TEXT.semiSmall}; + color: ${({ theme }) => theme.COLOR.grey2}; +`; + export const EtcContainer = styled.div` display: flex; justify-content: space-between; diff --git a/frontend/src/components/shared/roomCard/RoomCard.tsx b/frontend/src/components/shared/roomCard/RoomCard.tsx index f1ce5d345..5b647f89c 100644 --- a/frontend/src/components/shared/roomCard/RoomCard.tsx +++ b/frontend/src/components/shared/roomCard/RoomCard.tsx @@ -63,9 +63,13 @@ const RoomCard = React.memo(({ roomInfo }: RoomCardProps) => { - {displayedKeywords.map((keyword) => ( - #{keyword} - ))} + {displayedKeywords.length === 1 ? ( + 지정된 키워드 없음 + ) : ( + displayedKeywords.map((keyword) => ( + #{keyword} + )) + )} From 6e663244365860599f45fca3b5437b3300935234 Mon Sep 17 00:00:00 2001 From: jinsil Date: Mon, 14 Oct 2024 18:09:48 +0900 Subject: [PATCH 13/18] =?UTF-8?q?feat:=20=EB=B0=A9=20=EB=A7=A4=EC=B9=AD=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=20=EC=8B=9C=20=EC=84=9C=EB=B2=84=EA=B0=80=20?= =?UTF-8?q?=EC=A4=80=20message=20=EB=9D=84=EC=9A=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/roomDetail/RoomDetailPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/roomDetail/RoomDetailPage.tsx b/frontend/src/pages/roomDetail/RoomDetailPage.tsx index cbfb1517a..3b0b4ba16 100644 --- a/frontend/src/pages/roomDetail/RoomDetailPage.tsx +++ b/frontend/src/pages/roomDetail/RoomDetailPage.tsx @@ -81,7 +81,7 @@ const RoomDetailPage = () => { 매칭 실패시 이미지 -

현재 참여 중인 인원이 충분하지 않아 프로세스가 일찍 종료될 예정입니다.

+

{roomInfo.message}

); From 83c7406eb9b57bc1cb60620a60a556fb60f53957 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 14 Oct 2024 23:00:04 +0900 Subject: [PATCH 14/18] =?UTF-8?q?[BE]=20Room=20Controller=20=EC=97=AD?= =?UTF-8?q?=ED=95=A0=20=EB=B6=84=EB=A6=AC(#595)=20(#596)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: Room Controller 역할 분리 * refactor: 피드백 반영 --------- Co-authored-by: youngsu5582 <98307410+youngsu5582@users.noreply.github.com> --- .../controller/MatchingResultController.java | 32 +++++++ ...MatchingResultControllerSpecification.java | 35 +++++++ .../corea/room/controller/RoomController.java | 40 -------- .../RoomControllerSpecification.java | 72 --------------- .../controller/RoomInquiryController.java | 45 +++++++++ .../RoomInquiryControllerSpecification.java | 60 ++++++++++++ .../room/service/RoomInquiryService.java | 40 ++++++++ .../java/corea/room/service/RoomService.java | 17 ---- .../room/service/RoomInquiryServiceTest.java | 91 +++++++++++++++++++ .../corea/room/service/RoomServiceTest.java | 50 ---------- 10 files changed, 303 insertions(+), 179 deletions(-) create mode 100644 backend/src/main/java/corea/matchresult/controller/MatchingResultController.java create mode 100644 backend/src/main/java/corea/matchresult/controller/MatchingResultControllerSpecification.java create mode 100644 backend/src/main/java/corea/room/controller/RoomInquiryController.java create mode 100644 backend/src/main/java/corea/room/controller/RoomInquiryControllerSpecification.java create mode 100644 backend/src/main/java/corea/room/service/RoomInquiryService.java create mode 100644 backend/src/test/java/corea/room/service/RoomInquiryServiceTest.java diff --git a/backend/src/main/java/corea/matchresult/controller/MatchingResultController.java b/backend/src/main/java/corea/matchresult/controller/MatchingResultController.java new file mode 100644 index 000000000..9bcb253cc --- /dev/null +++ b/backend/src/main/java/corea/matchresult/controller/MatchingResultController.java @@ -0,0 +1,32 @@ +package corea.matchresult.controller; + +import corea.auth.annotation.LoginMember; +import corea.auth.domain.AuthInfo; +import corea.matchresult.dto.MatchResultResponses; +import corea.matchresult.service.MatchResultService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/rooms") +@RequiredArgsConstructor +public class MatchingResultController implements MatchingResultControllerSpecification { + + private final MatchResultService matchResultService; + + @GetMapping("/{id}/reviewers") + public ResponseEntity reviewers(@PathVariable long id, @LoginMember AuthInfo authInfo) { + MatchResultResponses response = matchResultService.findReviewers(authInfo.getId(), id); + return ResponseEntity.ok(response); + } + + @GetMapping("/{id}/reviewees") + public ResponseEntity reviewees(@PathVariable long id, @LoginMember AuthInfo authInfo) { + MatchResultResponses response = matchResultService.findReviewees(authInfo.getId(), id); + return ResponseEntity.ok(response); + } +} diff --git a/backend/src/main/java/corea/matchresult/controller/MatchingResultControllerSpecification.java b/backend/src/main/java/corea/matchresult/controller/MatchingResultControllerSpecification.java new file mode 100644 index 000000000..ae97acb3b --- /dev/null +++ b/backend/src/main/java/corea/matchresult/controller/MatchingResultControllerSpecification.java @@ -0,0 +1,35 @@ +package corea.matchresult.controller; + +import corea.auth.domain.AuthInfo; +import corea.exception.ExceptionType; +import corea.global.annotation.ApiErrorResponses; +import corea.matchresult.dto.MatchResultResponses; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import org.springframework.http.ResponseEntity; + +public interface MatchingResultControllerSpecification { + @Operation(summary = "해당 방에서 나에게 배정된 리뷰어들의 정보를 반환합니다.", + description = "해당 방에서 자신에게 배정된 리뷰어를 확인합니다.
" + + "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + + "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + + "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + + "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + + "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") + @ApiErrorResponses(value = {ExceptionType.MEMBER_NOT_FOUND, ExceptionType.ROOM_NOT_FOUND}) + ResponseEntity reviewers(@Parameter(description = "방 아이디", example = "1") + long id, + AuthInfo authInfo); + + @Operation(summary = "해당 방에서 나에게 배정된 리뷰이들의 정보를 반환합니다.", + description = "해당 방에서 자신에게 배정된 리뷰이를 확인합니다.
" + + "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + + "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + + "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + + "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + + "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") + @ApiErrorResponses(value = {ExceptionType.MEMBER_NOT_FOUND, ExceptionType.ROOM_NOT_FOUND}) + ResponseEntity reviewees(@Parameter(description = "방 아이디", example = "1") + long id, + AuthInfo authInfo); +} diff --git a/backend/src/main/java/corea/room/controller/RoomController.java b/backend/src/main/java/corea/room/controller/RoomController.java index 28aa50ad4..383801fdb 100644 --- a/backend/src/main/java/corea/room/controller/RoomController.java +++ b/backend/src/main/java/corea/room/controller/RoomController.java @@ -3,9 +3,6 @@ import corea.auth.annotation.AccessedMember; import corea.auth.annotation.LoginMember; import corea.auth.domain.AuthInfo; -import corea.matchresult.dto.MatchResultResponses; -import corea.matchresult.service.MatchResultService; -import corea.room.domain.RoomStatus; import corea.room.dto.RoomCreateRequest; import corea.room.dto.RoomParticipantResponses; import corea.room.dto.RoomResponse; @@ -25,7 +22,6 @@ public class RoomController implements RoomControllerSpecification { private final RoomService roomService; - private final MatchResultService matchResultService; private final AutomaticUpdateService automaticUpdateService; private final AutomaticMatchingService automaticMatchingService; @@ -52,48 +48,12 @@ public ResponseEntity participants(@PathVariable long return ResponseEntity.ok(response); } - @GetMapping("/{id}/reviewers") - public ResponseEntity reviewers(@PathVariable long id, @LoginMember AuthInfo authInfo) { - MatchResultResponses response = matchResultService.findReviewers(authInfo.getId(), id); - return ResponseEntity.ok(response); - } - - @GetMapping("/{id}/reviewees") - public ResponseEntity reviewees(@PathVariable long id, @LoginMember AuthInfo authInfo) { - MatchResultResponses response = matchResultService.findReviewees(authInfo.getId(), id); - return ResponseEntity.ok(response); - } - @GetMapping("/participated") public ResponseEntity participatedRooms(@LoginMember AuthInfo authInfo) { RoomResponses response = roomService.findParticipatedRooms(authInfo.getId()); return ResponseEntity.ok(response); } - @GetMapping("/opened") - public ResponseEntity openedRooms(@AccessedMember AuthInfo authInfo, - @RequestParam(defaultValue = "0") int page, - @RequestParam(value = "classification", defaultValue = "all") String expression) { - RoomResponses response = roomService.findRoomsWithRoomStatus(authInfo.getId(), page, expression, RoomStatus.OPEN); - return ResponseEntity.ok(response); - } - - @GetMapping("/progress") - public ResponseEntity progressRooms(@AccessedMember AuthInfo authInfo, - @RequestParam(defaultValue = "0") int page, - @RequestParam(value = "classification", defaultValue = "all") String expression) { - RoomResponses response = roomService.findRoomsWithRoomStatus(authInfo.getId(), page, expression, RoomStatus.PROGRESS); - return ResponseEntity.ok(response); - } - - @GetMapping("/closed") - public ResponseEntity closedRooms(@AccessedMember AuthInfo authInfo, - @RequestParam(defaultValue = "0") int page, - @RequestParam(value = "classification", defaultValue = "all") String expression) { - RoomResponses response = roomService.findRoomsWithRoomStatus(authInfo.getId(), page, expression, RoomStatus.CLOSE); - return ResponseEntity.ok(response); - } - @DeleteMapping("/{id}") public ResponseEntity delete(@PathVariable long id, @LoginMember AuthInfo authInfo) { roomService.delete(id, authInfo.getId()); diff --git a/backend/src/main/java/corea/room/controller/RoomControllerSpecification.java b/backend/src/main/java/corea/room/controller/RoomControllerSpecification.java index b8b380b02..25697fc76 100644 --- a/backend/src/main/java/corea/room/controller/RoomControllerSpecification.java +++ b/backend/src/main/java/corea/room/controller/RoomControllerSpecification.java @@ -50,30 +50,6 @@ ResponseEntity participants(@Parameter(description = " long id, AuthInfo authInfo); - @Operation(summary = "해당 방에서 나에게 배정된 리뷰어들의 정보를 반환합니다.", - description = "해당 방에서 자신에게 배정된 리뷰어를 확인합니다.
" + - "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + - "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + - "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + - "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + - "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") - @ApiErrorResponses(value = {ExceptionType.MEMBER_NOT_FOUND, ExceptionType.ROOM_NOT_FOUND}) - ResponseEntity reviewers(@Parameter(description = "방 아이디", example = "1") - long id, - AuthInfo authInfo); - - @Operation(summary = "해당 방에서 나에게 배정된 리뷰이들의 정보를 반환합니다.", - description = "해당 방에서 자신에게 배정된 리뷰이를 확인합니다.
" + - "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + - "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + - "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + - "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + - "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") - @ApiErrorResponses(value = {ExceptionType.MEMBER_NOT_FOUND, ExceptionType.ROOM_NOT_FOUND}) - ResponseEntity reviewees(@Parameter(description = "방 아이디", example = "1") - long id, - AuthInfo authInfo); - @Operation(summary = "참여 중인 방 정보를 반환합니다..", description = "해당 멤버가 참여 중인 방들의 정보를 리뷰 마감일이 임박한 순으로 정렬해 반환합니다.
" + "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + @@ -83,54 +59,6 @@ ResponseEntity reviewees(@Parameter(description = "방 아 "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") ResponseEntity participatedRooms(AuthInfo authInfo); - @Operation(summary = "현재 모집 중인 방 정보를 반환합니다.", - description = "현재 모집 중인 방들의 정보를 모집 마감일이 임박한 순으로 정렬해 반환합니다. 이미 참여 중인 방들의 정보는 제외됩니다.
" + - "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + - "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + - "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + - "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + - "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") - @ApiErrorResponses(value = ExceptionType.NOT_FOUND_ERROR) - ResponseEntity openedRooms(AuthInfo authInfo, - - @Parameter(description = "페이지 정보", example = "1") - int page, - - @Parameter(description = "방 분야", example = "AN") - String expression); - - @Operation(summary = "현재 모집 완료된 방 정보를 반환합니다.", - description = "현재 모집 완료된 방들의 정보를 반환합니다. 이미 참여 중인 방들의 정보는 제외됩니다.
" + - "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + - "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + - "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + - "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + - "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") - @ApiErrorResponses(value = ExceptionType.NOT_FOUND_ERROR) - ResponseEntity progressRooms(AuthInfo authInfo, - - @Parameter(description = "페이지 정보", example = "1") - int page, - - @Parameter(description = "방 분야", example = "AN") - String expression); - - @Operation(summary = "현재 종료된 방 정보를 반환합니다.", - description = "현재 모든 진행이 종료된 방들의 정보를 반환합니다. 이미 참여 중인 방들의 정보는 제외됩니다.
" + - "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + - "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + - "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + - "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + - "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") - @ApiErrorResponses(value = ExceptionType.NOT_FOUND_ERROR) - ResponseEntity closedRooms(AuthInfo authInfo, - - @Parameter(description = "페이지 정보", example = "2") - int page, - - @Parameter(description = "방 분야", example = "FE") - String expression); - @Operation(summary = "방을 삭제합니다.", description = "이미 생성되어 있는 방을 삭제합니다.
" + "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + diff --git a/backend/src/main/java/corea/room/controller/RoomInquiryController.java b/backend/src/main/java/corea/room/controller/RoomInquiryController.java new file mode 100644 index 000000000..6cc3d1e73 --- /dev/null +++ b/backend/src/main/java/corea/room/controller/RoomInquiryController.java @@ -0,0 +1,45 @@ +package corea.room.controller; + +import corea.auth.annotation.AccessedMember; +import corea.auth.domain.AuthInfo; +import corea.room.domain.RoomStatus; +import corea.room.dto.RoomResponses; +import corea.room.service.RoomInquiryService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/rooms") +@RequiredArgsConstructor +public class RoomInquiryController implements RoomInquiryControllerSpecification { + + private final RoomInquiryService roomInquiryService; + + @GetMapping("/opened") + public ResponseEntity openedRooms(@AccessedMember AuthInfo authInfo, + @RequestParam(defaultValue = "0") int page, + @RequestParam(value = "classification", defaultValue = "all") String expression) { + RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(authInfo.getId(), page, expression, RoomStatus.OPEN); + return ResponseEntity.ok(response); + } + + @GetMapping("/progress") + public ResponseEntity progressRooms(@AccessedMember AuthInfo authInfo, + @RequestParam(defaultValue = "0") int page, + @RequestParam(value = "classification", defaultValue = "all") String expression) { + RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(authInfo.getId(), page, expression, RoomStatus.PROGRESS); + return ResponseEntity.ok(response); + } + + @GetMapping("/closed") + public ResponseEntity closedRooms(@AccessedMember AuthInfo authInfo, + @RequestParam(defaultValue = "0") int page, + @RequestParam(value = "classification", defaultValue = "all") String expression) { + RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(authInfo.getId(), page, expression, RoomStatus.CLOSE); + return ResponseEntity.ok(response); + } +} diff --git a/backend/src/main/java/corea/room/controller/RoomInquiryControllerSpecification.java b/backend/src/main/java/corea/room/controller/RoomInquiryControllerSpecification.java new file mode 100644 index 000000000..14cc38b5b --- /dev/null +++ b/backend/src/main/java/corea/room/controller/RoomInquiryControllerSpecification.java @@ -0,0 +1,60 @@ +package corea.room.controller; + +import corea.auth.domain.AuthInfo; +import corea.exception.ExceptionType; +import corea.global.annotation.ApiErrorResponses; +import corea.room.dto.RoomResponses; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import org.springframework.http.ResponseEntity; + +public interface RoomInquiryControllerSpecification { + + @Operation(summary = "현재 모집 중인 방 정보를 반환합니다.", + description = "현재 모집 중인 방들의 정보를 모집 마감일이 임박한 순으로 정렬해 반환합니다. 이미 참여 중인 방들의 정보는 제외됩니다.
" + + "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + + "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + + "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + + "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + + "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") + @ApiErrorResponses(value = ExceptionType.NOT_FOUND_ERROR) + ResponseEntity openedRooms(AuthInfo authInfo, + + @Parameter(description = "페이지 정보", example = "1") + int page, + + @Parameter(description = "방 분야", example = "AN") + String expression); + + @Operation(summary = "현재 모집 완료된 방 정보를 반환합니다.", + description = "현재 모집 완료된 방들의 정보를 반환합니다. 이미 참여 중인 방들의 정보는 제외됩니다.
" + + "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + + "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + + "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + + "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + + "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") + @ApiErrorResponses(value = ExceptionType.NOT_FOUND_ERROR) + ResponseEntity progressRooms(AuthInfo authInfo, + + @Parameter(description = "페이지 정보", example = "1") + int page, + + @Parameter(description = "방 분야", example = "AN") + String expression); + + @Operation(summary = "현재 종료된 방 정보를 반환합니다.", + description = "현재 모든 진행이 종료된 방들의 정보를 반환합니다. 이미 참여 중인 방들의 정보는 제외됩니다.
" + + "요청 시 `Authorization Header`에 `Bearer JWT token`을 포함시켜야 합니다. " + + "이 토큰을 기반으로 `AuthInfo` 객체가 생성되며 사용자의 정보가 자동으로 주입됩니다.
" + + "JWT 토큰에서 추출된 사용자 정보는 피드백 작성에 필요한 인증된 사용자 정보를 제공합니다. " + + "

**참고:** 이 API를 사용하기 위해서는 유효한 JWT 토큰이 필요하며, " + + "토큰이 없거나 유효하지 않은 경우 인증 오류가 발생합니다.") + @ApiErrorResponses(value = ExceptionType.NOT_FOUND_ERROR) + ResponseEntity closedRooms(AuthInfo authInfo, + + @Parameter(description = "페이지 정보", example = "2") + int page, + + @Parameter(description = "방 분야", example = "FE") + String expression); +} diff --git a/backend/src/main/java/corea/room/service/RoomInquiryService.java b/backend/src/main/java/corea/room/service/RoomInquiryService.java new file mode 100644 index 000000000..0c93d2413 --- /dev/null +++ b/backend/src/main/java/corea/room/service/RoomInquiryService.java @@ -0,0 +1,40 @@ +package corea.room.service; + +import corea.member.domain.MemberRole; +import corea.participation.domain.ParticipationStatus; +import corea.room.domain.Room; +import corea.room.domain.RoomClassification; +import corea.room.domain.RoomStatus; +import corea.room.dto.RoomResponses; +import corea.room.repository.RoomRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class RoomInquiryService { + private static final int PAGE_DISPLAY_SIZE = 8; + private final RoomRepository roomRepository; + + public RoomResponses findRoomsWithRoomStatus(long memberId, int pageNumber, String expression, RoomStatus roomStatus) { + RoomClassification classification = RoomClassification.from(expression); + return getRoomResponses(memberId, pageNumber, classification, roomStatus); + } + + private RoomResponses getRoomResponses(long memberId, int pageNumber, RoomClassification classification, RoomStatus status) { + PageRequest pageRequest = PageRequest.of(pageNumber, PAGE_DISPLAY_SIZE); + + if (classification.isAll()) { + Page roomsWithPage = roomRepository.findAllByMemberAndStatus(memberId, status, pageRequest); + return RoomResponses.of(roomsWithPage, MemberRole.NONE, ParticipationStatus.NOT_PARTICIPATED, pageNumber); + } + Page roomsWithPage = roomRepository.findAllByMemberAndClassificationAndStatus(memberId, classification, status, pageRequest); + return RoomResponses.of(roomsWithPage, MemberRole.NONE, ParticipationStatus.NOT_PARTICIPATED, pageNumber); + } +} diff --git a/backend/src/main/java/corea/room/service/RoomService.java b/backend/src/main/java/corea/room/service/RoomService.java index 5bb1b292d..839718414 100644 --- a/backend/src/main/java/corea/room/service/RoomService.java +++ b/backend/src/main/java/corea/room/service/RoomService.java @@ -39,7 +39,6 @@ public class RoomService { private static final int PLUS_HOURS_TO_MINIMUM_RECRUITMENT_DEADLINE = 1; private static final int PLUS_DAYS_TO_MINIMUM_REVIEW_DEADLINE = 1; - private static final int PAGE_DISPLAY_SIZE = 8; private static final int RANDOM_DISPLAY_PARTICIPANTS_SIZE = 6; private final RoomRepository roomRepository; @@ -108,22 +107,6 @@ private List findNonClosedParticipatedRooms(long memberId) { .toList(); } - public RoomResponses findRoomsWithRoomStatus(long memberId, int pageNumber, String expression, RoomStatus roomStatus) { - RoomClassification classification = RoomClassification.from(expression); - return getRoomResponses(memberId, pageNumber, classification, roomStatus); - } - - private RoomResponses getRoomResponses(long memberId, int pageNumber, RoomClassification classification, RoomStatus status) { - PageRequest pageRequest = PageRequest.of(pageNumber, PAGE_DISPLAY_SIZE); - - if (classification.isAll()) { - Page roomsWithPage = roomRepository.findAllByMemberAndStatus(memberId, status, pageRequest); - return RoomResponses.of(roomsWithPage, MemberRole.NONE, ParticipationStatus.NOT_PARTICIPATED, pageNumber); - } - Page roomsWithPage = roomRepository.findAllByMemberAndClassificationAndStatus(memberId, classification, status, pageRequest); - return RoomResponses.of(roomsWithPage, MemberRole.NONE, ParticipationStatus.NOT_PARTICIPATED, pageNumber); - } - @Transactional public void delete(long roomId, long memberId) { Room room = getRoom(roomId); diff --git a/backend/src/test/java/corea/room/service/RoomInquiryServiceTest.java b/backend/src/test/java/corea/room/service/RoomInquiryServiceTest.java new file mode 100644 index 000000000..52aeed75c --- /dev/null +++ b/backend/src/test/java/corea/room/service/RoomInquiryServiceTest.java @@ -0,0 +1,91 @@ +package corea.room.service; + +import config.ServiceTest; +import corea.auth.domain.AuthInfo; +import corea.fixture.MemberFixture; +import corea.fixture.RoomFixture; +import corea.member.domain.Member; +import corea.member.repository.MemberRepository; +import corea.room.domain.RoomStatus; +import corea.room.dto.RoomResponse; +import corea.room.dto.RoomResponses; +import corea.room.repository.RoomRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.EnumSource; +import org.springframework.beans.factory.annotation.Autowired; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@ServiceTest +public class RoomInquiryServiceTest { + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private RoomInquiryService roomInquiryService; + + @Autowired + private RoomRepository roomRepository; + + @ParameterizedTest + @EnumSource(RoomStatus.class) + @DisplayName("로그인한 사용자가 자신이 참여하지 않은 방을 상태별로 마감일 임박순으로 조회할 수 있다.") + void findRoomsWithRoomStatus_login_member(RoomStatus roomStatus) { + Member pororo = memberRepository.save(MemberFixture.MEMBER_PORORO()); + Member ash = memberRepository.save(MemberFixture.MEMBER_ASH()); + + roomRepository.save(RoomFixture.ROOM_DOMAIN(pororo, LocalDateTime.now().plusDays(2), roomStatus)); + roomRepository.save(RoomFixture.ROOM_DOMAIN(ash, LocalDateTime.now().plusDays(3), roomStatus)); + + RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(pororo.getId(), 0, "all", roomStatus); + List managerNames = getManagerNames(response); + + assertThat(managerNames).containsExactly("박민아"); + } + + @ParameterizedTest + @EnumSource(RoomStatus.class) + @DisplayName("비로그인 사용자가 방을 상태별로 마감일 임박순으로 조회할 수 있다.") + void findRoomsWithRoomStatus_non_login_member(RoomStatus roomStatus) { + Member pororo = memberRepository.save(MemberFixture.MEMBER_PORORO()); + Member ash = memberRepository.save(MemberFixture.MEMBER_ASH()); + + roomRepository.save(RoomFixture.ROOM_DOMAIN(pororo, LocalDateTime.now().plusDays(2), roomStatus)); + roomRepository.save(RoomFixture.ROOM_DOMAIN(ash, LocalDateTime.now().plusDays(3), roomStatus)); + + AuthInfo anonymous = AuthInfo.getAnonymous(); + + RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(anonymous.getId(), 0, "all", roomStatus); + List managerNames = getManagerNames(response); + + assertThat(managerNames).containsExactly("조경찬", "박민아"); + } + + @ParameterizedTest + @CsvSource(value = {"0, false", "1, true"}) + @DisplayName("방을 조회할 때 전달받은 페이지가 마지막 페이지인지 판별할 수 있다.") + void isLastPage(int pageNumber, boolean expected) { + Member pororo = memberRepository.save(MemberFixture.MEMBER_PORORO()); + for (int i = 0; i < 9; i++) { + roomRepository.save(RoomFixture.ROOM_DOMAIN(pororo)); + } + + AuthInfo anonymous = AuthInfo.getAnonymous(); + RoomResponses response = roomInquiryService.findRoomsWithRoomStatus(anonymous.getId(), pageNumber, "all", RoomStatus.OPEN); + + assertThat(response.isLastPage()).isEqualTo(expected); + } + + private List getManagerNames(RoomResponses response) { + return response.rooms() + .stream() + .map(RoomResponse::manager) + .toList(); + } +} diff --git a/backend/src/test/java/corea/room/service/RoomServiceTest.java b/backend/src/test/java/corea/room/service/RoomServiceTest.java index dd61a061f..16b6bb5f7 100644 --- a/backend/src/test/java/corea/room/service/RoomServiceTest.java +++ b/backend/src/test/java/corea/room/service/RoomServiceTest.java @@ -198,55 +198,6 @@ void findNonClosedParticipatedRooms() { assertThat(managerNames).containsExactly("조경찬", "박민아"); } - @ParameterizedTest - @EnumSource(RoomStatus.class) - @DisplayName("로그인한 사용자가 자신이 참여하지 않은 방을 상태별로 마감일 임박순으로 조회할 수 있다.") - void findRoomsWithRoomStatus_login_member(RoomStatus roomStatus) { - Member pororo = memberRepository.save(MemberFixture.MEMBER_PORORO()); - Member ash = memberRepository.save(MemberFixture.MEMBER_ASH()); - - roomRepository.save(RoomFixture.ROOM_DOMAIN(pororo, LocalDateTime.now().plusDays(2), roomStatus)); - roomRepository.save(RoomFixture.ROOM_DOMAIN(ash, LocalDateTime.now().plusDays(3), roomStatus)); - - RoomResponses response = roomService.findRoomsWithRoomStatus(pororo.getId(), 0, "all", roomStatus); - List managerNames = getManagerNames(response); - - assertThat(managerNames).containsExactly("박민아"); - } - - @ParameterizedTest - @EnumSource(RoomStatus.class) - @DisplayName("비로그인 사용자가 방을 상태별로 마감일 임박순으로 조회할 수 있다.") - void findRoomsWithRoomStatus_non_login_member(RoomStatus roomStatus) { - Member pororo = memberRepository.save(MemberFixture.MEMBER_PORORO()); - Member ash = memberRepository.save(MemberFixture.MEMBER_ASH()); - - roomRepository.save(RoomFixture.ROOM_DOMAIN(pororo, LocalDateTime.now().plusDays(2), roomStatus)); - roomRepository.save(RoomFixture.ROOM_DOMAIN(ash, LocalDateTime.now().plusDays(3), roomStatus)); - - AuthInfo anonymous = AuthInfo.getAnonymous(); - - RoomResponses response = roomService.findRoomsWithRoomStatus(anonymous.getId(), 0, "all", roomStatus); - List managerNames = getManagerNames(response); - - assertThat(managerNames).containsExactly("조경찬", "박민아"); - } - - @ParameterizedTest - @CsvSource(value = {"0, false", "1, true"}) - @DisplayName("방을 조회할 때 전달받은 페이지가 마지막 페이지인지 판별할 수 있다.") - void isLastPage(int pageNumber, boolean expected) { - Member pororo = memberRepository.save(MemberFixture.MEMBER_PORORO()); - for (int i = 0; i < 9; i++) { - roomRepository.save(RoomFixture.ROOM_DOMAIN(pororo)); - } - - AuthInfo anonymous = AuthInfo.getAnonymous(); - RoomResponses response = roomService.findRoomsWithRoomStatus(anonymous.getId(), pageNumber, "all", RoomStatus.OPEN); - - assertThat(response.isLastPage()).isEqualTo(expected); - } - @Test @DisplayName("방을 생성한 방장의 참여 상태는 MANAGER다.") void create_participationStatus_manager() { @@ -331,7 +282,6 @@ void findParticipants_withNoPullRequestParticipants() { matchResultRepository.saveAll(members.stream().map(member -> MatchResultFixture.MATCH_RESULT_DOMAIN(room.getId(), manager, member)).toList()); matchResultRepository.save(MatchResultFixture.MATCH_RESULT_DOMAIN(room.getId(), members.get(0), manager)); - RoomParticipantResponses participants = assertDoesNotThrow(() -> roomService.findParticipants(room.getId(), manager.getId())); assertAll( From a8f8dea731f0cc288e9b44877c98cd6324f4ab6b Mon Sep 17 00:00:00 2001 From: jinsil Date: Tue, 15 Oct 2024 10:47:14 +0900 Subject: [PATCH 15/18] =?UTF-8?q?refactor:=20ALL=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/@types/roomInfo.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/@types/roomInfo.ts b/frontend/src/@types/roomInfo.ts index 77c9ac83e..e947b5cb2 100644 --- a/frontend/src/@types/roomInfo.ts +++ b/frontend/src/@types/roomInfo.ts @@ -1,4 +1,4 @@ -export type Classification = "FRONTEND" | "BACKEND" | "ANDROID"; +export type Classification = "ALL" | "FRONTEND" | "BACKEND" | "ANDROID"; export type RoomStatus = "OPEN" | "CLOSE" | "PROGRESS" | "FAIL"; From c545dd3377925dac2c2a09a5aec75d94c62fb17a Mon Sep 17 00:00:00 2001 From: 00kang Date: Tue, 15 Oct 2024 14:37:06 +0900 Subject: [PATCH 16/18] =?UTF-8?q?feat:=20=EC=88=98=EC=A0=95=EB=90=9C=20api?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20message=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/@types/roomInfo.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/@types/roomInfo.ts b/frontend/src/@types/roomInfo.ts index e947b5cb2..cbaea01b8 100644 --- a/frontend/src/@types/roomInfo.ts +++ b/frontend/src/@types/roomInfo.ts @@ -32,6 +32,7 @@ export interface RoomInfo extends BaseRoomInfo { roomStatus: RoomStatus; participationStatus: ParticipationStatus; memberRole: Role; + message: string; } export interface RoomListInfo { From 19d022c04d114251d510b479a997d2c2404108b3 Mon Sep 17 00:00:00 2001 From: 00kang Date: Tue, 15 Oct 2024 18:08:55 +0900 Subject: [PATCH 17/18] =?UTF-8?q?fix:=20=EB=B0=A9=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EC=8B=9C=20=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EC=9D=84=20=EC=95=88=ED=96=88=EC=9D=84=20=EB=95=8C=20=EB=A0=8C?= =?UTF-8?q?=EB=8D=94=EB=A7=81=20=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/shared/roomCard/RoomCard.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/shared/roomCard/RoomCard.tsx b/frontend/src/components/shared/roomCard/RoomCard.tsx index 5b647f89c..5bca335bc 100644 --- a/frontend/src/components/shared/roomCard/RoomCard.tsx +++ b/frontend/src/components/shared/roomCard/RoomCard.tsx @@ -46,7 +46,9 @@ interface RoomCardProps { const RoomCard = React.memo(({ roomInfo }: RoomCardProps) => { const { isModalOpen, handleOpenModal, handleCloseModal } = useModal(); - const displayedKeywords = roomInfo.keywords.slice(0, MAX_KEYWORDS); + const displayedKeywords = roomInfo.keywords + .filter((keyword) => keyword !== "") + .slice(0, MAX_KEYWORDS); return ( <> @@ -63,7 +65,7 @@ const RoomCard = React.memo(({ roomInfo }: RoomCardProps) => { - {displayedKeywords.length === 1 ? ( + {displayedKeywords.length === 0 ? ( 지정된 키워드 없음 ) : ( displayedKeywords.map((keyword) => ( From 7a3bb01374e49baea0ea3c17eaf31e3c050d80ac Mon Sep 17 00:00:00 2001 From: 00kang Date: Tue, 15 Oct 2024 21:15:09 +0900 Subject: [PATCH 18/18] =?UTF-8?q?feat:=20=EB=B0=94=EB=80=90=20RoomInfo=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=ED=98=95=EC=8B=9D=EC=97=90=20?= =?UTF-8?q?=EB=A7=9E=EA=B2=8C=20storybook=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/shared/roomCard/RoomCard.stories.tsx | 6 ++++-- .../shared/roomCardModal/RoomCardModal.stories.tsx | 6 ++++-- .../src/components/shared/roomList/RoomList.stories.tsx | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/shared/roomCard/RoomCard.stories.tsx b/frontend/src/components/shared/roomCard/RoomCard.stories.tsx index 77adee688..3fae3ca02 100644 --- a/frontend/src/components/shared/roomCard/RoomCard.stories.tsx +++ b/frontend/src/components/shared/roomCard/RoomCard.stories.tsx @@ -5,12 +5,14 @@ import roomInfo from "@/mocks/mockResponse/roomInfo.json"; const sampleRoomList = { ...roomInfo, - roomStatus: roomInfo.roomStatus as "OPEN" | "CLOSE" | "PROGRESS", + roomStatus: roomInfo.roomStatus as "OPEN" | "CLOSE" | "PROGRESS" | "FAIL", participationStatus: roomInfo.participationStatus as | "NOT_PARTICIPATED" | "PARTICIPATED" - | "MANAGER", + | "MANAGER" + | "PULL_REQUEST_NOT_SUBMITTED", memberRole: roomInfo.memberRole as "BOTH" | "REVIEWER" | "REVIEWEE" | "NONE", + message: "FAIL시 오류 메시지", } satisfies RoomInfo; const meta = { diff --git a/frontend/src/components/shared/roomCardModal/RoomCardModal.stories.tsx b/frontend/src/components/shared/roomCardModal/RoomCardModal.stories.tsx index 84486d52a..88229e5a9 100644 --- a/frontend/src/components/shared/roomCardModal/RoomCardModal.stories.tsx +++ b/frontend/src/components/shared/roomCardModal/RoomCardModal.stories.tsx @@ -5,12 +5,14 @@ import roomInfo from "@/mocks/mockResponse/roomInfo.json"; const sampleRoomList = { ...roomInfo, - roomStatus: roomInfo.roomStatus as "OPEN" | "CLOSE" | "PROGRESS", + roomStatus: roomInfo.roomStatus as "OPEN" | "CLOSE" | "PROGRESS" | "FAIL", participationStatus: roomInfo.participationStatus as | "NOT_PARTICIPATED" | "PARTICIPATED" - | "MANAGER", + | "MANAGER" + | "PULL_REQUEST_NOT_SUBMITTED", memberRole: roomInfo.memberRole as "BOTH" | "REVIEWER" | "REVIEWEE" | "NONE", + message: "FAIL시 오류 메시지", } satisfies RoomInfo; const meta: Meta = { diff --git a/frontend/src/components/shared/roomList/RoomList.stories.tsx b/frontend/src/components/shared/roomList/RoomList.stories.tsx index 4962cf576..517421cfa 100644 --- a/frontend/src/components/shared/roomList/RoomList.stories.tsx +++ b/frontend/src/components/shared/roomList/RoomList.stories.tsx @@ -5,13 +5,15 @@ import roomInfos from "@/mocks/mockResponse/roomInfos.json"; const sampleRoomList = roomInfos.rooms.map((roomInfo) => ({ ...roomInfo, - roomStatus: roomInfo.roomStatus as "OPEN" | "CLOSE" | "PROGRESS", + roomStatus: roomInfo.roomStatus as "OPEN" | "CLOSE" | "PROGRESS" | "FAIL", participationStatus: roomInfo.participationStatus as | "NOT_PARTICIPATED" | "PARTICIPATED" - | "MANAGER", + | "MANAGER" + | "PULL_REQUEST_NOT_SUBMITTED", memberRole: roomInfo.memberRole as "BOTH" | "REVIEWER" | "REVIEWEE" | "NONE", + message: "FAIL시 오류 메시지", })) satisfies RoomInfo[]; const meta = {