public async Task ChangeOwnership(ChangeOwnershipViewModel changeOwnershipViewModel) { Portfolio ownersPortfolio = await _unitOfWork.PortfolioRepository.GetAsync(changeOwnershipViewModel.OwnerPortfolioId); Portfolio receiverPortfolio = await _unitOfWork.PortfolioRepository.GetAsync(changeOwnershipViewModel.ReceiverPortfolioId); Share ownersShare = await _unitOfWork.SharesRepository.GetShareByPortfolioAsync(ownersPortfolio.PortfolioId, changeOwnershipViewModel.ShareId); if (ownersPortfolio == null || receiverPortfolio == null || ownersShare == null) { throw new ArgumentException("Id's doesn't match"); } // Handling owners shares if (changeOwnershipViewModel.Count < ownersShare.Count) { ownersShare.Count -= changeOwnershipViewModel.Count; _unitOfWork.SharesRepository.Update(ownersShare); } else if (changeOwnershipViewModel.Count == ownersShare.Count) { await _unitOfWork.SharesRepository.DeleteShareByPortfolioAsync(ownersPortfolio.PortfolioId, ownersShare.ShareId); } else { throw new Exception("Owner doesn't have enough shares"); } // Handling receivers shares Share receiversShare = receiverPortfolio.Shares.SingleOrDefault(share => share.ShareId == changeOwnershipViewModel.ShareId); if (receiversShare == null) { receiversShare = new Share { Portfolio = receiverPortfolio, ShareId = ownersShare.ShareId, Count = changeOwnershipViewModel.Count }; receiverPortfolio.Shares.Add(receiversShare); _unitOfWork.SharesRepository.Add(receiversShare); _unitOfWork.PortfolioRepository.Update(receiverPortfolio); } else { receiversShare.Count += changeOwnershipViewModel.Count; _unitOfWork.SharesRepository.Update(receiversShare); } // Commiting await _unitOfWork.CommitAsync(); }
public async Task <IActionResult> ChangeOwnership([FromBody] ChangeOwnershipViewModel ownershipViewModel) { if (!ModelState.IsValid) { return(BadRequest()); } try { await _sharesService.ChangeOwnership(ownershipViewModel); return(Ok(new { Status = "success" })); } catch (Exception e) { return(BadRequest("Unable to transfer shares, try again with different values")); } }