Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Expand Up @@ -24,4 +24,7 @@ default boolean doesNotExistById(UUID id) {
}

List<CenterOverviewInfo> findOverviewInfosByIds(List<UUID> ids);

Optional<String> findNameById(UUID id);

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.somemore.center.repository;

import com.querydsl.core.types.Path;
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
Expand Down Expand Up @@ -101,6 +102,11 @@ public List<CenterOverviewInfo> findOverviewInfosByIds(List<UUID> ids) {
.fetch();
}

@Override
public Optional<String> findNameById(UUID id) {
return findDynamicFieldByCenterId(id, userCommonAttribute.name);
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기그냥 Optional로 하는게 어떠신가요??

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 그게 좋다고 생각해용

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

감사합니다 반영했습니다!


private static BooleanExpression idIn(List<UUID> ids) {
return center.id.in(ids);
}
Expand All @@ -113,4 +119,18 @@ private BooleanExpression isNotDeleted() {
return center.deleted.isFalse();
}

private <T> Optional<T> findDynamicFieldByCenterId(UUID id, Path<T> field) {
return Optional.ofNullable(
queryFactory
.select(field)
.from(center)
.join(userCommonAttribute)
.on(userCommonAttribute.userId.eq(center.userId))
.where(
center.id.eq(id),
isNotDeleted()
)
.fetchOne()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.somemore.center.repository.record.CenterProfileDto;
import com.somemore.center.usecase.NEWCenterQueryUseCase;
import com.somemore.center.usecase.PreferItemQueryUseCase;
import com.somemore.global.exception.BadRequestException;
import com.somemore.global.exception.ExceptionMessage;
import com.somemore.global.exception.NoSuchElementException;
import com.somemore.user.repository.usercommonattribute.record.UserProfileDto;
Expand Down Expand Up @@ -74,4 +75,10 @@ public List<CenterOverviewInfo> getCenterOverviewsByIds(List<UUID> ids) {
return centerRepository.findOverviewInfosByIds(ids);
}

@Override
public String getNameById(UUID id) {
return centerRepository.findNameById(id)
.orElseThrow(
() -> new NoSuchElementException(ExceptionMessage.NOT_EXISTS_CENTER));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,7 @@ public interface NEWCenterQueryUseCase {
void validateCenterExists(UUID id);

List<CenterOverviewInfo> getCenterOverviewsByIds(List<UUID> ids);

String getNameById(UUID id);

}
Original file line number Diff line number Diff line change
@@ -1,29 +1,21 @@
package com.somemore.domains.recruitboard.controller;

import com.somemore.domains.recruitboard.domain.RecruitStatus;
import com.somemore.domains.recruitboard.domain.VolunteerCategory;
import com.somemore.domains.recruitboard.dto.condition.RecruitBoardSearchCondition;
import com.somemore.domains.recruitboard.dto.response.RecruitBoardResponseDto;
import com.somemore.domains.recruitboard.dto.response.RecruitBoardWithCenterResponseDto;
import com.somemore.domains.recruitboard.dto.response.RecruitBoardWithLocationResponseDto;
import com.somemore.domains.recruitboard.usecase.RecruitBoardQueryUseCase;
import com.somemore.global.auth.annotation.RoleId;
import com.somemore.global.common.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.security.access.annotation.Secured;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

import static org.springframework.data.domain.Sort.Direction.DESC;

@Tag(name = "Recruit Board Query API", description = "봉사 활동 모집 조회 관련 API")
Expand Down Expand Up @@ -62,59 +54,4 @@ public ApiResponse<Page<RecruitBoardWithCenterResponseDto>> getAll(
"봉사 활동 모집글 리스트 조회 성공"
);
}

@GetMapping("/recruit-boards/center/{centerId}")
@Operation(summary = "특정 기관 모집글 조회", description = "특정 기관의 봉사 모집글을 조회합니다.")
public ApiResponse<Page<RecruitBoardResponseDto>> getRecruitBoardsByCenterId(
@PathVariable UUID centerId,
@PageableDefault(sort = "created_at", direction = DESC) Pageable pageable,
@RequestParam(required = false) String keyword,
@RequestParam(required = false) VolunteerCategory category,
@RequestParam(required = false) String region,
@RequestParam(required = false) Boolean admitted,
@RequestParam(required = false) RecruitStatus status
) {
RecruitBoardSearchCondition condition = RecruitBoardSearchCondition.builder()
.keyword(keyword)
.category(category)
.region(region)
.admitted(admitted)
.status(status)
.pageable(pageable)
.build();

return ApiResponse.ok(
200,
recruitBoardQueryUseCase.getRecruitBoardsByCenterId(centerId, condition),
"특정 기관 봉사 활동 모집글 조회 성공"
);
}

@Secured("ROLE_CENTER")
@GetMapping("/recruit-boards/me")
@Operation(summary = "기관이 작성한 모집글 조회", description = "기관의 봉사 모집글을 조회합니다.")
public ApiResponse<Page<RecruitBoardResponseDto>> getMyRecruitBoards(
@RoleId UUID centerId,
@PageableDefault(sort = "created_at", direction = DESC) Pageable pageable,
@RequestParam(required = false) String keyword,
@RequestParam(required = false) VolunteerCategory category,
@RequestParam(required = false) String region,
@RequestParam(required = false) Boolean admitted,
@RequestParam(required = false) RecruitStatus status
) {
RecruitBoardSearchCondition condition = RecruitBoardSearchCondition.builder()
.keyword(keyword)
.category(category)
.region(region)
.admitted(admitted)
.status(status)
.pageable(pageable)
.build();

return ApiResponse.ok(
200,
recruitBoardQueryUseCase.getRecruitBoardsByCenterId(centerId, condition),
"기관 봉사 활동 모집글 조회 성공"
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.somemore.domains.recruitboard.domain.RecruitStatus;
import com.somemore.domains.recruitboard.domain.RecruitmentInfo;
import com.somemore.domains.recruitboard.domain.VolunteerCategory;
import com.somemore.domains.search.domain.RecruitBoardDocument;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;

Expand Down Expand Up @@ -69,4 +70,24 @@ public static RecruitBoardResponseDto from(RecruitBoard board) {
.admitted(info.getAdmitted())
.build();
}

public static RecruitBoardResponseDto fromDocument(RecruitBoardDocument document) {
return RecruitBoardResponseDto.builder()
.id(document.getId())
.centerId(document.getCenterId())
.locationId(document.getLocationId())
.createdAt(document.getCreatedAt())
.updatedAt(document.getUpdatedAt())
.title(document.getTitle())
.content(document.getContent())
.region(document.getRegion())
.recruitStatus(document.getRecruitStatus())
.recruitmentCount(document.getRecruitmentCount())
.volunteerStartDateTime(document.getVolunteerStartDateTime())
.volunteerEndDateTime(document.getVolunteerEndDateTime())
.volunteerCategory(document.getVolunteerCategory())
.volunteerHours(document.getVolunteerHours())
.admitted(document.getAdmitted())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,24 @@
import com.somemore.domains.recruitboard.dto.condition.RecruitBoardNearByCondition;
import com.somemore.domains.recruitboard.dto.condition.RecruitBoardSearchCondition;
import com.somemore.domains.recruitboard.dto.response.RecruitBoardDetailResponseDto;
import com.somemore.domains.recruitboard.dto.response.RecruitBoardResponseDto;
import com.somemore.domains.recruitboard.dto.response.RecruitBoardWithCenterResponseDto;
import com.somemore.domains.recruitboard.usecase.RecruitBoardQueryUseCase;
import com.somemore.domains.search.config.ElasticsearchHealthChecker;
import com.somemore.domains.search.usecase.RecruitBoardDocumentUseCase;
import com.somemore.global.auth.annotation.RoleId;
import com.somemore.global.common.response.ApiResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.security.access.annotation.Secured;
import org.springframework.web.bind.annotation.*;

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

import static org.springframework.data.domain.Sort.Direction.DESC;

Expand Down Expand Up @@ -100,5 +104,76 @@ public ApiResponse<Page<RecruitBoardDetailResponseDto>> getNearbyBySearch(
);
}

//TODO: 특정 기관 모집글 조회, 기관이 작성한 모집글 조회 추가
@GetMapping("/recruit-boards/center/{centerId}")
@Operation(summary = "특정 기관 모집글 조회", description = "특정 기관의 봉사 모집글을 조회합니다.")
public ApiResponse<Page<RecruitBoardResponseDto>> getRecruitBoardsByCenterId(
@PathVariable UUID centerId,
@PageableDefault(sort = "created_at", direction = DESC) Pageable pageable,
@RequestParam(required = false) String keyword,
@RequestParam(required = false) VolunteerCategory category,
@RequestParam(required = false) String region,
@RequestParam(required = false) Boolean admitted,
@RequestParam(required = false) RecruitStatus status
) {
RecruitBoardSearchCondition condition = RecruitBoardSearchCondition.builder()
.keyword(keyword)
.category(category)
.region(region)
.admitted(admitted)
.status(status)
.pageable(pageable)
.build();

if (elasticsearchHealthChecker.isElasticsearchRunning()) {
return ApiResponse.ok(
200,
recruitBoardDocumentUseCase.get()
.getRecruitBoardsByCenterIdWithKeyword(centerId, condition),
"특정 기관 봉사 활동 모집글 조회 성공"
);
}

return ApiResponse.ok(
200,
recruitBoardQueryUseCase.getRecruitBoardsByCenterId(centerId, condition),
"특정 기관 봉사 활동 모집글 조회 성공"
);
}

@Secured("ROLE_CENTER")
@GetMapping("/recruit-boards/me")
@Operation(summary = "기관이 작성한 모집글 조회", description = "기관의 봉사 모집글을 조회합니다.")
public ApiResponse<Page<RecruitBoardResponseDto>> getMyRecruitBoards(
@RoleId UUID centerId,
@PageableDefault(sort = "created_at", direction = DESC) Pageable pageable,
@RequestParam(required = false) String keyword,
@RequestParam(required = false) VolunteerCategory category,
@RequestParam(required = false) String region,
@RequestParam(required = false) Boolean admitted,
@RequestParam(required = false) RecruitStatus status
) {
RecruitBoardSearchCondition condition = RecruitBoardSearchCondition.builder()
.keyword(keyword)
.category(category)
.region(region)
.admitted(admitted)
.status(status)
.pageable(pageable)
.build();

if (elasticsearchHealthChecker.isElasticsearchRunning()) {
return ApiResponse.ok(
200,
recruitBoardDocumentUseCase.get()
.getRecruitBoardsByCenterIdWithKeyword(centerId, condition),
"기관 봉사 활동 모집글 조회 성공"
);
}

return ApiResponse.ok(
200,
recruitBoardQueryUseCase.getRecruitBoardsByCenterId(centerId, condition),
"기관 봉사 활동 모집글 조회 성공"
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@
import org.springframework.data.domain.Pageable;

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

public interface SearchBoardRepository {

Page<RecruitBoardDocument> findAllNearbyWithKeyword(RecruitBoardNearByCondition condition);
Page<RecruitBoardDocument> findByRecruitBoardsContaining(RecruitBoardSearchCondition condition);
Page<RecruitBoardDocument> findAllNearbyWithKeyword(RecruitBoardNearByCondition condition);
Page<RecruitBoardDocument> findAllByCenterIdWithKeyword(UUID centerId, RecruitBoardSearchCondition condition);
void saveRecruitBoardDocuments(List<RecruitBoard> recruitBoards);
void deleteRecruitBoardDocument(Long id);

Expand Down
Loading