Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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 @@ -21,4 +21,8 @@ public BaseQuantity(Long totalQuantity, Long occupiedQuantity) {
this.totalQuantity = totalQuantity;
this.occupiedQuantity = occupiedQuantity;
}

public Long getRemainingQuantity() {
return this.totalQuantity - this.occupiedQuantity;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@
import com.brainpix.api.swagger.SwaggerPageable;
import com.brainpix.post.converter.GetIdeaDetailDtoConverter;
import com.brainpix.post.converter.GetIdeaListDtoConverter;
import com.brainpix.post.converter.GetIdeaPurchasePageDtoConverter;
import com.brainpix.post.converter.GetPopularIdeaListDtoConverter;
import com.brainpix.post.dto.GetIdeaDetailDto;
import com.brainpix.post.dto.GetIdeaListDto;
import com.brainpix.post.dto.GetIdeaPurchasePageDto;
import com.brainpix.post.dto.GetPopularIdeaListDto;
import com.brainpix.post.service.IdeaMarketService;
import com.brainpix.security.authorization.AllUser;
Expand Down Expand Up @@ -81,4 +83,14 @@ public ResponseEntity<ApiResponse<CommonPageResponse<GetPopularIdeaListDto.IdeaD
parameter);
return ResponseEntity.ok(ApiResponse.success(response));
}

@AllUser
@Operation(summary = "아이디어 구매 페이지 [GET]", description = "경로 변수로 아이디어 식별자를 받아, 아이디어 구매 페이지에 필요한 DTO를 반환하는 API입니다.")
@GetMapping("/{ideaId}/purchase")
public ResponseEntity<ApiResponse<GetIdeaPurchasePageDto.Response>> getIdeaPurchasePage(
@PathVariable("ideaId") Long ideaId, @UserId Long userId) {
GetIdeaPurchasePageDto.Parameter parameter = GetIdeaPurchasePageDtoConverter.toParameter(ideaId, userId);
GetIdeaPurchasePageDto.Response response = ideaMarketService.getIdeaPurchasePage(parameter);
return ResponseEntity.ok(ApiResponse.success(response));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.brainpix.post.converter;

import com.brainpix.post.dto.GetIdeaPurchasePageDto;
import com.brainpix.post.entity.idea_market.IdeaMarket;
import com.brainpix.user.entity.User;

public class GetIdeaPurchasePageDtoConverter {

public static GetIdeaPurchasePageDto.Parameter toParameter(Long ideaId, Long userId) {

return GetIdeaPurchasePageDto.Parameter.builder()
.ideaId(ideaId)
.userId(userId)
.build();
}

public static GetIdeaPurchasePageDto.Response toResponse(IdeaMarket ideaMarket, User seller) {

return GetIdeaPurchasePageDto.Response.builder()
.ideaId(ideaMarket.getId())
.thumbnailImageUrl(ideaMarket.getFirstImage())
.price(ideaMarket.getPrice().getPrice())
.title(ideaMarket.getTitle())
.remainingQuantity(ideaMarket.getPrice().getRemainingQuantity())
.sellerId(seller.getId())
.name(seller.getName())
.profileImageUrl(seller.getProfileImage())
.build();
}
}
27 changes: 27 additions & 0 deletions src/main/java/com/brainpix/post/dto/GetIdeaPurchasePageDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.brainpix.post.dto;

import lombok.Builder;
import lombok.Getter;

public class GetIdeaPurchasePageDto {

@Builder
@Getter
public static class Parameter {
private Long ideaId; // 아이디어 ID
private Long userId; // 유저 ID
}

@Builder
@Getter
public static class Response {
private Long ideaId; // 아이디어 ID
private String thumbnailImageUrl; // 썸네일 이미지 URL
private Long price; // 아이디어 가격
private String title; // 아이디어 제목
private Long remainingQuantity; // 남은 수량
private Long sellerId; // 판매자의 식별자 값
private String name; // 판매자 이름
private String profileImageUrl; // 판매자 프로필 이미지 URL
}
}
29 changes: 29 additions & 0 deletions src/main/java/com/brainpix/post/service/IdeaMarketService.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@
import com.brainpix.post.converter.CreateIdeaMarketConverter;
import com.brainpix.post.converter.GetIdeaDetailDtoConverter;
import com.brainpix.post.converter.GetIdeaListDtoConverter;
import com.brainpix.post.converter.GetIdeaPurchasePageDtoConverter;
import com.brainpix.post.converter.GetPopularIdeaListDtoConverter;
import com.brainpix.post.dto.GetIdeaDetailDto;
import com.brainpix.post.dto.GetIdeaListDto;
import com.brainpix.post.dto.GetIdeaPurchasePageDto;
import com.brainpix.post.dto.GetPopularIdeaListDto;
import com.brainpix.post.dto.IdeaMarketCreateDto;
import com.brainpix.post.dto.IdeaMarketUpdateDto;
Expand Down Expand Up @@ -140,4 +142,31 @@ public CommonPageResponse<GetPopularIdeaListDto.IdeaDetail> getPopularIdeaList(

return GetPopularIdeaListDtoConverter.toResponse(ideaMarkets);
}

@Transactional(readOnly = true)
public GetIdeaPurchasePageDto.Response getIdeaPurchasePage(GetIdeaPurchasePageDto.Parameter parameter) {

// 유저 조회
User user = userRepository.findById(parameter.getUserId())
.orElseThrow(() -> new BrainPixException(CommonErrorCode.USER_NOT_FOUND));

// 아이디어 조회
IdeaMarket ideaMarket = ideaMarketRepository.findById(parameter.getIdeaId())
.orElseThrow(() -> new BrainPixException(PostErrorCode.POST_NOT_FOUND));

// 판매자 정보 조회
User seller = ideaMarket.getWriter();

// 개인이 기업 게시물을 구매하려는 경우 처리
if (ideaMarket.getPostAuth().equals(PostAuth.COMPANY) && user.getAuthority()
.equals(BrainpixAuthority.INDIVIDUAL)) {
throw new BrainPixException(IdeaMarketErrorCode.FORBIDDEN_ACCESS);
}
// 글 작성자가 구매하려는 경우 처리
if (seller == user) {
throw new BrainPixException(IdeaMarketErrorCode.FORBIDDEN_ACCESS);
}

return GetIdeaPurchasePageDtoConverter.toResponse(ideaMarket, seller);
}
}