From 775871e87ee9257a6ef97b3dba1c8cd959d9cd59 Mon Sep 17 00:00:00 2001 From: Lee sang Yeop Date: Wed, 23 Oct 2024 17:33:08 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BD=94=EB=A0=88=EC=95=84=201.23v=20=EB=B0=B0?= =?UTF-8?q?=ED=8F=AC=20(#674)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [FE] 헤더 리팩터링하기(#642) (#651) * feat: 메뉴와 클로즈 아이콘 추가 * feat: 버튼에 흰 배경의 default 타입 추가 * feat: 모바일 버전에서 나타낼 SideNavBar 컴포넌트 구현 * refactor: 디바이스에 따라 헤더와 사이드바 렌더링 * feat: createPortal 방식으로 sidenavbar 열기, backdrop 추가하기 * fix: 잘못 들어간 , 삭제 * feat: sidenavbar가 오픈상태일 때는 스크롤 막기 * feat: sidenavbar 컴포넌트에 fadeIn, fadeOut 애니메이션 추가 * design: 가이드페이지 line-height 조정 * design: 사이드바 폰트 크기 수정 * feat: z-index 삭제 * fix: 사이드바가 열린채로 디바이스 크기가 커져도 여전히 사이드바가 나타나는 문제 해결 --------- Co-authored-by: 00kang * [BE] FailedMatching 엔티티에 생성된 시간 필드 추가 및 로그 추가(#656) (#657) * feat: FailedMatching 생성 시점에 대한 필드 값 추가 * feat: 매칭 실패 시 로그 추가 --------- Co-authored-by: gyungchan Jo * feat: 개발 서버 토큰 변경 * feat: 개발 서버 설정 추가 * [BE] Member 내 리뷰어 인지 나타내는 칼럼 추가, 리뷰어가 아닌데 리뷰어로 참여시 예외 발생(#660) (#662) * feat: authRole 추가 * feat: 참가 시 리뷰어 검증 추가 --------- Co-authored-by: youngsu5582 <98307410+youngsu5582@users.noreply.github.com> * fix: Enum 문자열로 저장하게 변경 * [FE] 부족한 일부 기능 추가(#659) (#661) * feat: 헤더에 문의 탭 추가 * test: 방 참여자 리스트 불러오는 요청에 대한 MSW 추가 * feat: 남은 시간은 초 단위로 카운트다운하는 훅 추가 * feat: 참여자 리스트 요청을 5초에 한 번씩 가능하도록 추가 * feat: 모바일 사이드바에서 문의 탭 추가 * feat: 리뷰어로 등록된 계정만 리뷰어로 참여가 가능하도록 변경 * test: 방정보 더미데이터 값 수정 * style: 중복된 cursor style 제거 * chore: 상수명을 UPPER_SNAKECASE로 변경 --------- Co-authored-by: Lee sang Yeop * refactor: 운영 서버 설정 변경 * [FE] 모달 웹 접근성 추가(#644) (#658) * feat: FocusTrap의 children이 DOM 변경을 추적하도록 추가 * style: 피드백 모달 내 키워드 스타일 변경 * feat: 모달이 열리면 모달만 보이스오버가 읽을 수 있도록 추가 * style: 피드백 모달 키워드 텍스트 색상 추가 * feat: 피드백 작성 모달 보이스오버로 동작 가능하도록 추가 * test: MSW로 피드백 수정도 확인이 가능하도록 추가 * chore: 모달이 열리면 가장먼저 닫기가 선택되도록 변경 * fix: 불필요한 ,(쉼표) 삭제 * test: 작성된 리뷰이 피드백 데이터를 반환하는 MSW 추가 * refactor: 피드백 모달 페이지 접근성을 위해 시멘틱태그 활용하도록 변경 * feat: 룸카드 뱃지의 접근성 추가 * style: 깃허브 링크 주소에 패딩 추가 * feat: 날짜를 한국어로 바꿔주는 유틸함수 추가 * feat: 룸 카드를 div에서 버튼으로 변경 * feat: 방정보 모달에 접근성 추가 * chore: 텍스트 띄어쓰기 추가 * chore: 보이스오버에서 모달 닫기 버튼을 인식할 수 있도록 개선 * feat: 토스트 메시지가 발생하면 보이스오버에서 읽을 수 있도록 추가 * refactor: 뱃지의 종류를 한국어로 변환해주는 로직을 유틸 함수로 분리 * feat: 토스트모달은 aria-hidden 처리가 안되도록 변경 --------- Co-authored-by: Lee sang Yeop * [BE] 코멘트를 달아도 리뷰 완료되게 변경(#626) (#665) * feat: pr에 작성된 모든 커멘트들을 가져오는 기능 구현 * refactor: pr에 작성된 모든 리뷰들을 가져오는 기능 수정 * feat: pr에 작성된 리뷰와 커멘트를 확인하는 기능 구현 * refactor: 변수명 수정 * style: 코드 포맷팅 적용 * refactor: GithubPullRequestUrlExchanger를 컴포넌트로 변경 * refactor: 메서드명 변경 * test: 테스트가 통과하도록 수정 * test: 깃헙 api를 사용하는 테스트 Disabled 처리 * refactor: 변수명 변경 * style: TODO 추가 * feat: RestClient 타임아웃 설정 추가 --------- Co-authored-by: gyungchan Jo * [BE] Member 객체가 가지는 MemberRole 관련 리팩터링 제안(#663) (#664) * feat: 리뷰어 엔티티 작성 * refactor: 리뷰어 엔티티 활용해서 기존 로직 수정 * refactor: Member 엔티티에서 authRole 삭제 * refactor: 에러 문구 수정 * refactor: 사용 enum 수정 * style: 클래스 선언 이후 개행 추가 * refactor: 조이썬 피드백 반영 --------- Co-authored-by: ashsty * [FE] 서비스 가이드를 설명하는 메인페이지 구현(#413) (#537) * feat: IntroPage에 scroll-snap 적용 * feat: intro에서 현재 페이지 위치를 알 수 있도록 네비게이션 바 추가 * feat: intro 페이지에서는 헤더 안보이도록 수정 * feat: intro 페이지 라우터 추가 * style: 네비게이션바 스타일 수정 * feat: intro 페이지의 컨텐츠 추가 * design: 모바일 반응형 디자인 추가 * feat: 헤더 네비게이션에 서비스소개 intro 추가 * fix: 링크 공유시 미리보기에 이미지 안뜨는 문제 해결 * design: svg 이미지 색 있는 버전으로 변경 * fix: 테스트코드에서 놓친 message 속성 추가 * feat: 인트로페이지에 필요한 이미지 추가 * design: 모바일, 태블릿 반응형 디자인 추가 * design: 높이 수정 * feat: 사이드바에 소개페이지 추가 * feat: 반응형 디자인에 맞게 디테일 수정 --------- Co-authored-by: 00kang * [BE] QA 발생 중 발견한 버그 해결(#669) (#670) * feat: github api 요청 시 헤더에 토큰 추가 * refactor: 결과가 없으면 빈 배열로 만드는 기능 구현 --------- Co-authored-by: gyungchan Jo * [BE] 운영 서버 Swagger 비활성화 & 액츄에이터 내부 포트로 이동(#666) (#671) * feat: 헬스체크 포트 변경 * feat: 서브모듈 변경 반영 --------- Co-authored-by: youngsu5582 <98307410+youngsu5582@users.noreply.github.com> * [FE] 서비스 운영 전 QA(#667) (#673) * design: 피드백 작성 모달 디자인 반영 안된부분 추가 * fix: 방 참여자 요청 쿼리문의 staleTime 제거 * style: 사이드바 radius 추가 * feat: 안드로이드 코드 가이드 추가 * fix: PR 링크 클릭 시 해당 링크로 이동하지 않던 문제 해결 * style: 사이드바 열렸을 때 hover 시 radius 스타일링 추가 * feat: 내 리뷰이 매칭에 대한 추가정보를 테이블 아래에 추가 * fix: 방 제목이 길면 레이아웃이 꺠지는 문제 해결 * fix: 방 상태가 여러개인 경우 레이아웃이 꺠지는 문제 해결 * design: 모바일 햄버거 바 클릭 시 nav 스타일 변경 * fix: 모바일 환경에서 방 카드 정보에 뱃지가 제목을 가리는 문제 해결 * chore: 방 상세 페이지의 함께하는 참여자 제목 변경 --------- Co-authored-by: Lee sang Yeop --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: 00kang Co-authored-by: gyungchan Jo Co-authored-by: youngsu5582 <98307410+youngsu5582@users.noreply.github.com> Co-authored-by: ashsty --- backend/scripts/healthCheck.sh | 4 +- .../auth/controller/LoginController.java | 7 +- .../java/corea/auth/dto/LoginResponse.java | 3 +- .../java/corea/exception/ExceptionType.java | 2 + .../corea/global/config/RestClientConfig.java | 10 +- .../ReviewerPreemptiveMatchingStrategy.java | 1 - .../matchresult/domain/FailedMatching.java | 3 +- .../matchresult/domain/MatchResultReader.java | 2 +- .../matchresult/domain/MatchResultWriter.java | 4 +- .../java/corea/member/domain/AuthRole.java | 11 + .../corea/member/domain/MemberReader.java | 6 + .../java/corea/member/domain/MemberRole.java | 4 + .../java/corea/member/domain/Reviewer.java | 24 ++ .../corea/member/dto/MemberRoleResponse.java | 11 + .../member/repository/ReviewerRepository.java | 9 + .../corea/member/service/MemberService.java | 20 ++ .../service/ParticipationService.java | 16 + .../infrastructure/GithubCommentClient.java | 69 ++++ .../GithubPullRequestUrlExchanger.java | 38 ++- .../infrastructure/GithubReviewClient.java | 51 ++- .../infrastructure/GithubReviewProvider.java | 24 +- .../corea/review/service/ReviewService.java | 10 +- .../corea/room/dto/RoomUpdateRequest.java | 1 - .../java/corea/room/service/RoomService.java | 11 +- .../scheduler/service/MatchingExecutor.java | 13 +- backend/src/main/resources/config | 2 +- .../java/corea/fixture/MemberFixture.java | 26 +- .../repository/ProfileRepositoryTest.java | 2 +- .../service/ParticipationServiceTest.java | 54 ++- .../GithubCommentClientTest.java | 30 ++ .../GithubPullRequestUrlExchangerTest.java | 20 +- .../GithubReviewClientTest.java} | 19 +- .../GithubReviewProviderTest.java | 57 +++- .../review/service/ReviewServiceTest.java | 38 ++- frontend/public/index.html | 3 +- frontend/public/{logo.webp => logo.png} | Bin frontend/src/@types/icon.ts | 4 +- frontend/src/apis/auth.api.ts | 8 +- frontend/src/assets/index.ts | 8 + .../assets/intro/puzzle_with_people_color.svg | 13 + .../src/assets/intro/question_with_color.svg | 20 ++ frontend/src/assets/intro/step1_pic.webp | Bin 0 -> 228604 bytes frontend/src/assets/intro/step2_pic.webp | Bin 0 -> 162472 bytes frontend/src/assets/intro/step3_pic.webp | Bin 0 -> 292194 bytes frontend/src/assets/intro/step4_pic.webp | Bin 0 -> 343526 bytes frontend/src/assets/intro/step5_pic.webp | Bin 0 -> 84070 bytes .../src/components/common/Toast/Toast.tsx | 7 +- .../components/common/button/Button.style.ts | 4 + .../src/components/common/button/Button.tsx | 2 +- .../common/checkbox/Checkbox.style.ts | 17 +- .../components/common/checkbox/Checkbox.tsx | 9 +- .../components/common/focusTrap/FocusTrap.tsx | 20 ++ .../components/common/header/Header.style.ts | 13 + .../src/components/common/header/Header.tsx | 55 ++- .../common/header/SideNavBar.style.ts | 146 ++++++++ .../components/common/header/SideNavBar.tsx | 172 ++++++++++ frontend/src/components/common/icon/Icon.tsx | 4 + .../iconRadioButton/IconRadioButton.style.ts | 2 +- .../iconRadioButton/IconRadioButton.tsx | 14 +- .../src/components/common/modal/Modal.tsx | 23 +- .../components/common/textarea/Textarea.tsx | 2 +- .../evaluationPointBar/EvaluationPointBar.tsx | 4 +- .../feedbackForm/FeedbackForm.style.ts | 13 +- .../feedbackForm/RevieweeFeedbackForm.tsx | 20 +- .../feedbackForm/ReviewerFeedbackForm.tsx | 18 +- .../KeywordOptionButton.style.ts | 22 +- .../KeywordOptionButton.tsx | 30 +- .../intro/IntroNavigationBar.style.ts | 42 +++ .../components/intro/IntroNavigationBar.tsx | 23 ++ frontend/src/components/layout/Layout.tsx | 19 +- .../myReviewee/MyReviewee.style.ts | 7 + .../roomDetailPage/myReviewee/MyReviewee.tsx | 1 + .../participantList/ParticipantList.style.ts | 7 + .../participantList/ParticipantList.tsx | 19 +- .../roomInfoCard/RoomInfoCard.style.ts | 14 +- .../ClassificationBadge.style.ts | 6 +- .../ClassificationBadge.tsx | 10 +- .../shared/roomCard/RoomCard.style.ts | 12 +- .../components/shared/roomCard/RoomCard.tsx | 8 +- .../roomCardModal/RoomCardModal.style.ts | 9 +- .../shared/roomCardModal/RoomCardModal.tsx | 51 +-- .../roomCardModal/RoomCardModalButton.tsx | 88 +++-- frontend/src/hooks/common/useCountDown.ts | 28 ++ frontend/src/hooks/mutations/useMutateAuth.ts | 7 +- frontend/src/hooks/queries/useFetchRooms.ts | 2 - frontend/src/mocks/handler/roomHandler.ts | 11 + .../mocks/mockResponse/participantList.json | 47 +++ .../src/mocks/mockResponse/reviewInfo.json | 9 +- frontend/src/mocks/mockResponse/roomInfo.json | 2 +- .../src/mocks/mockResponse/roomInfos.json | 2 +- .../mocks/mockResponse/writedFeedback.json | 8 + frontend/src/pages/guide/GuidePage.style.ts | 7 +- frontend/src/pages/guide/GuidePage.tsx | 9 +- frontend/src/pages/intro/IntroPage.style.ts | 318 ++++++++++++++++++ frontend/src/pages/intro/IntroPage.tsx | 149 ++++++++ .../src/pages/roomDetail/RoomDetailPage.tsx | 2 +- frontend/src/router.tsx | 2 + .../utils/convertClassificationToKorean.ts | 16 + frontend/src/utils/dateFormatter.ts | 11 + 99 files changed, 1921 insertions(+), 280 deletions(-) create mode 100644 backend/src/main/java/corea/member/domain/AuthRole.java create mode 100644 backend/src/main/java/corea/member/domain/Reviewer.java create mode 100644 backend/src/main/java/corea/member/dto/MemberRoleResponse.java create mode 100644 backend/src/main/java/corea/member/repository/ReviewerRepository.java create mode 100644 backend/src/main/java/corea/member/service/MemberService.java create mode 100644 backend/src/main/java/corea/review/infrastructure/GithubCommentClient.java rename backend/src/main/java/corea/{auth => review}/infrastructure/GithubPullRequestUrlExchanger.java (60%) create mode 100644 backend/src/test/java/corea/review/infrastructure/GithubCommentClientTest.java rename backend/src/test/java/corea/{auth => review}/infrastructure/GithubPullRequestUrlExchangerTest.java (76%) rename backend/src/test/java/corea/{auth/infrastructure/GithubPullRequestReviewClientTest.java => review/infrastructure/GithubReviewClientTest.java} (65%) rename frontend/public/{logo.webp => logo.png} (100%) create mode 100644 frontend/src/assets/intro/puzzle_with_people_color.svg create mode 100644 frontend/src/assets/intro/question_with_color.svg create mode 100644 frontend/src/assets/intro/step1_pic.webp create mode 100644 frontend/src/assets/intro/step2_pic.webp create mode 100644 frontend/src/assets/intro/step3_pic.webp create mode 100644 frontend/src/assets/intro/step4_pic.webp create mode 100644 frontend/src/assets/intro/step5_pic.webp create mode 100644 frontend/src/components/common/header/SideNavBar.style.ts create mode 100644 frontend/src/components/common/header/SideNavBar.tsx create mode 100644 frontend/src/components/intro/IntroNavigationBar.style.ts create mode 100644 frontend/src/components/intro/IntroNavigationBar.tsx create mode 100644 frontend/src/hooks/common/useCountDown.ts create mode 100644 frontend/src/mocks/mockResponse/participantList.json create mode 100644 frontend/src/mocks/mockResponse/writedFeedback.json create mode 100644 frontend/src/pages/intro/IntroPage.style.ts create mode 100644 frontend/src/pages/intro/IntroPage.tsx create mode 100644 frontend/src/utils/convertClassificationToKorean.ts diff --git a/backend/scripts/healthCheck.sh b/backend/scripts/healthCheck.sh index b6202bdab..1972de9a8 100644 --- a/backend/scripts/healthCheck.sh +++ b/backend/scripts/healthCheck.sh @@ -1,10 +1,10 @@ #!/bin/bash echo "> Health check 시작" -echo "> curl -s http://localhost:8080/actuator/health" +echo "> curl -s http://localhost:9100/actuator/health" for RETRY_COUNT in {1..15} do - RESPONSE=$(curl -s http://localhost:8080/actuator/health) + RESPONSE=$(curl -s http://localhost:9100/actuator/health) UP_COUNT=$(echo $RESPONSE | grep 'UP' | wc -l) if [ $UP_COUNT -ge 1 ] diff --git a/backend/src/main/java/corea/auth/controller/LoginController.java b/backend/src/main/java/corea/auth/controller/LoginController.java index 86b35e480..e2ccfa706 100644 --- a/backend/src/main/java/corea/auth/controller/LoginController.java +++ b/backend/src/main/java/corea/auth/controller/LoginController.java @@ -10,6 +10,8 @@ import corea.auth.service.GithubOAuthProvider; import corea.auth.service.LoginService; import corea.auth.service.LogoutService; +import corea.member.dto.MemberRoleResponse; +import corea.member.service.MemberService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; @@ -27,14 +29,17 @@ public class LoginController implements LoginControllerSpecification { private final GithubOAuthProvider githubOAuthProvider; private final LoginService loginService; private final LogoutService logoutService; + private final MemberService memberService; @PostMapping("/login") public ResponseEntity login(@RequestBody LoginRequest loginRequest) { GithubUserInfo userInfo = githubOAuthProvider.getUserInfo(loginRequest.code()); TokenInfo tokenInfo = loginService.login(userInfo); + MemberRoleResponse memberRoleResponse = memberService.getMemberRoleWithGithubUserId(userInfo.id()); + return ResponseEntity.ok() .header(AUTHORIZATION_HEADER, tokenInfo.accessToken()) - .body(new LoginResponse(tokenInfo.refreshToken(), userInfo)); + .body(new LoginResponse(tokenInfo.refreshToken(), userInfo, memberRoleResponse.role())); } @PostMapping("/refresh") diff --git a/backend/src/main/java/corea/auth/dto/LoginResponse.java b/backend/src/main/java/corea/auth/dto/LoginResponse.java index 932097515..aa5e3eb13 100644 --- a/backend/src/main/java/corea/auth/dto/LoginResponse.java +++ b/backend/src/main/java/corea/auth/dto/LoginResponse.java @@ -5,5 +5,6 @@ @Schema(description = "로그인/로그인 유지를 위한 정보 전달") public record LoginResponse(@Schema(description = "리프레시 JWT 토큰", example = "O1234567COREAREFRESH") String refreshToken, - GithubUserInfo userInfo) { + GithubUserInfo userInfo, + String memberRole) { } diff --git a/backend/src/main/java/corea/exception/ExceptionType.java b/backend/src/main/java/corea/exception/ExceptionType.java index 4892f9336..d61877058 100644 --- a/backend/src/main/java/corea/exception/ExceptionType.java +++ b/backend/src/main/java/corea/exception/ExceptionType.java @@ -10,6 +10,8 @@ public enum ExceptionType { NOT_PARTICIPATED_ROOM(HttpStatus.BAD_REQUEST, "아직 참여하지 않은 방입니다."), ROOM_STATUS_INVALID(HttpStatus.BAD_REQUEST, "방이 마감되었습니다."), MEMBER_IS_NOT_MANAGER(HttpStatus.BAD_REQUEST, "매니저가 아닙니다."), + MEMBER_IS_NOT_REVIEWER(HttpStatus.BAD_REQUEST, "리뷰어로만 참여할 수 없습니다."), + MEMBER_IS_NOT_BOTH(HttpStatus.BAD_REQUEST, "리뷰어로만 참여할 수 있습니다."), ROOM_PARTICIPANT_EXCEED(HttpStatus.BAD_REQUEST, "방 참여 인원 수가 최대입니다."), PARTICIPANT_SIZE_LACK(HttpStatus.BAD_REQUEST, "참여 인원이 부족하여 매칭을 진행할 수 없습니다."), PARTICIPANT_SIZE_LACK_DUE_TO_PULL_REQUEST(HttpStatus.BAD_REQUEST, "pull request 미제출로 인해 인원이 부족하여 매칭을 진행할 수 없습니다."), diff --git a/backend/src/main/java/corea/global/config/RestClientConfig.java b/backend/src/main/java/corea/global/config/RestClientConfig.java index edbee4df8..9a3810a22 100644 --- a/backend/src/main/java/corea/global/config/RestClientConfig.java +++ b/backend/src/main/java/corea/global/config/RestClientConfig.java @@ -2,14 +2,22 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestClient; +import java.time.Duration; + @Configuration public class RestClientConfig { @Bean - RestClient restClient() { + public RestClient restClient() { + SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); + requestFactory.setConnectTimeout(Duration.ofSeconds(5)); + requestFactory.setReadTimeout(Duration.ofSeconds(10)); + return RestClient.builder() + .requestFactory(requestFactory) .build(); } } diff --git a/backend/src/main/java/corea/matching/strategy/ReviewerPreemptiveMatchingStrategy.java b/backend/src/main/java/corea/matching/strategy/ReviewerPreemptiveMatchingStrategy.java index 942f66035..95f9332f5 100644 --- a/backend/src/main/java/corea/matching/strategy/ReviewerPreemptiveMatchingStrategy.java +++ b/backend/src/main/java/corea/matching/strategy/ReviewerPreemptiveMatchingStrategy.java @@ -6,7 +6,6 @@ import corea.member.domain.Member; import corea.participation.domain.Participation; import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; import java.util.*; diff --git a/backend/src/main/java/corea/matchresult/domain/FailedMatching.java b/backend/src/main/java/corea/matchresult/domain/FailedMatching.java index a10ab8388..ca2ac208d 100644 --- a/backend/src/main/java/corea/matchresult/domain/FailedMatching.java +++ b/backend/src/main/java/corea/matchresult/domain/FailedMatching.java @@ -1,6 +1,7 @@ package corea.matchresult.domain; import corea.exception.ExceptionType; +import corea.global.BaseTimeEntity; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -11,7 +12,7 @@ @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter -public class FailedMatching { +public class FailedMatching extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/backend/src/main/java/corea/matchresult/domain/MatchResultReader.java b/backend/src/main/java/corea/matchresult/domain/MatchResultReader.java index b2296cc45..62f529fb0 100644 --- a/backend/src/main/java/corea/matchresult/domain/MatchResultReader.java +++ b/backend/src/main/java/corea/matchresult/domain/MatchResultReader.java @@ -12,7 +12,7 @@ public class MatchResultReader { private final MatchResultRepository matchResultRepository; - public MatchResult findOne(long roomId,long reviewerId,long revieweeId) { + public MatchResult findOne(long roomId, long reviewerId, long revieweeId) { return matchResultRepository.findByRoomIdAndReviewerIdAndRevieweeId(roomId, reviewerId, revieweeId) .orElseThrow(() -> new CoreaException(ExceptionType.NOT_MATCHED_MEMBER)); } diff --git a/backend/src/main/java/corea/matchresult/domain/MatchResultWriter.java b/backend/src/main/java/corea/matchresult/domain/MatchResultWriter.java index 8c89de909..13caefa45 100644 --- a/backend/src/main/java/corea/matchresult/domain/MatchResultWriter.java +++ b/backend/src/main/java/corea/matchresult/domain/MatchResultWriter.java @@ -14,9 +14,9 @@ public class MatchResultWriter { private final MatchResultRepository matchResultRepository; - public void reviewComplete(MatchResult matchResult, String prLink) { + public void reviewComplete(MatchResult matchResult, String reviewLink) { matchResult.reviewComplete(); - matchResult.updateReviewLink(prLink); + matchResult.updateReviewLink(reviewLink); } public MatchResult completeDevelopFeedback(long roomId, long deliverId, long receiverId) { diff --git a/backend/src/main/java/corea/member/domain/AuthRole.java b/backend/src/main/java/corea/member/domain/AuthRole.java new file mode 100644 index 000000000..a899676ab --- /dev/null +++ b/backend/src/main/java/corea/member/domain/AuthRole.java @@ -0,0 +1,11 @@ +package corea.member.domain; + +public enum AuthRole { + + REVIEWEE, + REVIEWER; + + public boolean isReviewer() { + return this == REVIEWER; + } +} diff --git a/backend/src/main/java/corea/member/domain/MemberReader.java b/backend/src/main/java/corea/member/domain/MemberReader.java index 62749fa63..d92effff9 100644 --- a/backend/src/main/java/corea/member/domain/MemberReader.java +++ b/backend/src/main/java/corea/member/domain/MemberReader.java @@ -3,6 +3,7 @@ import corea.exception.CoreaException; import corea.exception.ExceptionType; import corea.member.repository.MemberRepository; +import corea.member.repository.ReviewerRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -13,9 +14,14 @@ public class MemberReader { private final MemberRepository memberRepository; + private final ReviewerRepository reviewerRepository; public Member findOne(long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new CoreaException(ExceptionType.MEMBER_NOT_FOUND)); } + + public boolean isReviewer(String githubUserId) { + return reviewerRepository.existsByGithubUserId(githubUserId); + } } diff --git a/backend/src/main/java/corea/member/domain/MemberRole.java b/backend/src/main/java/corea/member/domain/MemberRole.java index 99fb95cc2..5079d2dda 100644 --- a/backend/src/main/java/corea/member/domain/MemberRole.java +++ b/backend/src/main/java/corea/member/domain/MemberRole.java @@ -24,6 +24,10 @@ public boolean isReviewer() { return this == REVIEWER; } + public boolean isBoth(){ + return this == BOTH; + } + public ParticipationStatus getParticipationStatus() { return switch (this) { case REVIEWER, REVIEWEE, BOTH -> ParticipationStatus.PARTICIPATED; diff --git a/backend/src/main/java/corea/member/domain/Reviewer.java b/backend/src/main/java/corea/member/domain/Reviewer.java new file mode 100644 index 000000000..15e373b1e --- /dev/null +++ b/backend/src/main/java/corea/member/domain/Reviewer.java @@ -0,0 +1,24 @@ +package corea.member.domain; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import static jakarta.persistence.GenerationType.IDENTITY; + +@Entity +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +public class Reviewer { + + @Id + @GeneratedValue(strategy = IDENTITY) + private Long id; + + private String githubUserId; +} diff --git a/backend/src/main/java/corea/member/dto/MemberRoleResponse.java b/backend/src/main/java/corea/member/dto/MemberRoleResponse.java new file mode 100644 index 000000000..a066b66b1 --- /dev/null +++ b/backend/src/main/java/corea/member/dto/MemberRoleResponse.java @@ -0,0 +1,11 @@ +package corea.member.dto; + +import corea.member.domain.AuthRole; + +public record MemberRoleResponse(String role) { + + public static MemberRoleResponse from(boolean isReviewer) { + AuthRole role = isReviewer ? AuthRole.REVIEWER : AuthRole.REVIEWEE; + return new MemberRoleResponse(role.name()); + } +} diff --git a/backend/src/main/java/corea/member/repository/ReviewerRepository.java b/backend/src/main/java/corea/member/repository/ReviewerRepository.java new file mode 100644 index 000000000..76c11425e --- /dev/null +++ b/backend/src/main/java/corea/member/repository/ReviewerRepository.java @@ -0,0 +1,9 @@ +package corea.member.repository; + +import corea.member.domain.Reviewer; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ReviewerRepository extends JpaRepository { + + boolean existsByGithubUserId(String githubUserId); +} diff --git a/backend/src/main/java/corea/member/service/MemberService.java b/backend/src/main/java/corea/member/service/MemberService.java new file mode 100644 index 000000000..bf943e88b --- /dev/null +++ b/backend/src/main/java/corea/member/service/MemberService.java @@ -0,0 +1,20 @@ +package corea.member.service; + +import corea.member.domain.MemberReader; +import corea.member.dto.MemberRoleResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MemberService { + + private final MemberReader memberReader; + + public MemberRoleResponse getMemberRoleWithGithubUserId(String githubUserId) { + boolean isReviewer = memberReader.isReviewer(githubUserId); + return MemberRoleResponse.from(isReviewer); + } +} diff --git a/backend/src/main/java/corea/participation/service/ParticipationService.java b/backend/src/main/java/corea/participation/service/ParticipationService.java index ae0bf8e85..b64944287 100644 --- a/backend/src/main/java/corea/participation/service/ParticipationService.java +++ b/backend/src/main/java/corea/participation/service/ParticipationService.java @@ -3,6 +3,7 @@ import corea.exception.CoreaException; import corea.exception.ExceptionType; import corea.member.domain.Member; +import corea.member.domain.MemberReader; import corea.member.domain.MemberRole; import corea.member.repository.MemberRepository; import corea.participation.domain.Participation; @@ -25,6 +26,8 @@ public class ParticipationService { private final ParticipationWriter participationWriter; private final RoomRepository roomRepository; private final MemberRepository memberRepository; + //TODO: memberRepository -> Reader/Writer + private final MemberReader memberReader; @Transactional public ParticipationResponse participate(ParticipationRequest request) { @@ -35,7 +38,9 @@ public ParticipationResponse participate(ParticipationRequest request) { private Participation saveParticipation(ParticipationRequest request) { Member member = memberRepository.findById(request.memberId()) .orElseThrow(() -> new CoreaException(ExceptionType.MEMBER_NOT_FOUND)); + MemberRole memberRole = MemberRole.from(request.role()); + validateRole(member, memberRole); Room room = getRoom(request.roomId()); return participationWriter.create(room, member, memberRole, request.matchingSize()); @@ -60,6 +65,17 @@ private void validateMemberExist(long memberId) { } } + private void validateRole(Member member, MemberRole memberRole) { + boolean isReviewer = memberReader.isReviewer(member.getGithubUserId()); + + if (!isReviewer && memberRole.isReviewer()) { + throw new CoreaException(ExceptionType.MEMBER_IS_NOT_REVIEWER); + } + if (isReviewer && memberRole.isBoth()) { + throw new CoreaException(ExceptionType.MEMBER_IS_NOT_BOTH); + } + } + private Room getRoom(long roomId) { return roomRepository.findById(roomId) .orElseThrow(() -> new CoreaException(ExceptionType.ROOM_NOT_FOUND)); diff --git a/backend/src/main/java/corea/review/infrastructure/GithubCommentClient.java b/backend/src/main/java/corea/review/infrastructure/GithubCommentClient.java new file mode 100644 index 000000000..1fef4834a --- /dev/null +++ b/backend/src/main/java/corea/review/infrastructure/GithubCommentClient.java @@ -0,0 +1,69 @@ +package corea.review.infrastructure; + +import corea.auth.infrastructure.GithubProperties; +import corea.review.dto.GithubPullRequestReview; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestClient; + +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import java.util.stream.Stream; + +import static org.springframework.http.MediaType.APPLICATION_JSON; + +@EnableConfigurationProperties(GithubProperties.class) +@Component +public class GithubCommentClient { + + private static final Random RANDOM = new Random(); + + private final RestClient restClient; + private final GithubPullRequestUrlExchanger githubPullRequestUrlExchanger; + private final List personalAccessTokens; + + public GithubCommentClient(RestClient restClient, GithubPullRequestUrlExchanger githubPullRequestUrlExchanger, GithubProperties githubProperties) { + this.restClient = restClient; + this.githubPullRequestUrlExchanger = githubPullRequestUrlExchanger; + this.personalAccessTokens = githubProperties.pullRequest() + .tokens(); + } + + public List getPullRequestComments(String prLink) { + String commentApiUrl = githubPullRequestUrlExchanger.pullRequestUrlToComment(prLink); + + return Stream.iterate(1, page -> page + 1) + .map(page -> getPullRequestCommentsForPage(page, commentApiUrl)) + .takeWhile(this::hasMoreComments) + .flatMap(Arrays::stream) + .toList(); + } + + private GithubPullRequestReview[] getPullRequestCommentsForPage(int page, String commentApiUrl) { + String url = buildPageUrl(page, commentApiUrl); + + return restClient.get() + .uri(url) + .header(HttpHeaders.AUTHORIZATION, getRandomPersonalAccessToken()) + .accept(APPLICATION_JSON) + .retrieve() + .body(GithubPullRequestReview[].class); + } + + private String buildPageUrl(int page, String commentApiUrl) { + return commentApiUrl + "?page=" + page + "&per_page=100"; + } + + private boolean hasMoreComments(GithubPullRequestReview[] comments) { + return comments.length > 0; + } + + private String getRandomPersonalAccessToken() { + if (personalAccessTokens.isEmpty()) { + return ""; + } + return "Bearer " + personalAccessTokens.get(RANDOM.nextInt(personalAccessTokens.size())); + } +} diff --git a/backend/src/main/java/corea/auth/infrastructure/GithubPullRequestUrlExchanger.java b/backend/src/main/java/corea/review/infrastructure/GithubPullRequestUrlExchanger.java similarity index 60% rename from backend/src/main/java/corea/auth/infrastructure/GithubPullRequestUrlExchanger.java rename to backend/src/main/java/corea/review/infrastructure/GithubPullRequestUrlExchanger.java index 50e2ed209..ec3bf657d 100644 --- a/backend/src/main/java/corea/auth/infrastructure/GithubPullRequestUrlExchanger.java +++ b/backend/src/main/java/corea/review/infrastructure/GithubPullRequestUrlExchanger.java @@ -1,11 +1,13 @@ -package corea.auth.infrastructure; +package corea.review.infrastructure; import corea.exception.CoreaException; import corea.exception.ExceptionType; +import org.springframework.stereotype.Component; import java.util.List; import java.util.stream.IntStream; +@Component public class GithubPullRequestUrlExchanger { private static final String REVIEW_API_PREFIX = "api.github.com/repos"; @@ -13,21 +15,20 @@ public class GithubPullRequestUrlExchanger { private static final String HTTP_SECURE_PREFIX = "https://"; private static final String URL_DELIMITER = "/"; private static final String GITHUB_PULL_REQUEST_REVIEW_API_SUFFIX = "reviews"; + private static final String GITHUB_PULL_REQUEST_COMMENT_API_SUFFIX = "comments"; private static final String GITHUB_PULL_REQUEST_DOMAIN = "pull"; private static final String GITHUB_PULL_REQUEST_API_DOMAIN = "pulls"; + private static final String GITHUB_PULL_REQUEST_COMMENT_DOMAIN = "issues"; private static final int DOMAIN_PREFIX_INDEX = 0; private static final int GITHUB_PULL_REQUEST_URL_INDEX = 3; private static final int VALID_URL_SPLIT_COUNT = 5; - private GithubPullRequestUrlExchanger() { - } - - public static String pullRequestUrlToReview(String prLink) { + public String pullRequestUrlToReview(String prLink) { validatePrLink(prLink); return prLinkToReviewApiLink(prLink); } - private static void validatePrLink(String prUrl) { + private void validatePrLink(String prUrl) { if (prUrl == null || !prUrl.startsWith(HTTP_SECURE_PREFIX)) { throw new CoreaException(ExceptionType.INVALID_PULL_REQUEST_URL); } @@ -40,7 +41,7 @@ private static void validatePrLink(String prUrl) { } } - private static String prLinkToReviewApiLink(String prLink) { + private String prLinkToReviewApiLink(String prLink) { String[] splitPrLink = prLink.replaceFirst(HTTP_SECURE_PREFIX + GITHUB_PREFIX, "").split(URL_DELIMITER); List apiUrlComponents = IntStream.range(0, splitPrLink.length) .mapToObj(i -> filterPullUrlToApiUrl(splitPrLink, i)) @@ -49,10 +50,31 @@ private static String prLinkToReviewApiLink(String prLink) { String.join(URL_DELIMITER, apiUrlComponents) + URL_DELIMITER + GITHUB_PULL_REQUEST_REVIEW_API_SUFFIX; } - private static String filterPullUrlToApiUrl(String[] splitPrLink, int index) { + private String filterPullUrlToApiUrl(String[] splitPrLink, int index) { if (index != GITHUB_PULL_REQUEST_URL_INDEX) { return splitPrLink[index]; } return GITHUB_PULL_REQUEST_API_DOMAIN; } + + public String pullRequestUrlToComment(String prLink) { + validatePrLink(prLink); + return prLinkToCommentApiLink(prLink); + } + + private String prLinkToCommentApiLink(String prLink) { + String[] splitPrLink = prLink.replaceFirst(HTTP_SECURE_PREFIX + GITHUB_PREFIX, "").split(URL_DELIMITER); + List apiUrlComponents = IntStream.range(0, splitPrLink.length) + .mapToObj(i -> filterPullUrlToCommentUrl(splitPrLink, i)) + .toList(); + return HTTP_SECURE_PREFIX + REVIEW_API_PREFIX + + String.join(URL_DELIMITER, apiUrlComponents) + URL_DELIMITER + GITHUB_PULL_REQUEST_COMMENT_API_SUFFIX; + } + + private String filterPullUrlToCommentUrl(String[] splitPrLink, int index) { + if (index != GITHUB_PULL_REQUEST_URL_INDEX) { + return splitPrLink[index]; + } + return GITHUB_PULL_REQUEST_COMMENT_DOMAIN; + } } diff --git a/backend/src/main/java/corea/review/infrastructure/GithubReviewClient.java b/backend/src/main/java/corea/review/infrastructure/GithubReviewClient.java index f5f8cbdd0..423346897 100644 --- a/backend/src/main/java/corea/review/infrastructure/GithubReviewClient.java +++ b/backend/src/main/java/corea/review/infrastructure/GithubReviewClient.java @@ -1,28 +1,69 @@ package corea.review.infrastructure; import corea.auth.infrastructure.GithubProperties; -import corea.auth.infrastructure.GithubPullRequestUrlExchanger; import corea.review.dto.GithubPullRequestReview; -import lombok.RequiredArgsConstructor; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Component; import org.springframework.web.client.RestClient; +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import java.util.stream.Stream; + import static org.springframework.http.MediaType.APPLICATION_JSON; @EnableConfigurationProperties(GithubProperties.class) @Component -@RequiredArgsConstructor public class GithubReviewClient { + private static final Random RANDOM = new Random(); + private final RestClient restClient; + private final GithubPullRequestUrlExchanger githubPullRequestUrlExchanger; + private final List personalAccessTokens; + + public GithubReviewClient(RestClient restClient, GithubPullRequestUrlExchanger githubPullRequestUrlExchanger, GithubProperties githubProperties) { + this.restClient = restClient; + this.githubPullRequestUrlExchanger = githubPullRequestUrlExchanger; + this.personalAccessTokens = githubProperties.pullRequest() + .tokens(); + } + + public List getPullRequestReviews(String prLink) { + String reviewApiUrl = githubPullRequestUrlExchanger.pullRequestUrlToReview(prLink); + + return Stream.iterate(1, page -> page + 1) + .map(page -> getPullRequestReviewsForPage(page, reviewApiUrl)) + .takeWhile(this::hasMoreReviews) + .flatMap(Arrays::stream) + .toList(); + } + + private GithubPullRequestReview[] getPullRequestReviewsForPage(int page, String reviewApiUrl) { + String url = buildPageUrl(page, reviewApiUrl); - public GithubPullRequestReview[] getReviewLink(String prLink) { - String url = GithubPullRequestUrlExchanger.pullRequestUrlToReview(prLink); return restClient.get() .uri(url) + .header(HttpHeaders.AUTHORIZATION, getRandomPersonalAccessToken()) .accept(APPLICATION_JSON) .retrieve() .body(GithubPullRequestReview[].class); } + + private String buildPageUrl(int page, String reviewApiUrl) { + return reviewApiUrl + "?page=" + page + "&per_page=100"; + } + + private boolean hasMoreReviews(GithubPullRequestReview[] reviews) { + return reviews.length > 0; + } + + private String getRandomPersonalAccessToken() { + if (personalAccessTokens.isEmpty()) { + return ""; + } + return "Bearer " + personalAccessTokens.get(RANDOM.nextInt(personalAccessTokens.size())); + } } diff --git a/backend/src/main/java/corea/review/infrastructure/GithubReviewProvider.java b/backend/src/main/java/corea/review/infrastructure/GithubReviewProvider.java index 0b3aca546..668bbd162 100644 --- a/backend/src/main/java/corea/review/infrastructure/GithubReviewProvider.java +++ b/backend/src/main/java/corea/review/infrastructure/GithubReviewProvider.java @@ -5,23 +5,37 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; -import java.util.Arrays; +import java.util.List; +import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; @Component @RequiredArgsConstructor public class GithubReviewProvider { private final GithubReviewClient reviewClient; + private final GithubCommentClient commentClient; - public GithubPullRequestReviewInfo getReviewWithPrLink(String prLink) { - final GithubPullRequestReview[] result = reviewClient.getReviewLink(prLink); - return new GithubPullRequestReviewInfo(Arrays.stream(result) + public GithubPullRequestReviewInfo provideReviewInfo(String prLink) { + //TODO: getPullRequestReviews, getPullRequestComments에서 prLink를 중복으로 검증하고 있음. + List reviews = reviewClient.getPullRequestReviews(prLink); + List comments = commentClient.getPullRequestComments(prLink); + + Map result = collectPullRequestReviews(reviews, comments); + return new GithubPullRequestReviewInfo(result); + } + + private Map collectPullRequestReviews(List reviews, List comments) { + return Stream.concat( + reviews.stream(), + comments.stream() + ) .collect(Collectors.toMap( GithubPullRequestReview::getGithubUserId, Function.identity(), (x, y) -> x - ))); + )); } } diff --git a/backend/src/main/java/corea/review/service/ReviewService.java b/backend/src/main/java/corea/review/service/ReviewService.java index 2f095ce8c..040bb6e5a 100644 --- a/backend/src/main/java/corea/review/service/ReviewService.java +++ b/backend/src/main/java/corea/review/service/ReviewService.java @@ -6,6 +6,7 @@ import corea.matchresult.domain.MatchResultReader; import corea.matchresult.domain.MatchResultWriter; import corea.review.dto.GithubPullRequestReview; +import corea.review.dto.GithubPullRequestReviewInfo; import corea.review.infrastructure.GithubReviewProvider; import corea.room.domain.RoomReader; import corea.room.domain.RoomStatus; @@ -34,15 +35,16 @@ public void completeReview(long roomId, long reviewerId, long revieweeId) { throw new CoreaException(ExceptionType.ROOM_STATUS_INVALID); } MatchResult matchResult = matchResultReader.findOne(roomId, reviewerId, revieweeId); - String prLink = getPrReviewLink(matchResult.getPrLink(), matchResult.getReviewerGithubId()); - matchResultWriter.reviewComplete(matchResult, prLink); + String reviewLink = getPrReviewLink(matchResult.getPrLink(), matchResult.getReviewerGithubId()); + matchResultWriter.reviewComplete(matchResult, reviewLink); log.info("리뷰 완료[{매칭 ID({}), 리뷰어 ID({}, 리뷰이 ID({})", matchResult.getId(), reviewerId, revieweeId); } private String getPrReviewLink(String prLink, String reviewerGithubId) { - return githubReviewProvider.getReviewWithPrLink(prLink) - .findWithGithubUserId(reviewerGithubId) + GithubPullRequestReviewInfo reviewInfo = githubReviewProvider.provideReviewInfo(prLink); + + return reviewInfo.findWithGithubUserId(reviewerGithubId) .map(GithubPullRequestReview::html_url) .orElseThrow(() -> new CoreaException(ExceptionType.NOT_COMPLETE_GITHUB_REVIEW)); } diff --git a/backend/src/main/java/corea/room/dto/RoomUpdateRequest.java b/backend/src/main/java/corea/room/dto/RoomUpdateRequest.java index b1a0a586a..19d6a83c1 100644 --- a/backend/src/main/java/corea/room/dto/RoomUpdateRequest.java +++ b/backend/src/main/java/corea/room/dto/RoomUpdateRequest.java @@ -4,7 +4,6 @@ import corea.member.domain.Member; import corea.room.domain.Room; import corea.room.domain.RoomClassification; -import corea.room.domain.RoomStatus; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; diff --git a/backend/src/main/java/corea/room/service/RoomService.java b/backend/src/main/java/corea/room/service/RoomService.java index c6dc1d52e..63846d184 100644 --- a/backend/src/main/java/corea/room/service/RoomService.java +++ b/backend/src/main/java/corea/room/service/RoomService.java @@ -1,7 +1,5 @@ package corea.room.service; -import corea.exception.CoreaException; -import corea.exception.ExceptionType; import corea.matchresult.repository.MatchResultRepository; import corea.member.domain.Member; import corea.member.domain.MemberReader; @@ -23,6 +21,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; @Slf4j @Service @@ -81,10 +80,12 @@ public RoomParticipantResponses findParticipants(long roomId, long memberId) { Collections.shuffle(participants); - return new RoomParticipantResponses(participants.stream() + List roomParticipantResponses = participants.stream() .limit(RANDOM_DISPLAY_PARTICIPANTS_SIZE) .map(participation -> getRoomParticipantResponse(roomId, participation)) - .toList(), participants.size()); + .filter(Objects::nonNull) + .toList(); + return new RoomParticipantResponses(roomParticipantResponses, participants.size()); } private boolean isValidParticipant(Participation participation, long memberId) { @@ -102,7 +103,7 @@ private RoomParticipantResponse getRoomParticipantResponse(long roomId, Particip .getGithubUserId(), matchResult.getReviewee() .getUsername(), matchResult.getPrLink(), matchResult.getReviewee() .getThumbnailUrl())) - .orElseThrow(() -> new CoreaException(ExceptionType.MEMBER_NOT_FOUND)); + .orElse(null); } public RoomResponse getRoomById(long roomId) { diff --git a/backend/src/main/java/corea/scheduler/service/MatchingExecutor.java b/backend/src/main/java/corea/scheduler/service/MatchingExecutor.java index 71b067d4e..7688eec9a 100644 --- a/backend/src/main/java/corea/scheduler/service/MatchingExecutor.java +++ b/backend/src/main/java/corea/scheduler/service/MatchingExecutor.java @@ -38,8 +38,7 @@ public void match(long roomId) { return null; }); } catch (CoreaException e) { - log.warn("매칭 실행 중 에러 발생: {}", e.getMessage(), e); - recordMatchingFailure(roomId, e.getExceptionType()); + recordMatchingFailure(roomId, e); } } @@ -50,12 +49,12 @@ private void startMatching(long roomId) { matchingService.match(roomId, pullRequestInfo); } - private void recordMatchingFailure(long roomId, ExceptionType exceptionType) { + private void recordMatchingFailure(long roomId, CoreaException e) { //TODO: 위와 동일 TransactionTemplate template = new TransactionTemplate(transactionManager); template.execute(status -> { updateRoomStatusToFail(roomId); - saveFailedMatching(roomId, exceptionType); + saveFailedMatching(roomId, e); return null; }); } @@ -65,9 +64,11 @@ private void updateRoomStatusToFail(long roomId) { room.updateStatusToFail(); } - private void saveFailedMatching(long roomId, ExceptionType exceptionType) { - FailedMatching failedMatching = new FailedMatching(roomId, exceptionType); + private void saveFailedMatching(long roomId, CoreaException e) { + FailedMatching failedMatching = new FailedMatching(roomId, e.getExceptionType()); failedMatchingRepository.save(failedMatching); + + log.info("매칭 실행 중 에러 발생. 방 아이디={}, 실패 원인={}", roomId, e.getMessage(), e); } private Room getRoom(long roomId) { diff --git a/backend/src/main/resources/config b/backend/src/main/resources/config index 7af7af1e0..7918cfd62 160000 --- a/backend/src/main/resources/config +++ b/backend/src/main/resources/config @@ -1 +1 @@ -Subproject commit 7af7af1e09c3410d6c652ab93741835577a7e49b +Subproject commit 7918cfd62b8d269d695deda0a2957b9884899aa6 diff --git a/backend/src/test/java/corea/fixture/MemberFixture.java b/backend/src/test/java/corea/fixture/MemberFixture.java index 7677efe26..07c48a430 100644 --- a/backend/src/test/java/corea/fixture/MemberFixture.java +++ b/backend/src/test/java/corea/fixture/MemberFixture.java @@ -2,6 +2,7 @@ import corea.member.domain.Member; import corea.member.domain.Profile; +import corea.member.domain.Reviewer; import java.util.List; import java.util.stream.IntStream; @@ -168,18 +169,27 @@ public static Member MEMBER_PORORO_GITHUB() { ); } + public static Reviewer MEMBER_YOUNGSU_REVIEWER() { + return new Reviewer( + null, + "98307410" + ); + } + public static List SEVEN_MEMBERS() { return List.of(MEMBER_PORORO(), MEMBER_ASH(), MEMBER_YOUNGSU(), MEMBER_CHOCO(), MEMBER_MOVIN(), MEMBER_TENTEN()); } public static List CREATE_MEMBERS(int index) { - return IntStream.range(0, index).mapToObj(idx -> new Member( - "name : " + (idx + 10), - "https://avatars.githubusercontent.com/u/98307410?v=4", - null, - "jcoding-play@gmail.com", - false, - "119468757" - )).toList(); + return IntStream.range(0, index) + .mapToObj(idx -> new Member( + "name : " + (idx + 10), + "https://avatars.githubusercontent.com/u/98307410?v=4", + null, + "jcoding-play@gmail.com", + false, + "119468757" + )) + .toList(); } } diff --git a/backend/src/test/java/corea/member/repository/ProfileRepositoryTest.java b/backend/src/test/java/corea/member/repository/ProfileRepositoryTest.java index 0c01ddd40..981af8264 100644 --- a/backend/src/test/java/corea/member/repository/ProfileRepositoryTest.java +++ b/backend/src/test/java/corea/member/repository/ProfileRepositoryTest.java @@ -22,7 +22,7 @@ class ProfileRepositoryTest { @DisplayName("사용자가 쓴 피드백의 개수를 셀 수 있다.") void findDeliverCountByProfile() { Profile profile = new Profile(3, 2, 1, 5.0f, 5.0f); - memberRepository.save(MemberFixture.MEMBER_PORORO(profile)); + profileRepository.save(profile); long result = profileRepository.findDeliverCountByProfile(profile); diff --git a/backend/src/test/java/corea/participation/service/ParticipationServiceTest.java b/backend/src/test/java/corea/participation/service/ParticipationServiceTest.java index 8eb75c6fa..0f07efb40 100644 --- a/backend/src/test/java/corea/participation/service/ParticipationServiceTest.java +++ b/backend/src/test/java/corea/participation/service/ParticipationServiceTest.java @@ -7,19 +7,20 @@ import corea.member.domain.Member; import corea.member.domain.MemberRole; import corea.member.repository.MemberRepository; +import corea.member.repository.ReviewerRepository; import corea.participation.domain.Participation; import corea.participation.domain.ParticipationStatus; import corea.participation.dto.ParticipationRequest; import corea.participation.repository.ParticipationRepository; import corea.room.domain.Room; import corea.room.repository.RoomRepository; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; import org.springframework.beans.factory.annotation.Autowired; import static corea.fixture.MemberFixture.MEMBER_YOUNGSU; +import static corea.fixture.MemberFixture.MEMBER_YOUNGSU_REVIEWER; import static org.assertj.core.api.Assertions.*; @ServiceTest @@ -34,20 +35,59 @@ class ParticipationServiceTest { @Autowired private MemberRepository memberRepository; + @Autowired + private ReviewerRepository reviewerRepository; + @Autowired private ParticipationRepository participationRepository; - @ParameterizedTest - @CsvSource({"both", "reviewer"}) - @DisplayName("멤버가 방에 참여한다.") - void participate(String role) { + @AfterEach + void tearDown() { + reviewerRepository.deleteAll(); + } + + @Test + @DisplayName("멤버가 BOTH 로 방에 참여한다.") + void participate_with_both() { + Member member = memberRepository.save(MEMBER_YOUNGSU()); + Room room = roomRepository.save(RoomFixture.ROOM_DOMAIN(member)); + + assertThatCode(() -> participationService.participate(new ParticipationRequest(room.getId(), member.getId(), "both", 2))) + .doesNotThrowAnyException(); + } + + @Test + @DisplayName("리뷰어가 아닌데 reviewer 로 참여시 예외를 발생한다.") + void throw_exception_when_participate_reviewer_with_not_reviewer() { + Member member = memberRepository.save(MEMBER_YOUNGSU()); + Room room = roomRepository.save(RoomFixture.ROOM_DOMAIN(member)); + + assertThatCode(() -> participationService.participate(new ParticipationRequest(room.getId(), member.getId(), "reviewer", 2))) + .isInstanceOf(CoreaException.class); + } + + @Test + @DisplayName("리뷰어가 reviewer 로 방에 참여한다.") + void participate_with_reviewer() { Member member = memberRepository.save(MEMBER_YOUNGSU()); + reviewerRepository.save(MEMBER_YOUNGSU_REVIEWER()); Room room = roomRepository.save(RoomFixture.ROOM_DOMAIN(member)); - assertThatCode(() -> participationService.participate(new ParticipationRequest(room.getId(), member.getId(), role, 2))) + assertThatCode(() -> participationService.participate(new ParticipationRequest(room.getId(), member.getId(), "reviewer", 2))) .doesNotThrowAnyException(); } + @Test + @DisplayName("리뷰어가 both 로 참여시 예외를 발생한다.") + void throw_exception_when_participate_both_with_not_both() { + Member member = memberRepository.save(MEMBER_YOUNGSU()); + reviewerRepository.save(MEMBER_YOUNGSU_REVIEWER()); + Room room = roomRepository.save(RoomFixture.ROOM_DOMAIN(member)); + + assertThatCode(() -> participationService.participate(new ParticipationRequest(room.getId(), member.getId(), "both", 2))) + .isInstanceOf(CoreaException.class); + } + @Test @DisplayName("ID에 해당하는 방이 없으면 예외를 발생한다.") void participate_throw_exception_when_roomId_not_exist() { diff --git a/backend/src/test/java/corea/review/infrastructure/GithubCommentClientTest.java b/backend/src/test/java/corea/review/infrastructure/GithubCommentClientTest.java new file mode 100644 index 000000000..b63ff9b0b --- /dev/null +++ b/backend/src/test/java/corea/review/infrastructure/GithubCommentClientTest.java @@ -0,0 +1,30 @@ +package corea.review.infrastructure; + +import corea.review.dto.GithubPullRequestReview; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@Disabled +@SpringBootTest +class GithubCommentClientTest { + + @Autowired + private GithubCommentClient githubCommentClient; + + @Test + @DisplayName("해당 PR 링크에 존재하는 커멘트들을 가져온다.") + void getPullRequestComments() { + String prLink = "https://github.com/youngsu5582/github-api-test/pull/1"; + + List comments = githubCommentClient.getPullRequestComments(prLink); + + assertThat(comments).hasSize(2); + } +} diff --git a/backend/src/test/java/corea/auth/infrastructure/GithubPullRequestUrlExchangerTest.java b/backend/src/test/java/corea/review/infrastructure/GithubPullRequestUrlExchangerTest.java similarity index 76% rename from backend/src/test/java/corea/auth/infrastructure/GithubPullRequestUrlExchangerTest.java rename to backend/src/test/java/corea/review/infrastructure/GithubPullRequestUrlExchangerTest.java index 5148d7446..aac952461 100644 --- a/backend/src/test/java/corea/auth/infrastructure/GithubPullRequestUrlExchangerTest.java +++ b/backend/src/test/java/corea/review/infrastructure/GithubPullRequestUrlExchangerTest.java @@ -1,6 +1,8 @@ -package corea.auth.infrastructure; +package corea.review.infrastructure; import corea.exception.CoreaException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -10,15 +12,23 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +@Disabled class GithubPullRequestUrlExchangerTest { + private GithubPullRequestUrlExchanger githubPullRequestUrlExchanger; + + @BeforeEach + void setUp() { + githubPullRequestUrlExchanger = new GithubPullRequestUrlExchanger(); + } + @Test @DisplayName("올바른 Pull Request URL 을 상응하는 Github API 요청 주소로 변환한다.") void test() { String test = "https://github.com/woowacourse-teams/2024-corea/pull/1"; String expected = "https://api.github.com/repos/woowacourse-teams/2024-corea/pulls/1/reviews"; - assertThat(GithubPullRequestUrlExchanger.pullRequestUrlToReview(test)).isEqualTo(expected); + assertThat(githubPullRequestUrlExchanger.pullRequestUrlToReview(test)).isEqualTo(expected); } @Test @@ -26,7 +36,7 @@ void test() { void validate1() { String test = "http://github.com/woowacourse-teams/2024-corea/pull/1"; - assertThatThrownBy(() -> GithubPullRequestUrlExchanger.pullRequestUrlToReview(test)) + assertThatThrownBy(() -> githubPullRequestUrlExchanger.pullRequestUrlToReview(test)) .isInstanceOf(CoreaException.class); } @@ -34,7 +44,7 @@ void validate1() { @NullAndEmptySource @DisplayName("빈 주소에 대해 예외를 발생한다.") void validate2(String test) { - assertThatThrownBy(() -> GithubPullRequestUrlExchanger.pullRequestUrlToReview(test)) + assertThatThrownBy(() -> githubPullRequestUrlExchanger.pullRequestUrlToReview(test)) .isInstanceOf(CoreaException.class); } @@ -46,7 +56,7 @@ void validate2(String test) { "https://github.com/woowacourse-teams/2024-corea/pull"}) @DisplayName("올바르지 않은 Pull Request 주소에 대해 예외를 발생한다.") void validate3(String test) { - assertThatThrownBy(() -> GithubPullRequestUrlExchanger.pullRequestUrlToReview(test)) + assertThatThrownBy(() -> githubPullRequestUrlExchanger.pullRequestUrlToReview(test)) .isInstanceOf(CoreaException.class); } } diff --git a/backend/src/test/java/corea/auth/infrastructure/GithubPullRequestReviewClientTest.java b/backend/src/test/java/corea/review/infrastructure/GithubReviewClientTest.java similarity index 65% rename from backend/src/test/java/corea/auth/infrastructure/GithubPullRequestReviewClientTest.java rename to backend/src/test/java/corea/review/infrastructure/GithubReviewClientTest.java index 3a38c0897..ad401996b 100644 --- a/backend/src/test/java/corea/auth/infrastructure/GithubPullRequestReviewClientTest.java +++ b/backend/src/test/java/corea/review/infrastructure/GithubReviewClientTest.java @@ -1,32 +1,35 @@ -package corea.auth.infrastructure; +package corea.review.infrastructure; import corea.review.dto.GithubPullRequestReview; -import corea.review.infrastructure.GithubReviewClient; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; +@Disabled @SpringBootTest -class GithubPullRequestReviewClientTest { +class GithubReviewClientTest { @Autowired private GithubReviewClient client; @Test @DisplayName("해당 PR 링크에 존재하는 리뷰들을 가져온다.") - void getReviewLink() { + void getPullRequestReviews() { String prLink1 = "https://github.com/woowacourse-teams/2024-corea/pull/10"; String prLink2 = "https://github.com/woowacourse-teams/2024-corea/pull/96"; String prLink3 = "https://github.com/woowacourse-teams/2024-corea/pull/114"; String prLink4 = "https://github.com/woowacourse-teams/2024-corea/pull/8"; - GithubPullRequestReview[] reviews1 = client.getReviewLink(prLink1); - GithubPullRequestReview[] reviews2 = client.getReviewLink(prLink2); - GithubPullRequestReview[] reviews3 = client.getReviewLink(prLink3); - GithubPullRequestReview[] reviews4 = client.getReviewLink(prLink4); + List reviews1 = client.getPullRequestReviews(prLink1); + List reviews2 = client.getPullRequestReviews(prLink2); + List reviews3 = client.getPullRequestReviews(prLink3); + List reviews4 = client.getPullRequestReviews(prLink4); assertThat(reviews1).hasSize(1); assertThat(reviews2).hasSize(8); diff --git a/backend/src/test/java/corea/review/infrastructure/GithubReviewProviderTest.java b/backend/src/test/java/corea/review/infrastructure/GithubReviewProviderTest.java index 72dfef61d..61165dae0 100644 --- a/backend/src/test/java/corea/review/infrastructure/GithubReviewProviderTest.java +++ b/backend/src/test/java/corea/review/infrastructure/GithubReviewProviderTest.java @@ -2,12 +2,15 @@ import corea.review.dto.GithubPullRequestReview; import corea.review.dto.GithubPullRequestReviewInfo; -import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import static org.assertj.core.api.Assertions.assertThat; + +@Disabled @SpringBootTest class GithubReviewProviderTest { @@ -15,24 +18,58 @@ class GithubReviewProviderTest { private GithubReviewProvider githubReviewProvider; @Test - @DisplayName("리뷰한 사람의 리뷰 링크를 찾을 수 있다.") - void getReviewWithPrLink() { - GithubPullRequestReviewInfo result = githubReviewProvider.getReviewWithPrLink("https://github.com/youngsu5582/github-api-test/pull/5"); + @DisplayName("한 사람이 하나의 리뷰를 남겼을 시, 리뷰한 사람의 리뷰 링크를 찾는다.") + void provideReviewInfo1() { + GithubPullRequestReviewInfo result = githubReviewProvider.provideReviewInfo("https://github.com/youngsu5582/github-api-test/pull/5"); - // 입력된 pr에 무빈이 남긴 리뷰 -> 1개만 존재 - GithubPullRequestReview review = result.findWithGithubUserId("80106238").get(); + // 입력된 pr에 텐텐이 남긴 리뷰 -> 1개 존재 + GithubPullRequestReview review = result.findWithGithubUserId("63334368").get(); + + assertThat(review.html_url()).isEqualTo("https://github.com/youngsu5582/github-api-test/pull/5#pullrequestreview-2362410991"); + } + + @Test + @DisplayName("한 사람이 하나의 커멘트를 남겼을 시, 리뷰한 사람의 커멘트 링크를 찾는다.") + void provideReviewInfo2() { + GithubPullRequestReviewInfo result = githubReviewProvider.provideReviewInfo("https://github.com/youngsu5582/github-api-test/pull/10"); + + // 입력된 pr에 뽀로로가 남긴 커멘트 -> 1개 존재 + GithubPullRequestReview review = result.findWithGithubUserId("119468757").get(); - Assertions.assertThat(review.html_url()).isEqualTo("https://github.com/youngsu5582/github-api-test/pull/5#pullrequestreview-2327171078"); + assertThat(review.html_url()).isEqualTo("https://github.com/youngsu5582/github-api-test/pull/10#issuecomment-2429806517"); } @Test @DisplayName("한 사람이 여러 리뷰를 남겼을 시, 첫번째 리뷰 링크를 찾는다.") - void getReviewWithPrLink_duplicatedKey() { - GithubPullRequestReviewInfo result = githubReviewProvider.getReviewWithPrLink("https://github.com/youngsu5582/github-api-test/pull/5"); + void provideReviewInfo3() { + GithubPullRequestReviewInfo result = githubReviewProvider.provideReviewInfo("https://github.com/youngsu5582/github-api-test/pull/5"); + + // 입력된 pr에 무빈이 남긴 리뷰 -> 2개 존재 + GithubPullRequestReview review = result.findWithGithubUserId("80106238").get(); + + assertThat(review.html_url()).isEqualTo("https://github.com/youngsu5582/github-api-test/pull/5#pullrequestreview-2327171078"); + } + + @Test + @DisplayName("한 사람이 여러 커멘트를 남겼을 시, 첫번째 커멘트 링크를 찾는다.") + void provideReviewInfo4() { + GithubPullRequestReviewInfo result = githubReviewProvider.provideReviewInfo("https://github.com/youngsu5582/github-api-test/pull/3"); + + // 입력된 pr에 뽀로로가 남긴 커멘트 -> 2개 존재 + GithubPullRequestReview review = result.findWithGithubUserId("119468757").get(); + + assertThat(review.html_url()).isEqualTo("https://github.com/youngsu5582/github-api-test/pull/3#issuecomment-2429811119"); + } + + @Test + @DisplayName("한 사람이 여러 리뷰와 커멘트를 남겼을 시, 첫번째 리뷰 링크를 찾는다.") + void provideReviewInfo5() { + GithubPullRequestReviewInfo result = githubReviewProvider.provideReviewInfo("https://github.com/youngsu5582/github-api-test/pull/1"); // 입력된 pr에 뽀로로가 남긴 리뷰 -> 2개 존재 + // 입력된 pr에 뽀로로가 남긴 커멘트 -> 2개 존재 GithubPullRequestReview review = result.findWithGithubUserId("119468757").get(); - Assertions.assertThat(review.html_url()).isEqualTo("https://github.com/youngsu5582/github-api-test/pull/5#pullrequestreview-2327172283"); + assertThat(review.html_url()).isEqualTo("https://github.com/youngsu5582/github-api-test/pull/1#pullrequestreview-2383980194"); } } diff --git a/backend/src/test/java/corea/review/service/ReviewServiceTest.java b/backend/src/test/java/corea/review/service/ReviewServiceTest.java index eac9ef099..713bca658 100644 --- a/backend/src/test/java/corea/review/service/ReviewServiceTest.java +++ b/backend/src/test/java/corea/review/service/ReviewServiceTest.java @@ -13,7 +13,8 @@ import corea.member.domain.Member; import corea.member.repository.MemberRepository; import corea.review.dto.GithubPullRequestReview; -import corea.review.infrastructure.GithubReviewClient; +import corea.review.dto.GithubPullRequestReviewInfo; +import corea.review.infrastructure.GithubReviewProvider; import corea.room.domain.Room; import corea.room.repository.RoomRepository; import org.assertj.core.api.InstanceOfAssertFactories; @@ -23,6 +24,9 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; +import java.util.Collections; +import java.util.Map; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.anyString; @@ -44,7 +48,7 @@ class ReviewServiceTest { private MatchResultRepository matchResultRepository; @MockBean - private GithubReviewClient githubReviewClient; + private GithubReviewProvider githubReviewProvider; @Test @Transactional @@ -55,18 +59,21 @@ void completeReview() { Room room = roomRepository.save(RoomFixture.ROOM_DOMAIN_WITH_PROGRESS(memberRepository.save(MemberFixture.MEMBER_ROOM_MANAGER_JOYSON()))); MatchResult matchResult = matchResultRepository.save(MatchResultFixture.MATCH_RESULT_DOMAIN(room.getId(), reviewer, reviewee)); - when(githubReviewClient.getReviewLink(anyString())) - .thenReturn(new GithubPullRequestReview[]{ - new GithubPullRequestReview( - "id", - new GithubUserInfo( - reviewer.getUsername(), - reviewer.getName(), - reviewer.getThumbnailUrl(), - reviewer.getEmail(), - String.valueOf(reviewer.getGithubUserId())), - "html_url")} - ); + when(githubReviewProvider.provideReviewInfo(anyString())) + .thenReturn(new GithubPullRequestReviewInfo( + Map.of( + reviewer.getGithubUserId(), + new GithubPullRequestReview( + "id", + new GithubUserInfo( + reviewer.getUsername(), + reviewer.getName(), + reviewer.getThumbnailUrl(), + reviewer.getEmail(), + reviewer.getGithubUserId()), + "html_url") + ))); + reviewService.completeReview(room.getId(), reviewer.getId(), reviewee.getId()); assertThat(matchResult.getReviewStatus()).isEqualTo(ReviewStatus.COMPLETE); @@ -80,7 +87,8 @@ void notCompleteReview() { Room room = roomRepository.save(RoomFixture.ROOM_DOMAIN_WITH_PROGRESS(memberRepository.save(MemberFixture.MEMBER_ROOM_MANAGER_JOYSON()))); matchResultRepository.save(MatchResultFixture.MATCH_RESULT_DOMAIN(room.getId(), reviewer, reviewee)); - when(githubReviewClient.getReviewLink(anyString())).thenReturn(new GithubPullRequestReview[]{}); + when(githubReviewProvider.provideReviewInfo(anyString())) + .thenReturn(new GithubPullRequestReviewInfo(Collections.emptyMap())); assertThatThrownBy(() -> reviewService.completeReview(room.getId(), reviewer.getId(), reviewee.getId())) .asInstanceOf(InstanceOfAssertFactories.type(CoreaException.class)) diff --git a/frontend/public/index.html b/frontend/public/index.html index 4da635dc1..1300b15dd 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -16,7 +16,7 @@ property="og:description" content="주니어 개발자들이 서로 코드리뷰하고 피드백 받을 수 있는 플랫폼" /> - + @@ -39,5 +39,6 @@
+
diff --git a/frontend/public/logo.webp b/frontend/public/logo.png similarity index 100% rename from frontend/public/logo.webp rename to frontend/public/logo.png diff --git a/frontend/src/@types/icon.ts b/frontend/src/@types/icon.ts index cd7228f47..1c1674cd5 100644 --- a/frontend/src/@types/icon.ts +++ b/frontend/src/@types/icon.ts @@ -20,6 +20,8 @@ type IconKind = | "arrowDropDown" | "arrowDropUp" | "arrowRenew" - | "check"; + | "check" + | "menu" + | "close"; export default IconKind; diff --git a/frontend/src/apis/auth.api.ts b/frontend/src/apis/auth.api.ts index 663e8a793..5e01674d2 100644 --- a/frontend/src/apis/auth.api.ts +++ b/frontend/src/apis/auth.api.ts @@ -1,12 +1,11 @@ import apiClient from "./apiClient"; import { API_ENDPOINTS } from "./endpoints"; +import { UserInfoResponse } from "@/hooks/mutations/useMutateAuth"; import { UserInfo } from "@/@types/userInfo"; import { serverUrl } from "@/config/serverUrl"; import MESSAGES from "@/constants/message"; -export const postLogin = async ( - code: string, -): Promise<{ accessToken: string; refreshToken: string; userInfo: UserInfo }> => { +export const postLogin = async (code: string): Promise => { const response = await fetch(`${serverUrl}${API_ENDPOINTS.LOGIN}`, { method: "POST", headers: { @@ -26,12 +25,13 @@ export const postLogin = async ( const authBody = text ? JSON.parse(text) : response; const refreshToken = authBody.refreshToken; const userInfo = authBody.userInfo as UserInfo; + const memberRole = authBody.memberRole as string; if (!accessToken) { throw new Error(MESSAGES.ERROR.POST_LOGIN); } - return { accessToken, refreshToken, userInfo }; + return { accessToken, refreshToken, userInfo, memberRole }; }; export const postLogout = async (): Promise => { diff --git a/frontend/src/assets/index.ts b/frontend/src/assets/index.ts index 36cc6da44..d7fc49472 100644 --- a/frontend/src/assets/index.ts +++ b/frontend/src/assets/index.ts @@ -23,4 +23,12 @@ export { default as rank1 } from "@/assets/ranking/rank-1.svg"; export { default as rank2 } from "@/assets/ranking/rank-2.svg"; export { default as rank3 } from "@/assets/ranking/rank-3.svg"; +export { default as question_with_color } from "@/assets/intro/question_with_color.svg"; +export { default as puzzle_with_people_color } from "@/assets/intro/puzzle_with_people_color.svg"; +export { default as step1_pic } from "@/assets/intro/step1_pic.webp"; +export { default as step2_pic } from "@/assets/intro/step2_pic.webp"; +export { default as step3_pic } from "@/assets/intro/step3_pic.webp"; +export { default as step4_pic } from "@/assets/intro/step4_pic.webp"; +export { default as step5_pic } from "@/assets/intro/step5_pic.webp"; + export { default as mainLogo } from "@/assets/coreaLogo/coreaMainLogo.svg"; diff --git a/frontend/src/assets/intro/puzzle_with_people_color.svg b/frontend/src/assets/intro/puzzle_with_people_color.svg new file mode 100644 index 000000000..e9570b449 --- /dev/null +++ b/frontend/src/assets/intro/puzzle_with_people_color.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/frontend/src/assets/intro/question_with_color.svg b/frontend/src/assets/intro/question_with_color.svg new file mode 100644 index 000000000..5301c9219 --- /dev/null +++ b/frontend/src/assets/intro/question_with_color.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/intro/step1_pic.webp b/frontend/src/assets/intro/step1_pic.webp new file mode 100644 index 0000000000000000000000000000000000000000..24550221bf8f98b577458b4dbe94b60a2f78b904 GIT binary patch literal 228604 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

2gKb$ESHMX(&0}$*(=f-7KyT)u>=DM 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