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());
+ }
}