protected async Task LogError <T>(T callParams, ControllerContext controllerCtx, Exception ex) { await _log.WriteErrorAsync(controllerCtx.GetControllerAndAction(), (new { callParams }).ToJson(), ex); }
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); }
//[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)); } }