package com.example.pb.controller;
import javax.ws.rs.core.MediaType;
import com.example.pb.dto.BankMapRequest;
import com.example.pb.domain.Person;
import com.example.pb.repository.PersonRepository;
import com.example.pb.service.CreditCardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;package com.example.pb.controller;
import javax.ws.rs.core.MediaType;
import com.example.pb.dto.BankMapRequest;
import com.example.pb.domain.Person;
import com.example.pb.repository.PersonRepository;
import com.example.pb.service.CreditCardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.scheduler.Schedulers;
import java.util.*;
import java.util.stream.Collectors;
@Controller
@RequestMapping(value = "/api/persons")
public class InefficientBanksController {
@Autowired
private PersonRepository repository;
@Autowired
private CreditCardService creditCardService;
private static final Map CARD_BANK = new HashMap<>();
static {
CARD_BANK.put("cc-visa-1", "Bank of Spring");
CARD_BANK.put("cc-mc-1", "Reactive Credit Union");
}
@PostMapping(path = "/banks-inefficient",
consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON)
public Map> mapPersonToBanksInefficient(@RequestBody BankMapRequest req) {
List persons = repository.findAllById(req.getPersonIds())
.publishOn(Schedulers.parallel())
.collectList()
.block();
List allCards = new ArrayList<>();
for (Person p : persons) {
if (p.getCreditCardIds() != null) {
allCards.addAll(p.getCreditCardIds());
}
}
List filtered = allCards.stream()
.filter(id -> req.getCreditCardIds() != null && req.getCreditCardIds().contains(id))
.collect(Collectors.toList());
Set toLookup = new HashSet<>(filtered);
Map> result = new LinkedHashMap<>();
for (Person p : persons) {
Map card2bank =
creditCardService.getBankNamesForCardIds(toLookup).block();
List copy = p.getCreditCardIds() == null
? new ArrayList<>()
: new ArrayList<>(p.getCreditCardIds());
copy.removeIf(id -> req.getCreditCardIds() == null || !req.getCreditCardIds().contains(id));
List banks = copy.stream()
.map(card2bank::get)
.collect(Collectors.toList());
banks.removeIf(Objects::isNull);
banks = new ArrayList<>(new LinkedHashSet<>(banks));
result.put(p.getName(), banks);
}
return result;
}
}
import reactor.core.publisher.Flux;
import reactor.core.scheduler.Schedulers;
import java.util.*;
import java.util.stream.Collectors;
@Controller
@RequestMapping(value = "/api/persons")
public class InefficientBanksController {
@Autowired
private PersonRepository repository;
@Autowired
private CreditCardService creditCardService;
private static final Map CARD_BANK = new HashMap<>();
static {
CARD_BANK.put("cc-visa-1", "Bank of Spring");
CARD_BANK.put("cc-mc-1", "Reactive Credit Union");
}
@PostMapping(path = "/banks-inefficient",
consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON)
public Map> mapPersonToBanksInefficient(@RequestBody BankMapRequest req) {
List persons = repository.findAllById(req.getPersonIds())
.publishOn(Schedulers.parallel())
.collectList()
.block();
List allCards = new ArrayList<>();
for (Person p : persons) {
if (p.getCreditCardIds() != null) {
allCards.addAll(p.getCreditCardIds());
}
}
List filtered = allCards.stream()
.filter(id -> req.getCreditCardIds() != null && req.getCreditCardIds().contains(id))
.collect(Collectors.toList());
Set toLookup = new HashSet<>(filtered);
Map> result = new LinkedHashMap<>();
for (Person p : persons) {
Map card2bank =
creditCardService.getBankNamesForCardIds(toLookup).block();
List copy = p.getCreditCardIds() == null
? new ArrayList<>()
: new ArrayList<>(p.getCreditCardIds());
copy.removeIf(id -> req.getCreditCardIds() == null || !req.getCreditCardIds().contains(id));
List banks = copy.stream()
.map(card2bank::get)
.collect(Collectors.toList());
banks.removeIf(Objects::isNull);
banks = new ArrayList<>(new LinkedHashSet<>(banks));
result.put(p.getName(), banks);
}
return result;
}
}