Предположим, у меня есть сервис, который позволяет пользователям давать очки другому пользователю. Таким образом, чтобы отправить несколько баллов указанному пользователю c, ему необходимо знать, какая учетная запись будет отправляться, а какая отправляется. Таким образом, я создаю еще один сервис, отвечающий за поиск аккаунта по его идентификатору. Все работает нормально, но мне просто интересно, как правильно это сделать или как лучше это делать. У меня на уме 3 стратегии.
Вот как это выглядит:
- Пусть контроллер вызывает службу поиска учетных записей и передает ее службе отправителя.
// a method in Controller class
@RequestMapping("/transactions")
public ResponseEntity<?> sendNuggerPoint(Long senderId, Long receiverId, Long amountOfNugger){
Optional<Account> sender = accountService.getAccountById(senderId);
Optional<Account> receiver = accountService.getAccountById(receiverId);
if(sender.isPresent()&&receiver.isPresent()){
try {
transactionService.transferNuggerPointToAccount(sender.get(), receiver.get(), amountOfNugger);
}
catch(InsufficientNuggerPointException e){
return new ResponseEntity<>(e.getMessage(),HttpStatus.BAD_REQUEST);
}
}
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
// a method in Service class
public void transferNuggerPointToAccount(Account senderAccount, Account receiverAccount,Long amountOfNugger) throws InsufficientNuggerPointException{
// get both account yum yum nugger
Long senderCurrentNugger = senderAccount.getNuggerPoint();
Long receiverCurrentNugger = receiverAccount.getNuggerPoint();
if(senderCurrentNugger < amountOfNugger) {
// throw exception if sender nugger is insufficient
throw new InsufficientNuggerPointException("Sorry, insufficeint nugger point.");
}
senderAccount.setNuggerPoint(senderCurrentNugger - amountOfNugger);
receiverAccount.setNuggerPoint(receiverCurrentNugger + amountOfNugger);
}
Просто пропустите Id отправителя и получателя и позвольте службе отправителя позвонить в службу поиска учетных записей.
// a method in Controller class
@RequestMapping("/transactions")
public ResponseEntity<?> sendNuggerPoint(Long senderId, Long receiverId, Long amountOfNugger){
if(sender.isPresent()&&receiver.isPresent()){
try {
transactionService.transferNuggerPointToAccount(senderId, receiverId, amountOfNugger);
}
catch(InsufficientNuggerPointException e){
return new ResponseEntity<>(e.getMessage(),HttpStatus.BAD_REQUEST);
}
}
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
// a method in Service class
public void transferNuggerPointToAccount(Long senderId, Long receiverId,Long amountOfNugger) throws InsufficientNuggerPointException{
// get both account yum yum nugger
Optional<Account> sender = accountService.getAccountById(senderId);
Optional<Account> receiver = accountService.getAccountById(receiverId);
if(sender.isPresent() && receiver.isPresent()){
Long senderCurrentNugger = sender.get().getNuggerPoint();
Long receiverCurrentNugger = receiver.get().getNuggerPoint();
if(senderCurrentNugger < amountOfNugger) {
// throw exception if sender nugger is insufficient
throw new InsufficientNuggerPointException("Sorry, insufficeint nugger point.");
}
senderAccount.setNuggerPoint(senderCurrentNugger - amountOfNugger);
receiverAccount.setNuggerPoint(receiverCurrentNugger + amountOfNugger);
}
}
Создать другую сущность и позволить пользователю отправлять всю информацию в теле запроса
// a method in Controller class
@RequestMapping("/transactions")
public ResponseEntity<?> sendNuggerPoint(@RequestBody Transaction transaction){
try {
transactionService.transferNuggerPointToAccount(transaction.getSender(), transaction.getReceiver(), transaction.getAmoutOfNugger());
}
catch(InsufficientNuggerPointException e){
return new ResponseEntity<>(e.getMessage(),HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
// a method in Service class
public void transferNuggerPointToAccount(Account senderAccount, Account receiverAccount,Long amountOfNugger) throws InsufficientNuggerPointException{
// get both account yum yum nugger
Long senderCurrentNugger = senderAccount.getNuggerPoint();
Long receiverCurrentNugger = receiverAccount.getNuggerPoint();
if(senderCurrentNugger < amountOfNugger) {
// throw exception if sender nugger is insufficient
throw new InsufficientNuggerPointException("Sorry, insufficeint nugger point.");
}
senderAccount.setNuggerPoint(senderCurrentNugger - amountOfNugger);
receiverAccount.setNuggerPoint(receiverCurrentNugger + amountOfNugger);
}