Skip to content
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
2e173ab
feat(volunteer-apply): 지원자 통계 기능
leebs0521 Dec 4, 2024
a624ed1
test(volunteer-apply): 지원자 통계 기능 테스트
leebs0521 Dec 4, 2024
4c9a18e
feat(volunteer-apply): 지원자 통계 기능 API
leebs0521 Dec 4, 2024
c80333b
refactor(volunteer-apply): requestDto 패키지 위치 변경
leebs0521 Dec 4, 2024
189a2f8
feat(volunteer-apply): 봉사 지원 단건 조회 기능
leebs0521 Dec 4, 2024
3dc935c
test(volunteer-apply): 봉사 지원 단건 조회 테스트
leebs0521 Dec 4, 2024
ebb3751
feat(volunteer-apply): 봉사 지원 단건 조회 API
leebs0521 Dec 4, 2024
6ae9e3c
test(volunteer-apply): 봉사 지원 단건 조회 API 테스트
leebs0521 Dec 4, 2024
0906da5
feat(volunteer): 봉사 지원자 정보 조회 기능
leebs0521 Dec 4, 2024
f9630cb
test(volunteer): 봉사 지원자 정보 조회 기능 테스트
leebs0521 Dec 4, 2024
3e2f753
feat(volunteer-apply): 봉사 지원 리스트 응답 DTO 및 동적 쿼리 DTO
leebs0521 Dec 4, 2024
8dabb60
feat(volunteer-apply): 봉사 지원 리스트 조회 기능
leebs0521 Dec 4, 2024
60f8e2f
test(volunteer-apply): 봉사 지원 리스트 조회 기능 테스트
leebs0521 Dec 4, 2024
92e1e58
feat(volunteer-apply): 봉사 지원 리스트 조회 기능 API
leebs0521 Dec 4, 2024
079dfbc
test(volunteer-apply): 봉사 지원 리스트 조회 기능 API 테스트
leebs0521 Dec 4, 2024
044b8a4
feat(recruit-board): 봉사 모집글 조회 기능 추가
leebs0521 Dec 4, 2024
1d84eaf
test(recruit-board): 봉사 모집글 조회 기능 추가 테스트
leebs0521 Dec 4, 2024
0471363
feat(volunteer-apply): 봉사 지원 리스트 응답 DTO
leebs0521 Dec 4, 2024
aff8c7c
feat(volunteer-apply): 특정 봉사 지원 리스트 조회 기능
leebs0521 Dec 4, 2024
00fe262
test(volunteer-apply): 특정 봉사 지원 리스트 조회 기능 테스트
leebs0521 Dec 4, 2024
49c7198
feat(volunteer-apply): 특정 봉사 지원 리스트 조회 기능 API
leebs0521 Dec 4, 2024
ba34fad
test(volunteer-apply): 특정 봉사 지원 리스트 조회 기능 API 테스트
leebs0521 Dec 4, 2024
26eb1c3
fix(volunteer-apply): @Transactional 없던 오류 수정
leebs0521 Dec 4, 2024
5284816
refactor(volunteer-apply): VolunteerInfo 객체만 가져오도록 수정
leebs0521 Dec 4, 2024
6a7dea0
chore: sonar qube 이슈 수정
leebs0521 Dec 4, 2024
4cd52ce
refactor(volunteer-apply): facade 패키기로 이동
leebs0521 Dec 5, 2024
8e90d85
refactor(volunteer-apply): facade 에서 레포지토리가 아닌 UseCase를 의존하도록 변경
leebs0521 Dec 5, 2024
cf8e1c3
test(volunteer-apply): facade 에서 레포지토리가 아닌 UseCase를 의존하도록 변경에 따른 테스트
leebs0521 Dec 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.somemore.recruitboard.dto.response;

import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import com.somemore.recruitboard.domain.RecruitBoard;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;

