update
Service
Usaremos o flatmap! Ele nos permite um merge, transformando uma ou mais streams em uma nova stream.
Antes
@Transactional
public UserDTO update(String id, UserDTO dto) {
User entity = repository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("Recurso não encontrado"));
copyDtoToEntity(dto, entity);
entity = repository.save(entity);
return new UserDTO(entity);
}
Depois
public Mono<UserDTO> update(String id, UserDTO dto) {
return repository.findById(id)
.flatMap(exinstingUser -> {
//modificamos os dados do User que está no banco
exinstingUser.setName(dto.getName());
exinstingUser.setEmail(dto.getEmail());
return repository.save(exinstingUser);
})
//transformamos por fim em um Mono de UserDTO.
.map(UserDTO::new)
.switchIfEmpty(Mono.error(new ResourceNotFoundException("Recurso não encontrado")));
}
Controller
Antes
@PutMapping(value = "/{id}")
public ResponseEntity<UserDTO> update(@PathVariable String id, @RequestBody UserDTO dto) {
dto = service.update(id, dto);
return ResponseEntity.ok(dto);
}
Depois
@PutMapping(value = "/{id}")
public Mono<ResponseEntity<UserDTO>> update(@PathVariable String id,
@RequestBody UserDTO dto) {
return service.update(id, dto).map(userDTO -> ResponseEntity.ok().body(userDTO));
}
Atualizado