3434
3535@ Service
3636@ RequiredArgsConstructor
37+ @ Transactional (readOnly = true )
3738public class UserFridgeService {
3839
3940 private final IngredientRepository ingredientRepository ;
4041 private final FridgeIngredientRepository fIngredientRepository ;
4142 private final FridgeRepository fRepository ;
4243
4344 @ Transactional
44- public UserFridgeResponse addIngredients (String userId ,UserFridgeRequest userFridgeRequest ) {
45+ public UserFridgeResponse addIngredients (String userId , UserFridgeRequest userFridgeRequest ) {
4546
46- Fridge fridge = fRepository .findByNameAndUser_UserId ("나의 냉장고" , userId )
47- .orElseThrow (() -> new IllegalArgumentException ("접근 권한이 없거나 존재하지 않는 냉장고입니다." ));
47+ Fridge fridge = findFridge (userId );
4848
4949 List <FridgeIngredient > newFridgeIngredients = new ArrayList <>();
5050 List <FridgeIngredientRequest > ingredients = userFridgeRequest .getIngredients ();
51- List <FridgeIngredient > savedIngredients = saveFridgeIngredients (fridge , newFridgeIngredients , ingredients );
52- List <FridgeIngredientResponse > responseIngredients = toResponseList (savedIngredients );
5351
54- return new UserFridgeResponse (
55- fridge .getId (),
56- responseIngredients
57- );
58- }
59-
60- private List <FridgeIngredientResponse > toResponseList (List <FridgeIngredient > savedIngredients ) {
61- List <FridgeIngredientResponse > responseIngredients = savedIngredients .stream ().
62- map (fi ->{
63- LocalDateTime expiredDate = fi .getPurchaseDate ()
64- .plusDays (fi .getIngredient ().getAvgExpiryDays ());
65- Duration duration = Duration .between (LocalDateTime .now (),expiredDate );
66- long daysLeft = duration .toDays ();
67- return new FridgeIngredientResponse (
68- fi .getId (),
69- fi .getIngredient ().getCategory (),
70- fi .getIngredient ().getName (),
71- fi .getPurchaseDate (),
72- expiredDate ,
73- daysLeft
74- );
75-
76- }).toList ();
77- return responseIngredients ;
78- }
79-
80- private List <FridgeIngredient > saveFridgeIngredients (Fridge fridge , List <FridgeIngredient > newFridgeIngredients ,
81- List <FridgeIngredientRequest > ingredients ) {
82- ingredients .forEach (ingredient -> {
83- Ingredient newIngredient = ingredientRepository .findByName (ingredient .getName ())
84- .orElseThrow (()-> new IllegalArgumentException ("해당하는 식자재가 없습니다." ));
52+ for (FridgeIngredientRequest req : ingredients ) {
53+ Ingredient masterIngredient = ingredientRepository .findByName (req .getName ())
54+ .orElseThrow (() -> new IllegalArgumentException ("해당하는 식자재가 없습니다: " + req .getName ()));
8555
56+ LocalDateTime expiredDate = calculateExpireDate (req .getPurchaseDate (), masterIngredient .getAvgExpiryDays (), null );
57+
8658 FridgeIngredient fridgeIngredient = FridgeIngredient .builder ()
87- .fridge (fridge )
88- .ingredient (newIngredient )
89- .purchaseDate (ingredient .getPurchaseDate ())
90- .expiredDate (ingredient . getPurchaseDate (). plusDays ( newIngredient . getAvgExpiryDays ()) )
91- .build ();
59+ .fridge (fridge )
60+ .ingredient (masterIngredient )
61+ .purchaseDate (req .getPurchaseDate ())
62+ .expiredDate (expiredDate )
63+ .build ();
9264 newFridgeIngredients .add (fridgeIngredient );
93- });
65+ }
9466
9567 List <FridgeIngredient > savedIngredients = fIngredientRepository .saveAll (newFridgeIngredients );
96- return savedIngredients ;
97- }
98-
99- private Page <FridgeIngredientResponse > convertEntityDto (Page <FridgeIngredient > ingredients ) {
100- return ingredients .map (
101- fi ->{
102- LocalDateTime expiredDate = fi .getPurchaseDate ()
103- .plusDays (fi .getIngredient ().getAvgExpiryDays ());
104- Duration duration = Duration .between (LocalDateTime .now (),expiredDate );
105- long daysLeft = duration .toDays ();
106- return new FridgeIngredientResponse (
107- fi .getId (),
108- fi .getIngredient ().getCategory (),
109- fi .getIngredient ().getName (),
110- fi .getPurchaseDate (),
111- expiredDate ,
112- daysLeft
113- );
114- }
115- );
116- }
117-
118- public PageUserFridgeResponse retrieveAll (String userId ,int size ,int page ){
119- Fridge fridge = fRepository .findByNameAndUser_UserId ("나의 냉장고" , userId )
120- .orElseThrow (() -> new IllegalArgumentException ("접근 권한이 없거나 존재하지 않는 냉장고입니다." ));
121- Pageable pageable = PageRequest .of (page , size ,Sort .by ("purchaseDate" ).descending ());
122- Page <FridgeIngredient > ingredients = fIngredientRepository .findByFridge (fridge , pageable );
123- Page <FridgeIngredientResponse > fridgeIngredients = convertEntityDto (ingredients );
124- return new PageUserFridgeResponse (
125- fridge .getId (),
126- fridgeIngredients
127- );
128- }
129-
130- public PageUserFridgeResponse filteredByName (String userId ,String name ,int size ,int page ) {
131- Fridge fridge = fRepository .findByNameAndUser_UserId ("나의 냉장고" , userId )
132- .orElseThrow (() -> new IllegalArgumentException ("접근 권한이 없거나 존재하지 않는 냉장고입니다." ));
133- Pageable pageable = PageRequest .of (page , size ,Sort .by ("purchaseDate" ).descending ());
134- Page <FridgeIngredient > ingredients = fIngredientRepository .findByFridgeAndIngredient_NameContaining (fridge , name , pageable );
135- Page <FridgeIngredientResponse > fridgeIngredients = convertEntityDto (ingredients );
136- return new PageUserFridgeResponse (
137- fridge .getId (),
138- fridgeIngredients
139- );
140- }
141-
142- public PageUserFridgeResponse filteredByCategory (String userId ,String category ,int size ,int page ) {
143- Fridge fridge = fRepository .findByNameAndUser_UserId ("나의 냉장고" , userId )
144- .orElseThrow (() -> new IllegalArgumentException ("접근 권한이 없거나 존재하지 않는 냉장고입니다." ));
145- Pageable pageable = PageRequest .of (page , size ,Sort .by ("purchaseDate" ).descending ());
146- Page <FridgeIngredient > ingredients = fIngredientRepository .findByFridgeAndIngredient_Category (fridge , category , pageable );
147- Page <FridgeIngredientResponse > fridgeIngredients = convertEntityDto (ingredients );
148- return new PageUserFridgeResponse (
149- fridge .getId (),
150- fridgeIngredients
151- );
152- }
153-
154- @ Transactional
155- public ChangeFridgeIngredientResponse updatePurchasedDate (String userId ,ChangeFridgeIngredientRequest request ) {
156- Fridge fridge = fRepository .findByNameAndUser_UserId ("나의 냉장고" , userId )
157- .orElseThrow (() -> new IllegalArgumentException ("접근 권한이 없거나 존재하지 않는 냉장고입니다." ));
158- FridgeIngredient fridgeIngredient = fIngredientRepository .findByIdAndFridge (request .getIngredientId (),fridge )
159- .orElseThrow (()-> new IllegalArgumentException ("해당하는 아이디로 재료 찾을 수 없습니다." ));
160- fridgeIngredient .setPurchaseDate (request .getPurchasedDate ());
161- String message = "업데이트 완료" ;
162- return new ChangeFridgeIngredientResponse (fridgeIngredient ,message );
163- }
164-
165- @ Transactional
166- public void deleteIngredient (String userId , Long fridgeIngredientId ) {
167-
168- Fridge fridge = fRepository .findByNameAndUser_UserId ("나의 냉장고" , userId )
169- .orElseThrow (() -> new IllegalArgumentException ("접근 권한이 없거나 존재하지 않는 냉장고입니다." ));
170-
171- FridgeIngredient fridgeIngredient = fIngredientRepository
172- .findByIdAndFridge (fridgeIngredientId , fridge )
173- .orElseThrow (() -> new IllegalArgumentException ("삭제 권한이 없거나 존재하지 않는 재료입니다." ));
17468
175- fIngredientRepository .delete (fridgeIngredient );
69+ return new UserFridgeResponse (
70+ fridge .getId (),
71+ toResponseList (savedIngredients )
72+ );
17673 }
74+
17775 @ Transactional
17876 public UserFridgeResponse updateIngredientInformation (String userId , FridgeBatchUpdateRequest fRequest ) {
17977
180- Fridge fridge = fRepository .findByNameAndUser_UserId ("나의 냉장고" , userId )
181- .orElseThrow (() -> new IllegalArgumentException ("접근 권한이 없거나 존재하지 않는 냉장고입니다." ));
78+ Fridge fridge = findFridge (userId );
18279
18380 List <FridgeIngredientUpdateItem > requestItems = fRequest .getIngredients ();
18481
18582 List <Long > ingredientIds = requestItems .stream ()
18683 .map (FridgeIngredientUpdateItem ::getIngredientId )
18784 .toList ();
18885
189- List <Ingredient > masterIngredients = ingredientRepository .findAllById (ingredientIds );
190-
191- Map <Long , Ingredient > ingredientMap = masterIngredients .stream ()
86+ Map <Long , Ingredient > ingredientMap = ingredientRepository .findAllById (ingredientIds ).stream ()
19287 .collect (Collectors .toMap (Ingredient ::getId , i -> i ));
19388
19489 if (fridge .getIngredients () != null ) {
@@ -204,8 +99,11 @@ public UserFridgeResponse updateIngredientInformation(String userId, FridgeBatch
20499 throw new IllegalArgumentException ("존재하지 않는 식재료 ID입니다: " + item .getIngredientId ());
205100 }
206101
207- LocalDateTime expiredDate = item .getPurchaseDate ()
208- .plusDays (masterIngredient .getAvgExpiryDays ());
102+ LocalDateTime expiredDate = calculateExpireDate (
103+ item .getPurchaseDate (),
104+ masterIngredient .getAvgExpiryDays (),
105+ item .getExpiredDate ()
106+ );
209107
210108 FridgeIngredient fridgeIngredient = FridgeIngredient .builder ()
211109 .fridge (fridge )
@@ -224,5 +122,102 @@ public UserFridgeResponse updateIngredientInformation(String userId, FridgeBatch
224122 toResponseList (savedIngredients )
225123 );
226124 }
125+
126+
127+ public PageUserFridgeResponse retrieveAll (String userId , int size , int page ){
128+ Fridge fridge = findFridge (userId );
129+ Pageable pageable = PageRequest .of (page , size , Sort .by ("purchaseDate" ).descending ());
130+
131+ Page <FridgeIngredient > ingredients = fIngredientRepository .findByFridge (fridge , pageable );
132+
133+ return new PageUserFridgeResponse (
134+ fridge .getId (),
135+ ingredients .map (this ::toFridgeIngredientResponse )
136+ );
137+ }
138+
139+ public PageUserFridgeResponse filteredByName (String userId , String name , int size , int page ) {
140+ Fridge fridge = findFridge (userId );
141+ Pageable pageable = PageRequest .of (page , size , Sort .by ("purchaseDate" ).descending ());
142+
143+ Page <FridgeIngredient > ingredients = fIngredientRepository .findByFridgeAndIngredient_NameContaining (fridge , name , pageable );
144+
145+ return new PageUserFridgeResponse (
146+ fridge .getId (),
147+ ingredients .map (this ::toFridgeIngredientResponse )
148+ );
149+ }
150+
151+ public PageUserFridgeResponse filteredByCategory (String userId , String category , int size , int page ) {
152+ Fridge fridge = findFridge (userId );
153+ Pageable pageable = PageRequest .of (page , size , Sort .by ("purchaseDate" ).descending ());
154+
155+ Page <FridgeIngredient > ingredients = fIngredientRepository .findByFridgeAndIngredient_Category (fridge , category , pageable );
156+
157+ return new PageUserFridgeResponse (
158+ fridge .getId (),
159+ ingredients .map (this ::toFridgeIngredientResponse )
160+ );
161+ }
162+
163+ @ Transactional
164+ public ChangeFridgeIngredientResponse updatePurchasedDate (String userId , ChangeFridgeIngredientRequest request ) {
165+ Fridge fridge = findFridge (userId );
166+
167+ FridgeIngredient fridgeIngredient = fIngredientRepository .findByIdAndFridge (request .getIngredientId (), fridge )
168+ .orElseThrow (() -> new IllegalArgumentException ("해당하는 아이디로 재료 찾을 수 없습니다." ));
169+
170+ fridgeIngredient .setPurchaseDate (request .getPurchasedDate ());
171+
172+ return new ChangeFridgeIngredientResponse (fridgeIngredient , "업데이트 완료" );
173+ }
174+
175+ @ Transactional
176+ public void deleteIngredient (String userId , Long fridgeIngredientId ) {
177+ Fridge fridge = findFridge (userId );
178+
179+ FridgeIngredient fridgeIngredient = fIngredientRepository
180+ .findByIdAndFridge (fridgeIngredientId , fridge )
181+ .orElseThrow (() -> new IllegalArgumentException ("삭제 권한이 없거나 존재하지 않는 재료입니다." ));
182+
183+ fIngredientRepository .delete (fridgeIngredient );
184+ }
185+
186+
187+ private Fridge findFridge (String userId ) {
188+ return fRepository .findByNameAndUser_UserId ("나의 냉장고" , userId )
189+ .orElseThrow (() -> new IllegalArgumentException ("접근 권한이 없거나 존재하지 않는 냉장고입니다." ));
190+ }
191+
192+ private LocalDateTime calculateExpireDate (LocalDateTime purchaseDate , int avgDays , LocalDateTime userExpiredDate ) {
193+ if (userExpiredDate != null ) {
194+ return userExpiredDate ;
195+ }
196+ return purchaseDate .plusDays (avgDays );
197+ }
227198
228- }
199+ private List <FridgeIngredientResponse > toResponseList (List <FridgeIngredient > ingredients ) {
200+ return ingredients .stream ()
201+ .map (this ::toFridgeIngredientResponse )
202+ .toList ();
203+ }
204+
205+ private FridgeIngredientResponse toFridgeIngredientResponse (FridgeIngredient fi ) {
206+ LocalDateTime expiredDate = fi .getExpiredDate ();
207+
208+ long daysLeft = 0 ;
209+ if (expiredDate != null ) {
210+ Duration duration = Duration .between (LocalDateTime .now (), expiredDate );
211+ daysLeft = duration .toDays ();
212+ }
213+
214+ return new FridgeIngredientResponse (
215+ fi .getId (),
216+ fi .getIngredient ().getCategory (),
217+ fi .getIngredient ().getName (),
218+ fi .getPurchaseDate (),
219+ expiredDate ,
220+ daysLeft
221+ );
222+ }
223+ }
0 commit comments