Vavr i Either - mapowanie błędów

Vavr i Either - mapowanie błędów
HD
  • Rejestracja:około rok
  • Ostatnio:2 dni
  • Postów:8
0

Witam wszystkich, to mój pierwszy post na grupie, programuje w Javie hobbistycznie i natrafiłem na małą blokadę w moim projekcie.

Napisałem sobie feature do aktualizacji mojej encji Book. Encja Book podczas dodawania do systemu jest walidowana w DTO przez interfejs Validation z biblioteki Vavr. Bardzo spodobało mi się podejście @danek z ResponseResolver i enum jako zwracany błąd. Tylko w tym przypadku nie wiem czy nie przekombinowałem i może tą walidację lepiej przepisać na jakiegoś Hibernate Validator z @Valid i uniknąć tych wszystkich problemów, ale chciałem spróbować czegoś innego. Doszedłem jeszcze do jednego wniosku, że w tej walidacji niepotrzebnie waliduję chyba wszystkie pola z warunkami takimi jak długość tytułu, autora książki, jakie macie podejście w tej kwestii ? Najważniejszym polem jest kod ISBN i może tylko na tym polu się skupić i zrobić proste sprawdzenie, które będzie zwracać BookError z ISBN_IS_INVALID i wtedy problem jest tak naprawdę rozwiązany bo mam wszystkie błędy typy BookError.
Flow wygląda następująco:
Przekazuję do metody od aktualizacji encji BookUpdateDto i bookId. Znajduje encje za pomocą findById i robię na niej update. I tutaj jest problem, bo findById zwraca mi Either<BookError, BookCreateDto> (gdy nie ma książki o danym id zwraca BOOK_NOT_FOUND), a chciałbym jeszcze walidować przed update moje BookUpdateDto, które zwraca Validation.
Mógłby mi ktoś udzielić wskazówki jak zrobić mapowanie dla tych błędów, aby uniknąć jakiegoś zagnieżdżenia w stylu Either<BookError, Validation<Seq<String>, BookCreateDto>.
Metoda update mapuje BookUpdateDto na encje book za pomocą Buildera. Link to kodu gdzie jest metoda: tutaj.

Kod:

Kopiuj
public Either<BookError, BookCreateDto> updateBookById(final Long bookId, final BookUpdateDto toUpdate) {
        return findBookById(bookId)
                .toEither(BOOK_NOT_FOUND)
                .map(book -> bookValidation.validate(book.response()))

                .map(book -> book.update(toUpdate))
                .map(book -> bookRepository.save(book).response());
    }

Jeszcze jest tam sporo rzeczy, które muszę poprawić, ale przy okazji jeśli ktoś ma ochotę spojrzeć na mój projekt i wskazać błędy, coś poradzić czy idę w dobrym kierunku to będę mega wdzięczny!

edytowany 8x, ostatnio: hare-dev
Riddle
@hare-dev: Zapoznaj się z https://4programmers.net/Forum/Spolecznosc/355922-dlaczego_nie_nalezy_zamieszczac_kodu_w_postaci_obrazkow Zachęcamy do usunięcia rzutu ekranu z kodem, i wklejenia kodu w znacznikach ```java oraz ```.
Riddle
@hare-dev: Dzięki! Dodatkowo, nie musisz zamieszczać technologii w tytule, jeśli są już w tagach. Czy tytuł "Jak mapować błędy by uniknąć zagnieżdżenia" będzie dla Ciebie odpowiedni?
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 5 godzin
0

Jak cos jest juz zapisane w bazie danych, to jaki sens ma to jeszcze walidowac? Przeciez tam jest implicite zalozenie, ze jak w bazie to jest ok. Ewentualnie jak chcesz sie jeszcze zabezpieczyc przed blednymi migracjami to juz przezuc to do wyjatku. Bo taka sytuacja to by byl faktyczny wyjatek, a nie cos co mozna biznesowo obsluzyc


λλλ
edytowany 1x, ostatnio: stivens
HD
  • Rejestracja:około rok
  • Ostatnio:2 dni
  • Postów:8
0
stivens napisał(a):

Jak cos jest juz zapisane w bazie danych to jaki sens ma to jeszcze walidowac? Przeciez tam jest implicite zalozenie, ze jak w bazie to jest ok. Ewentualnie jak chcesz sie jeszcze zabezpieczyc przed blednymi migracjami to juz przezuc to do wyjatku. Bo taka sytuacja to by byl faktyczny wyjatek a nie cos co mozna biznesowo obsluzyc

Tak wiem, ale użytkownik może wprowadzić nowe dane, które muszę sprawdzić czy są poprawne. Np. przy próbie aktualizacji kodu ISBN muszę sprawdzić czy ten ISBN jest poprawny.

edytowany 1x, ostatnio: hare-dev
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 5 godzin
0

Ale to po zaaplikowaniu update'u? A Ty to robisz przed


λλλ
edytowany 1x, ostatnio: stivens
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 5 godzin
0

Ale troche bardziej odpowiadajac na pytanie: musisz przemapowac bledy walidacji na - w tym przypadku - BookError i wlozyc flatmape pomiedzy


λλλ
HD
  • Rejestracja:około rok
  • Ostatnio:2 dni
  • Postów:8
0
stivens napisał(a):

Ale to po zaaplikowaniu update'u? A Ty to robisz przed

Chcę walidować przed update. Sprawdzić czy pola, które aktualizuje użytkownik są poprawne.

stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 5 godzin
1

No pola, ktore juz sa zapisane w bazie to raczej sa poprawne ;)
Powinienes walidowac instancje update'u lub zupdate'owany (ale jeszcze niezapisany) obiekt ksiazki


λλλ
edytowany 1x, ostatnio: stivens
HD
  • Rejestracja:około rok
  • Ostatnio:2 dni
  • Postów:8
0
stivens napisał(a):

No pola, ktore juz sa zapisane w bazie to raczej sa poprawne ;)
Powinienes walidowac instancje update'u lub zupdate'owany (ale jeszcze niezapisany) obiekt ksiazki

Są poprawne bo mam walidację na to przed dodaniem obiektu do bazy kiedy normalnie dodaję obiekt. Może kombinuje za bardzo :D

edytowany 1x, ostatnio: hare-dev
PR
  • Rejestracja:prawie 4 lata
  • Ostatnio:około 6 godzin
  • Postów:222
1

Mogę się mylić, ale to operator fold ogarnie ;)

HD
  • Rejestracja:około rok
  • Ostatnio:2 dni
  • Postów:8
0
Productionserver napisał(a):

Mogę się mylić, ale to operator fold ogarnie ;)

Spróbuję, dzięki :)

CY
  • Rejestracja:ponad 3 lata
  • Ostatnio:dzień
  • Postów:39
0

swoją drogą vavr umarł? bo stronka nie działa https://www.vavr.io/

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.