Example #1
0
        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();
        }
Example #2
0
        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"));
            }
        }