feat(shopping): add getByWeekStart to ShoppingService
Returns the shopping list for a given week, defaulting to the current week's Monday when no weekStart is provided. Returns null when no list exists. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -18,10 +18,11 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.time.DayOfWeek;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.temporal.TemporalAdjusters;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Transactional
|
@Transactional
|
||||||
@@ -52,6 +53,18 @@ public class ShoppingService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Transactional(readOnly = true)
|
||||||
|
public ShoppingListResponse getByWeekStart(UUID householdId, LocalDate weekStart) {
|
||||||
|
if (weekStart == null) {
|
||||||
|
weekStart = LocalDate.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
|
||||||
|
}
|
||||||
|
|
||||||
|
return shoppingListRepository.findByHouseholdIdAndWeekPlanWeekStart(householdId, weekStart)
|
||||||
|
.map(this::toResponse)
|
||||||
|
.orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public ShoppingListResponse generateFromPlan(UUID householdId, UUID weekPlanId) {
|
public ShoppingListResponse generateFromPlan(UUID householdId, UUID weekPlanId) {
|
||||||
WeekPlan weekPlan = weekPlanRepository.findById(weekPlanId)
|
WeekPlan weekPlan = weekPlanRepository.findById(weekPlanId)
|
||||||
.orElseThrow(() -> new ResourceNotFoundException("Week plan not found"));
|
.orElseThrow(() -> new ResourceNotFoundException("Week plan not found"));
|
||||||
|
|||||||
@@ -92,6 +92,46 @@ class ShoppingServiceTest {
|
|||||||
} catch (Exception e) { throw new RuntimeException(e); }
|
} catch (Exception e) { throw new RuntimeException(e); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── Get by week start ──
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getByWeekStartShouldReturnListForGivenWeek() {
|
||||||
|
var household = testHousehold();
|
||||||
|
var plan = testWeekPlan(household);
|
||||||
|
var list = testShoppingList(household, plan);
|
||||||
|
|
||||||
|
when(shoppingListRepository.findByHouseholdIdAndWeekPlanWeekStart(HOUSEHOLD_ID, WEEK_START))
|
||||||
|
.thenReturn(Optional.of(list));
|
||||||
|
|
||||||
|
ShoppingListResponse result = shoppingService.getByWeekStart(HOUSEHOLD_ID, WEEK_START);
|
||||||
|
|
||||||
|
assertThat(result.id()).isEqualTo(list.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getByWeekStartShouldDefaultToCurrentWeekWhenNull() {
|
||||||
|
var household = testHousehold();
|
||||||
|
var plan = testWeekPlan(household);
|
||||||
|
var list = testShoppingList(household, plan);
|
||||||
|
|
||||||
|
when(shoppingListRepository.findByHouseholdIdAndWeekPlanWeekStart(eq(HOUSEHOLD_ID), any(LocalDate.class)))
|
||||||
|
.thenReturn(Optional.of(list));
|
||||||
|
|
||||||
|
ShoppingListResponse result = shoppingService.getByWeekStart(HOUSEHOLD_ID, null);
|
||||||
|
|
||||||
|
assertThat(result).isNotNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void getByWeekStartShouldReturnNullWhenNoListExists() {
|
||||||
|
when(shoppingListRepository.findByHouseholdIdAndWeekPlanWeekStart(HOUSEHOLD_ID, WEEK_START))
|
||||||
|
.thenReturn(Optional.empty());
|
||||||
|
|
||||||
|
ShoppingListResponse result = shoppingService.getByWeekStart(HOUSEHOLD_ID, WEEK_START);
|
||||||
|
|
||||||
|
assertThat(result).isNull();
|
||||||
|
}
|
||||||
|
|
||||||
// ── Generate ──
|
// ── Generate ──
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user