Jak zablokować możliwość zmiany pola boolean z true na false?

0

Jedna z moich encji ma pole:

private Boolean assignedToOrder;

Do edycji encji używam JsonMergePatch.

Chciałbym się zabezpieczyć że jeżeli pole assignedToOrder jest true, tzn obiekt jest przypisany do zlecenia to nie można go edytować, co więcej jeżeli to pole jest true, to nie można go zmienić na false.
Czy mógłby mi ktoś podpowiedzieć jak to zrobić ?

1
MaciejJankowski napisał(a):

Jedna z moich encji ma pole:

Bazodanowych / biznesowych ?

jak to zrobić ?

Czyli co ? Napisać więcej kodu tej encji?
Zaplanowac architekturę, o której milczysz, aby rozumiała odmowę ?
Może ty jesteś w jakims puncie myślenia, ale nikt inny

0

Próbowałem pisać zwykłe ify w metodzie odpowiedzialnej za edycje ale to nic nie daje.

Dla przykładu:

private static void checkingAssignedToOrder(Goods goods) {
    if (goods.getAssignedToOrder()){
        throw new CannotEditGoodsAssignedToOrderException("Cannot edit goods assigned to the order.");
    }
}

Ten if dzała poprawnie tzn jezeli towar jest przypisany do zlecenia, faktycznie nie moge go edytowac.
Jednak nie moge sobie poradzić z zabezpieczeniem sytuacji gdy ktoś bedzie chciał wyslać żadanie ktore bedzie ustawiać assignedToOrder na false.

0
MaciejJankowski napisał(a):

Ten if dzała poprawnie tzn jezeli towar jest przypisany do zlecenia, faktycznie nie moge go edytowac.
Jednak nie moge sobie poradzić z zabezpieczeniem sytuacji gdy ktoś bedzie chciał wyslać żadanie ktore bedzie ustawiać assignedToOrder na false.

Pokaż kod który zmienia to pole.

0
@Transactional
public void updateGoods(GoodsDTO goodsDTO){
  Goods goods = goodsMapper.mapToEntity(goodsDTO);
  checkingAssignedToOrder(goods);
  checkingLabelUnique(goodsDTO);

  goodsRepository.save(goods);
}

private void checkingLabelUnique(GoodsDTO goodsDTO) {
   if (goodsRepository.existsByLabelAndAssignedToOrderFalse(goodsDTO.getLabel())){
      throw new NonUniqueLabelsException("Label must be unique among unassigned goods");
  }
}

  private static void checkingAssignedToOrder(Goods goods) {
    if (goods.getAssignedToOrder()){
      throw new CannotEditGoodsAssignedToOrderException("Cannot edit goods assigned to the order.");
  }
}

I kontroler:

@PatchMapping("/goods/{id}")
  public ResponseEntity<?> updateGoods(@PathVariable Long id, @RequestBody JsonMergePatch patch)
            throws JsonPatchException, JsonProcessingException{

    GoodsDTO goodsDTO = goodsService.findGoodsById(id);
    applyPatchAndUpdateGoods(goodsDTO, patch);
    return ResponseEntity.noContent().build();

}

private void applyPatchAndUpdateGoods(GoodsDTO goodsDTO, JsonMergePatch patch)
        throws JsonPatchException, JsonProcessingException{

    JsonNode goodsNode = objectMapper.valueToTree(goodsDTO);
    JsonNode patchedGoods = patch.apply(goodsNode);
    GoodsDTO patchedGoodsDTO = objectMapper.treeToValue(patchedGoods, GoodsDTO.class);
    goodsService.updateGoods(patchedGoodsDTO);
}

0
@Transactional
public void updateGoods(GoodsDTO goodsDTO){
  Goods goods = goodsMapper.mapToEntity(goodsDTO);
  checkingAssignedToOrder(goods);
  checkingLabelUnique(goodsDTO);
  checkingNotSet(goods, goodsDTO);

  goodsRepository.save(goods);
}

// [...]

private void checkingNotSet(Goods goods, GoodsDTO goodsDTO) {
  if (goods.pole == true && goodsDTO.pole == false) {
    throw new Exception("ktoś próbuje zmienić pole na false");
  }
}

Pamiętaj żeby napisać testy automatyczne pod to, dokładniej dwa:

  • Miej goods który ma pole na false, spróbuj wysłać request z false - asercja że się udało
  • Miej goods który ma pole na true, spróbuj wysłać request z false, asercja że jest błąd
0

Coś mimo wszystko jest nie tak, gdy wysyłam żądanie w Postmanie z jakimkolwiek polem np. descrption, to dostaje błąd ze nie moge edytować.
A gdy próbuje edytować assignedToOrder na false to bez problemu przechodzi.
Wydaje mi się ze mimo że przesyłam w Postmanie jedno pole to niejawnie idą wszystkie w tym assinedToOrder które domyślnie moze miec false.

0
MaciejJankowski napisał(a):

Coś mimo wszystko jest nie tak, gdy wysyłam żądanie w Postmanie z jakimkolwiek polem np. descrption, to dostaje błąd ze nie moge edytować.
A gdy próbuje edytować assignedToOrder na false to bez problemu przechodzi.
Wydaje mi się ze mimo że przesyłam w Postmanie jedno pole to niejawnie idą wszystkie w tym assinedToOrder które domyślnie moze miec false.

Ah, spróbuj tak.

private void applyPatchAndUpdateGoods(GoodsDTO goodsDTO, JsonMergePatch patch) {
    JsonNode goodsNode = objectMapper.valueToTree(goodsDTO);
    JsonNode patchedGoods = patch.apply(goodsNode);
    GoodsDTO patchedGoodsDTO = objectMapper.treeToValue(patchedGoods, GoodsDTO.class);
    goodsService.updateGoods(
      goodsDTO, // tutaj przekaż aktualną wersję
      patchedGoodsDTO
    );
}

public void updateGoods(GoodsDTO current, GoodsDTO next){
  Goods goods = goodsMapper.mapToEntity(next);
  checkingAssignedToOrder(goods);
  checkingLabelUnique(next);

  if (current.jakieśPole == true && next.jakieśPole == false) {
    // tutaj rzuć wyjątek
  }

  goodsRepository.save(goods);
}
0

Niestety cały czas moge zmienić z true na false :(

Edit:
Przepraszam, mialem literówke, jest ok :)

0

Pomieszałeś DTOsy dla obiektu sprzed zaaplikowania patcha i po zaaplikowaniu.

Odpalasz swoje sprawdzenie checkingAssignedToOrder po zaaplikowaniu patcha, a raczej powinieneś to zrobić przed. I dlatego twój check przechodzi tylko gdy ustawisz na false w patchu.

Za to checkingLabelUnique pewnie chcesz sprawdzić w wersji po

1 użytkowników online, w tym zalogowanych: 0, gości: 1