Реализация Soft Delete в проекте Spring Boot на основе MongoDB
Мне нужно реализовать мягкое удаление в проекте Spring Boot, который использует MongoDB в качестве своей базы данных. В классе сущности под названием Farmer я объявил логическое значение is_deleted, которое по умолчанию установлено равным false
@JsonIgnoreProperties(ignoreUnknown = true)
@Document(collection = "farmers")
public class Farmer {
@Id
private String id;
private String name;
private String nationalId;
private String location;
private boolean is_deleted = false;
public Farmer(final String id, final String name, final String nationalId final String location){
this.id = id;
this.name = name;
this.nationalId = nationalId;
this.location = location;
}
}
Затем я аннотировал функции в моем классе MongoRepository с помощью @Query(value="{'is_deleted': false}")
отфильтровывать только те записи, которые не были удалены для следующих функций:
public interface FarmerRepository extends MongoRepository<Farmer, Integer> {
@Query(value="{'is_deleted': false}")
Page<Farmer> findAllByName(@Param("name") String name,Pageable pageable);
@Query(value="{'is_deleted': false}")
Farmer findByNationalId(@Param("nationalId") String nationalId);
@Query(value="{'is_deleted': false}")
Page<Farmer> findAllByLocation (@Param("location") String location, Pageable pageable);
@Query(value="{'is_deleted': false}")
Farmer findById(@Param("id") String id);
@Query(value="{'is_deleted': false}")
Page<Farmer> findAllByLocationAndName(@Param("location") String location, @Param("name") String name,
Pageable pageable);
}
Я также объявил следующие функции в моем слое обслуживания, которые обращаются к этим функциям MongoRepository
@Service
public class FarmerService {
private final FarmerRepository farmerRepository;
@Autowired
public FarmerService(final FarmerRepository farmerRepository){
this.farmerRepository = farmerRepository;
}
public Farmer createFarmer ( Farmer farmer){
this.farmerRepository.save(farmer);
return farmer;
}
public Farmer findFarmerById(String id){
Farmer farmerFoundById = this.farmerRepository.findById(id);
return farmerFoundById;
}
public Page<Farmer> findFarmersByName(final String name, final int page, final int size){
Page<Farmer> findFarmersPage = this.farmerRepository.findAllByName(name, new PageRequest(page,size));
return findFarmersPage;
}
public Farmer findFarmerByNationalId(String nationalId){
Farmer farmerFoundByNationaId = this.farmerRepository.findByNationalId(nationalId);
return farmerFoundByNationaId;
}
public Page<Farmer> findFarmersByLocation(final String location, final int page, final int size){
Page<Farmer> farmersFoundByLocation = this.farmerRepository.
findAllByLocation(location,new PageRequest(page,size));
return farmersFoundByLocation;
}
public Page<Farmer> findFarmersByLocationAndName(String location, String name,final int page,
final int size){
Page<Farmer> farmersFoundByLocationAndName =
this.farmerRepository.findAllByLocationAndName(location,name,new PageRequest(page,size));
return farmersFoundByLocationAndName;
}
public void deleteFarmer(String id){
Farmer deletedFarmer = this.farmerRepository.findById(id);
deletedFarmer.setIs_deleted(true);
this.farmerRepository.save(deletedFarmer);
}
}
Однако, когда я запускаю модульные тесты, чтобы проверить, можно ли получить доступ к фермерам с тем же именем и местоположением, тест не пройден. Ниже приведены тесты, которые не выполняются со следующей ошибкой:
Ошибка Assertion: ожидается:<2>, но была:<1>
@Test
public void findMultipleFarmersByLocationAndName_failWhenMultipleFarmersInSameLocationWithSameNameNotFound(){
Farmer farmer = new Farmer("1", "John Doe", "1", "Freetown");
Farmer farmer2 = new Farmer("2", "John Doe", "2", "Freetown");
Farmer farmer3 = new Farmer("3", "John Smith", "3", "Freetown");
Farmer savedFarmer1 = this.farmerService.createFarmer(farmer);
Farmer savedFarmer2 = this.farmerService.createFarmer(farmer2);
Farmer savedFarmer3 = this.farmerService.createFarmer(farmer3);
Page<Farmer> farmersFoundByLocationAndName = this.farmerService.
findFarmersByLocationAndName(farmer.getLocation(),farmer.getName(),0,5);
assertEquals("Farmers not found with same location and name", 2,
farmersFoundByLocationAndName.getTotalElements());
}
@Test
public void findMultipleFarmersByLocation_failWhenMultipleFarmersInSameLocationNotFound(){
Farmer farmer = new Farmer("1", "John Doe", "1", "Freetown");
Farmer farmer2 = new Farmer("2", "John Smith", "2", "Freetown");
Farmer savedFarmer1 = this.farmerService.createFarmer(farmer);
Farmer savedFarmer2 = this.farmerService.createFarmer(farmer2);
Page<Farmer> farmersFoundByLocation = this.farmerService.findFarmersByLocation(farmer.getLocation(),
0,5);
assertEquals("Farmers not found with same location", 2,
farmersFoundByLocation.getTotalElements());
}
@Test
public void findMultipleFarmersByName_failWhenMultipleFarmersWithSameNameNotFound(){
Farmer farmer = new Farmer("1", "John Doe", "1", "Earth");
Farmer farmer2 = new Farmer("2", "John Doe", "2", "Earth");
Farmer savedFarmer1 = this.farmerService.createFarmer(farmer);
Farmer savedFarmer2 = this.farmerService.createFarmer(farmer2);
//List<Farmer> farmersFoundByName = this.farmerService.findFarmersByName(farmer.getName());
Page<Farmer> farmersFoundByName = this.farmerService.findFarmersByName(farmer.getName(),0,5);
assertEquals("Farmer with name not detected", 2, farmersFoundByName.getTotalElements());
//assertEquals("Farmer with name not detected", 2, farmersFoundByName.size());
}
Любые выводы о том, где я иду не так, будут оценены. Я неправильно использовал аннотации @Query в MongoRepository?