@JsonNaming(SnakeCaseStrategy.class)
@Builder
public record RecruitBoardOverViewResponseDto(
@Schema(description = "모집글 아이디", example = "1")
Long id,
@Schema(description = "모집글 제목", example = "서울시 도서관 봉사 활동 모집")
String title
) {

public static RecruitBoardOverViewResponseDto from(RecruitBoard recruitBoard) {
return RecruitBoardOverViewResponseDto.builder()
.id(recruitBoard.getId())
.title(recruitBoard.getTitle())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
package com.somemore.recruitboard.repository;

import com.somemore.recruitboard.domain.RecruitBoard;
import com.somemore.recruitboard.dto.condition.RecruitBoardNearByCondition;
import com.somemore.recruitboard.dto.condition.RecruitBoardSearchCondition;
import com.somemore.recruitboard.repository.mapper.RecruitBoardDetail;
import com.somemore.recruitboard.repository.mapper.RecruitBoardWithCenter;
import com.somemore.recruitboard.repository.mapper.RecruitBoardWithLocation;
import com.somemore.recruitboard.dto.condition.RecruitBoardNearByCondition;
import com.somemore.recruitboard.dto.condition.RecruitBoardSearchCondition;

import java.util.List;

import java.util.Optional;
import java.util.UUID;

import org.springframework.data.domain.Page;

public interface RecruitBoardRepository {
Expand All @@ -31,4 +28,6 @@ public interface RecruitBoardRepository {
Page<RecruitBoard> findAllByCenterId(UUID centerId, RecruitBoardSearchCondition condition);

List<Long> findNotCompletedIdsByCenterId(UUID centerId);

List<RecruitBoard> findAllByIds(List<Long> ids);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,16 @@
import com.somemore.location.utils.GeoUtils;
import com.somemore.recruitboard.domain.QRecruitBoard;
import com.somemore.recruitboard.domain.RecruitBoard;

import java.util.List;

import com.somemore.recruitboard.domain.RecruitStatus;
import com.somemore.recruitboard.domain.VolunteerCategory;
import com.somemore.recruitboard.dto.condition.RecruitBoardNearByCondition;
import com.somemore.recruitboard.dto.condition.RecruitBoardSearchCondition;
import com.somemore.recruitboard.repository.mapper.RecruitBoardDetail;
import com.somemore.recruitboard.repository.mapper.RecruitBoardWithCenter;
import com.somemore.recruitboard.repository.mapper.RecruitBoardWithLocation;
import com.somemore.recruitboard.dto.condition.RecruitBoardNearByCondition;
import com.somemore.recruitboard.dto.condition.RecruitBoardSearchCondition;

import java.util.List;
import java.util.Optional;
import java.util.UUID;

import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Page;
Expand Down Expand Up @@ -80,6 +76,17 @@ public List<Long> findNotCompletedIdsByCenterId(UUID centerId) {
.fetch();
}

@Override
public List<RecruitBoard> findAllByIds(List<Long> ids) {
BooleanExpression exp = recruitBoard.id.in(ids)
.and(isNotCompleted());

return queryFactory
.selectFrom(recruitBoard)
.where(exp)
.fetch();
}

@Override
public Optional<RecruitBoardWithLocation> findWithLocationById(Long id) {
QRecruitBoard recruitBoard = QRecruitBoard.recruitBoard;
Expand Down Expand Up @@ -160,7 +167,7 @@ public Page<RecruitBoardDetail> findAllNearby(RecruitBoardNearByCondition condit

@Override
public Page<RecruitBoard> findAllByCenterId(UUID centerId,
RecruitBoardSearchCondition condition) {
RecruitBoardSearchCondition condition) {
QRecruitBoard recruitBoard = QRecruitBoard.recruitBoard;

Pageable pageable = condition.pageable();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.somemore.recruitboard.service.query;

import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_RECRUIT_BOARD;

import com.somemore.center.usecase.query.CenterQueryUseCase;
import com.somemore.global.exception.BadRequestException;
import com.somemore.recruitboard.domain.RecruitBoard;
Expand All @@ -14,16 +16,13 @@
import com.somemore.recruitboard.repository.mapper.RecruitBoardWithCenter;
import com.somemore.recruitboard.repository.mapper.RecruitBoardWithLocation;
import com.somemore.recruitboard.usecase.query.RecruitBoardQueryUseCase;
import java.util.List;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
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_RECRUIT_BOARD;

@RequiredArgsConstructor
@Transactional(readOnly = true)
@Service
Expand Down Expand Up @@ -70,7 +69,7 @@ public Page<RecruitBoardDetailResponseDto> getRecruitBoardsNearby(

@Override
public Page<RecruitBoardResponseDto> getRecruitBoardsByCenterId(UUID centerId,
RecruitBoardSearchCondition condition) {
RecruitBoardSearchCondition condition) {
centerQueryUseCase.validateCenterExists(centerId);

Page<RecruitBoard> boards = recruitBoardRepository.findAllByCenterId(centerId, condition);
Expand All @@ -82,4 +81,9 @@ public List<Long> getNotCompletedIdsByCenterIds(UUID centerId) {
return recruitBoardRepository.findNotCompletedIdsByCenterId(centerId);
}

@Override
public List<RecruitBoard> getAllByIds(List<Long> ids) {
return recruitBoardRepository.findAllByIds(ids);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,5 @@ Page<RecruitBoardResponseDto> getRecruitBoardsByCenterId(UUID centerId,

List<Long> getNotCompletedIdsByCenterIds(UUID centerId);

List<RecruitBoard> getAllByIds(List<Long> ids);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.somemore.volunteer.dto.response;

import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import com.somemore.volunteer.repository.mapper.VolunteerSimpleInfo;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.UUID;
import lombok.Builder;

@Schema(description = "봉사자 간단 정보 응답 DTO")
@JsonNaming(SnakeCaseStrategy.class)
@Builder
public record VolunteerSimpleInfoResponseDto(
@Schema(description = "봉사자 ID", example = "f5a8779a-bcc9-4fc5-b8a1-7b2a383054a9")
UUID id,
@Schema(description = "봉사자 이름", example = "홍길동")
String name,
@Schema(description = "봉사자 닉네임", example = "gil-dong")
String nickname,
@Schema(description = "봉사자 이메일", example = "[email protected]")
String email,
@Schema(description = "봉사자 이미지 URL", example = "https://example.com/images/hong.jpg")
String imgUrl
) {

public static VolunteerSimpleInfoResponseDto from(VolunteerSimpleInfo volunteerSimpleInfo) {
return VolunteerSimpleInfoResponseDto.builder()
.id(volunteerSimpleInfo.id())
.name(volunteerSimpleInfo.name())
.nickname(volunteerSimpleInfo.nickname())
.email(volunteerSimpleInfo.email())
.imgUrl(volunteerSimpleInfo.imgUrl())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

import com.somemore.volunteer.domain.Volunteer;
import com.somemore.volunteer.repository.mapper.VolunteerOverviewForRankingByHours;
import org.springframework.stereotype.Repository;

import com.somemore.volunteer.repository.mapper.VolunteerSimpleInfo;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import org.springframework.stereotype.Repository;

@Repository
public interface VolunteerRepository {
Expand All @@ -24,4 +24,6 @@ public interface VolunteerRepository {
void deleteAllInBatch();

List<Volunteer> findAllByIds(List<UUID> volunteerIds);

List<VolunteerSimpleInfo> findSimpleInfoByIds(List<UUID> ids);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
import com.somemore.volunteer.domain.QVolunteer;
import com.somemore.volunteer.domain.QVolunteerDetail;
import com.somemore.volunteer.domain.Volunteer;
import com.somemore.volunteer.repository.mapper.VolunteerOverviewForRankingByHours;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import com.somemore.volunteer.repository.mapper.VolunteerSimpleInfo;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

@RequiredArgsConstructor
@Repository
Expand All @@ -22,6 +23,7 @@ public class VolunteerRepositoryImpl implements VolunteerRepository {
private final JPAQueryFactory queryFactory;

private static final QVolunteer volunteer = QVolunteer.volunteer;
private static final QVolunteerDetail volunteerDetail = QVolunteerDetail.volunteerDetail;

@Override
public Volunteer save(Volunteer volunteer) {
Expand Down Expand Up @@ -72,6 +74,25 @@ public List<Volunteer> findAllByIds(List<UUID> volunteerIds) {
return volunteerJpaRepository.findAllByIdInAndDeletedFalse(volunteerIds);
}

@Override
public List<VolunteerSimpleInfo> findSimpleInfoByIds(List<UUID> ids) {
BooleanExpression exp = volunteer.id.in(ids)
.and(isNotDeleted());

return queryFactory
.select(Projections.constructor(VolunteerSimpleInfo.class,
volunteer.id,
volunteerDetail.name,
volunteer.nickname,
volunteerDetail.email,
volunteer.imgUrl,
volunteer.tier))
.from(volunteer)
.join(volunteerDetail).on(volunteer.id.eq(volunteerDetail.volunteerId))
.where(exp)
.fetch();
}

private Optional<Volunteer> findOne(BooleanExpression condition) {

return Optional.ofNullable(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.somemore.volunteer.repository.mapper;

import com.somemore.volunteer.domain.Tier;
import java.util.UUID;

public record VolunteerSimpleInfo(
UUID id,
String name,
String nickname,
String email,
String imgUrl,
Tier tier
) {

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.somemore.volunteer.service;

import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_VOLUNTEER;

import com.somemore.facade.validator.VolunteerDetailAccessValidator;
import com.somemore.global.exception.BadRequestException;
import com.somemore.volunteer.domain.Volunteer;
Expand All @@ -9,17 +11,15 @@
import com.somemore.volunteer.repository.VolunteerDetailRepository;
import com.somemore.volunteer.repository.VolunteerRepository;
import com.somemore.volunteer.repository.mapper.VolunteerOverviewForRankingByHours;
import com.somemore.volunteer.repository.mapper.VolunteerSimpleInfo;
import com.somemore.volunteer.usecase.VolunteerQueryUseCase;
import java.util.List;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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_VOLUNTEER;

@Slf4j
@Service
@RequiredArgsConstructor
Expand Down Expand Up @@ -49,7 +49,7 @@ public VolunteerProfileResponseDto getVolunteerProfile(UUID volunteerId) {

@Override
public VolunteerProfileResponseDto getVolunteerDetailedProfile(UUID volunteerId,
UUID centerId) {
UUID centerId) {
volunteerDetailAccessValidator.validateByCenterId(centerId, volunteerId);

return VolunteerProfileResponseDto.from(
Expand Down Expand Up @@ -87,6 +87,11 @@ public List<Volunteer> getAllByIds(List<UUID> volunteerIds) {
return volunteerRepository.findAllByIds(volunteerIds);
}

@Override
public List<VolunteerSimpleInfo> getVolunteerSimpleInfosByIds(List<UUID> ids) {
return volunteerRepository.findSimpleInfoByIds(ids);
}

private Volunteer findVolunteer(UUID volunteerId) {
return volunteerRepository.findById(volunteerId)
.orElseThrow(() -> new BadRequestException(NOT_EXISTS_VOLUNTEER));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.somemore.volunteer.domain.Volunteer;
import com.somemore.volunteer.dto.response.VolunteerProfileResponseDto;
import com.somemore.volunteer.dto.response.VolunteerRankingResponseDto;

import com.somemore.volunteer.repository.mapper.VolunteerSimpleInfo;
import java.util.List;
import java.util.UUID;

Expand All @@ -22,4 +22,6 @@ public interface VolunteerQueryUseCase {
VolunteerRankingResponseDto getRankingByHours();

List<Volunteer> getAllByIds(List<UUID> volunteerIds);

List<VolunteerSimpleInfo> getVolunteerSimpleInfosByIds(List<UUID> ids);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.somemore.auth.annotation.CurrentUser;
import com.somemore.global.common.response.ApiResponse;
import com.somemore.volunteerapply.dto.VolunteerApplyCreateRequestDto;
import com.somemore.volunteerapply.dto.request.VolunteerApplyCreateRequestDto;
import com.somemore.volunteerapply.usecase.ApplyVolunteerApplyUseCase;
import com.somemore.volunteerapply.usecase.WithdrawVolunteerApplyUseCase;
import io.swagger.v3.oas.annotations.Operation;
Expand Down
Loading
Loading