protected async Task LogError <T>(T callParams, ControllerContext controllerCtx, Exception ex)
 {
     await _log.WriteErrorAsync(controllerCtx.GetControllerAndAction(), (new { callParams }).ToJson(), ex);
 }
コード例 #2
0
        public async Task <IActionResult> ClaimInvitationLink(string refLinkId, [FromBody] ClaimReferralLinkRequest request)
        {
            if (!request.IsNewClient)
            {
                return(await LogAndReturnBadRequest(request, ControllerContext, "Not a new client."));
            }

            var refLink = await _referralLinksService.GetReferralLinkById(refLinkId ?? "") ?? await _referralLinksService.GetReferralLinkByUrl(request.ReferalLinkUrl ?? "");

            var validationError = ValidateClaimRefLinkAndRequest(refLink, request, refLinkId);

            if (!String.IsNullOrEmpty(validationError))
            {
                return(await LogAndReturnBadRequest(request, ControllerContext, validationError));
            }

            var claims = (await _referralLinkClaimsService.GetRefLinkClaims(refLink.Id)).ToList();

            var alreadyClaimedByThisRecipient = claims.Any(c => c.RecipientClientId == request.RecipientClientId);

            if (alreadyClaimedByThisRecipient)
            {
                return(await LogAndReturnBadRequest(request, ControllerContext, $"Link already claimed by client id {request.RecipientClientId}"));
            }

            bool shouldReceiveReward = await ShoulReceiveReward(claims, refLink);

            try
            {
                var newRefLinkClaimRecipient = await CreateNewRefLinkClaim(refLink, request.RecipientClientId, shouldReceiveReward, true);

                if (shouldReceiveReward)
                {
                    var newRefLinkClaimSender = await CreateNewRefLinkClaim(refLink, refLink.SenderClientId, true, false);

                    if (Math.Abs(refLink.Amount) < MinimalAmount)
                    {
                        await LogWarn(request, ControllerContext, $"Invitation link with id {refLink.Id} is claimed, but the link is set to reward amount 0. If this is intentional, please act accordingly - possibly rewarding the recipients manually. Records for the claim will be created in DB, but with empty transaction ID. Invitation links get created with 0 amount if the relevant setting in config is set to 0. ");

                        return(Ok(new ClaimRefLinkResponse()));
                    }

                    var transactionRewardSender = await _exchangeService.TransferRewardCoins(refLink, false, refLink.SenderClientId, ControllerContext.GetControllerAndAction());
                    await SetRefLinkClaimTransactionId(transactionRewardSender, newRefLinkClaimSender);

                    var transactionRewardRecipient = await _exchangeService.TransferRewardCoins(refLink, request.IsNewClient, request.RecipientClientId, ControllerContext.GetControllerAndAction());
                    await SetRefLinkClaimTransactionId(transactionRewardRecipient, newRefLinkClaimRecipient);

                    if (transactionRewardSender.IsOk() && transactionRewardRecipient.IsOk())
                    {
                        return(Ok
                               (
                                   new ClaimRefLinkResponse
                        {
                            TransactionRewardSender = transactionRewardSender.TransactionId,
                            TransactionRewardRecipient = transactionRewardRecipient.TransactionId
                        }
                               ));
                    }
                    return(await LogAndReturnInternalServerError(request, ControllerContext, $"TransactionRewardRecipientError: Code: {transactionRewardRecipient.Code}, {transactionRewardRecipient.Message}; TransactionRewardSenderError: Code: {transactionRewardSender.Code}, {transactionRewardSender.Message}"));
                }

                return(Ok(new ClaimRefLinkResponse()));
            }
            catch (Exception ex)
            {
                return(await LogAndReturnInternalServerError(request, ControllerContext, $"{ex.ToJson()}."));
            }
        }
 protected async Task LogWarn <T>(T callParams, ControllerContext controllerCtx, string info)
 {
     await _log.WriteWarningAsync(controllerCtx.GetControllerAndAction(), (new { callParams }).ToJson(), info);
 }
コード例 #4
0
        //[HttpPut("giftCoinLinks/{refLinkId}/claim")]  - reserved for version 2
        //[SwaggerOperation("ClaimGiftCoins")]
        //[ProducesResponseType(typeof(ErrorResponseModel), (int)HttpStatusCode.BadRequest)]
        //[ProducesResponseType(typeof(ErrorResponseModel), (int)HttpStatusCode.NotFound)]
        //[ProducesResponseType(typeof(ClaimRefLinkResponse), (int)HttpStatusCode.OK)]
        private async Task <IActionResult> ClaimGiftCoins([FromBody] ClaimReferralLinkRequest request, string refLinkId)
        {
            var refLink = await _referralLinksService.GetReferralLinkById(refLinkId ?? "");

            var validationError = ValidateClaimRefLinkAndRequest(refLink, request, refLinkId);

            if (!String.IsNullOrEmpty(validationError))
            {
                return(await LogAndReturnBadRequest(request, ControllerContext, validationError));
            }

            var asset = (await _assets.GetDictionaryAsync()).Values.FirstOrDefault(v => v.Id == refLink.Asset);

            if (asset == null)
            {
                return(await LogAndReturnBadRequest(request, ControllerContext, $"Asset with id {refLink.Asset} for Referral link {refLink.Id} not found. Check transfer's history."));
            }

            if (await _srvKycForAsset.IsKycNeeded(request.RecipientClientId, asset.Id))
            {
                return(await LogAndReturnBadRequest(request, ControllerContext, $"KYC needed for recipient client id {request.RecipientClientId} before claiming asset {refLink.Asset}"));
            }

            var newRefLinkClaimRecipient = await CreateNewRefLinkClaim(refLink, request.RecipientClientId, true, request.IsNewClient);

            var transactionRewardRecipient = await _exchangeService.TransferRewardCoins(refLink, request.IsNewClient, request.RecipientClientId, ControllerContext.GetControllerAndAction());

            try
            {
                if (transactionRewardRecipient.IsOk())
                {
                    using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
                    {
                        await SetRefLinkClaimTransactionId(transactionRewardRecipient, newRefLinkClaimRecipient);
                        await UpdateRefLinkState(refLink, ReferralLinkState.Claimed);

                        scope.Complete();
                    }

                    return(Ok(new ClaimRefLinkResponse {
                        TransactionRewardRecipient = transactionRewardRecipient.TransactionId, SenderOffchainTransferId = refLink.SenderOffchainTransferId
                    }));
                }
                return(await LogAndReturnNotFound(request, ControllerContext, $"TransactionRewardRecipientError: Code: {transactionRewardRecipient.Code}, Message: {transactionRewardRecipient.Message}"));
            }
            catch (TransactionAbortedException ex)
            {
                await LogError(new { Request = request, RefLink = refLink ?? new ReferralLink() }, ControllerContext, ex);

                return(NotFound(ex.Message));
            }
            catch (ApplicationException ex)
            {
                await LogError(new { Request = request, RefLink = refLink ?? new ReferralLink() }, ControllerContext, ex);

                return(NotFound(ex.Message));
            }
            catch (Exception ex)
            {
                await LogError(new { Request = request, RefLink = refLink ?? new ReferralLink() }, ControllerContext, ex);

                return(NotFound(ex.Message));
            }
        }