public async Task <IActionResult> ShuftiPro()
        {
            var check = await KycExternalProvider.OnServiceCallback(HttpContext.Request);

            if (check.IsFinalStatus)
            {
                var ticket =
                    await(
                        from t in DbContext.KycShuftiProTicket
                        where t.ReferenceId == check.TicketId && t.TimeResponded == null
                        select t
                        )
                    .Include(tickt => tickt.User).ThenInclude(user => user.UserVerification)
                    .FirstOrDefaultAsync()
                ;

                if (ticket != null)
                {
                    var userVerified = check.OverallStatus == CoreLogic.Services.KYC.VerificationStatus.Verified;

                    ticket.IsVerified         = userVerified;
                    ticket.CallbackStatusCode = check.ServiceStatus;
                    ticket.CallbackMessage    = check.ServiceMessage;
                    ticket.TimeResponded      = DateTime.UtcNow;
                    await DbContext.SaveChangesAsync();
                }
            }
            return(Ok());
        }
Exemple #2
0
        public async Task <APIResponse> VerificationKycStart([FromBody] VerificationKycStartModel model)
        {
            // validate
            if (BaseValidableModel.IsInvalid(model, out var errFields))
            {
                return(APIResponse.BadRequest(errFields));
            }

            var user = await GetUserFromDb();

            var userTier = CoreLogic.User.GetTier(user);

            // tos not signed, didn't fill personal data, has kyc already
            if (
                !CoreLogic.User.HasTosSigned(user.UserVerification) ||
                !CoreLogic.User.HasFilledPersonalData(user.UserVerification) ||
                CoreLogic.User.HasKycVerification(user.UserVerification)
                )
            {
                return(APIResponse.BadRequest(APIErrorCode.AccountNotVerified));
            }

            // check previous verification attempt
            var status = MakeVerificationView(user);

            if (status.IsKycPending)
            {
                return(APIResponse.BadRequest(APIErrorCode.RateLimit));
            }

            // ---

            // new kyc ticket
            var ticket = new KycTicket()
            {
                UserId      = user.Id,
                ReferenceId = Guid.NewGuid().ToString("N"),
                Method      = "general",

                FirstName   = user.UserVerification.FirstName,
                LastName    = user.UserVerification.LastName,
                DoB         = user.UserVerification.DoB.Value,
                CountryCode = user.UserVerification.CountryCode,
                PhoneNumber = user.UserVerification.PhoneNumber,
                TimeCreated = DateTime.UtcNow,
            };

            DbContext.KycShuftiProTicket.Add(ticket);
            await DbContext.SaveChangesAsync();

            // set last ticket
            user.UserVerification.LastKycTicket = ticket;
            await DbContext.SaveChangesAsync();

            // new redirect
            var kycUser = new CoreLogic.Services.KYC.UserData()
            {
                FirstName    = ticket.FirstName,
                LastName     = ticket.LastName,
                CountryCode  = ticket.CountryCode,
                LanguageCode = GetUserLocale().ToString().ToUpper(),
                DoB          = ticket.DoB,
                PhoneNumber  = ticket.PhoneNumber,
                Email        = user.Email,
            };

            var callbackUrl         = Url.Link("CallbackShuftiPro", new { /*secret = AppConfig.Services.ShuftiPro.CallbackSecret*/ });
            var userTempRedirectUrl = Url.Link("CallbackRedirect", new { to = System.Web.HttpUtility.UrlEncode(model.Redirect) });
            var kycRedirect         = await KycExternalProvider.GetRedirect(
                kycUser,
                ticket.ReferenceId,
                userTempRedirectUrl,
                callbackUrl
                );

            Logger.Verbose($"{user.UserName} got kyc redirect to {kycRedirect} with callback to {callbackUrl} and middle redirect to {userTempRedirectUrl}");

            return(APIResponse.Success(new VerificationKycStartView()
            {
                TicketId = ticket.Id.ToString(),
                Redirect = kycRedirect,
            }));
        }