From 0c22359bc97dba0377cbb3c53c50693aa4b2c43b Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Mon, 25 Nov 2024 22:00:14 +0900 Subject: [PATCH 01/15] =?UTF-8?q?test(community):=20communityBoard=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 커뮤니티 게시글 목록 조회 - 커뮤니티 게시글 목록 사용자별 조회 - 커뮤니티 게시글 상세 조회 --- .../repository/CommunityRepositoryTest.java | 114 +++++++++ .../query/CommunityBoardQueryServiceTest.java | 238 ++++++++++++++++++ 2 files changed, 352 insertions(+) create mode 100644 src/test/java/com/somemore/community/repository/CommunityRepositoryTest.java create mode 100644 src/test/java/com/somemore/community/service/query/CommunityBoardQueryServiceTest.java diff --git a/src/test/java/com/somemore/community/repository/CommunityRepositoryTest.java b/src/test/java/com/somemore/community/repository/CommunityRepositoryTest.java new file mode 100644 index 000000000..7acc82d4c --- /dev/null +++ b/src/test/java/com/somemore/community/repository/CommunityRepositoryTest.java @@ -0,0 +1,114 @@ +package com.somemore.community.repository; + +import com.somemore.IntegrationTestSupport; +import com.somemore.community.domain.CommunityBoard; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + + +@Transactional +public class CommunityRepositoryTest extends IntegrationTestSupport { + + @Autowired + private CommunityBoardRepository communityBoardRepository; + + @DisplayName("커뮤니티 id로 커뮤니티 상세 정보를 조회할 수 있다. (Repository)") + @Test + void findById() { + //given + CommunityBoard communityBoard = CommunityBoard.builder() + .title("테스트 커뮤니티 게시글 제목") + .content("테스트 커뮤니티 게시글 내용") + .imgUrl("http://community.example.com/123") + .writerId(UUID.randomUUID()) + .build(); + + communityBoardRepository.save(communityBoard); + + //when + Optional foundCommunityBoard = communityBoardRepository.findById(communityBoard.getId()); + + //then + assertThat(foundCommunityBoard).isNotNull(); + assertThat(foundCommunityBoard.get().getTitle()).isEqualTo("테스트 커뮤니티 게시글 제목"); + assertThat(foundCommunityBoard.get().getContent()).isEqualTo("테스트 커뮤니티 게시글 내용"); + assertThat(foundCommunityBoard.get().getImgUrl()).isEqualTo("http://community.example.com/123"); + assertThat(foundCommunityBoard.get().getWriterId()).isEqualTo(communityBoard.getWriterId()); + } + + @DisplayName("저장된 전체 커뮤니티 게시글을 목록으로 조회할 수 있다. (Repository)") + @Test + void getCommunityBoards() { + //given + CommunityBoard communityBoard1 = CommunityBoard.builder() + .title("테스트 커뮤니티 게시글 제목1") + .content("테스트 커뮤니티 게시글 내용1") + .imgUrl("http://community.example.com/123") + .writerId(UUID.randomUUID()) + .build(); + + CommunityBoard communityBoard2 = CommunityBoard.builder() + .title("테스트 커뮤니티 게시글 제목2") + .content("테스트 커뮤니티 게시글 내용2") + .imgUrl("http://community.example.com/12") + .writerId(UUID.randomUUID()) + .build(); + + communityBoardRepository.save(communityBoard1); + communityBoardRepository.save(communityBoard2); + + //when + List communityBoards = communityBoardRepository.getCommunityBoards(); + + //then + assertThat(communityBoards.size()).isEqualTo(2); + assertThat(communityBoards.get(0)).isEqualTo(communityBoard2); + assertThat(communityBoards.get(1)).isEqualTo(communityBoard1); + } + + @DisplayName("저장된 커뮤니티 게시글 리스트를 작성자별로 조회할 수 있다. (Repository)") + @Test + void getCommunityBoardsByWriterId() { + //given + CommunityBoard communityBoard1 = CommunityBoard.builder() + .title("테스트 커뮤니티 게시글 제목1") + .content("테스트 커뮤니티 게시글 내용1") + .imgUrl("http://community.example.com/123") + .writerId(UUID.randomUUID()) + .build(); + + CommunityBoard communityBoard2 = CommunityBoard.builder() + .title("테스트 커뮤니티 게시글 제목2") + .content("테스트 커뮤니티 게시글 내용2") + .imgUrl("http://community.example.com/12") + .writerId(communityBoard1.getWriterId()) + .build(); + + CommunityBoard communityBoard3 = CommunityBoard.builder() + .title("테스트 커뮤니티 게시글 제목3") + .content("테스트 커뮤니티 게시글 내용3") + .imgUrl("http://community.example.com/1") + .writerId(UUID.randomUUID()) + .build(); + + communityBoardRepository.save(communityBoard1); + communityBoardRepository.save(communityBoard2); + communityBoardRepository.save(communityBoard3); + + //when + List communityBoards = communityBoardRepository.getCommunityBoardsByWriterId(communityBoard1.getWriterId()); + + //then + assertThat(communityBoards.size()).isEqualTo(2); + assertThat(communityBoards.get(0)).isEqualTo(communityBoard2); + assertThat(communityBoards.get(1)).isEqualTo(communityBoard1); + } +} diff --git a/src/test/java/com/somemore/community/service/query/CommunityBoardQueryServiceTest.java b/src/test/java/com/somemore/community/service/query/CommunityBoardQueryServiceTest.java new file mode 100644 index 000000000..517448a67 --- /dev/null +++ b/src/test/java/com/somemore/community/service/query/CommunityBoardQueryServiceTest.java @@ -0,0 +1,238 @@ +package com.somemore.community.service.query; + +import com.somemore.IntegrationTestSupport; +import com.somemore.auth.oauth.OAuthProvider; +import com.somemore.center.domain.Center; +import com.somemore.center.repository.CenterRepository; +import com.somemore.community.domain.CommunityBoard; +import com.somemore.community.dto.request.CommunityBoardCreateRequestDto; +import com.somemore.community.dto.response.CommunityBoardGetDetailResponseDto; +import com.somemore.community.dto.response.CommunityBoardGetResponseDto; +import com.somemore.community.repository.CommunityBoardRepository; +import com.somemore.community.service.command.CreateCommunityBoardService; +import com.somemore.global.exception.BadRequestException; +import com.somemore.global.exception.ExceptionMessage; +import com.somemore.volunteer.domain.Volunteer; +import com.somemore.volunteer.repository.VolunteerRepository; +import org.assertj.core.api.ThrowableAssert; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +class CommunityBoardQueryServiceTest extends IntegrationTestSupport { + + @Autowired + CommunityBoardRepository communityBoardRepository; + @Autowired + VolunteerRepository volunteerRepository; + @Autowired + CenterRepository centerRepository; + @Autowired + CreateCommunityBoardService createCommunityBoardService; + @Autowired + CommunityBoardQueryService communityBoardQueryService; + + @AfterEach + void tearDown() { + communityBoardRepository.deleteAllInBatch(); + } + + @DisplayName("저장된 커뮤니티 게시글 리스트를 조회한다.") + @Test + void getAllCommunityBoards() { + + //given + String oAuthId = "example-oauth-id"; + Volunteer volunteer = Volunteer.createDefault(OAuthProvider.NAVER, oAuthId); + + Volunteer savedVolunteer = volunteerRepository.save(volunteer); + + Center center = Center.create( + "기본 기관 이름", + "010-1234-5678", + "http://example.com/image.jpg", + "기관 소개 내용", + "http://example.com", + "account123", + "password123" + ); + Center savedCenter = centerRepository.save(center); + + CommunityBoardCreateRequestDto dto1 = CommunityBoardCreateRequestDto.builder() + .title("커뮤니티 테스트 제목1") + .content("커뮤니티 테스트 내용1") + .build(); + + CommunityBoardCreateRequestDto dto2 = CommunityBoardCreateRequestDto.builder() + .title("커뮤니티 테스트 제목2") + .content("커뮤니티 테스트 내용2") + .build(); + + + String imgUrl1 = "https://image.test.url/123"; + + Long communityId1 = createCommunityBoardService.createCommunityBoard(dto1, savedCenter.getId(), null); + Long communityId2 = createCommunityBoardService.createCommunityBoard(dto2, savedVolunteer.getId(), imgUrl1); + + // when + List dtos = communityBoardQueryService.getCommunityBoards(); + + // then + Optional communityBoard1 = communityBoardRepository.findById(communityId1); + Optional communityBoard2 = communityBoardRepository.findById(communityId2); + + assertThat(dtos).isNotNull(); + assertThat(dtos).hasSize(2); + + CommunityBoardGetResponseDto board1 = dtos.getLast(); + assertThat(board1.id()).isEqualTo(communityId1); + assertThat(board1.writerNickname()).isEqualTo(savedCenter.getName()); + assertThat(board1.title()).isEqualTo(dto1.title()); + assertThat(board1.createdAt()).isEqualTo(communityBoard1.get().getCreatedAt()); + + CommunityBoardGetResponseDto board2 = dtos.getFirst(); + assertThat(board2.id()).isEqualTo(communityId2); + assertThat(board2.writerNickname()).isEqualTo(savedVolunteer.getNickname()); + assertThat(board2.title()).isEqualTo(dto2.title()); + assertThat(board2.createdAt()).isEqualTo(communityBoard2.get().getCreatedAt()); + } + + @DisplayName("저장된 커뮤니티 게시글 리스트를 작성자자별로 조회한다.") + @Test + void getCommunityBoardsByWriter() { + + //given + String oAuthId = "example-oauth-id"; + Volunteer volunteer = Volunteer.createDefault(OAuthProvider.NAVER, oAuthId); + + Volunteer savedVolunteer = volunteerRepository.save(volunteer); + + Center center = Center.create( + "기본 기관 이름", + "010-1234-5678", + "http://example.com/image.jpg", + "기관 소개 내용", + "http://example.com", + "account123", + "password123" + ); + Center savedCenter = centerRepository.save(center); + + CommunityBoardCreateRequestDto dto1 = CommunityBoardCreateRequestDto.builder() + .title("커뮤니티 테스트 제목1") + .content("커뮤니티 테스트 내용1") + .build(); + + CommunityBoardCreateRequestDto dto2 = CommunityBoardCreateRequestDto.builder() + .title("커뮤니티 테스트 제목2") + .content("커뮤니티 테스트 내용2") + .build(); + + CommunityBoardCreateRequestDto dto3 = CommunityBoardCreateRequestDto.builder() + .title("커뮤니티 테스트 제목3") + .content("커뮤니티 테스트 내용23") + .build(); + + String imgUrl1 = "https://image.test.url/123"; + + Long communityId1 = createCommunityBoardService.createCommunityBoard(dto1, savedVolunteer.getId(), null); + Long communityId2 = createCommunityBoardService.createCommunityBoard(dto2, savedVolunteer.getId(), imgUrl1); + Long communityId3 = createCommunityBoardService.createCommunityBoard(dto3, savedCenter.getId(), imgUrl1); + + //when + List dtos = communityBoardQueryService.getCommunityBoardsByWriterId(volunteer.getId()); + + //then + Optional communityBoard1 = communityBoardRepository.findById(communityId1); + Optional communityBoard2 = communityBoardRepository.findById(communityId2); + + assertThat(dtos).isNotNull(); + assertThat(dtos).hasSize(2); + + CommunityBoardGetResponseDto board1 = dtos.getLast(); + assertThat(board1.id()).isEqualTo(communityId1); + assertThat(board1.writerNickname()).isEqualTo(savedVolunteer.getNickname()); + assertThat(board1.title()).isEqualTo(dto1.title()); + assertThat(board1.createdAt()).isEqualTo(communityBoard1.get().getCreatedAt()); + + CommunityBoardGetResponseDto board2 = dtos.getFirst(); + assertThat(board2.id()).isEqualTo(communityId2); + assertThat(board2.writerNickname()).isEqualTo(savedVolunteer.getNickname()); + assertThat(board2.title()).isEqualTo(dto2.title()); + assertThat(board2.createdAt()).isEqualTo(communityBoard2.get().getCreatedAt()); + } + + @DisplayName("커뮤니티 게시글의 상세 정보를 조회한다.") + @Test + void getCommunityBoardDetail() { + + //given + String oAuthId = "example-oauth-id"; + Volunteer volunteer = Volunteer.createDefault(OAuthProvider.NAVER, oAuthId); + + Volunteer savedVolunteer = volunteerRepository.save(volunteer); + + CommunityBoardCreateRequestDto dto1 = CommunityBoardCreateRequestDto.builder() + .title("커뮤니티 테스트 제목") + .content("커뮤니티 테스트 내용") + .build(); + + String imgUrl = "https://image.test.url/123"; + + Long communityId1 = createCommunityBoardService.createCommunityBoard(dto1, savedVolunteer.getId(), imgUrl); + + //when + CommunityBoardGetDetailResponseDto communityBoard = communityBoardQueryService.getCommunityBoardDetail(communityId1); + + //then + assertThat(communityBoard).isNotNull(); + assertThat(communityBoard.id()).isEqualTo(communityId1); + assertThat(communityBoard.title()).isEqualTo("커뮤니티 테스트 제목"); + assertThat(communityBoard.content()).isEqualTo("커뮤니티 테스트 내용"); + assertThat(communityBoard.imageUrl()).isEqualTo("https://image.test.url/123"); + + assertThat(communityBoard.writerDetailDto().id()).isEqualTo(savedVolunteer.getId()); + assertThat(communityBoard.writerDetailDto().name()).isEqualTo(savedVolunteer.getNickname()); + assertThat(communityBoard.writerDetailDto().imgUrl()).isEqualTo(savedVolunteer.getImgUrl()); + assertThat(communityBoard.writerDetailDto().tier()).isEqualTo(savedVolunteer.getTier()); + } + + @DisplayName("삭제된 커뮤니티 게시글의 상세 정보를 조회할 때 예외를 던진다.") + @Test + void getCommunityBoardDetailWithDeletedId() { + + //given + String oAuthId = "example-oauth-id"; + Volunteer volunteer = Volunteer.createDefault(OAuthProvider.NAVER, oAuthId); + + Volunteer savedVolunteer = volunteerRepository.save(volunteer); + + CommunityBoardCreateRequestDto dto1 = CommunityBoardCreateRequestDto.builder() + .title("커뮤니티 테스트 제목") + .content("커뮤니티 테스트 내용") + .build(); + + String imgUrl = "https://image.test.url/123"; + + Long communityId = createCommunityBoardService.createCommunityBoard(dto1, savedVolunteer.getId(), imgUrl); + + communityBoardRepository.deleteAllInBatch(); + + //when + ThrowableAssert.ThrowingCallable callable = () -> communityBoardQueryService.getCommunityBoardDetail(communityId); + + //then + assertThatExceptionOfType(BadRequestException.class) + .isThrownBy(callable) + .withMessage(ExceptionMessage.NOT_EXISTS_COMMUNITY_BOARD.getMessage()); + + } +} + From fb2a3091d4a89877c1f628422e30f2c45c6fbbc4 Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Mon, 25 Nov 2024 22:02:03 +0900 Subject: [PATCH 02/15] =?UTF-8?q?test(center):=20center=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/CenterRepositoryTest.java | 21 ++++++++++++++++ .../service/query/CenterQueryServiceTest.java | 25 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/src/test/java/com/somemore/center/repository/CenterRepositoryTest.java b/src/test/java/com/somemore/center/repository/CenterRepositoryTest.java index cb663d659..b6573a8d7 100644 --- a/src/test/java/com/somemore/center/repository/CenterRepositoryTest.java +++ b/src/test/java/com/somemore/center/repository/CenterRepositoryTest.java @@ -82,4 +82,25 @@ void notExistsById() { assertThat(isExist).isFalse(); } + @DisplayName("센터의 id로 name을 조회한다. (Repository)") + @Test + void findNameById() { + //given + Center center = Center.create( + "기본 기관 이름", + "010-1234-5678", + "http://example.com/image.jpg", + "기관 소개 내용", + "http://example.com", + "account123", + "password123" + ); + centerRepository.save(center); + + //when + String centerName = centerRepository.findNameById(center.getId()); + + //then + assertThat(centerName).isEqualTo("기본 기관 이름"); + } } diff --git a/src/test/java/com/somemore/center/service/query/CenterQueryServiceTest.java b/src/test/java/com/somemore/center/service/query/CenterQueryServiceTest.java index 457b0a175..0ff4ae5ef 100644 --- a/src/test/java/com/somemore/center/service/query/CenterQueryServiceTest.java +++ b/src/test/java/com/somemore/center/service/query/CenterQueryServiceTest.java @@ -119,4 +119,29 @@ void validateExistingCenter() { assertThatCode(callable).doesNotThrowAnyException(); } + @DisplayName("센터의 id로 name을 조회한다.") + @Test + void getNameById() { + + //given + Center center = Center.create( + "기본 기관 이름", + "010-1234-5678", + "http://example.com/image.jpg", + "기관 소개 내용", + "http://example.com", + "account123", + "password123" + ); + + Center savedCenter = centerRepository.save(center); + + //when + String name = centerQueryService.getNameById(savedCenter.getId()); + + //then + assertThat(name).isEqualTo("기본 기관 이름"); + + } + } From 946085ffe7476e400d5b6c67fbc443ada15e1669 Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Mon, 25 Nov 2024 22:02:37 +0900 Subject: [PATCH 03/15] =?UTF-8?q?test(volunteer):=20volunteer=20=EB=8B=89?= =?UTF-8?q?=EB=84=A4=EC=9E=84=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/VolunteerRepositoryTest.java | 34 +++++++++++++++++++ .../query/FindVolunteerIdServiceTest.java | 17 ++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/test/java/com/somemore/volunteer/repository/VolunteerRepositoryTest.java diff --git a/src/test/java/com/somemore/volunteer/repository/VolunteerRepositoryTest.java b/src/test/java/com/somemore/volunteer/repository/VolunteerRepositoryTest.java new file mode 100644 index 000000000..f34cb5433 --- /dev/null +++ b/src/test/java/com/somemore/volunteer/repository/VolunteerRepositoryTest.java @@ -0,0 +1,34 @@ +package com.somemore.volunteer.repository; + +import com.somemore.IntegrationTestSupport; +import com.somemore.auth.oauth.OAuthProvider; +import com.somemore.center.domain.Center; +import com.somemore.volunteer.domain.Volunteer; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@Transactional +public class VolunteerRepositoryTest extends IntegrationTestSupport { + @Autowired + private VolunteerRepository volunteerRepository; + + @DisplayName("봉사자의 id로 닉네임을 조회한다. (Repository)") + @Test + void findNicknameById() { + //given + String oAuthId = "example-oauth-id"; + Volunteer volunteer = Volunteer.createDefault(OAuthProvider.NAVER, oAuthId); + + volunteerRepository.save(volunteer); + + //when + String volunteerNickname = volunteerRepository.findNicknameById(volunteer.getId()); + + //then + assertThat(volunteerNickname).isEqualTo(volunteer.getNickname()); + } +} diff --git a/src/test/java/com/somemore/volunteer/service/query/FindVolunteerIdServiceTest.java b/src/test/java/com/somemore/volunteer/service/query/FindVolunteerIdServiceTest.java index 29aed5992..4bd0ec03b 100644 --- a/src/test/java/com/somemore/volunteer/service/query/FindVolunteerIdServiceTest.java +++ b/src/test/java/com/somemore/volunteer/service/query/FindVolunteerIdServiceTest.java @@ -57,4 +57,21 @@ void throwExceptionWhenVolunteerNotFound() { assertThatThrownBy(() -> findVolunteerIdService.findVolunteerIdByOAuthId(oAuthId)) .isInstanceOf(EntityNotFoundException.class); } + + @DisplayName("봉사자의 id로 nickname을 조회한다.") + @Test + void getNicknameById() { + + //given + String oAuthId = "example-oauth-id"; + Volunteer volunteer = Volunteer.createDefault(OAuthProvider.NAVER, oAuthId); + + volunteerRepository.save(volunteer); + + //when + String nickname = findVolunteerIdService.getNicknameById(volunteer.getId()); + + //then + assertThat(nickname).isEqualTo(volunteer.getNickname()); + } } From e28f14cda58681d74491c132eea9dbcc402f25c9 Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Mon, 25 Nov 2024 22:06:41 +0900 Subject: [PATCH 04/15] =?UTF-8?q?feat(community):=20communityBoard=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20responseDto=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CommunityBoardGetDetailResponseDto.java | 30 +++++++++++++++++++ .../CommunityBoardGetResponseDto.java | 25 ++++++++++++++++ .../dto/response/WriterDetailDto.java | 12 ++++++++ 3 files changed, 67 insertions(+) create mode 100644 src/main/java/com/somemore/community/dto/response/CommunityBoardGetDetailResponseDto.java create mode 100644 src/main/java/com/somemore/community/dto/response/CommunityBoardGetResponseDto.java create mode 100644 src/main/java/com/somemore/community/dto/response/WriterDetailDto.java diff --git a/src/main/java/com/somemore/community/dto/response/CommunityBoardGetDetailResponseDto.java b/src/main/java/com/somemore/community/dto/response/CommunityBoardGetDetailResponseDto.java new file mode 100644 index 000000000..c14231a3c --- /dev/null +++ b/src/main/java/com/somemore/community/dto/response/CommunityBoardGetDetailResponseDto.java @@ -0,0 +1,30 @@ +package com.somemore.community.dto.response; + +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.somemore.community.domain.CommunityBoard; + +import java.time.LocalDateTime; + +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public record CommunityBoardGetDetailResponseDto( + Long id, + String title, + String content, + String imageUrl, + LocalDateTime createdAt, + LocalDateTime updatedAt, + WriterDetailDto writerDetailDto +) { + public static CommunityBoardGetDetailResponseDto fromEntity(CommunityBoard board, WriterDetailDto writer) { + return new CommunityBoardGetDetailResponseDto( + board.getId(), + board.getTitle(), + board.getContent(), + board.getImgUrl(), + board.getCreatedAt(), + board.getUpdatedAt(), + writer + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/somemore/community/dto/response/CommunityBoardGetResponseDto.java b/src/main/java/com/somemore/community/dto/response/CommunityBoardGetResponseDto.java new file mode 100644 index 000000000..112b59e08 --- /dev/null +++ b/src/main/java/com/somemore/community/dto/response/CommunityBoardGetResponseDto.java @@ -0,0 +1,25 @@ +package com.somemore.community.dto.response; + +import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.somemore.community.domain.CommunityBoard; + +import java.time.LocalDateTime; + +@JsonNaming(SnakeCaseStrategy.class) +public record CommunityBoardGetResponseDto( + Long id, + String title, + String writerNickname, + LocalDateTime createdAt +) { + public static CommunityBoardGetResponseDto fromEntity(CommunityBoard board, String writerNickname) { + return new CommunityBoardGetResponseDto( + board.getId(), + board.getTitle(), + writerNickname, + board.getCreatedAt() + ); + } +} + diff --git a/src/main/java/com/somemore/community/dto/response/WriterDetailDto.java b/src/main/java/com/somemore/community/dto/response/WriterDetailDto.java new file mode 100644 index 000000000..ee32de949 --- /dev/null +++ b/src/main/java/com/somemore/community/dto/response/WriterDetailDto.java @@ -0,0 +1,12 @@ +package com.somemore.community.dto.response; + +import com.somemore.volunteer.domain.Tier; + +import java.util.UUID; + +public interface WriterDetailDto { + UUID id(); + String name(); + String imgUrl(); + Tier tier(); +} From 9ef829e771340d4e573aa8e78a1e032137e7c45a Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Mon, 25 Nov 2024 22:09:37 +0900 Subject: [PATCH 05/15] =?UTF-8?q?feat(community):=20communityBoard=20Query?= =?UTF-8?q?=20Usecase=20=EB=B0=8F=20Service=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../query/CommunityBoardQueryService.java | 82 +++++++++++++++++++ .../query/CommunityBoardQueryUseCase.java | 13 +++ 2 files changed, 95 insertions(+) create mode 100644 src/main/java/com/somemore/community/service/query/CommunityBoardQueryService.java create mode 100644 src/main/java/com/somemore/community/usecase/query/CommunityBoardQueryUseCase.java diff --git a/src/main/java/com/somemore/community/service/query/CommunityBoardQueryService.java b/src/main/java/com/somemore/community/service/query/CommunityBoardQueryService.java new file mode 100644 index 000000000..8bf776f91 --- /dev/null +++ b/src/main/java/com/somemore/community/service/query/CommunityBoardQueryService.java @@ -0,0 +1,82 @@ +package com.somemore.community.service.query; + +import com.somemore.center.usecase.query.CenterQueryUseCase; +import com.somemore.community.domain.CommunityBoard; +import com.somemore.community.dto.response.CommunityBoardGetDetailResponseDto; +import com.somemore.community.dto.response.CommunityBoardGetResponseDto; +import com.somemore.community.dto.response.WriterDetailDto; +import com.somemore.community.repository.CommunityBoardRepository; +import com.somemore.community.usecase.query.CommunityBoardQueryUseCase; +import com.somemore.global.exception.BadRequestException; +import com.somemore.volunteer.dto.response.VolunteerForCommunityResponseDto; +import com.somemore.volunteer.usecase.query.FindVolunteerIdUseCase; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_COMMUNITY_BOARD; + + +@RequiredArgsConstructor +@Transactional(readOnly = true) +@Service +public class CommunityBoardQueryService implements CommunityBoardQueryUseCase { + + private final CommunityBoardRepository communityBoardRepository; + private final CenterQueryUseCase centerQueryUseCase; + private final FindVolunteerIdUseCase findVolunteerIdUseCase; + + @Override + public List getCommunityBoards() { + List boards = communityBoardRepository.getCommunityBoards(); + + return boards.stream() + .map(board -> { + String writerNickname = getWriterNickname(board.getWriterId()); + return CommunityBoardGetResponseDto.fromEntity(board, writerNickname); + }) + .collect(Collectors.toList()); + } + + @Override + public List getCommunityBoardsByWriterId(UUID writerId) { + List boards = communityBoardRepository.getCommunityBoardsByWriterId(writerId); + String writerNickname = getWriterNickname(writerId); + + return boards.stream() + .map(board -> CommunityBoardGetResponseDto.fromEntity(board, writerNickname)) + .collect(Collectors.toList()); + } + + @Override + public CommunityBoardGetDetailResponseDto getCommunityBoardDetail(Long id) { + CommunityBoard board = communityBoardRepository.findById(id) + .orElseThrow(() -> new BadRequestException(NOT_EXISTS_COMMUNITY_BOARD.getMessage())); + + return CommunityBoardGetDetailResponseDto.fromEntity(board, getWriterDetail(board.getWriterId())); + } + + private String getWriterNickname(UUID writerId) { + String nickname = findVolunteerIdUseCase.getNicknameById(writerId); + + if (nickname == null) { + nickname = centerQueryUseCase.getNameById(writerId); + } + + return nickname; + } + + private WriterDetailDto getWriterDetail(UUID writerId) { + VolunteerForCommunityResponseDto volunteer = findVolunteerIdUseCase.getVolunteerDetailForCommunity(writerId); + + if (volunteer == null) { + return centerQueryUseCase.getCenterDetailForCommunity(writerId); + } else { + return volunteer; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/somemore/community/usecase/query/CommunityBoardQueryUseCase.java b/src/main/java/com/somemore/community/usecase/query/CommunityBoardQueryUseCase.java new file mode 100644 index 000000000..a7c3818c3 --- /dev/null +++ b/src/main/java/com/somemore/community/usecase/query/CommunityBoardQueryUseCase.java @@ -0,0 +1,13 @@ +package com.somemore.community.usecase.query; + +import com.somemore.community.dto.response.CommunityBoardGetDetailResponseDto; +import com.somemore.community.dto.response.CommunityBoardGetResponseDto; + +import java.util.List; +import java.util.UUID; + +public interface CommunityBoardQueryUseCase { + List getCommunityBoards(); + List getCommunityBoardsByWriterId(UUID writerId); + CommunityBoardGetDetailResponseDto getCommunityBoardDetail(Long id); +} From f2e5088f4c13d981af75a53f76fe34b9aa6cd748 Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Mon, 25 Nov 2024 22:10:17 +0900 Subject: [PATCH 06/15] =?UTF-8?q?feat(community):=20communityBoard=20Repos?= =?UTF-8?q?itory=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CommunityBoardJpaRepository.java | 7 +++ .../repository/CommunityBoardRepository.java | 11 +++- .../repository/CommunityRepositoryImpl.java | 58 +++++++++++++++++++ 3 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/somemore/community/repository/CommunityBoardJpaRepository.java create mode 100644 src/main/java/com/somemore/community/repository/CommunityRepositoryImpl.java diff --git a/src/main/java/com/somemore/community/repository/CommunityBoardJpaRepository.java b/src/main/java/com/somemore/community/repository/CommunityBoardJpaRepository.java new file mode 100644 index 000000000..ce59211b9 --- /dev/null +++ b/src/main/java/com/somemore/community/repository/CommunityBoardJpaRepository.java @@ -0,0 +1,7 @@ +package com.somemore.community.repository; + +import com.somemore.community.domain.CommunityBoard; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CommunityBoardJpaRepository extends JpaRepository { +} diff --git a/src/main/java/com/somemore/community/repository/CommunityBoardRepository.java b/src/main/java/com/somemore/community/repository/CommunityBoardRepository.java index 85d051cc6..a089b011b 100644 --- a/src/main/java/com/somemore/community/repository/CommunityBoardRepository.java +++ b/src/main/java/com/somemore/community/repository/CommunityBoardRepository.java @@ -1,8 +1,15 @@ package com.somemore.community.repository; import com.somemore.community.domain.CommunityBoard; -import org.springframework.data.jpa.repository.JpaRepository; -public interface CommunityBoardRepository extends JpaRepository { +import java.util.List; +import java.util.Optional; +import java.util.UUID; +public interface CommunityBoardRepository { + CommunityBoard save(CommunityBoard communityBoard); + Optional findById(Long id); + List getCommunityBoards(); + List getCommunityBoardsByWriterId(UUID writerId); + void deleteAllInBatch(); } diff --git a/src/main/java/com/somemore/community/repository/CommunityRepositoryImpl.java b/src/main/java/com/somemore/community/repository/CommunityRepositoryImpl.java new file mode 100644 index 000000000..1219a55fc --- /dev/null +++ b/src/main/java/com/somemore/community/repository/CommunityRepositoryImpl.java @@ -0,0 +1,58 @@ +package com.somemore.community.repository; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.somemore.community.domain.CommunityBoard; +import com.somemore.community.domain.QCommunityBoard; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@RequiredArgsConstructor +@Repository +public class CommunityRepositoryImpl implements CommunityBoardRepository { + + private final JPAQueryFactory queryFactory; + private final CommunityBoardJpaRepository communityBoardJpaRepository; + + @Override + public CommunityBoard save(CommunityBoard communityBoard) { + return communityBoardJpaRepository.save(communityBoard); + } + + @Override + public Optional findById(Long id) { + return communityBoardJpaRepository.findById(id); + } + + @Override + public List getCommunityBoards() { + QCommunityBoard communityBoard = QCommunityBoard.communityBoard; + + return queryFactory + .selectFrom(communityBoard) + .where(communityBoard.deleted.eq(false)) + .orderBy(communityBoard.createdAt.desc()) + .fetch(); + } + + @Override + public List getCommunityBoardsByWriterId(UUID writerId) { + QCommunityBoard communityBoard = QCommunityBoard.communityBoard; + + return queryFactory + .selectFrom(communityBoard) + .where(communityBoard.writerId.eq(writerId) + .and(communityBoard.deleted.eq(false)) + ) + .orderBy(communityBoard.createdAt.desc()) + .fetch(); + } + + @Override + public void deleteAllInBatch() { + communityBoardJpaRepository.deleteAllInBatch(); + } +} From 59ae6cc075aaf9f57ea6f532f3918f87a285ade7 Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Mon, 25 Nov 2024 22:11:58 +0900 Subject: [PATCH 07/15] =?UTF-8?q?feat(center):=20=EC=BB=A4=EB=AE=A4?= =?UTF-8?q?=EB=8B=88=ED=8B=B0=20=EC=A1=B0=ED=9A=8C=EC=97=90=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=A0=20ResponseDto=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CenterForCommunityResponseDto.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/com/somemore/center/dto/response/CenterForCommunityResponseDto.java diff --git a/src/main/java/com/somemore/center/dto/response/CenterForCommunityResponseDto.java b/src/main/java/com/somemore/center/dto/response/CenterForCommunityResponseDto.java new file mode 100644 index 000000000..37a0683f4 --- /dev/null +++ b/src/main/java/com/somemore/center/dto/response/CenterForCommunityResponseDto.java @@ -0,0 +1,28 @@ +package com.somemore.center.dto.response; + +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.somemore.center.domain.Center; +import com.somemore.community.dto.response.WriterDetailDto; +import com.somemore.volunteer.domain.Tier; + +import java.util.UUID; + +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public record CenterForCommunityResponseDto( + UUID id, + String name, + String imgUrl, + Tier tier +) implements WriterDetailDto { + + public static CenterForCommunityResponseDto fromEntity(Center center) { + return new CenterForCommunityResponseDto( + center.getId(), + center.getName(), + center.getImgUrl(), + null + ); + } +} + From de43f6083e3b90ab596c58521bd9a5c31e2ef105 Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Mon, 25 Nov 2024 22:13:53 +0900 Subject: [PATCH 08/15] =?UTF-8?q?feat(center):=20center=20Query=20Usecase?= =?UTF-8?q?=20=EB=B0=8F=20Service=EC=97=90=20center=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../center/service/query/CenterQueryService.java | 11 +++++++++++ .../center/usecase/query/CenterQueryUseCase.java | 3 +++ 2 files changed, 14 insertions(+) diff --git a/src/main/java/com/somemore/center/service/query/CenterQueryService.java b/src/main/java/com/somemore/center/service/query/CenterQueryService.java index 838eba6ea..c208052b9 100644 --- a/src/main/java/com/somemore/center/service/query/CenterQueryService.java +++ b/src/main/java/com/somemore/center/service/query/CenterQueryService.java @@ -1,6 +1,7 @@ package com.somemore.center.service.query; import com.somemore.center.domain.Center; +import com.somemore.center.dto.response.CenterForCommunityResponseDto; import com.somemore.center.dto.response.CenterProfileResponseDto; import com.somemore.center.dto.response.PreferItemResponseDto; import com.somemore.center.repository.CenterRepository; @@ -45,4 +46,14 @@ private Center getCenterById(UUID centerId) { .orElseThrow(() -> new BadRequestException(NOT_EXISTS_CENTER.getMessage())); } + @Override + public String getNameById(UUID id) { + return centerRepository.findNameById(id); + } + + @Override + public CenterForCommunityResponseDto getCenterDetailForCommunity(UUID id) { + Center center = getCenterById(id); + return CenterForCommunityResponseDto.fromEntity(center); + } } diff --git a/src/main/java/com/somemore/center/usecase/query/CenterQueryUseCase.java b/src/main/java/com/somemore/center/usecase/query/CenterQueryUseCase.java index 7c12cb28c..68aafc007 100644 --- a/src/main/java/com/somemore/center/usecase/query/CenterQueryUseCase.java +++ b/src/main/java/com/somemore/center/usecase/query/CenterQueryUseCase.java @@ -1,5 +1,6 @@ package com.somemore.center.usecase.query; +import com.somemore.center.dto.response.CenterForCommunityResponseDto; import com.somemore.center.dto.response.CenterProfileResponseDto; import java.util.UUID; @@ -8,4 +9,6 @@ public interface CenterQueryUseCase { CenterProfileResponseDto getCenterProfileByCenterId(UUID centerId); void validateCenterExists(UUID centerId); + String getNameById(UUID id); + CenterForCommunityResponseDto getCenterDetailForCommunity(UUID id); } From b88355faec6ec220ee0333ba6526fb57be62a44a Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Mon, 25 Nov 2024 22:14:12 +0900 Subject: [PATCH 09/15] =?UTF-8?q?feat(center):=20center=20Repository=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/CenterJpaRepository.java | 12 +++++ .../center/repository/CenterRepository.java | 9 ++-- .../repository/CenterRepositoryImpl.java | 49 +++++++++++++++++++ 3 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/somemore/center/repository/CenterJpaRepository.java create mode 100644 src/main/java/com/somemore/center/repository/CenterRepositoryImpl.java diff --git a/src/main/java/com/somemore/center/repository/CenterJpaRepository.java b/src/main/java/com/somemore/center/repository/CenterJpaRepository.java new file mode 100644 index 000000000..fde29e33a --- /dev/null +++ b/src/main/java/com/somemore/center/repository/CenterJpaRepository.java @@ -0,0 +1,12 @@ +package com.somemore.center.repository; + +import com.somemore.center.domain.Center; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; +import java.util.UUID; + +public interface CenterJpaRepository extends JpaRepository { + boolean existsById(UUID id); + Optional
findCenterById(UUID id); +} diff --git a/src/main/java/com/somemore/center/repository/CenterRepository.java b/src/main/java/com/somemore/center/repository/CenterRepository.java index b72572f5a..406a01126 100644 --- a/src/main/java/com/somemore/center/repository/CenterRepository.java +++ b/src/main/java/com/somemore/center/repository/CenterRepository.java @@ -1,20 +1,19 @@ package com.somemore.center.repository; import com.somemore.center.domain.Center; -import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.Optional; import java.util.UUID; @Repository -public interface CenterRepository extends JpaRepository { - +public interface CenterRepository { + Center save(Center center); boolean existsById(UUID id); - default boolean doesNotExistById(UUID id) { return !existsById(id); } - Optional
findCenterById(UUID id); + String findNameById(UUID id); + void deleteAllInBatch(); } diff --git a/src/main/java/com/somemore/center/repository/CenterRepositoryImpl.java b/src/main/java/com/somemore/center/repository/CenterRepositoryImpl.java new file mode 100644 index 000000000..4fb68911d --- /dev/null +++ b/src/main/java/com/somemore/center/repository/CenterRepositoryImpl.java @@ -0,0 +1,49 @@ +package com.somemore.center.repository; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.somemore.center.domain.Center; +import com.somemore.center.domain.QCenter; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +import java.util.UUID; + +@RequiredArgsConstructor +@Repository +public class CenterRepositoryImpl implements CenterRepository { + + private final CenterJpaRepository centerJpaRepository; + private final JPAQueryFactory queryFactory; + + @Override + public Center save(Center center) { + return centerJpaRepository.save(center); + } + + @Override + public boolean existsById(UUID id) { + return centerJpaRepository.existsById(id); + } + + @Override + public Optional
findCenterById(UUID id) { + return centerJpaRepository.findCenterById(id); + } + + @Override + public String findNameById(UUID id) { + QCenter center = QCenter.center; + + return queryFactory + .select(center.name) + .from(center) + .where(center.id.eq(id)) + .fetchOne(); + } + + @Override + public void deleteAllInBatch() { + centerJpaRepository.deleteAllInBatch(); + } +} From 76852a6a0f6aaca9d904689c98f66066fd111b98 Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Mon, 25 Nov 2024 22:14:43 +0900 Subject: [PATCH 10/15] =?UTF-8?q?feat(volunteer):=20=EC=BB=A4=EB=AE=A4?= =?UTF-8?q?=EB=8B=88=ED=8B=B0=20=EC=A1=B0=ED=9A=8C=EC=97=90=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=A0=20ResponseDto=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VolunteerForCommunityResponseDto.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/com/somemore/volunteer/dto/response/VolunteerForCommunityResponseDto.java diff --git a/src/main/java/com/somemore/volunteer/dto/response/VolunteerForCommunityResponseDto.java b/src/main/java/com/somemore/volunteer/dto/response/VolunteerForCommunityResponseDto.java new file mode 100644 index 000000000..662d6fe07 --- /dev/null +++ b/src/main/java/com/somemore/volunteer/dto/response/VolunteerForCommunityResponseDto.java @@ -0,0 +1,28 @@ +package com.somemore.volunteer.dto.response; + +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.somemore.community.dto.response.WriterDetailDto; +import com.somemore.volunteer.domain.Tier; +import com.somemore.volunteer.domain.Volunteer; + +import java.util.UUID; + +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public record VolunteerForCommunityResponseDto( + UUID id, + String name, + String imgUrl, + Tier tier +) implements WriterDetailDto { + + public static VolunteerForCommunityResponseDto fromEntity(Volunteer volunteer) { + return new VolunteerForCommunityResponseDto( + volunteer.getId(), + volunteer.getNickname(), + volunteer.getImgUrl(), + volunteer.getTier() + ); + } +} + From 27f328d6e5b1a4370af766d4aad7c30348f70f23 Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Mon, 25 Nov 2024 22:15:20 +0900 Subject: [PATCH 11/15] =?UTF-8?q?feat(volunteer):=20volunteer=20Query=20Us?= =?UTF-8?q?ecase=20=EB=B0=8F=20Service=EC=97=90=20volunteer=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/query/FindVolunteerIdService.java | 14 ++++++++++++++ .../usecase/query/FindVolunteerIdUseCase.java | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/src/main/java/com/somemore/volunteer/service/query/FindVolunteerIdService.java b/src/main/java/com/somemore/volunteer/service/query/FindVolunteerIdService.java index b6c7e6ee3..970a643d4 100644 --- a/src/main/java/com/somemore/volunteer/service/query/FindVolunteerIdService.java +++ b/src/main/java/com/somemore/volunteer/service/query/FindVolunteerIdService.java @@ -1,5 +1,7 @@ package com.somemore.volunteer.service.query; +import com.somemore.volunteer.domain.Volunteer; +import com.somemore.volunteer.dto.response.VolunteerForCommunityResponseDto; import com.somemore.volunteer.repository.VolunteerRepository; import com.somemore.volunteer.usecase.query.FindVolunteerIdUseCase; import jakarta.persistence.EntityNotFoundException; @@ -24,4 +26,16 @@ public UUID findVolunteerIdByOAuthId(String oAuthId) { .orElseThrow(EntityNotFoundException::new) .getId(); } + + @Override + public String getNicknameById(UUID id) { + return volunteerRepository.findNicknameById(id); + } + + @Override + public VolunteerForCommunityResponseDto getVolunteerDetailForCommunity(UUID id) { + Volunteer volunteer = volunteerRepository.findById(id); + + return VolunteerForCommunityResponseDto.fromEntity(volunteer); + } } diff --git a/src/main/java/com/somemore/volunteer/usecase/query/FindVolunteerIdUseCase.java b/src/main/java/com/somemore/volunteer/usecase/query/FindVolunteerIdUseCase.java index 6427cb5db..cf1775afb 100644 --- a/src/main/java/com/somemore/volunteer/usecase/query/FindVolunteerIdUseCase.java +++ b/src/main/java/com/somemore/volunteer/usecase/query/FindVolunteerIdUseCase.java @@ -1,7 +1,11 @@ package com.somemore.volunteer.usecase.query; +import com.somemore.volunteer.dto.response.VolunteerForCommunityResponseDto; + import java.util.UUID; public interface FindVolunteerIdUseCase { UUID findVolunteerIdByOAuthId(String oAuthId); + String getNicknameById(UUID id); + VolunteerForCommunityResponseDto getVolunteerDetailForCommunity(UUID id); } From 9006430d25c7226b908ca6ae76686cebfe619800 Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Mon, 25 Nov 2024 22:15:39 +0900 Subject: [PATCH 12/15] =?UTF-8?q?feat(volunteer):=20volunteer=20Repository?= =?UTF-8?q?=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/VolunteerJpaRepository.java | 12 +++++ .../repository/VolunteerRepository.java | 8 +-- .../repository/VolunteerRepositoryImpl.java | 49 +++++++++++++++++++ 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/somemore/volunteer/repository/VolunteerJpaRepository.java create mode 100644 src/main/java/com/somemore/volunteer/repository/VolunteerRepositoryImpl.java diff --git a/src/main/java/com/somemore/volunteer/repository/VolunteerJpaRepository.java b/src/main/java/com/somemore/volunteer/repository/VolunteerJpaRepository.java new file mode 100644 index 000000000..16e5105da --- /dev/null +++ b/src/main/java/com/somemore/volunteer/repository/VolunteerJpaRepository.java @@ -0,0 +1,12 @@ +package com.somemore.volunteer.repository; + +import com.somemore.volunteer.domain.Volunteer; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; +import java.util.UUID; + +public interface VolunteerJpaRepository extends JpaRepository { + Volunteer findById(UUID id); + Optional findByOauthId(String oauthId); +} diff --git a/src/main/java/com/somemore/volunteer/repository/VolunteerRepository.java b/src/main/java/com/somemore/volunteer/repository/VolunteerRepository.java index 25e15dde8..bcc37359d 100644 --- a/src/main/java/com/somemore/volunteer/repository/VolunteerRepository.java +++ b/src/main/java/com/somemore/volunteer/repository/VolunteerRepository.java @@ -1,14 +1,16 @@ package com.somemore.volunteer.repository; import com.somemore.volunteer.domain.Volunteer; -import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.Optional; import java.util.UUID; @Repository -public interface VolunteerRepository extends JpaRepository { - +public interface VolunteerRepository { + Volunteer save(Volunteer volunteer); + Volunteer findById(UUID id); + String findNicknameById(UUID id); Optional findByOauthId(String oauthId); + void deleteAllInBatch(); } diff --git a/src/main/java/com/somemore/volunteer/repository/VolunteerRepositoryImpl.java b/src/main/java/com/somemore/volunteer/repository/VolunteerRepositoryImpl.java new file mode 100644 index 000000000..bb19af698 --- /dev/null +++ b/src/main/java/com/somemore/volunteer/repository/VolunteerRepositoryImpl.java @@ -0,0 +1,49 @@ +package com.somemore.volunteer.repository; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.somemore.volunteer.domain.QVolunteer; +import com.somemore.volunteer.domain.Volunteer; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +import java.util.UUID; + +@RequiredArgsConstructor +@Repository +public class VolunteerRepositoryImpl implements VolunteerRepository{ + + private final VolunteerJpaRepository volunteerJpaRepository; + private final JPAQueryFactory queryFactory; + + @Override + public Volunteer save(Volunteer volunteer) { + return volunteerJpaRepository.save(volunteer); + } + + @Override + public Volunteer findById(UUID id) { + return volunteerJpaRepository.findById(id); + } + + @Override + public String findNicknameById(UUID id) { + QVolunteer volunteer = QVolunteer.volunteer; + + return queryFactory + .select(volunteer.nickname) + .from(volunteer) + .where(volunteer.id.eq(id)) + .fetchOne(); + } + + @Override + public Optional findByOauthId(String oauthId) { + return volunteerJpaRepository.findByOauthId(oauthId); + } + + @Override + public void deleteAllInBatch() { + volunteerJpaRepository.deleteAllInBatch(); + } +} From d625daeca0cd5320f9a611a35af5cb5d408ecf29 Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Mon, 25 Nov 2024 22:16:13 +0900 Subject: [PATCH 13/15] =?UTF-8?q?feat(community):=20community=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/somemore/global/exception/ExceptionMessage.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/somemore/global/exception/ExceptionMessage.java b/src/main/java/com/somemore/global/exception/ExceptionMessage.java index 615f84ac0..f4291d3c6 100644 --- a/src/main/java/com/somemore/global/exception/ExceptionMessage.java +++ b/src/main/java/com/somemore/global/exception/ExceptionMessage.java @@ -8,7 +8,8 @@ @Getter public enum ExceptionMessage { - NOT_EXISTS_CENTER("존재하지 않는 기관 ID 입니다.") + NOT_EXISTS_CENTER("존재하지 않는 기관 ID 입니다."), + NOT_EXISTS_COMMUNITY_BOARD("삭제된 게시글 입니다.") ; private final String message; From c57f4dd7aad0429021d90ba62ea3d8106de0f9c5 Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Mon, 25 Nov 2024 22:42:50 +0900 Subject: [PATCH 14/15] =?UTF-8?q?fix(community):=20sonarqube=20=EC=9D=B4?= =?UTF-8?q?=EC=8A=88=20=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../query/CommunityBoardQueryService.java | 4 +-- .../repository/CommunityRepositoryTest.java | 9 +++--- .../query/CommunityBoardQueryServiceTest.java | 28 +++++-------------- .../repository/VolunteerRepositoryTest.java | 5 ++-- 4 files changed, 15 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/somemore/community/service/query/CommunityBoardQueryService.java b/src/main/java/com/somemore/community/service/query/CommunityBoardQueryService.java index 8bf776f91..8927e3f60 100644 --- a/src/main/java/com/somemore/community/service/query/CommunityBoardQueryService.java +++ b/src/main/java/com/somemore/community/service/query/CommunityBoardQueryService.java @@ -39,7 +39,7 @@ public List getCommunityBoards() { String writerNickname = getWriterNickname(board.getWriterId()); return CommunityBoardGetResponseDto.fromEntity(board, writerNickname); }) - .collect(Collectors.toList()); + .toList(); } @Override @@ -49,7 +49,7 @@ public List getCommunityBoardsByWriterId(UUID writ return boards.stream() .map(board -> CommunityBoardGetResponseDto.fromEntity(board, writerNickname)) - .collect(Collectors.toList()); + .toList(); } @Override diff --git a/src/test/java/com/somemore/community/repository/CommunityRepositoryTest.java b/src/test/java/com/somemore/community/repository/CommunityRepositoryTest.java index 7acc82d4c..9529439ce 100644 --- a/src/test/java/com/somemore/community/repository/CommunityRepositoryTest.java +++ b/src/test/java/com/somemore/community/repository/CommunityRepositoryTest.java @@ -11,11 +11,10 @@ import java.util.Optional; import java.util.UUID; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - +import static org.assertj.core.api.Assertions.assertThat; @Transactional -public class CommunityRepositoryTest extends IntegrationTestSupport { +class CommunityRepositoryTest extends IntegrationTestSupport { @Autowired private CommunityBoardRepository communityBoardRepository; @@ -69,7 +68,7 @@ void getCommunityBoards() { List communityBoards = communityBoardRepository.getCommunityBoards(); //then - assertThat(communityBoards.size()).isEqualTo(2); + assertThat(communityBoards).hasSize(2); assertThat(communityBoards.get(0)).isEqualTo(communityBoard2); assertThat(communityBoards.get(1)).isEqualTo(communityBoard1); } @@ -107,7 +106,7 @@ void getCommunityBoardsByWriterId() { List communityBoards = communityBoardRepository.getCommunityBoardsByWriterId(communityBoard1.getWriterId()); //then - assertThat(communityBoards.size()).isEqualTo(2); + assertThat(communityBoards).hasSize(2); assertThat(communityBoards.get(0)).isEqualTo(communityBoard2); assertThat(communityBoards.get(1)).isEqualTo(communityBoard1); } diff --git a/src/test/java/com/somemore/community/service/query/CommunityBoardQueryServiceTest.java b/src/test/java/com/somemore/community/service/query/CommunityBoardQueryServiceTest.java index 517448a67..c03b7437b 100644 --- a/src/test/java/com/somemore/community/service/query/CommunityBoardQueryServiceTest.java +++ b/src/test/java/com/somemore/community/service/query/CommunityBoardQueryServiceTest.java @@ -88,8 +88,10 @@ void getAllCommunityBoards() { Optional communityBoard1 = communityBoardRepository.findById(communityId1); Optional communityBoard2 = communityBoardRepository.findById(communityId2); - assertThat(dtos).isNotNull(); - assertThat(dtos).hasSize(2); + + assertThat(dtos) + .isNotNull() + .hasSize(2); CommunityBoardGetResponseDto board1 = dtos.getLast(); assertThat(board1.id()).isEqualTo(communityId1); @@ -114,17 +116,6 @@ void getCommunityBoardsByWriter() { Volunteer savedVolunteer = volunteerRepository.save(volunteer); - Center center = Center.create( - "기본 기관 이름", - "010-1234-5678", - "http://example.com/image.jpg", - "기관 소개 내용", - "http://example.com", - "account123", - "password123" - ); - Center savedCenter = centerRepository.save(center); - CommunityBoardCreateRequestDto dto1 = CommunityBoardCreateRequestDto.builder() .title("커뮤니티 테스트 제목1") .content("커뮤니티 테스트 내용1") @@ -135,16 +126,10 @@ void getCommunityBoardsByWriter() { .content("커뮤니티 테스트 내용2") .build(); - CommunityBoardCreateRequestDto dto3 = CommunityBoardCreateRequestDto.builder() - .title("커뮤니티 테스트 제목3") - .content("커뮤니티 테스트 내용23") - .build(); - String imgUrl1 = "https://image.test.url/123"; Long communityId1 = createCommunityBoardService.createCommunityBoard(dto1, savedVolunteer.getId(), null); Long communityId2 = createCommunityBoardService.createCommunityBoard(dto2, savedVolunteer.getId(), imgUrl1); - Long communityId3 = createCommunityBoardService.createCommunityBoard(dto3, savedCenter.getId(), imgUrl1); //when List dtos = communityBoardQueryService.getCommunityBoardsByWriterId(volunteer.getId()); @@ -153,8 +138,9 @@ void getCommunityBoardsByWriter() { Optional communityBoard1 = communityBoardRepository.findById(communityId1); Optional communityBoard2 = communityBoardRepository.findById(communityId2); - assertThat(dtos).isNotNull(); - assertThat(dtos).hasSize(2); + assertThat(dtos) + .isNotNull() + .hasSize(2); CommunityBoardGetResponseDto board1 = dtos.getLast(); assertThat(board1.id()).isEqualTo(communityId1); diff --git a/src/test/java/com/somemore/volunteer/repository/VolunteerRepositoryTest.java b/src/test/java/com/somemore/volunteer/repository/VolunteerRepositoryTest.java index f34cb5433..e9d0cf63c 100644 --- a/src/test/java/com/somemore/volunteer/repository/VolunteerRepositoryTest.java +++ b/src/test/java/com/somemore/volunteer/repository/VolunteerRepositoryTest.java @@ -2,17 +2,16 @@ import com.somemore.IntegrationTestSupport; import com.somemore.auth.oauth.OAuthProvider; -import com.somemore.center.domain.Center; import com.somemore.volunteer.domain.Volunteer; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.Assertions.assertThat; @Transactional -public class VolunteerRepositoryTest extends IntegrationTestSupport { +class VolunteerRepositoryTest extends IntegrationTestSupport { @Autowired private VolunteerRepository volunteerRepository; From ce7ec930b979da2097f60c1b93ffe94bfc642bb2 Mon Sep 17 00:00:00 2001 From: ayoung-dev Date: Tue, 26 Nov 2024 11:41:47 +0900 Subject: [PATCH 15/15] =?UTF-8?q?refactor(community):=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EB=A6=AC=EB=B7=B0=20=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - repository 테스트 usecase 주입 - getWriterDetail 메서드 else문 삭제 --- .../query/CommunityBoardQueryService.java | 5 +---- .../query/CommunityBoardQueryServiceTest.java | 18 +++++++++--------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/somemore/community/service/query/CommunityBoardQueryService.java b/src/main/java/com/somemore/community/service/query/CommunityBoardQueryService.java index 8927e3f60..14c192423 100644 --- a/src/main/java/com/somemore/community/service/query/CommunityBoardQueryService.java +++ b/src/main/java/com/somemore/community/service/query/CommunityBoardQueryService.java @@ -16,7 +16,6 @@ import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_COMMUNITY_BOARD; @@ -66,7 +65,6 @@ private String getWriterNickname(UUID writerId) { if (nickname == null) { nickname = centerQueryUseCase.getNameById(writerId); } - return nickname; } @@ -75,8 +73,7 @@ private WriterDetailDto getWriterDetail(UUID writerId) { if (volunteer == null) { return centerQueryUseCase.getCenterDetailForCommunity(writerId); - } else { - return volunteer; } + return volunteer; } } \ No newline at end of file diff --git a/src/test/java/com/somemore/community/service/query/CommunityBoardQueryServiceTest.java b/src/test/java/com/somemore/community/service/query/CommunityBoardQueryServiceTest.java index c03b7437b..068e3b8d1 100644 --- a/src/test/java/com/somemore/community/service/query/CommunityBoardQueryServiceTest.java +++ b/src/test/java/com/somemore/community/service/query/CommunityBoardQueryServiceTest.java @@ -9,7 +9,7 @@ import com.somemore.community.dto.response.CommunityBoardGetDetailResponseDto; import com.somemore.community.dto.response.CommunityBoardGetResponseDto; import com.somemore.community.repository.CommunityBoardRepository; -import com.somemore.community.service.command.CreateCommunityBoardService; +import com.somemore.community.usecase.command.CreateCommunityBoardUseCase; import com.somemore.global.exception.BadRequestException; import com.somemore.global.exception.ExceptionMessage; import com.somemore.volunteer.domain.Volunteer; @@ -35,7 +35,7 @@ class CommunityBoardQueryServiceTest extends IntegrationTestSupport { @Autowired CenterRepository centerRepository; @Autowired - CreateCommunityBoardService createCommunityBoardService; + CreateCommunityBoardUseCase createCommunityBoardUseCase; @Autowired CommunityBoardQueryService communityBoardQueryService; @@ -52,7 +52,7 @@ void getAllCommunityBoards() { String oAuthId = "example-oauth-id"; Volunteer volunteer = Volunteer.createDefault(OAuthProvider.NAVER, oAuthId); - Volunteer savedVolunteer = volunteerRepository.save(volunteer); + Volunteer savedVolunteer = volunteerRepository.save(volunteer); Center center = Center.create( "기본 기관 이름", @@ -78,8 +78,8 @@ void getAllCommunityBoards() { String imgUrl1 = "https://image.test.url/123"; - Long communityId1 = createCommunityBoardService.createCommunityBoard(dto1, savedCenter.getId(), null); - Long communityId2 = createCommunityBoardService.createCommunityBoard(dto2, savedVolunteer.getId(), imgUrl1); + Long communityId1 = createCommunityBoardUseCase.createCommunityBoard(dto1, savedCenter.getId(), null); + Long communityId2 = createCommunityBoardUseCase.createCommunityBoard(dto2, savedVolunteer.getId(), imgUrl1); // when List dtos = communityBoardQueryService.getCommunityBoards(); @@ -128,8 +128,8 @@ void getCommunityBoardsByWriter() { String imgUrl1 = "https://image.test.url/123"; - Long communityId1 = createCommunityBoardService.createCommunityBoard(dto1, savedVolunteer.getId(), null); - Long communityId2 = createCommunityBoardService.createCommunityBoard(dto2, savedVolunteer.getId(), imgUrl1); + Long communityId1 = createCommunityBoardUseCase.createCommunityBoard(dto1, savedVolunteer.getId(), null); + Long communityId2 = createCommunityBoardUseCase.createCommunityBoard(dto2, savedVolunteer.getId(), imgUrl1); //when List dtos = communityBoardQueryService.getCommunityBoardsByWriterId(volunteer.getId()); @@ -172,7 +172,7 @@ void getCommunityBoardDetail() { String imgUrl = "https://image.test.url/123"; - Long communityId1 = createCommunityBoardService.createCommunityBoard(dto1, savedVolunteer.getId(), imgUrl); + Long communityId1 = createCommunityBoardUseCase.createCommunityBoard(dto1, savedVolunteer.getId(), imgUrl); //when CommunityBoardGetDetailResponseDto communityBoard = communityBoardQueryService.getCommunityBoardDetail(communityId1); @@ -207,7 +207,7 @@ void getCommunityBoardDetailWithDeletedId() { String imgUrl = "https://image.test.url/123"; - Long communityId = createCommunityBoardService.createCommunityBoard(dto1, savedVolunteer.getId(), imgUrl); + Long communityId = createCommunityBoardUseCase.createCommunityBoard(dto1, savedVolunteer.getId(), imgUrl); communityBoardRepository.deleteAllInBatch();