'Spring Reactive programming if search is not there in database then prepare entity and save else return new instance of object

I am new to reactive world and trying to write for following logic:

find if entry is there in database corresponding to my service call. If the the data is not there in database then i have to preapre that vendorServiceAreaMapping object and then save.

VendorServiceAreaMapping vendorServiceAreaMapping = new VendorServiceAreaMapping();
vendorServiceAreaMapping.setVendorId(123);
vendorServiceAreaMapping.setClientId(456);

int count= vendorService.findCountByVendorId(vendorServiceAreaMapping.getVendorId(), vendorServiceAreaMapping.getClientId())

if(count ==0){
    CityModel cityModel = cityService.getCityByName("Florida");
    vendorServiceAreaMapping.setCityId(cityModel.getCityId());
    vendorService.save(vendorServiceAreaMapping);
}else{
    new VendorServiceAreaMapping();
}

Above code snippet is what i am trying to incorporate using spring reactive way:

public Mono<VendorServiceAreaMapping> createVendorMapping(String invitationName) {
    return invitationService.getInvitationDetails(invitationName)
        .flatMap(vendorServiceAreaMapping -> {
            vendorService.findCountByVendorId(vendorServiceAreaMapping.getVendorId(), vendorServiceAreaMapping.getClientId())// returns integer
            .doOnNext(count -> {
                   if(count == 0){// there is no corresponding entry in database
                         .flatMap(vendorServiceAreaMapping -> {
                            return cityService.getCityByName("Florida")
                                     .map(cityModel -> {
                                            vendorServiceAreaMapping.setCityId(cityModel.getCityId());
                                            return vendorServiceAreaMapping;
                              });
                         })
                         .flatMap(vendorServiceAreaMapping -> {                          
                            return vendorService.save(vendorServiceAreaMapping);
                         })
                     }else{
                         return Mono.just(new VendorServiceAreaMapping());
                     }
                 });
        }
}


Solution 1:[1]

You just need to create a reactive flow chaining async methods using flatMap.

public Mono<VendorServiceAreaMapping> createVendorMapping(String invitationName) {
        return invitationService.getInvitationDetails(invitationName)
                .flatMap(vendorServiceAreaMapping ->
                    vendorService.findCountByVendorId(vendorServiceAreaMapping.getVendorId(), vendorServiceAreaMapping.getClientId())
                            .flatMap(count -> {
                                if (count == 0) {
                                    return cityService.getCityByName("Florida")
                                            .flatMap(cityModel -> {
                                                vendorServiceAreaMapping.setCityId(cityModel.getCityId());
                                                return vendorService.save(vendorServiceAreaMapping);
                                            });
                                } else {
                                    return Mono.just(new VendorServiceAreaMapping());
                                }
                            })
                );
    }

This code assumes that all methods are reactive and return Mono<T>.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Alex