From 077780c0c32d0205837d717c5326fb3d2868eb6e Mon Sep 17 00:00:00 2001 From: Alex <78383757+Lextical@users.noreply.github.com> Date: Sun, 12 Apr 2026 18:00:24 -0600 Subject: [PATCH] adjusted so only available pets for the selected store is displayed when adopting --- .../example/petstoremobile/api/PetApi.java | 2 +- .../repositories/PetRepository.java | 4 ++-- .../viewmodels/AdoptionDetailViewModel.java | 8 ++------ .../controller/DropdownController.java | 19 ++++++++----------- .../backend/repository/PetRepository.java | 11 +++++++++++ 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/android/app/src/main/java/com/example/petstoremobile/api/PetApi.java b/android/app/src/main/java/com/example/petstoremobile/api/PetApi.java index 97423002..b03ab44d 100644 --- a/android/app/src/main/java/com/example/petstoremobile/api/PetApi.java +++ b/android/app/src/main/java/com/example/petstoremobile/api/PetApi.java @@ -42,7 +42,7 @@ public interface PetApi { Call> getCustomerPets(@Path("customerId") Long customerId); @GET("api/v1/dropdowns/adoption-pets") - Call> getAdoptionPets(); + Call> getAdoptionPets(@Query("storeId") Long storeId); @GET("api/v1/dropdowns/pets") Call> getPetDropdowns(); diff --git a/android/app/src/main/java/com/example/petstoremobile/repositories/PetRepository.java b/android/app/src/main/java/com/example/petstoremobile/repositories/PetRepository.java index a186cc7e..f3114beb 100644 --- a/android/app/src/main/java/com/example/petstoremobile/repositories/PetRepository.java +++ b/android/app/src/main/java/com/example/petstoremobile/repositories/PetRepository.java @@ -43,8 +43,8 @@ public class PetRepository extends BaseRepository { /** * Retrieves a list of pets available for adoption from the dropdowns API. */ - public LiveData>> getAdoptionPets() { - return executeCall(petApi.getAdoptionPets()); + public LiveData>> getAdoptionPets(Long storeId) { + return executeCall(petApi.getAdoptionPets(storeId)); } /** diff --git a/android/app/src/main/java/com/example/petstoremobile/viewmodels/AdoptionDetailViewModel.java b/android/app/src/main/java/com/example/petstoremobile/viewmodels/AdoptionDetailViewModel.java index 06b96595..7416c0fc 100644 --- a/android/app/src/main/java/com/example/petstoremobile/viewmodels/AdoptionDetailViewModel.java +++ b/android/app/src/main/java/com/example/petstoremobile/viewmodels/AdoptionDetailViewModel.java @@ -156,13 +156,9 @@ public class AdoptionDetailViewModel extends ViewModel { } private void loadAvailablePetsByStore(Long storeId) { - observeOnce(petRepository.getAvailablePetsByStore(storeId), r -> { + observeOnce(petRepository.getAdoptionPets(storeId), r -> { if (r != null && r.status == Resource.Status.SUCCESS && r.data != null) { - List dropdowns = new ArrayList<>(); - for (com.example.petstoremobile.dtos.PetDTO pet : r.data.getContent()) { - dropdowns.add(new DropdownDTO(pet.getPetId(), pet.getPetName())); - } - petList.setValue(dropdowns); + petList.setValue(r.data); } }); } diff --git a/backend/src/main/java/com/petshop/backend/controller/DropdownController.java b/backend/src/main/java/com/petshop/backend/controller/DropdownController.java index 6ad1ad36..e391023f 100644 --- a/backend/src/main/java/com/petshop/backend/controller/DropdownController.java +++ b/backend/src/main/java/com/petshop/backend/controller/DropdownController.java @@ -5,10 +5,7 @@ import com.petshop.backend.entity.User; import com.petshop.backend.repository.*; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.Comparator; import java.util.HashSet; @@ -46,20 +43,20 @@ public class DropdownController { } @GetMapping("/pets") - public ResponseEntity> getPets() { - return ResponseEntity.ok( - petRepository.findAll().stream() + public ResponseEntity> getPets(@RequestParam(required = false) Long storeId) { + List pets = petRepository.findAll().stream() + .filter(p -> storeId == null || (p.getStore() != null && p.getStore().getStoreId().equals(storeId))) .map(p -> new DropdownOption(p.getPetId(), p.getPetName())) .sorted(Comparator.comparing(DropdownOption::getLabel, String.CASE_INSENSITIVE_ORDER)) - .collect(Collectors.toList()) - ); + .collect(Collectors.toList()); + return ResponseEntity.ok(pets); } @GetMapping("/adoption-pets") @PreAuthorize("hasAnyRole('STAFF', 'ADMIN')") - public ResponseEntity> getAdoptionPets() { + public ResponseEntity> getAdoptionPets(@RequestParam(required = false) Long storeId) { return ResponseEntity.ok( - petRepository.findAdoptablePetsOrderByPetNameAsc().stream() + petRepository.findAdoptablePetsByStore(storeId).stream() .map(p -> new DropdownOption(p.getPetId(), p.getPetName())) .collect(Collectors.toList()) ); diff --git a/backend/src/main/java/com/petshop/backend/repository/PetRepository.java b/backend/src/main/java/com/petshop/backend/repository/PetRepository.java index 7adb6dd5..8197fc6f 100644 --- a/backend/src/main/java/com/petshop/backend/repository/PetRepository.java +++ b/backend/src/main/java/com/petshop/backend/repository/PetRepository.java @@ -23,6 +23,17 @@ public interface PetRepository extends JpaRepository { ") " + "ORDER BY p.petName ASC") List findAdoptablePetsOrderByPetNameAsc(); + + @Query("SELECT p FROM Pet p " + + "WHERE LOWER(p.petStatus) = 'available' " + + "AND (:storeId IS NULL OR p.store.storeId = :storeId) " + + "AND NOT EXISTS (" + + " SELECT 1 FROM Adoption a " + + " WHERE a.pet = p AND LOWER(a.adoptionStatus) = 'completed'" + + ") " + + "ORDER BY p.petName ASC") + List findAdoptablePetsByStore(@Param("storeId") Long storeId); + List findAllByOwner_IdOrderByPetNameAsc(Long ownerId); Optional findByIdAndOwner_Id(Long id, Long ownerId);