Skip to content

Commit 95bc781

Browse files
authored
[REFACT] 협업 광장 조회 관련 리팩토링 (#120) (#123)
* [REFACT] 인증 및 인가, 스웨거 설명 작성, 커스텀 에러 적용, dto에 openProfile 추가 * [FIX] 동적 쿼리 조회 GET -> POST 수정
1 parent a4e230a commit 95bc781

File tree

6 files changed

+48
-39
lines changed

6 files changed

+48
-39
lines changed

src/main/java/com/brainpix/post/controller/CollaborationHubController.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.brainpix.post.controller;
22

33
import org.springframework.data.domain.Pageable;
4+
import org.springframework.data.web.PageableDefault;
45
import org.springframework.http.ResponseEntity;
56
import org.springframework.web.bind.annotation.DeleteMapping;
67
import org.springframework.web.bind.annotation.GetMapping;
@@ -13,6 +14,7 @@
1314
import org.springframework.web.bind.annotation.RestController;
1415

1516
import com.brainpix.api.ApiResponse;
17+
import com.brainpix.api.CommonPageResponse;
1618
import com.brainpix.post.converter.ApplyCollaborationDtoConverter;
1719
import com.brainpix.post.converter.GetCollaborationHubDetailDtoConverter;
1820
import com.brainpix.post.converter.GetCollaborationHubListDtoConverter;
@@ -21,8 +23,8 @@
2123
import com.brainpix.post.dto.CollaborationHubUpdateDto;
2224
import com.brainpix.post.dto.GetCollaborationHubDetailDto;
2325
import com.brainpix.post.dto.GetCollaborationHubListDto;
24-
import com.brainpix.post.service.CollaborationHubInitialMemberService;
2526
import com.brainpix.post.dto.PostApiResponseDto;
27+
import com.brainpix.post.service.CollaborationHubInitialMemberService;
2628
import com.brainpix.post.service.CollaborationHubService;
2729
import com.brainpix.security.authorization.AllUser;
2830
import com.brainpix.security.authorization.UserId;
@@ -70,12 +72,15 @@ public ResponseEntity<ApiResponse<Void>> updateCollaborationHub(@PathVariable("c
7072
return ResponseEntity.ok(ApiResponse.successWithNoData());
7173
}
7274

73-
@GetMapping
74-
public ResponseEntity<ApiResponse<GetCollaborationHubListDto.Response>> getCollaborationHubList(
75-
GetCollaborationHubListDto.Request request, Pageable pageable) {
75+
@Operation(summary = "협업 광장 전체 조회 [POST]", description = "json body로 검색 조건을 입력받고, 쿼리 파라미터로 페이징을 위한 page, size를 입력받아 전체 조회합니다.")
76+
@PostMapping("/search")
77+
public ResponseEntity<ApiResponse<CommonPageResponse<GetCollaborationHubListDto.CollaborationDetail>>> getCollaborationHubList(
78+
@RequestBody GetCollaborationHubListDto.Request request,
79+
@PageableDefault(page = 0, size = 6) Pageable pageable) {
7680
GetCollaborationHubListDto.Parameter parameter = GetCollaborationHubListDtoConverter.toParameter(request,
7781
pageable);
78-
GetCollaborationHubListDto.Response response = collaborationHubService.getCollaborationHubList(parameter);
82+
CommonPageResponse<GetCollaborationHubListDto.CollaborationDetail> response = collaborationHubService.getCollaborationHubList(
83+
parameter);
7984
return ResponseEntity.ok(ApiResponse.success(response));
8085
}
8186

@@ -95,11 +100,14 @@ public ResponseEntity<ApiResponse<Void>> validateUserIdentifier(@PathVariable St
95100
return ResponseEntity.ok(ApiResponse.successWithNoData());
96101
}
97102

103+
@AllUser
104+
@Operation(summary = "협업 광장 상세 조회 [GET]", description = "경로 변수로 협업 게시글 식별자 값을 입력받아 상세 조회합니다.")
98105
@GetMapping("/{collaborationId}")
99106
public ResponseEntity<ApiResponse<GetCollaborationHubDetailDto.Response>> getCollaborationHubDetail(
107+
@UserId Long userId,
100108
@PathVariable("collaborationId") Long collaborationId) {
101109
GetCollaborationHubDetailDto.Parameter parameter = GetCollaborationHubDetailDtoConverter.toParameter(
102-
collaborationId);
110+
collaborationId, userId);
103111
GetCollaborationHubDetailDto.Response response = collaborationHubService.getCollaborationHubDetail(parameter);
104112
return ResponseEntity.ok(ApiResponse.success(response));
105113
}

src/main/java/com/brainpix/post/converter/GetCollaborationHubDetailDtoConverter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313

1414
public class GetCollaborationHubDetailDtoConverter {
1515

16-
public static GetCollaborationHubDetailDto.Parameter toParameter(Long collaborationId) {
16+
public static GetCollaborationHubDetailDto.Parameter toParameter(Long collaborationId, Long userId) {
1717
return GetCollaborationHubDetailDto.Parameter.builder()
1818
.collaborationId(collaborationId)
19+
.userId(userId)
1920
.build();
2021
}
2122

@@ -62,6 +63,7 @@ public static GetCollaborationHubDetailDto.Response toResponse(CollaborationHub
6263
.attachments(collaborationHub.getImageList())
6364
.recruitments(recruitments)
6465
.openMembers(openMembers)
66+
.openMyProfile(collaborationHub.getOpenMyProfile())
6567
.build();
6668
}
6769

@@ -91,7 +93,7 @@ public static GetCollaborationHubDetailDto.OpenMember toOpenMember(CollectionGat
9193
.userId(collectionGathering.getJoiner().getId())
9294
.name(collectionGathering.getJoiner().getName())
9395
.domain(collectionGathering.getCollaborationRecruitment().getDomain())
94-
// .isOpenPortfolio(?)
96+
.openMyProfile(collectionGathering.getOpenProfile())
9597
.build();
9698
}
9799
}

src/main/java/com/brainpix/post/converter/GetCollaborationHubListDtoConverter.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
import java.time.LocalDateTime;
44
import java.time.temporal.ChronoUnit;
5-
import java.util.List;
65

76
import org.springframework.data.domain.Page;
87
import org.springframework.data.domain.Pageable;
98

9+
import com.brainpix.api.CommonPageResponse;
1010
import com.brainpix.api.code.error.CommonErrorCode;
1111
import com.brainpix.api.exception.BrainPixException;
1212
import com.brainpix.post.dto.GetCollaborationHubListDto;
@@ -39,9 +39,10 @@ public static GetCollaborationHubListDto.Parameter toParameter(GetCollaborationH
3939
.build();
4040
}
4141

42-
public static GetCollaborationHubListDto.Response toResponse(Page<Object[]> CollaborationHubs) {
42+
public static CommonPageResponse<GetCollaborationHubListDto.CollaborationDetail> toResponse(
43+
Page<Object[]> CollaborationHubs) {
4344

44-
List<GetCollaborationHubListDto.CollaborationDetail> collaborationDetailList = CollaborationHubs.stream()
45+
Page<GetCollaborationHubListDto.CollaborationDetail> response = CollaborationHubs
4546
.map(CollaborationHub -> {
4647
CollaborationHub collaboration = (CollaborationHub)CollaborationHub[0]; // 실제 엔티티 객체
4748
Long saveCount = (Long)CollaborationHub[1]; // 저장 횟수
@@ -54,16 +55,9 @@ public static GetCollaborationHubListDto.Response toResponse(Page<Object[]> Coll
5455
Long totalQuantity = collaboration.getTotalQuantity();
5556
return toCollaborationDetail(collaboration, saveCount, days, occupiedQuantity, totalQuantity);
5657
}
57-
).toList();
58+
);
5859

59-
return GetCollaborationHubListDto.Response.builder()
60-
.collaborationDetailList(collaborationDetailList)
61-
.totalPages(CollaborationHubs.getTotalPages())
62-
.totalElements((int)CollaborationHubs.getTotalElements())
63-
.currentPage(CollaborationHubs.getNumber())
64-
.currentSize(CollaborationHubs.getNumberOfElements())
65-
.hasNext(CollaborationHubs.hasNext())
66-
.build();
60+
return CommonPageResponse.of(response);
6761
}
6862

6963
public static GetCollaborationHubListDto.CollaborationDetail toCollaborationDetail(

src/main/java/com/brainpix/post/dto/GetCollaborationHubDetailDto.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public class GetCollaborationHubDetailDto {
1212
@Getter
1313
public static class Parameter {
1414
private Long collaborationId; // 협업 게시글 ID
15+
private Long userId; // 유저 ID
1516
}
1617

1718
@Builder
@@ -32,6 +33,7 @@ public static class Response {
3233
private List<String> attachments; // 첨부 파일 목록
3334
private List<Recruitment> recruitments; // 모집 단위
3435
private List<OpenMember> openMembers; // 개최 인원
36+
private Boolean openMyProfile; // 프로필 공개 여부
3537
}
3638

3739
@Builder
@@ -61,6 +63,6 @@ public static class OpenMember {
6163
private Long userId; // 유저 식별자 값
6264
private String name; // 유저 이름
6365
private String domain; // 유저 역할
64-
private Boolean isOpenPortfolio; // 포트폴리오 불러오기 여부
66+
private Boolean openMyProfile; // 포트폴리오 불러오기 여부
6567
}
6668
}

src/main/java/com/brainpix/post/dto/GetCollaborationHubListDto.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.brainpix.post.dto;
22

3-
import java.util.List;
4-
53
import org.springframework.data.domain.Pageable;
64

75
import com.brainpix.post.enums.SortType;
@@ -10,13 +8,11 @@
108
import lombok.Builder;
119
import lombok.Getter;
1210
import lombok.NoArgsConstructor;
13-
import lombok.Setter;
1411

1512
public class GetCollaborationHubListDto {
1613

1714
@NoArgsConstructor
1815
@Getter
19-
@Setter
2016
public static class Request {
2117
private String keyword; // 검색 키워드
2218
private String category; // 카테고리
@@ -34,17 +30,6 @@ public static class Parameter {
3430
private Pageable pageable; // 페이징 기준
3531
}
3632

37-
@Builder
38-
@Getter
39-
public static class Response {
40-
private List<CollaborationDetail> collaborationDetailList; // 결과 값 리스트
41-
private Integer totalPages; // 전체 페이지 수
42-
private Integer totalElements; // 전체 결과의 크기
43-
private Integer currentPage; // 현재 페이지 수
44-
private Integer currentSize; // 현재 페이지의 크기
45-
private Boolean hasNext; // 다음 페이지 존재 여부
46-
}
47-
4833
@Builder
4934
@Getter
5035
public static class CollaborationDetail {

src/main/java/com/brainpix/post/service/CollaborationHubService.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.springframework.stereotype.Service;
77
import org.springframework.transaction.annotation.Transactional;
88

9+
import com.brainpix.api.CommonPageResponse;
910
import com.brainpix.api.code.error.CollaborationHubErrorCode;
1011
import com.brainpix.api.code.error.CommonErrorCode;
1112
import com.brainpix.api.code.error.PostErrorCode;
@@ -15,18 +16,21 @@
1516
import com.brainpix.post.dto.CollaborationHubUpdateDto;
1617
import com.brainpix.joining.entity.purchasing.CollectionGathering;
1718
import com.brainpix.joining.repository.CollectionGatheringRepository;
19+
import com.brainpix.joining.repository.RequestTaskPurchasingRepository;
1820
import com.brainpix.post.converter.ApplyCollaborationDtoConverter;
1921
import com.brainpix.post.converter.GetCollaborationHubDetailDtoConverter;
2022
import com.brainpix.post.converter.GetCollaborationHubListDtoConverter;
2123
import com.brainpix.post.dto.ApplyCollaborationDto;
2224
import com.brainpix.post.dto.GetCollaborationHubDetailDto;
2325
import com.brainpix.post.dto.GetCollaborationHubListDto;
26+
import com.brainpix.post.entity.PostAuth;
2427
import com.brainpix.post.entity.collaboration_hub.CollaborationHub;
2528
import com.brainpix.post.entity.collaboration_hub.CollaborationRecruitment;
2629
import com.brainpix.post.repository.CollaborationHubRepository;
2730
import com.brainpix.post.repository.CollaborationRecruitmentRepository;
2831
import com.brainpix.post.repository.IdeaMarketRepository;
2932
import com.brainpix.post.repository.SavedPostRepository;
33+
import com.brainpix.security.authority.BrainpixAuthority;
3034
import com.brainpix.user.entity.User;
3135
import com.brainpix.user.repository.UserRepository;
3236

@@ -45,6 +49,7 @@ public class CollaborationHubService {
4549
private final CollaborationHubInitialMemberService collaborationHubInitialMemberService;
4650
private final SavedPostRepository savedPostRepository;
4751
private final IdeaMarketRepository ideaMarketRepository;
52+
private final RequestTaskPurchasingRepository requestTaskPurchasingRepository;
4853

4954
@Transactional
5055
public Long createCollaborationHub(Long userId, CollaborationHubCreateDto createDto) {
@@ -88,7 +93,8 @@ public void deleteCollaborationHub(Long collaborationId, Long userId) {
8893
}
8994

9095
@Transactional(readOnly = true)
91-
public GetCollaborationHubListDto.Response getCollaborationHubList(GetCollaborationHubListDto.Parameter parameter) {
96+
public CommonPageResponse<GetCollaborationHubListDto.CollaborationDetail> getCollaborationHubList(
97+
GetCollaborationHubListDto.Parameter parameter) {
9298

9399
// 협업 게시글-저장수 쌍으로 반환된 결과
94100
Page<Object[]> result = collaborationHubRepository.findCollaborationListWithSaveCount(
@@ -102,9 +108,19 @@ public GetCollaborationHubListDto.Response getCollaborationHubList(GetCollaborat
102108
public GetCollaborationHubDetailDto.Response getCollaborationHubDetail(
103109
GetCollaborationHubDetailDto.Parameter parameter) {
104110

111+
// 유저 조회
112+
User user = userRepository.findById(parameter.getUserId())
113+
.orElseThrow(() -> new BrainPixException(CommonErrorCode.USER_NOT_FOUND));
114+
105115
// 협업 게시글 조회
106116
CollaborationHub collaborationHub = collaborationHubRepository.findById(parameter.getCollaborationId())
107-
.orElseThrow(() -> new BrainPixException(CommonErrorCode.RESOURCE_NOT_FOUND));
117+
.orElseThrow(() -> new BrainPixException(CollaborationHubErrorCode.COLLABORATION_NOT_FOUND));
118+
119+
// 개인이 기업 게시물을 상세보기 하는 경우 처리
120+
if (collaborationHub.getPostAuth().equals(PostAuth.COMPANY) && user.getAuthority()
121+
.equals(BrainpixAuthority.INDIVIDUAL)) {
122+
throw new BrainPixException(RequestTaskErrorCode.FORBIDDEN_ACCESS);
123+
}
108124

109125
// 작성자 조회
110126
User writer = collaborationHub.getWriter();
@@ -116,7 +132,9 @@ public GetCollaborationHubDetailDto.Response getCollaborationHubDetail(
116132
Long totalIdeas = ideaMarketRepository.countByWriterId(writer.getId());
117133

118134
// 작성자의 협업 횟수
119-
Long totalCollaborations = collectionGatheringRepository.countByJoinerIdAndAccepted(writer.getId(), true);
135+
Long totalCollaborations = collectionGatheringRepository.countByJoinerIdAndAccepted(writer.getId(), true)
136+
+ collectionGatheringRepository.countByJoinerIdAndInitialGathering(
137+
writer.getId(), true) + requestTaskPurchasingRepository.countByBuyerIdAndAccepted(writer.getId(), true);
120138

121139
// 개최 인원
122140
List<CollectionGathering> collectionGatherings = collectionGatheringRepository.findByCollaborationHubId(

0 commit comments

Comments
 (0)