Skip to content

Commit acf8b99

Browse files
author
bu2000
committed
update logic used to check and fix ingredients' information
1 parent c930a8e commit acf8b99

1 file changed

Lines changed: 124 additions & 129 deletions

File tree

src/main/java/com/webservice/algorithmchef/service/UserFridgeService.java

Lines changed: 124 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -34,161 +34,56 @@
3434

3535
@Service
3636
@RequiredArgsConstructor
37+
@Transactional(readOnly = true)
3738
public 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

Comments
 (0)