Skip to content

Commit ac5784e

Browse files
authored
[FEAT] 아이디어 마켓 등록, 수정, 삭제 API 구현 (#33) (#56)
* [FEAT] 아이디어 마켓 등록, 수정, 삭제 API 구현 * [FEAT] 아이디어 마켓 등록, 수정, 삭제 API 구현 * [CHORE] PR 리뷰 반영 * [CHORE] PR 리뷰 반영 - try-catch 삭제
1 parent 1deb035 commit ac5784e

File tree

14 files changed

+270
-9
lines changed

14 files changed

+270
-9
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.brainpix.api.code.error;
2+
3+
import org.springframework.http.HttpStatus;
4+
5+
import lombok.Getter;
6+
import lombok.RequiredArgsConstructor;
7+
8+
@Getter
9+
@RequiredArgsConstructor
10+
public enum IdeaMarketErrorCode implements ErrorCode {
11+
12+
// 400 Bad Request - 잘못된 요청
13+
INVALID_IDEA_INPUT(HttpStatus.BAD_REQUEST ,"IDEAMARKET400", "아이디어 마켓 입력값이 올바르지 않습니다."),
14+
INVALID_RECRUITMENT_INPUT(HttpStatus.BAD_REQUEST,"IDEAMARKET400", "모집 정보가 잘못되었습니다."),
15+
//INVALID_PARAMETER(HttpStatus.BAD_REQUEST,"REQUESTTASK400", "잘못된 파라미터 값입니다."),
16+
17+
// 401 Unauthorized - 인증 실패
18+
UNAUTHORIZED_ACCESS(HttpStatus.UNAUTHORIZED,"IDEAMARKET401", "로그인이 필요합니다."),
19+
20+
// 403 Forbidden - 권한 없음
21+
FORBIDDEN_ACCESS(HttpStatus.UNAUTHORIZED,"IDEAMARKET403", "해당 요청에 대한 권한이 없습니다."),
22+
23+
// 404 Not Found - 리소스를 찾을 수 없음
24+
IDEA_NOT_FOUND(HttpStatus.NOT_FOUND,"IDEAMARKET404", "아이디어 마켓 게시글을 찾을 수 없습니다."),
25+
RECRUITMENT_NOT_FOUND(HttpStatus.NOT_FOUND,"IDEAMARKET404", "해당 모집 정보를 찾을 수 없습니다."),
26+
USER_NOT_FOUND(HttpStatus.NOT_FOUND,"IDEAMARKET404", "사용자를 찾을 수 없습니다."),
27+
28+
// 500 Internal Server Error - 서버 내부 오류
29+
IDEA_CREATION_FAILED(HttpStatus.INTERNAL_SERVER_ERROR,"IDEAMARKET500", "아이디어 마켓 게시글 생성 중 오류가 발생했습니다."),
30+
IDEA_UPDATE_FAILED(HttpStatus.INTERNAL_SERVER_ERROR,"IDEAMARKET500", "아이디어 마켓 게시글 수정 중 오류가 발생했습니다."),
31+
IDEA_DELETE_FAILED(HttpStatus.INTERNAL_SERVER_ERROR,"IDEAMARKET500", "아이디어 마켓 게시글 삭제 중 오류가 발생했습니다.");
32+
33+
private final HttpStatus httpStatus;
34+
private final String code;
35+
private final String message;
36+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.brainpix.joining.converter;
2+
3+
import org.springframework.stereotype.Component;
4+
5+
import com.brainpix.joining.dto.IdeaMarketPriceDto;
6+
import com.brainpix.joining.entity.quantity.PaymentDuration;
7+
import com.brainpix.joining.entity.quantity.Price;
8+
9+
@Component
10+
public class CreateIdeaMarketPriceConverter {
11+
12+
public Price convertToIdeaMarketPrice(IdeaMarketPriceDto priceDto) {
13+
return Price.builder()
14+
.price(priceDto.getPrice())
15+
.occupiedQuantity(0L)
16+
.totalQuantity(priceDto.getTotalQuantity())
17+
.paymentDuration(PaymentDuration.ONCE)
18+
.build();
19+
}
20+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.brainpix.joining.dto;
2+
3+
import com.brainpix.joining.entity.quantity.PaymentDuration;
4+
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
@Getter
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
public class IdeaMarketPriceDto {
13+
14+
private Long price;
15+
private Long totalQuantity;
16+
}

src/main/java/com/brainpix/joining/service/PriceService.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import org.springframework.stereotype.Service;
44

5+
import com.brainpix.joining.converter.CreateIdeaMarketPriceConverter;
56
import com.brainpix.joining.converter.CreatePriceConverter;
7+
import com.brainpix.joining.dto.IdeaMarketPriceDto;
68
import com.brainpix.joining.dto.PriceDto;
79
import com.brainpix.joining.entity.quantity.Price;
810
import com.brainpix.joining.repository.PriceRepository;
@@ -15,6 +17,7 @@
1517
public class PriceService {
1618
private final PriceRepository priceRepository;
1719
private final CreatePriceConverter createPriceConverter;
20+
private final CreateIdeaMarketPriceConverter createIdeaMarketPriceConverter;
1821

1922
@Transactional
2023
public Price createPrice(PriceDto priceDto) {
@@ -24,6 +27,14 @@ public Price createPrice(PriceDto priceDto) {
2427
return priceRepository.save(price);
2528
}
2629

30+
@Transactional
31+
public Price createIdeaMarketPrice(IdeaMarketPriceDto priceDto) {
32+
33+
Price price = createIdeaMarketPriceConverter.convertToIdeaMarketPrice(priceDto);
34+
35+
return priceRepository.save(price);
36+
}
37+
2738
@Transactional
2839
public void updatePrice(Price price, PriceDto priceDto) {
2940
price.updatePriceFields(priceDto.getPrice(), priceDto.getTotalQuantity(), priceDto.getPaymentDuration());

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

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@
22

33
import org.springframework.data.domain.Pageable;
44
import org.springframework.http.ResponseEntity;
5+
import org.springframework.web.bind.annotation.DeleteMapping;
56
import org.springframework.web.bind.annotation.GetMapping;
67
import org.springframework.web.bind.annotation.PathVariable;
8+
import org.springframework.web.bind.annotation.PostMapping;
9+
import org.springframework.web.bind.annotation.PutMapping;
10+
import org.springframework.web.bind.annotation.RequestBody;
711
import org.springframework.web.bind.annotation.RequestMapping;
12+
import org.springframework.web.bind.annotation.RequestParam;
813
import org.springframework.web.bind.annotation.RestController;
914

1015
import com.brainpix.api.ApiResponse;
@@ -16,8 +21,12 @@
1621
import com.brainpix.post.dto.GetIdeaDetailDto;
1722
import com.brainpix.post.dto.GetIdeaListDto;
1823
import com.brainpix.post.dto.GetPopularIdeaListDto;
24+
import com.brainpix.post.dto.IdeaMarketApiResponseDto;
25+
import com.brainpix.post.dto.IdeaMarketCreateDto;
26+
import com.brainpix.post.dto.IdeaMarketUpdateDto;
1927
import com.brainpix.post.service.IdeaMarketService;
2028

29+
import jakarta.validation.Valid;
2130
import lombok.RequiredArgsConstructor;
2231
import lombok.extern.slf4j.Slf4j;
2332

@@ -26,13 +35,33 @@
2635
@RequiredArgsConstructor
2736
@Slf4j
2837
public class IdeaMarketController {
38+
2939
private final IdeaMarketService ideaMarketService;
3040

41+
@PostMapping
42+
public ResponseEntity<ApiResponse<IdeaMarketApiResponseDto>> createIdeaMarket(@RequestParam Long userId,
43+
@Valid @RequestBody IdeaMarketCreateDto createDto) {
44+
Long ideaId = ideaMarketService.createIdeaMarket(userId, createDto);
45+
return ResponseEntity.ok(ApiResponse.success(new IdeaMarketApiResponseDto("ideaId", ideaId)));
46+
}
47+
48+
@PutMapping("/{ideaId}")
49+
public ResponseEntity<ApiResponse<Void>> updateIdeaMarket(@PathVariable("ideaId") Long ideaId,
50+
@RequestParam Long userId, @Valid @RequestBody IdeaMarketUpdateDto updateDto) {
51+
ideaMarketService.updateIdeaMarket(ideaId, userId, updateDto);
52+
return ResponseEntity.ok(ApiResponse.successWithNoData());
53+
}
54+
55+
@DeleteMapping("/{ideaId}")
56+
public ResponseEntity<ApiResponse<Void>> deleteIdeaMarket(@PathVariable("ideaId") Long ideaId,
57+
@RequestParam Long userId) {
58+
ideaMarketService.deleteIdeaMarket(ideaId, userId);
59+
return ResponseEntity.ok(ApiResponse.successWithNoData());
60+
}
61+
3162
@GetMapping
32-
public ResponseEntity<ApiResponse<GetIdeaListDto.Response>> getIdeaList(
33-
GetIdeaListDto.Request request,
34-
Pageable pageable
35-
) {
63+
public ResponseEntity<ApiResponse<GetIdeaListDto.Response>> getIdeaList(GetIdeaListDto.Request request,
64+
Pageable pageable) {
3665
GetIdeaListDto.Parameter parameter = GetIdeaListDtoConverter.toParameter(request, pageable);
3766
GetIdeaListDto.Response response = ideaMarketService.getIdeaList(parameter);
3867
return ResponseEntity.ok(ApiResponse.success(response));
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.brainpix.post.converter;
2+
3+
import org.springframework.stereotype.Component;
4+
5+
import com.brainpix.joining.entity.quantity.Price;
6+
import com.brainpix.post.dto.IdeaMarketCreateDto;
7+
import com.brainpix.post.entity.idea_market.IdeaMarket;
8+
import com.brainpix.user.entity.User;
9+
10+
@Component
11+
public class CreateIdeaMarketConverter {
12+
13+
public IdeaMarket convertToIdeaMarket(IdeaMarketCreateDto createDto, User writer, Price price) {
14+
return IdeaMarket.builder()
15+
.writer(writer)
16+
.title(createDto.getTitle())
17+
.content(createDto.getContent())
18+
.specialization(createDto.getSpecialization())
19+
.openMyProfile(createDto.getOpenMyProfile())
20+
.viewCount(0L) // 초기 조회수는 0으로 설정
21+
.imageList(createDto.getImageList())
22+
.attachmentFileList(createDto.getAttachmentFileList())
23+
.postAuth(createDto.getPostAuth())
24+
.ideaMarketType(createDto.getIdeaMarketType())
25+
.price(price)
26+
.build();
27+
}
28+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.brainpix.post.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
7+
@Getter
8+
@NoArgsConstructor
9+
@AllArgsConstructor
10+
public class IdeaMarketApiResponseDto {
11+
12+
private String message;
13+
private Long userId;
14+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.brainpix.post.dto;
2+
3+
import com.brainpix.joining.dto.IdeaMarketPriceDto;
4+
import com.brainpix.joining.dto.PriceDto;
5+
import com.brainpix.post.entity.idea_market.IdeaMarketType;
6+
7+
import jakarta.validation.constraints.NotNull;
8+
import lombok.AllArgsConstructor;
9+
import lombok.Getter;
10+
import lombok.NoArgsConstructor;
11+
12+
@Getter
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
public class IdeaMarketCreateDto extends PostDto{
16+
17+
@NotNull(message = "아이디어 유형 선택은 필수입니다.")
18+
private IdeaMarketType ideaMarketType;
19+
20+
@NotNull(message = "가격 및 수량 설정은 필수입니다.")
21+
private IdeaMarketPriceDto priceDto;
22+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.brainpix.post.dto;
2+
3+
import com.brainpix.joining.dto.PriceDto;
4+
import com.brainpix.post.entity.idea_market.IdeaMarketType;
5+
6+
import jakarta.validation.constraints.NotNull;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Getter;
9+
import lombok.NoArgsConstructor;
10+
11+
@Getter
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
public class IdeaMarketUpdateDto extends PostDto{
15+
16+
@NotNull(message = "아이디어 유형 선택은 필수입니다.")
17+
private IdeaMarketType ideaMarketType;
18+
19+
//@NotNull(message = "가격 및 수량 설정은 필수입니다.")
20+
//private PriceDto priceDto;
21+
}

src/main/java/com/brainpix/post/entity/Post.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ public abstract class Post extends BaseTimeEntity {
3737

3838
private String title;
3939
private String content;
40-
private String category;
4140
private Boolean openMyProfile;
4241
private Long viewCount;
4342

0 commit comments

Comments
 (0)