55import com .cmg .comtogether .quote .dto .AddQuoteItemRequestDto ;
66import com .cmg .comtogether .quote .dto .QuoteItemResponseDto ;
77import com .cmg .comtogether .quote .dto .QuoteResponseDto ;
8+ import com .cmg .comtogether .quote .dto .QuoteSummaryDto ;
9+ import com .cmg .comtogether .quote .dto .SaveQuoteRequestDto ;
10+ import com .cmg .comtogether .quote .dto .UpdateQuoteItemQuantityRequestDto ;
811import com .cmg .comtogether .quote .service .QuoteService ;
912import com .cmg .comtogether .user .entity .User ;
1013import jakarta .validation .Valid ;
1114import lombok .RequiredArgsConstructor ;
1215import org .springframework .http .ResponseEntity ;
1316import org .springframework .security .core .annotation .AuthenticationPrincipal ;
14- import org .springframework .web .bind .annotation .*;
17+ import org .springframework .web .bind .annotation .DeleteMapping ;
18+ import org .springframework .web .bind .annotation .GetMapping ;
19+ import org .springframework .web .bind .annotation .PatchMapping ;
20+ import org .springframework .web .bind .annotation .PathVariable ;
21+ import org .springframework .web .bind .annotation .PostMapping ;
22+ import org .springframework .web .bind .annotation .PutMapping ;
23+ import org .springframework .web .bind .annotation .RequestBody ;
24+ import org .springframework .web .bind .annotation .RequestMapping ;
25+ import org .springframework .web .bind .annotation .RestController ;
26+
27+ import java .util .List ;
1528
1629@ RestController
1730@ RequestMapping ("/quotes" )
@@ -21,56 +34,122 @@ public class QuoteController {
2134 private final QuoteService quoteService ;
2235
2336 /**
24- * 현재 견적 조회
25- * GET /quotes
37+ * 새 견적 생성 (초안 상태)
38+ */
39+ @ PostMapping
40+ public ResponseEntity <ApiResponse <QuoteResponseDto >> createQuote (
41+ @ AuthenticationPrincipal CustomUserDetails userDetails
42+ ) {
43+ User user = userDetails .getUser ();
44+ QuoteResponseDto responseDto = quoteService .createQuote (user .getUserId ());
45+ return ResponseEntity .ok (ApiResponse .success (responseDto ));
46+ }
47+
48+ /**
49+ * 저장된 견적 목록 조회
2650 */
2751 @ GetMapping
28- public ResponseEntity <ApiResponse <QuoteResponseDto >> getCurrentQuote (
52+ public ResponseEntity <ApiResponse <List < QuoteSummaryDto >>> getQuotes (
2953 @ AuthenticationPrincipal CustomUserDetails userDetails
3054 ) {
3155 User user = userDetails .getUser ();
32- QuoteResponseDto responseDto = quoteService .getCurrentQuote (user .getUserId ());
56+ List <QuoteSummaryDto > response = quoteService .getSavedQuotes (user .getUserId ());
57+ return ResponseEntity .ok (ApiResponse .success (response ));
58+ }
59+
60+ /**
61+ * 저장된 견적 단건 조회
62+ */
63+ @ GetMapping ("/{quoteId:\\ d+}" )
64+ public ResponseEntity <ApiResponse <QuoteResponseDto >> getQuote (
65+ @ AuthenticationPrincipal CustomUserDetails userDetails ,
66+ @ PathVariable Long quoteId
67+ ) {
68+ User user = userDetails .getUser ();
69+ QuoteResponseDto responseDto = quoteService .getQuote (user .getUserId (), quoteId );
3370 return ResponseEntity .ok (ApiResponse .success (responseDto ));
3471 }
3572
3673 /**
3774 * 견적에 상품 추가
38- * POST /quotes/items
3975 */
40- @ PostMapping ("/items" )
76+ @ PostMapping ("/{quoteId: \\ d+}/ items" )
4177 public ResponseEntity <ApiResponse <QuoteItemResponseDto >> addItem (
4278 @ AuthenticationPrincipal CustomUserDetails userDetails ,
79+ @ PathVariable Long quoteId ,
4380 @ Valid @ RequestBody AddQuoteItemRequestDto requestDto
4481 ) {
4582 User user = userDetails .getUser ();
46- QuoteItemResponseDto responseDto = quoteService .addItem (user .getUserId (), requestDto );
83+ QuoteItemResponseDto responseDto = quoteService .addItem (user .getUserId (), quoteId , requestDto );
4784 return ResponseEntity .ok (ApiResponse .success (responseDto ));
4885 }
4986
5087 /**
51- * 견적에서 상품 삭제
52- * DELETE /quotes/items/{quoteItemId}
88+ * 견적 상품 수량 수정
5389 */
54- @ DeleteMapping ("/items/{quoteItemId}" )
90+ @ PatchMapping ("/{quoteId:\\ d+}/items/{quoteItemId}" )
91+ public ResponseEntity <ApiResponse <QuoteItemResponseDto >> updateItemQuantity (
92+ @ AuthenticationPrincipal CustomUserDetails userDetails ,
93+ @ PathVariable Long quoteId ,
94+ @ PathVariable Long quoteItemId ,
95+ @ Valid @ RequestBody UpdateQuoteItemQuantityRequestDto requestDto
96+ ) {
97+ User user = userDetails .getUser ();
98+ QuoteItemResponseDto responseDto = quoteService .updateItemQuantity (user .getUserId (), quoteId , quoteItemId , requestDto .getQuantity ());
99+ return ResponseEntity .ok (ApiResponse .success (responseDto ));
100+ }
101+
102+ /**
103+ * 견적 저장 (이름 지정 필수)
104+ */
105+ @ PutMapping ("/{quoteId:\\ d+}" )
106+ public ResponseEntity <ApiResponse <QuoteResponseDto >> saveQuote (
107+ @ AuthenticationPrincipal CustomUserDetails userDetails ,
108+ @ PathVariable Long quoteId ,
109+ @ Valid @ RequestBody SaveQuoteRequestDto requestDto
110+ ) {
111+ User user = userDetails .getUser ();
112+ QuoteResponseDto responseDto = quoteService .saveQuote (user .getUserId (), quoteId , requestDto .getName ());
113+ return ResponseEntity .ok (ApiResponse .success (responseDto ));
114+ }
115+
116+ /**
117+ * 견적에서 특정 상품 삭제
118+ */
119+ @ DeleteMapping ("/{quoteId:\\ d+}/items/{quoteItemId}" )
55120 public ResponseEntity <ApiResponse <QuoteResponseDto >> removeItem (
56121 @ AuthenticationPrincipal CustomUserDetails userDetails ,
122+ @ PathVariable Long quoteId ,
57123 @ PathVariable Long quoteItemId
58124 ) {
59125 User user = userDetails .getUser ();
60- QuoteResponseDto responseDto = quoteService .removeItem (user .getUserId (), quoteItemId );
126+ QuoteResponseDto responseDto = quoteService .removeItem (user .getUserId (), quoteId , quoteItemId );
61127 return ResponseEntity .ok (ApiResponse .success (responseDto ));
62128 }
63129
64130 /**
65- * 견적 전체 비우기
66- * DELETE /quotes
131+ * 견적의 모든 상품 삭제
67132 */
68- @ DeleteMapping
133+ @ DeleteMapping ( "/{quoteId: \\ d+}/items" )
69134 public ResponseEntity <ApiResponse <QuoteResponseDto >> clearQuote (
70- @ AuthenticationPrincipal CustomUserDetails userDetails
135+ @ AuthenticationPrincipal CustomUserDetails userDetails ,
136+ @ PathVariable Long quoteId
71137 ) {
72138 User user = userDetails .getUser ();
73- QuoteResponseDto responseDto = quoteService .clearQuote (user .getUserId ());
139+ QuoteResponseDto responseDto = quoteService .clearQuote (user .getUserId (), quoteId );
74140 return ResponseEntity .ok (ApiResponse .success (responseDto ));
75141 }
142+
143+ /**
144+ * 견적 삭제
145+ */
146+ @ DeleteMapping ("/{quoteId:\\ d+}" )
147+ public ResponseEntity <ApiResponse <Void >> deleteQuote (
148+ @ AuthenticationPrincipal CustomUserDetails userDetails ,
149+ @ PathVariable Long quoteId
150+ ) {
151+ User user = userDetails .getUser ();
152+ quoteService .deleteQuote (user .getUserId (), quoteId );
153+ return ResponseEntity .ok (ApiResponse .success (null ));
154+ }
76155}
0 commit comments