Vavr i Either - mapowanie błędów

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:

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!

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

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.

0

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

0

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

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.

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

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

1

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

0
Productionserver napisał(a):

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

Spróbuję, dzięki :)

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.