Co sądzicie o takim wykorzystywaniu Monad? Chodzi mi o wykorzystanie metody send(String id) {...} i chainowanie razem wszystkich operacji wykonywanych w niej.
- Szukam elementu po id
- Predicate czy można na nim działać
- Operacja "główna"
- Zmiana EmailStatus z PENDING na SENT
- .save() na repository
Chciałbym zwracać tutaj Either zamiast Email. Da rade jakoś to tak zorbić żeby left było rzucane tam gdzie się coś wywaliło?
- na findById
- isEmailPending
- na emailSenderService::send
Czy może jakoś inaczej do tego podejść?
@RequiredArgsConstructor
@Service
public class EmailFacadeServiceImpl implements EmailFacadeService {
private final EmailPersistenceService emailPersistenceService;
private final EmailSenderService emailSenderService;
private final Predicate<Email> isEmailPending = email -> email.getStatus().equals(EmailStatus.PENDING);
private final Function<Email, Email> setEmailStatusToSent = email -> new Email(email.getId(), email.getHeader(), email.getMessage(), EmailStatus.SENT);
@Override
public Email send(String id) {
return emailPersistenceService.findById(id)
.filter(isEmailPending)
.map(emailSenderService::send)
.map(setEmailStatusToSent)
.map(emailPersistenceService::save)
.getOrElseThrow(() -> new RuntimeException()); // ???
}