Mutiny — объединить Uni и Multi на основе бизнес-логики

Я новичок в реактивном программировании. Пожалуйста, помогите в достижении ниже в Mutiny.

У меня есть класс DTO

      public class UserAppSessionDto{
    private UserDto user;
    private List<OrgDto>  userOrgs;
    private List<AppDto> userApps;
}

и 3 метода обслуживания, один возврат Uniи другие возвращаются Multi.

      Uni<UserDto> getUserByOrgUserId(Integer orgUserId);
Multi<AppDto> getUserApps(Integer orgUserId);
Multi<RoleDto> getUserRoles(Integer orgUserId);

Мне нужно написать метод службы, который вызывает 3 вышеуказанных метода, применяет некоторые бизнес-проверки, устанавливает возвращаемые значения для экземпляра UserAppSessionDtoи вернуть Uni<UserAppSessionDto>. Я упомянул базовую бизнес-логику (нулевую проверку), которая будет применяться ниже.

      public Uni<UserAppSessionDto> getUserAppSessionDetails(Integer orgUserId)
         {
             UserAppSessionDto user=new UserAppSessionDto();

             //1. call the method Uni<UserDto> getUserByOrgUserId(Integer orgUserId)
             //2. If UserDto (in the returned Uni) is not null, call Multi<AppDto> getUserApps(Integer orgUserId) and Multi<RoleDto> getUserRoles(Integer orgUserId) methods in parallel. 
             //3. Set the return values from the above three methods into user variable
             //4. Return Uni<UserAppSessionDto>

             return Uni.createFrom().item(user);
         }

1 ответ

Любая причина, почему getUserAppsа также getUserRolesвозвращаются мульти? Я не верю, что они будут передавать результаты, а вместо этого вернут список одним пакетом. Если это так, используя Uni<List<X>это лучше.

С этим изменением ваша логика становится намного проще:

      public Uni<UserAppSessionDto> getUserAppSessionDetails(Integer orgUserId) {
  UserAppSessionDto user=new UserAppSessionDto();

 Uni<UserDto> uni = getUserByOrgUserId(orgUserId)
       .invoke(userDTO -> user.user = userDTO);
 
return uni
   onItem().ifNotNull().transformToUni(userdto -> 
       Uni.combine().all()
         .unis(getUserApps(orgUserId),getUserRoles(orgUserId))
         .asTuple()
         .invoke((apps, roles) -> user....)
     )
     .map(x -> user);
}
Другие вопросы по тегам