Skip to content

Commit 2a4c9a0

Browse files
[FEAT] 아이디어 결제 페이지 구현 (#142) (#153)
* [FEAT] 아이디어 구매 페이지 구현 * [FEAT] 검증 로직 추가 --------- Co-authored-by: 조경호 <[email protected]>
1 parent 7308e46 commit 2a4c9a0

File tree

4 files changed

+98
-0
lines changed

4 files changed

+98
-0
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
import com.brainpix.api.swagger.SwaggerPageable;
1818
import com.brainpix.post.converter.GetIdeaDetailDtoConverter;
1919
import com.brainpix.post.converter.GetIdeaListDtoConverter;
20+
import com.brainpix.post.converter.GetIdeaPurchasePageDtoConverter;
2021
import com.brainpix.post.converter.GetPopularIdeaListDtoConverter;
2122
import com.brainpix.post.dto.GetIdeaDetailDto;
2223
import com.brainpix.post.dto.GetIdeaListDto;
24+
import com.brainpix.post.dto.GetIdeaPurchasePageDto;
2325
import com.brainpix.post.dto.GetPopularIdeaListDto;
2426
import com.brainpix.post.service.IdeaMarketService;
2527
import com.brainpix.security.authorization.AllUser;
@@ -81,4 +83,14 @@ public ResponseEntity<ApiResponse<CommonPageResponse<GetPopularIdeaListDto.IdeaD
8183
parameter);
8284
return ResponseEntity.ok(ApiResponse.success(response));
8385
}
86+
87+
@AllUser
88+
@Operation(summary = "아이디어 구매 페이지 [GET]", description = "경로 변수로 아이디어 식별자를 받아, 아이디어 구매 페이지에 필요한 DTO를 반환하는 API입니다.")
89+
@GetMapping("/{ideaId}/purchase")
90+
public ResponseEntity<ApiResponse<GetIdeaPurchasePageDto.Response>> getIdeaPurchasePage(
91+
@PathVariable("ideaId") Long ideaId, @UserId Long userId) {
92+
GetIdeaPurchasePageDto.Parameter parameter = GetIdeaPurchasePageDtoConverter.toParameter(ideaId, userId);
93+
GetIdeaPurchasePageDto.Response response = ideaMarketService.getIdeaPurchasePage(parameter);
94+
return ResponseEntity.ok(ApiResponse.success(response));
95+
}
8496
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.brainpix.post.converter;
2+
3+
import com.brainpix.post.dto.GetIdeaPurchasePageDto;
4+
import com.brainpix.post.entity.idea_market.IdeaMarket;
5+
import com.brainpix.user.entity.User;
6+
7+
public class GetIdeaPurchasePageDtoConverter {
8+
9+
public static GetIdeaPurchasePageDto.Parameter toParameter(Long ideaId, Long userId) {
10+
11+
return GetIdeaPurchasePageDto.Parameter.builder()
12+
.ideaId(ideaId)
13+
.userId(userId)
14+
.build();
15+
}
16+
17+
public static GetIdeaPurchasePageDto.Response toResponse(IdeaMarket ideaMarket, User seller) {
18+
19+
return GetIdeaPurchasePageDto.Response.builder()
20+
.ideaId(ideaMarket.getId())
21+
.thumbnailImageUrl(ideaMarket.getFirstImage())
22+
.price(ideaMarket.getPrice().getPrice())
23+
.title(ideaMarket.getTitle())
24+
.remainingQuantity(ideaMarket.getPrice().getRemainingQuantity())
25+
.sellerId(seller.getId())
26+
.name(seller.getName())
27+
.profileImageUrl(seller.getProfileImage())
28+
.build();
29+
}
30+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.brainpix.post.dto;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
public class GetIdeaPurchasePageDto {
7+
8+
@Builder
9+
@Getter
10+
public static class Parameter {
11+
private Long ideaId; // 아이디어 ID
12+
private Long userId; // 유저 ID
13+
}
14+
15+
@Builder
16+
@Getter
17+
public static class Response {
18+
private Long ideaId; // 아이디어 ID
19+
private String thumbnailImageUrl; // 썸네일 이미지 URL
20+
private Long price; // 아이디어 가격
21+
private String title; // 아이디어 제목
22+
private Long remainingQuantity; // 남은 수량
23+
private Long sellerId; // 판매자의 식별자 값
24+
private String name; // 판매자 이름
25+
private String profileImageUrl; // 판매자 프로필 이미지 URL
26+
}
27+
}

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616
import com.brainpix.post.converter.CreateIdeaMarketConverter;
1717
import com.brainpix.post.converter.GetIdeaDetailDtoConverter;
1818
import com.brainpix.post.converter.GetIdeaListDtoConverter;
19+
import com.brainpix.post.converter.GetIdeaPurchasePageDtoConverter;
1920
import com.brainpix.post.converter.GetPopularIdeaListDtoConverter;
2021
import com.brainpix.post.dto.GetIdeaDetailDto;
2122
import com.brainpix.post.dto.GetIdeaListDto;
23+
import com.brainpix.post.dto.GetIdeaPurchasePageDto;
2224
import com.brainpix.post.dto.GetPopularIdeaListDto;
2325
import com.brainpix.post.dto.IdeaMarketCreateDto;
2426
import com.brainpix.post.dto.IdeaMarketUpdateDto;
@@ -145,4 +147,31 @@ public CommonPageResponse<GetPopularIdeaListDto.IdeaDetail> getPopularIdeaList(
145147

146148
return GetPopularIdeaListDtoConverter.toResponse(ideaMarkets);
147149
}
150+
151+
@Transactional(readOnly = true)
152+
public GetIdeaPurchasePageDto.Response getIdeaPurchasePage(GetIdeaPurchasePageDto.Parameter parameter) {
153+
154+
// 유저 조회
155+
User user = userRepository.findById(parameter.getUserId())
156+
.orElseThrow(() -> new BrainPixException(CommonErrorCode.USER_NOT_FOUND));
157+
158+
// 아이디어 조회
159+
IdeaMarket ideaMarket = ideaMarketRepository.findById(parameter.getIdeaId())
160+
.orElseThrow(() -> new BrainPixException(PostErrorCode.POST_NOT_FOUND));
161+
162+
// 판매자 정보 조회
163+
User seller = ideaMarket.getWriter();
164+
165+
// 개인이 기업 게시물을 구매하려는 경우 처리
166+
if (ideaMarket.getPostAuth().equals(PostAuth.COMPANY) && user.getAuthority()
167+
.equals(BrainpixAuthority.INDIVIDUAL)) {
168+
throw new BrainPixException(IdeaMarketErrorCode.FORBIDDEN_ACCESS);
169+
}
170+
// 글 작성자가 구매하려는 경우 처리
171+
if (seller == user) {
172+
throw new BrainPixException(IdeaMarketErrorCode.FORBIDDEN_ACCESS);
173+
}
174+
175+
return GetIdeaPurchasePageDtoConverter.toResponse(ideaMarket, seller);
176+
}
148177
}

0 commit comments

Comments
 (0)