Skip to content

Commit

Permalink
코레아 1.2v 배포 (#638)
Browse files Browse the repository at this point in the history
* [BE] 방 매칭 실패 시 매칭 실패 원인을 전달하는 기능 구현(#562) (#575)

* feat: 반환된 예외를 통해 실패 원인을 찾는 기능 구현

* feat: 실패한 매칭 정보를 저장하는 엔티티 구현

* feat: 매칭을 실패했을 경우 실패한 매칭 정보를 저장하는 기능 구현

* refactor: 클래스명 변경

* feat: 반환된 예외를 통해 매칭 실패 원인에 대한 메세지를 얻는 기능 구현

* refactor: FailedMatching 생성자 변경

* feat: 매칭 실패한 방을 조회시, 실패 원인을 같이 전달하는 기능 구현

* refactor: 맵 구현체 변경

* refactor: 피드백 반영

---------

Co-authored-by: gyungchan Jo <[email protected]>

* [BE] 방 종료 시, 코드 리뷰 완료 버튼 동작 안하도록 하는 기능 구현(#579) (#580)

* feat: 방 종료 후 코드 리뷰 완료 버튼 검증 로직 구현

* fix: 잘못된 요청값 수정 (#566)

Co-authored-by: youngsu5582 <[email protected]>

* refactor: 리뷰 완료 요청 검증 로직 변경

---------

Co-authored-by: gyungchan Jo <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: youngsu5582 <[email protected]>

* [BE] 참여했던 방이 종료되면 참여 중 탭에서 제거(#581) (#584)

* feat: 참여했던 방이 종료되면 참여 중 탭에서 제거하는 기능 구현

* [BE] 중복으로 매칭되던 상황 해결(#587) (#588)

* refactor: 도메인 수정

* feat: 리뷰어, 리뷰이 조회 API 기능 구현

* refactor: 중복된 기능 코드 제거

* docs: 메서드 시그니쳐 통일

* feat: 시연용 데이터 추가

* refactor: 패키지 이동으로 인한 오류 수정

* feat: 시연용 데이터 추가

* fix: REMOTE_ORIGIN 그냥 변수로 변경

* feat: 데이터 추가

* feat: 서브모듈 반영

* feat: response 생성 때 reviewer, reviewee 분리

* feat: application 설정 변경

* feat: 데모 데이터 함수로 분리

* fix: 누락된 saveAll 추가

* fix: 데이터 정합성 수정

* fix: roomId 상수 변경

* feat: 피드백 키워드 뒤 .제거

* refactor: 3차 데모데이 데이터 변경

* feat: room 4에 대한 케이스도 추가

* feat: room 4 매칭 추가

* fix: 응답 내 프로필 링크로 변경

* 최신 브랜치 병합

* feat: submodule 업데이트

* refactor: 서브모듈 변경

* fix: 매칭 중복 예외 처리 안되던 오류 해결

* fix: 리뷰어 매칭 안되던 오류 수정

* test: participationFilter 로직 수정에 따른 테스트 수정

---------

Co-authored-by: hjk0761 <[email protected]>
Co-authored-by: youngsu5582 <[email protected]>

* feat: pr 제출 안 했을 때 문구 추가 (#590)

Co-authored-by: jinsil <[email protected]>

* [BE] 방 생성 검증 로직 주석 처리(#593) (#594)

* refactor: 방 생성 검증 로직 주석 처리

* refactor: 운영 환경 설정 변경

* refactor: 방 생성 검증 로직 테스트 disabled 처리

---------

Co-authored-by: gyungchan Jo <[email protected]>

* [BE] 방 매칭 실패 시 매칭 실패 원인을 전달하는 기능 구현(#562) (#575)

* feat: 반환된 예외를 통해 실패 원인을 찾는 기능 구현

* feat: 실패한 매칭 정보를 저장하는 엔티티 구현

* feat: 매칭을 실패했을 경우 실패한 매칭 정보를 저장하는 기능 구현

* refactor: 클래스명 변경

* feat: 반환된 예외를 통해 매칭 실패 원인에 대한 메세지를 얻는 기능 구현

* refactor: FailedMatching 생성자 변경

* feat: 매칭 실패한 방을 조회시, 실패 원인을 같이 전달하는 기능 구현

* refactor: 맵 구현체 변경

* refactor: 피드백 반영

---------

Co-authored-by: gyungchan Jo <[email protected]>

* [BE] 방 종료 시, 코드 리뷰 완료 버튼 동작 안하도록 하는 기능 구현(#579) (#580)

* feat: 방 종료 후 코드 리뷰 완료 버튼 검증 로직 구현

* fix: 잘못된 요청값 수정 (#566)

Co-authored-by: youngsu5582 <[email protected]>

* refactor: 리뷰 완료 요청 검증 로직 변경

---------

Co-authored-by: gyungchan Jo <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: youngsu5582 <[email protected]>

---------

Co-authored-by: gyungchan Jo <[email protected]>
Co-authored-by: ashsty <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: hjk0761 <[email protected]>
Co-authored-by: youngsu5582 <[email protected]>
Co-authored-by: jinsil <[email protected]>

* refactor: 로컬 서버용 깃허브 토큰 변경 (#600)

Co-authored-by: gyungchan Jo <[email protected]>

* [BE] Room Controller 역할 분리(#595) (#596)

* refactor: Room Controller 역할 분리

* refactor: 피드백 반영

---------

Co-authored-by: youngsu5582 <[email protected]>

* [BE] 자동 예약 및 자동 업데이트 동시성 제어(#586) (#604)

* feat: Lock을 통한 자동 매칭 동시성 제어 기능 구현

* feat: Lock을 통한 자동 업데이트 동시성 제어 기능 구현

* feat: 자동 매칭 Lock 범위 최소화를 위한 클래스 구현

* feat: 자동 예약 Lock 범위 최소화를 위한 클래스 구현

* test: 자동 매칭 테스트 중복 코드 추상 클래스로 이동

* test: 자동 예약 테스트 중복 코드 추상 클래스로 이동

* refactor: Transactional 어노테이션 제거

* refactor: 피드백 반영

---------

Co-authored-by: gyungchan Jo <[email protected]>

* [BE] 방 수정 기능 & 스케줄러 부분 분리 및 리팩토링(#605) (#606)

* feat: repository 의존성 제거, 테스트 명확하게 변경

* feat: Reader/Writer 통해 조회 로직 분리

* feat: 룸 수정 기능 구현

* refactor: 피드백 반영

* fix: 충돌 해결

---------

Co-authored-by: youngsu5582 <[email protected]>

* [FE] 콜리네 서비스 제공후 QA(#597) (#602)

* fix: 모집 마감 -> 종료된 방으로 변경

* fix: 매칭 후 pr 제출 안 해서 실패했을 때 바로 문구 띄우기

* design: 모달 이름에 width 변경

* design: 프로필 드롭다운에서 이름 다 보여지게 하기

* design: 배너 medium일 때 높이 수정

* feat: timeDropdown에서 선택된 시간이 제일 위에 떠있게 하기

* feat: 피드백 모아보기에서 세부 피드백에 scroll 추가

* design: 세부 피드백 높이 지정

* fix: content 길이 길어졌을 때 ... 로 보이게 하기

* design: 피드백 모달 엔터처리, line-height 추가

* feat: 분류 드롭다운으로 선택하게 변경

* feat: 키워드 없을 때 ui 처리

* feat: 방 매칭 실패 시 서버가 준 message 띄우기

* [BE] Room Controller 역할 분리(#595) (#596)

* refactor: Room Controller 역할 분리

* refactor: 피드백 반영

---------

Co-authored-by: youngsu5582 <[email protected]>

* refactor: ALL 타입 추가

* feat: 수정된 api에 맞게 message 타입 추가

* fix: 방 생성 시 키워드 입력을 안했을 때 렌더링 조건 수정

* feat: 바뀐 RoomInfo 데이터 형식에 맞게 storybook 수정

---------

Co-authored-by: jinsil <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: youngsu5582 <[email protected]>
Co-authored-by: 00kang <[email protected]>

* [BE] 참여했던 방이 종료 된 후, 종료 탭 및 마이페이지에서 안보이는 문제 해결(#607) (#611)

* refactor: 참여한 방을 조회하는 기능 수정

* refactor: 방을 조회하는 기능 메서드 분리

* refactor: 방을 조회 메서드 클래스 분리

* test: Nested 어노테이션을 통한 RoomServiceTest 관심사 분리

* feat: 참여했던 방이 종료되면 종료 탭에서 보이도록 하는 기능 구현

* feat: 종료 탭에서 자신이 참여했던 방도 나타내는 기능 구현

* test: 테스트 수정

* refactor: 조회 쿼리 수정

* refactor: 피드백 반영

* refactor: 변수명 변경

---------

Co-authored-by: gyungchan Jo <[email protected]>

* [BE] 로그 중복 작성 제거, 비즈니스 로직 내 로그 추가(#608) (#610)

* feat: additivity false 로 변경

* refactor: 참가,취소 로직 분리

* chore: 로그 레벨 변경

* feat: 로그 추가

* refactor: 피드백 반영

---------

Co-authored-by: youngsu5582 <[email protected]>

* [FE] 24시간 이하로 남으면 디데이 말고 시간 보여주기(#598) (#609)

* fix: 디데이가 1일 남은경우에도 24시간 미만 남은경우 남은 dday로 반환하도록 변경

* refactor: areDatesEqual 함수를 dateFormatter 유틸 함수로 이동

* fix: 중복된 함수 제거

* test: 데이터 포메팅 유틸 함수 테스트코드 추가

* test: 테스트 시 이미지 모듈은 mock string 값이 반환되도록 모킹

* test: 룸 카드의 남은 기간 정보 UI 렌더링 테스트 추가

* fix: 진행중인 방의 D-Day 가 잘못 표기되는 문제 해결

* test: 테스트 명세 오타 수정

* test: 방 상세정보의 모집/리뷰 마감까지 남은 시간 렌더링 테스트 추가

* test: jest 환경에서 시간대를 한국 시간대를 사용하도록 변경

* feat: SEO 최적화를 위해 html에 메타태그 추가

---------

Co-authored-by: Lee sang Yeop <[email protected]>

* [FE] 생성페이지 달력, 시간 입력 리팩토링(#603) (#614)

* design: 방 생성 페이지 모바일, 태블릿 대응

* refactor: error props 제거

* feat: DateTimePicker 생성하여 날짜, 시간 한번에 관리

* refactor: formatCombinedDateTime 인자 하나로 받기

* refactor: handleInputChange 함수로 통합하기

* refactor: 분류 type 맞추기

* feat: 방 생성 유효성 처리

---------

Co-authored-by: jinsil <[email protected]>

* refactor: 초기 데이터 주석 처리

* refactor: 초기 참여자 사이즈 변경

* feat: 매칭 실패 원인을 전달하는 기능 구현

* [BE] 방 응답 시, CLASSIFICATION 반환 추가(#621) (#623)

* feat: 방 정보 응답 시, classification 정보 추가

* feat: 개발 서버 액세스 토큰 변경

* test: 테스트 통과하도록 주석 처리

---------

Co-authored-by: gyungchan Jo <[email protected]>

* refactor: 요청 dto 제약 조건 변경

* [FE] 방 수정 기능 추가(#616) (#620)

* feat: hostType node_env로 판별

* feat: 검색 title 변경

* fix: test에 message 추가하여 오류 해결

* feat: 방 수정 api 추가

* refactor: classification 속성 추가하기

* refactor: 방 상세 정보 가져오는 함수 훅으로 분리

* feat: 방 생성, 수정 페이지 분리

* fix: put 요청으로 변경

* refactor: getInitialFormState 함수로 분리

* design: 드롭다운 선택된 것 다르게 보여주기

* refactor: 불필요한 코드 제거

* fix: roomId로 변경

* feat: roomId로 변경

---------

Co-authored-by: jinsil <[email protected]>

* [FE] 참여 중인 방에 대해 바뀐 명세서 반영하기(#612) (#622)

* refactor: 수정된 API명세서에 맞게 includeClosed 쿼리 추가

* feat: 참여중 라벨 추가

* feat: 참여중, 모집중 라벨 같이 보여주기

* feat: 종료, 매칭실패 라벨 같이 보여주기

* feat: 참여중 라벨을 범용적으로 사용하기 위해 참여로 수정

* refactor: 참여 라벨, 매칭실패 라벨 고려하여 추가하기

* test: roomStatus, participationStatus, message 상태에 따라 다르게 보여지는 라벨의 테스트 구현

* feat: 서비스 어느 곳에서든지 참여 라벨이 있을 경우 상세페이지로 리다이렉팅

---------

Co-authored-by: 00kang <[email protected]>
Co-authored-by: Lee sang Yeop <[email protected]>

* [BE] 쓴 피드백은 피드백 모아보기에서 바로 볼 수 있도록 변경 + 리팩터링(#613) (#617)

* refactor: 작성한 피드백은 바로 피드백 모아보기에서 보도록 수정

* refactor: 피드백 가져오는 역할 클래스 분리

* refactor: 개발 피드백 작성 기능 수정

* refactor: 개발 피드백 수정 기능 변경

* refactor: 개발 피드백 조회 기능 수정

* refactor: 생성, 수정 dto 분리

* refactor: 피드백을 조회하는 기능 수정

* refactor: 피드백 반영

* refactor: 피드백 반영

---------

Co-authored-by: gyungchan Jo <[email protected]>

* [BE] 매칭 로직 원복 및 수정(#624) (#627)

* refactor: 도메인 수정

* feat: 리뷰어, 리뷰이 조회 API 기능 구현

* refactor: 중복된 기능 코드 제거

* docs: 메서드 시그니쳐 통일

* feat: 시연용 데이터 추가

* refactor: 패키지 이동으로 인한 오류 수정

* feat: 시연용 데이터 추가

* fix: REMOTE_ORIGIN 그냥 변수로 변경

* feat: 데이터 추가

* feat: 서브모듈 반영

* feat: response 생성 때 reviewer, reviewee 분리

* feat: application 설정 변경

* feat: 데모 데이터 함수로 분리

* fix: 누락된 saveAll 추가

* fix: 데이터 정합성 수정

* fix: roomId 상수 변경

* feat: 피드백 키워드 뒤 .제거

* refactor: 3차 데모데이 데이터 변경

* feat: room 4에 대한 케이스도 추가

* feat: room 4 매칭 추가

* fix: 응답 내 프로필 링크로 변경

* 최신 브랜치 병합

* feat: submodule 업데이트

* refactor: 서브모듈 변경

* feat: submodule 업데이트

* refactor: 매칭 로직 원복

* fix: 매칭 로직 오류 수정

* refactor: 변수명 직관적으로 수정

* refactor: 리뷰어를 제외하고 matchingSize 만큼 추가 매칭하도록 수정

* refactor: 리뷰어가 matchingSize 만큼 리뷰이와 매칭되도록 수정

* feat: submodule 업데이트

* refactor: 피드백 반영

* refactor: 변수명 수정

---------

Co-authored-by: hjk0761 <[email protected]>
Co-authored-by: youngsu5582 <[email protected]>
Co-authored-by: HyunJoong Kim <[email protected]>

* [BE] 참여한 전체 방들 조회할 때, 실패 원인 같이 보내는 기능 구현(#625) (#629)

* refactor: ParticipationWriter 패키지 변경 및 코드 포맷팅 적용

* refactor: 작은 단위로 클래스 분리

* refactor: 예외 타입명 변경

* refactor: 참여했지만 매칭에 실패했던 모든 방들을 조회할 때 실패 메시지를 같이 보내는 기능 구현

* refactor: 방 조회 기능 수정

* test: 방 관련 테스트 추가

---------

Co-authored-by: gyungchan Jo <[email protected]>

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: gyungchan Jo <[email protected]>
Co-authored-by: youngsu5582 <[email protected]>
Co-authored-by: ashsty <[email protected]>
Co-authored-by: hjk0761 <[email protected]>
Co-authored-by: jinsil <[email protected]>
Co-authored-by: 00kang <[email protected]>
Co-authored-by: HyunJoong Kim <[email protected]>
  • Loading branch information
9 people authored Oct 19, 2024
1 parent 5f5466f commit 1bd4df4
Show file tree
Hide file tree
Showing 151 changed files with 4,813 additions and 1,947 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/frontend-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ jobs:
- name: Checkout
uses: actions/checkout@v4

- name: Set timezone to Asia/Seoul
run: sudo timedatectl set-timezone Asia/Seoul

# 노드 설치
- name: Install Nodejs
uses: actions/setup-node@v4
Expand Down
464 changes: 231 additions & 233 deletions backend/src/main/java/corea/ContextInitializer.java

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion backend/src/main/java/corea/DataInitializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public void run(ApplicationArguments args) {
LocalDateTime.of(2024, 12, 25, 12, 30),
LocalDateTime.of(2025, 1, 3, 12, 0),
RoomClassification.BACKEND, RoomStatus.OPEN));
roomRepository.save(
Room closedRoom = roomRepository.save(
new Room("방 제목 10", "방 설명 10", 3,
null, null, List.of("TDD", "클린코드"),
1, 20, member1,
Expand Down Expand Up @@ -204,6 +204,7 @@ public void run(ApplicationArguments args) {
participationRepository.save(new Participation(room7, member1, MemberRole.BOTH, room7.getMatchingSize()));
participationRepository.save(new Participation(room7, member2, MemberRole.BOTH, room7.getMatchingSize()));

participationRepository.save(new Participation(closedRoom, member1, MemberRole.BOTH, closedRoom.getMatchingSize()));
participationRepository.save(new Participation(roomProgress, member1, MemberRole.BOTH, roomProgress.getMatchingSize()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ public AuthInfo resolveArgument(MethodParameter parameter, ModelAndViewContainer
if (accessToken.equals(ANONYMOUS)) {
throw new CoreaException(ExceptionType.AUTHORIZATION_ERROR);
}
log.info("로그인 시도[토큰={}]", accessToken);

long memberId = tokenService.findMemberIdByToken(accessToken);
Member member = memberRepository.findById(memberId)
Expand Down
13 changes: 11 additions & 2 deletions backend/src/main/java/corea/auth/service/LoginService.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,14 @@
import corea.member.domain.Member;
import corea.member.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import static corea.exception.ExceptionType.INVALID_TOKEN;
import static corea.exception.ExceptionType.TOKEN_EXPIRED;

@Slf4j
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
Expand All @@ -35,7 +37,13 @@ public TokenInfo login(GithubUserInfo userInfo) {
}

private Member register(GithubUserInfo userInfo) {
return memberRepository.save(new Member(userInfo.login(), userInfo.avatarUrl(), userInfo.name(), userInfo.email(), true, userInfo.id()));
Member member = memberRepository.save(new Member(userInfo.login(), userInfo.avatarUrl(), userInfo.name(), userInfo.email(), true, userInfo.id()));
logCreateMembers(member);
return member;
}

private void logCreateMembers(Member member) {
log.info("멤버를 생성했습니다. 멤버 id={}, 멤버 이름={},깃허브 id={}, 닉네임={}", member.getId(), member.getName(), member.getGithubUserId(), member.getUsername());
}

private String extendAuthorization(Member member) {
Expand All @@ -56,7 +64,8 @@ public String refresh(String refreshToken) {
.orElseThrow(() -> new CoreaException(INVALID_TOKEN));
return tokenService.createAccessToken(info.getMember());
} catch (CoreaException e) {
if (e.getExceptionType().equals(TOKEN_EXPIRED)) {
if (e.getExceptionType()
.equals(TOKEN_EXPIRED)) {
logoutService.logoutByExpiredRefreshToken(refreshToken);
}
throw e;
Expand Down
6 changes: 4 additions & 2 deletions backend/src/main/java/corea/exception/ExceptionType.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@
@Getter
public enum ExceptionType {

ALREADY_APPLY(HttpStatus.BAD_REQUEST, "해당 방에 이미 참여했습니다."),
NOT_ALREADY_APPLY(HttpStatus.BAD_REQUEST, "아직 참여하지 않은 방입니다."),
ALREADY_PARTICIPATED_ROOM(HttpStatus.BAD_REQUEST, "해당 방에 이미 참여했습니다."),
NOT_PARTICIPATED_ROOM(HttpStatus.BAD_REQUEST, "아직 참여하지 않은 방입니다."),
ROOM_STATUS_INVALID(HttpStatus.BAD_REQUEST, "방이 마감되었습니다."),
MEMBER_IS_NOT_MANAGER(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 미제출로 인해 인원이 부족하여 매칭을 진행할 수 없습니다."),
Expand All @@ -26,6 +27,7 @@ public enum ExceptionType {
INVALID_TOKEN(HttpStatus.UNAUTHORIZED, "토큰이 올바르지 않습니다."),
AUTHORIZATION_ERROR(HttpStatus.UNAUTHORIZED, "인증에 실패했습니다."),
ROOM_DELETION_AUTHORIZATION_ERROR(HttpStatus.UNAUTHORIZED, "방 삭제 권한이 없습니다. 방 생성자만 방을 삭제할 수 있습니다."),
FEEDBACK_UPDATE_AUTHORIZATION_ERROR(HttpStatus.UNAUTHORIZED, "피드백 수정 권한이 없습니다. 피드백 작성자만 피드백을 수정할 수 있습니다."),

MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 멤버를 찾을 수 없습니다."),
ROOM_NOT_FOUND(HttpStatus.NOT_FOUND, "방을 찾을 수 없습니다."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

import corea.auth.annotation.LoginMember;
import corea.auth.domain.AuthInfo;
import corea.feedback.dto.DevelopFeedbackRequest;
import corea.feedback.dto.DevelopFeedbackCreateRequest;
import corea.feedback.dto.DevelopFeedbackResponse;
import corea.feedback.dto.DevelopFeedbackUpdateRequest;
import corea.feedback.service.DevelopFeedbackService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
Expand All @@ -16,15 +17,13 @@ public class DevelopFeedbackController implements DevelopFeedbackControllerSpeci

private final DevelopFeedbackService developFeedbackService;

@Override
@PostMapping
public ResponseEntity<Void> create(@PathVariable long roomId, @LoginMember AuthInfo authInfo, @RequestBody DevelopFeedbackRequest request) {
public ResponseEntity<Void> create(@PathVariable long roomId, @LoginMember AuthInfo authInfo, @RequestBody DevelopFeedbackCreateRequest request) {
developFeedbackService.create(roomId, authInfo.getId(), request);
return ResponseEntity.ok()
.build();
}

@Override
@GetMapping
public ResponseEntity<DevelopFeedbackResponse> developFeedback(
@PathVariable long roomId, @RequestParam String username, @LoginMember AuthInfo authInfo) {
Expand All @@ -33,10 +32,9 @@ public ResponseEntity<DevelopFeedbackResponse> developFeedback(
.body(response);
}

@Override
@PutMapping("/{feedbackId}")
public ResponseEntity<Void> update(
@PathVariable long roomId, @PathVariable long feedbackId, @LoginMember AuthInfo authInfo, @RequestBody DevelopFeedbackRequest request) {
@PathVariable long roomId, @PathVariable long feedbackId, @LoginMember AuthInfo authInfo, @RequestBody DevelopFeedbackUpdateRequest request) {
developFeedbackService.update(feedbackId, authInfo.getId(), request);
return ResponseEntity.ok()
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

import corea.auth.domain.AuthInfo;
import corea.exception.ExceptionType;
import corea.feedback.dto.DevelopFeedbackRequest;
import corea.feedback.dto.DevelopFeedbackCreateRequest;
import corea.feedback.dto.DevelopFeedbackResponse;
import corea.feedback.dto.DevelopFeedbackUpdateRequest;
import corea.global.annotation.ApiErrorResponses;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
Expand All @@ -26,7 +27,7 @@ ResponseEntity<Void> create(
@Parameter(description = "방 아이디", example = "1")
long roomId,
AuthInfo authInfo,
DevelopFeedbackRequest request);
DevelopFeedbackCreateRequest request);

@Operation(summary = "개발 관련 피드백 리스트를 반환합니다.",
description = "자신에게 사람들이 남긴 개발 능력 관련 피드백을 읽어옵니다. <br>" +
Expand Down Expand Up @@ -59,5 +60,5 @@ ResponseEntity<Void> update(
@Parameter(description = "피드백 아이디", example = "2")
long feedbackId,
AuthInfo authInfo,
DevelopFeedbackRequest request);
DevelopFeedbackUpdateRequest request);
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ public DevelopFeedback(long roomId, Member deliver, Member receiver, int evaluat
this(null, roomId, deliver, receiver, evaluatePoint, keywords, feedBackText, recommendationPoint);
}

public boolean isNotMatchingDeliver(long deliverId) {
return deliver.isNotMatchingId(deliverId);
}

public void update(int evaluationPoint, List<String> feedbackKeywords, String feedbackText, int recommendationPoint) {
this.evaluatePoint = evaluationPoint;
this.keywords = FeedbackKeywordConverter.convertToKeywords(feedbackKeywords);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package corea.feedback.domain;

import corea.exception.CoreaException;
import corea.exception.ExceptionType;
import corea.feedback.dto.FeedbackOutput;
import corea.feedback.repository.DevelopFeedbackRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Component
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class DevelopFeedbackReader {

private final DevelopFeedbackRepository developFeedbackRepository;

public Map<Long, List<FeedbackOutput>> collectDeliverDevelopFeedback(long feedbackDeliverId) {
return developFeedbackRepository.findAllByDeliverId(feedbackDeliverId)
.stream()
.map(FeedbackOutput::fromDeliver)
.collect(Collectors.groupingBy(FeedbackOutput::roomId));
}

public Map<Long, List<FeedbackOutput>> collectReceivedDevelopFeedback(long feedbackReceiverId) {
return developFeedbackRepository.findAllByReceiverId(feedbackReceiverId)
.stream()
.map(FeedbackOutput::fromReceiver)
.collect(Collectors.groupingBy(FeedbackOutput::roomId));
}

public DevelopFeedback findById(long feedbackId) {
return developFeedbackRepository.findById(feedbackId)
.orElseThrow(() -> new CoreaException(ExceptionType.FEEDBACK_NOT_FOUND));
}

public DevelopFeedback findDevelopFeedback(long roomId, long deliverId, String username) {
return developFeedbackRepository.findByRoomIdAndDeliverIdAndReceiverUsername(roomId, deliverId, username)
.orElseThrow(() -> new CoreaException(ExceptionType.FEEDBACK_NOT_FOUND));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package corea.feedback.domain;

import corea.exception.CoreaException;
import corea.exception.ExceptionType;
import corea.feedback.dto.DevelopFeedbackUpdateInput;
import corea.feedback.repository.DevelopFeedbackRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

@Slf4j
@Component
@RequiredArgsConstructor
@Transactional
public class DevelopFeedbackWriter {

private final DevelopFeedbackRepository developFeedbackRepository;

public DevelopFeedback create(DevelopFeedback developFeedback, long roomId, long deliverId, long receiverId) {
validateAlreadyExist(roomId, deliverId, receiverId);
log.info("개발 피드백 작성 [방 ID={}, 작성자 ID={}, 수신자 ID={}]", roomId, deliverId, receiverId);

return developFeedbackRepository.save(developFeedback);
}

private void validateAlreadyExist(long roomId, long deliverId, long receiverId) {
if (developFeedbackRepository.existsByRoomIdAndDeliverIdAndReceiverId(roomId, deliverId, receiverId)) {
throw new CoreaException(ExceptionType.ALREADY_COMPLETED_FEEDBACK);
}
}

public void update(DevelopFeedback developFeedback, long deliverId, DevelopFeedbackUpdateInput input) {
validateUpdateAuthority(developFeedback, deliverId);
log.info("개발 피드백 업데이트 [피드백 ID={}, 작성자 ID={}, 요청값={}]", developFeedback.getId(), developFeedback, input);

developFeedback.update(
input.evaluationPoint(),
input.feedbackKeywords(),
input.feedbackText(),
input.recommendationPoint()
);
}

private void validateUpdateAuthority(DevelopFeedback developFeedback, long deliverId) {
if (developFeedback.isNotMatchingDeliver(deliverId)) {
throw new CoreaException(ExceptionType.FEEDBACK_UPDATE_AUTHORIZATION_ERROR);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package corea.feedback.domain;

import corea.feedback.dto.FeedbackOutput;
import corea.feedback.repository.SocialFeedbackRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Component
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class SocialFeedbackReader {

private final SocialFeedbackRepository socialFeedbackRepository;

public Map<Long, List<FeedbackOutput>> collectDeliverSocialFeedback(long feedbackDeliverId) {
return socialFeedbackRepository.findAllByDeliverId(feedbackDeliverId)
.stream()
.map(FeedbackOutput::fromDeliver)
.collect(Collectors.groupingBy(FeedbackOutput::roomId));
}

public Map<Long, List<FeedbackOutput>> collectReceivedSocialFeedback(long feedbackReceiverId) {
return socialFeedbackRepository.findAllByReceiverId(feedbackReceiverId)
.stream()
.map(FeedbackOutput::fromReceiver)
.collect(Collectors.groupingBy(FeedbackOutput::roomId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package corea.feedback.dto;

import corea.feedback.domain.DevelopFeedback;
import corea.feedback.util.FeedbackKeywordConverter;
import corea.member.domain.Member;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;

import java.util.List;

@Schema(description = "개발 능력 관련 피드백 작성 요청")
public record DevelopFeedbackCreateRequest(@Schema(description = "리뷰이 아이디", example = "2")
@NotNull
long receiverId,

@Schema(description = "평가 점수", example = "4")
@NotNull
int evaluationPoint,

@Schema(description = "선택한 피드백 키워드", example = "[\"코드를 이해하기 쉬웠어요\", \"컨벤션이 잘 지켜졌어요\"]")
@NotNull
List<String> feedbackKeywords,

@Schema(description = "부가 작성 가능한 피드백 텍스트", example = "처음 자바를 접해봤다고 했는데 생각보다 매우 잘 구성되어 있는 코드였습니다. ...")
String feedbackText,

@Schema(description = "랭킹에 필요한 추천 점수", example = "2")
int recommendationPoint) {

public DevelopFeedback toEntity(long roomId, Member deliver, Member receiver) {
return new DevelopFeedback(
roomId,
deliver,
receiver,
evaluationPoint,
FeedbackKeywordConverter.convertToKeywords(feedbackKeywords),
feedbackText,
recommendationPoint
);
}
}

This file was deleted.

Loading

0 comments on commit 1bd4df4

Please sign in to comment.