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 + ); + } +} + 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(); + } +} 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); } 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(); +} 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(); + } +} 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..14c192423 --- /dev/null +++ b/src/main/java/com/somemore/community/service/query/CommunityBoardQueryService.java @@ -0,0 +1,79 @@ +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 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); + }) + .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)) + .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); + } + 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); +} diff --git a/src/main/java/com/somemore/global/exception/ExceptionMessage.java b/src/main/java/com/somemore/global/exception/ExceptionMessage.java index 546c529c5..9035b71da 100644 --- a/src/main/java/com/somemore/global/exception/ExceptionMessage.java +++ b/src/main/java/com/somemore/global/exception/ExceptionMessage.java @@ -9,6 +9,7 @@ public enum ExceptionMessage { NOT_EXISTS_CENTER("존재하지 않는 기관 ID 입니다."), + NOT_EXISTS_COMMUNITY_BOARD("삭제된 게시글 입니다."), NOT_EXISTS_LOCATION("존재하지 않는 위치 ID 입니다."), NOT_EXISTS_RECRUIT_BOARD("존재하지 않는 봉사 모집글 ID 입니다."), UNAUTHORIZED_RECRUIT_BOARD("자신이 작성한 봉사 모집글이 아닙니다."), 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() + ); + } +} + 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(); + } +} 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); } 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("기본 기관 이름"); + + } + } 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..9529439ce --- /dev/null +++ b/src/test/java/com/somemore/community/repository/CommunityRepositoryTest.java @@ -0,0 +1,113 @@ +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.Assertions.assertThat; + +@Transactional +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).hasSize(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).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 new file mode 100644 index 000000000..068e3b8d1 --- /dev/null +++ b/src/test/java/com/somemore/community/service/query/CommunityBoardQueryServiceTest.java @@ -0,0 +1,224 @@ +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.usecase.command.CreateCommunityBoardUseCase; +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 + CreateCommunityBoardUseCase createCommunityBoardUseCase; + @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 = createCommunityBoardUseCase.createCommunityBoard(dto1, savedCenter.getId(), null); + Long communityId2 = createCommunityBoardUseCase.createCommunityBoard(dto2, savedVolunteer.getId(), imgUrl1); + + // when + List dtos = communityBoardQueryService.getCommunityBoards(); + + // then + Optional communityBoard1 = communityBoardRepository.findById(communityId1); + Optional communityBoard2 = communityBoardRepository.findById(communityId2); + + + assertThat(dtos) + .isNotNull() + .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); + + 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 = createCommunityBoardUseCase.createCommunityBoard(dto1, savedVolunteer.getId(), null); + Long communityId2 = createCommunityBoardUseCase.createCommunityBoard(dto2, savedVolunteer.getId(), imgUrl1); + + //when + List dtos = communityBoardQueryService.getCommunityBoardsByWriterId(volunteer.getId()); + + //then + Optional communityBoard1 = communityBoardRepository.findById(communityId1); + Optional communityBoard2 = communityBoardRepository.findById(communityId2); + + assertThat(dtos) + .isNotNull() + .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 = createCommunityBoardUseCase.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 = createCommunityBoardUseCase.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()); + + } +} + 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..e9d0cf63c --- /dev/null +++ b/src/test/java/com/somemore/volunteer/repository/VolunteerRepositoryTest.java @@ -0,0 +1,33 @@ +package com.somemore.volunteer.repository; + +import com.somemore.IntegrationTestSupport; +import com.somemore.auth.oauth.OAuthProvider; +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.Assertions.assertThat; + +@Transactional +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()); + } }