Ejemplo n.º 1
0
        public async Task <LoginResponse> ResendEmailConfirmationAsync()
        {
            var email = LoggedEmail;

            BaseEmailValidation(email);
            EmailValidation(email);

            var user = GetForLoginByEmail(email);

            if (user == null)
            {
                throw new NotFoundException("User cannot be found.");
            }

            if (!user.ConfirmationDate.HasValue)
            {
                await SendEmailConfirmationAsync(email, user.ConfirmationCode);
            }

            return(new LoginResponse()
            {
                Id = user.Id,
                Email = user.Email,
                PendingConfirmation = !user.ConfirmationDate.HasValue,
                IsAdvisor = IsValidAdvisor(user),
                AdvisorName = UserBusiness.GetAdvisorName(user),
                ProfileUrlGuid = UserBusiness.GetProfileUrlGuid(user),
                HasInvestment = GetUserHasInvestment(user)
            });
        }
Ejemplo n.º 2
0
        public LoginResponse ConfirmEmail(string code)
        {
            var user = Data.GetByConfirmationCode(code);

            if (user == null)
            {
                throw new BusinessException("Invalid confirmation code.");
            }
            else if (user.ConfirmationDate.HasValue)
            {
                throw new BusinessException("Email already confirmed.");
            }

            user.ConfirmationDate = Data.GetDateTimeNow();
            Data.Update(user);

            return(new LoginResponse()
            {
                Id = user.Id,
                Email = user.Email,
                PendingConfirmation = false,
                IsAdvisor = IsValidAdvisor(user),
                AdvisorName = UserBusiness.GetAdvisorName(user),
                ProfileUrlGuid = UserBusiness.GetProfileUrlGuid(user),
                HasInvestment = GetUserHasInvestment(user)
            });
        }
Ejemplo n.º 3
0
        public LoginResponse Login(string email, string password)
        {
            BaseEmailValidation(email);
            EmailValidation(email);
            BasePasswordValidation(password);

            var user = GetForLoginByEmail(email);

            if (user == null || user.Password != GetHashedPassword(password, user.Email, user.CreationDate))
            {
                throw new BusinessException("Invalid credentials.");
            }

            bool hasInvestment = GetUserHasInvestment(user);

            ActionBusiness.InsertNewLogin(user.Id, null, null);
            return(new LoginResponse()
            {
                Id = user.Id,
                Email = user.Email,
                PendingConfirmation = !user.ConfirmationDate.HasValue,
                IsAdvisor = IsValidAdvisor(user),
                AdvisorName = UserBusiness.GetAdvisorName(user),
                ProfileUrlGuid = UserBusiness.GetProfileUrlGuid(user),
                HasInvestment = hasInvestment
            });
        }
Ejemplo n.º 4
0
        public LoginResponse RecoverPassword(string code, string password)
        {
            var recovery = Data.Get(code);

            if (recovery == null)
            {
                throw new BusinessException("There is no request for recover password.");
            }
            if (Data.GetDateTimeNow() > recovery.CreationDate.AddMinutes(60))
            {
                throw new BusinessException("Recover password code is expired.");
            }

            var user = UserBusiness.GetForLoginById(recovery.UserId);

            UserBusiness.UpdatePassword(user, password);

            bool hasInvestment = UserBusiness.GetUserHasInvestment(user);

            return(new LoginResponse()
            {
                Id = user.Id,
                Email = user.Email,
                PendingConfirmation = !user.ConfirmationDate.HasValue,
                IsAdvisor = UserBusiness.IsValidAdvisor(user),
                AdvisorName = UserBusiness.GetAdvisorName(user),
                ProfileUrlGuid = UserBusiness.GetProfileUrlGuid(user),
                HasInvestment = hasInvestment
            });
        }
Ejemplo n.º 5
0
        public void Create(string name, string email, string twitter)
        {
            UserBusiness.EmailValidation(email);

            var previousRecord = Data.GetByEmail(email);

            if (!string.IsNullOrWhiteSpace(name) && name.Length > 50)
            {
                name = name.Substring(0, 50);
            }
            if (!string.IsNullOrWhiteSpace(twitter) && twitter.Length > 15)
            {
                twitter = twitter.Substring(0, 15);
            }

            if (previousRecord == null)
            {
                Insert(new EarlyAccessEmail()
                {
                    CreationDate = Data.GetDateTimeNow(),
                    Email        = email,
                    Name         = name,
                    Twitter      = twitter
                });
            }
            else
            {
                previousRecord.Name    = name;
                previousRecord.Twitter = twitter;
                Update(previousRecord);
            }
        }
Ejemplo n.º 6
0
        public async Task SendEmailForForgottenPasswordAsync(string email)
        {
            var user = UserBusiness.GetByEmail(email);

            if (user != null)
            {
                var recovery = Data.Get(user.Id);
                if (recovery == null)
                {
                    recovery              = new PasswordRecovery();
                    recovery.UserId       = user.Id;
                    recovery.CreationDate = Data.GetDateTimeNow();
                    recovery.Token        = Guid.NewGuid().ToString();
                    Data.Insert(recovery);
                }
                else
                {
                    recovery.CreationDate = Data.GetDateTimeNow();
                    recovery.Token        = Guid.NewGuid().ToString();
                    Data.Update(recovery);
                }

                await SendForgottenPasswordAsync(email, recovery.Token);
            }
        }
Ejemplo n.º 7
0
        private ApiAccess BaseCreation(string email)
        {
            var user      = UserBusiness.GetValidUser(email);
            var apiAccess = new ApiAccess();

            apiAccess.CreationDate = DateTime.UtcNow;
            apiAccess.UserId       = user.Id;
            return(apiAccess);
        }
Ejemplo n.º 8
0
        public void RecoverPassword(string code, string password)
        {
            var recovery = Data.Get(code);

            if (recovery == null)
            {
                throw new ArgumentException("There is no request for recover password.");
            }
            if (DateTime.UtcNow > recovery.Date.AddMinutes(60))
            {
                throw new ArgumentException("Recover password code is expired.");
            }

            UserBusiness.UpdatePassword(UserBusiness.Get(recovery.UserId), password);
        }
Ejemplo n.º 9
0
        public LoginResponse GetLoginResponse()
        {
            var user = GetForLoginByEmail(LoggedEmail);

            if (user == null)
            {
                throw new NotFoundException("User not found.");
            }

            return(new LoginResponse()
            {
                Id = user.Id,
                Email = user.Email,
                PendingConfirmation = !user.ConfirmationDate.HasValue,
                IsAdvisor = IsValidAdvisor(user),
                AdvisorName = UserBusiness.GetAdvisorName(user),
                ProfileUrlGuid = UserBusiness.GetProfileUrlGuid(user),
                HasInvestment = GetUserHasInvestment(user)
            });
        }
Ejemplo n.º 10
0
        public void ValidateUserWallet(User user)
        {
            var cacheKey  = user.Email + "validated";
            var validated = MemoryCache.Get <object>(cacheKey);

            if (validated == null)
            {
                var wallet = Data.GetByUser(user.Id);
                if (wallet == null)
                {
                    throw new NotFoundException("Wallet was not defined.");
                }

                wallet.AUCBalance = GetAucAmount(wallet.Address);
                ActionBusiness.InsertNewAucVerification(user.Id, wallet.AUCBalance.Value);
                Data.Update(wallet);

                ValidateAucAmount(wallet.AUCBalance.Value, UserBusiness.GetMinimumAucAmountForUser(user));
                MemoryCache.Set <object>(cacheKey, true, 20);
            }
        }
Ejemplo n.º 11
0
        private LoginResponse SocialLogin(User user, SocialNetworkType socialNetworkType)
        {
            if (!user.ConfirmationDate.HasValue)
            {
                user.ConfirmationDate = Data.GetDateTimeNow();
                Data.Update(user);
            }
            bool hasInvestment = GetUserHasInvestment(user);

            ActionBusiness.InsertNewLogin(user.Id, null, socialNetworkType);

            return(new LoginResponse()
            {
                Id = user.Id,
                Email = user.Email,
                PendingConfirmation = !user.ConfirmationDate.HasValue,
                IsAdvisor = IsValidAdvisor(user),
                AdvisorName = UserBusiness.GetAdvisorName(user),
                ProfileUrlGuid = UserBusiness.GetProfileUrlGuid(user),
                HasInvestment = hasInvestment
            });
        }
Ejemplo n.º 12
0
        public async Task SendEmailForForgottenPassword(string email)
        {
            var user     = UserBusiness.GetValidUser(email);
            var recovery = Data.Get(user.Id);

            if (recovery == null)
            {
                recovery        = new PasswordRecovery();
                recovery.UserId = user.Id;
                recovery.Date   = DateTime.UtcNow;
                recovery.Token  = Guid.NewGuid().ToString();
                Data.Insert(recovery);
            }
            else
            {
                recovery.Date  = DateTime.UtcNow;
                recovery.Token = Guid.NewGuid().ToString();
                Data.Update(recovery);
            }

            await SendForgottenPassword(email, recovery.Token);
        }
Ejemplo n.º 13
0
        public Goal Create(string email, int goalOptionId, int timeframe, int risk, double?targetAmount, double startingAmount, double monthlyContribution)
        {
            var user = UserBusiness.GetValidUser(email);

            return(Create(user.Id, goalOptionId, timeframe, risk, targetAmount, startingAmount, monthlyContribution));
        }
Ejemplo n.º 14
0
        public LoginResponse ValidateSignature(string address, string signature)
        {
            BaseEmailValidation(LoggedEmail);
            var user = Data.GetForNewWallet(LoggedEmail);

            if (user == null)
            {
                throw new NotFoundException("User cannot be found.");
            }
            if (string.IsNullOrWhiteSpace(signature))
            {
                throw new BusinessException("Signature cannot be empty.");
            }

            address = WalletBusiness.GetAddressFormatted(address);

            var wallet = WalletBusiness.GetByAddress(address);

            if (wallet != null)
            {
                if (wallet.UserId == user.Id)
                {
                    throw new BusinessException("The wallet is already linked to your account.");
                }
                else
                {
                    throw new BusinessException("The wallet is already on used.");
                }
            }

            var message         = $"I accept the Privacy Policy and Terms of Use.";
            var recoveryAddress = Signature.HashAndEcRecover(message, signature)?.ToLower();

            if (address != recoveryAddress)
            {
                throw new BusinessException("Invalid signature.");
            }

            decimal?aucAmount = null;

            if (!IsValidAdvisor(user))
            {
                aucAmount = WalletBusiness.GetAucAmount(address);
                WalletBusiness.ValidateAucAmount(aucAmount.Value, GetMinimumAucAmountForUser(user));
            }

            var creationDate = Data.GetDateTimeNow();

            using (var transaction = TransactionalDapperCommand)
            {
                transaction.Insert(WalletBusiness.CreateNew(creationDate, user.Id, address, aucAmount));
                if (user.ReferredId.HasValue)
                {
                    user.ReferralStatus = ReferralStatusType.InProgress.Value;
                    transaction.Update(user);
                }
                transaction.Commit();
            }
            ActionBusiness.InsertNewWallet(creationDate, user.Id, $"Message: {message} --- Signature: {signature}", aucAmount ?? null);

            return(new LoginResponse()
            {
                Id = user.Id,
                Email = user.Email,
                HasInvestment = false,
                IsAdvisor = IsValidAdvisor(user),
                AdvisorName = UserBusiness.GetAdvisorName(user),
                ProfileUrlGuid = UserBusiness.GetProfileUrlGuid(user),
                PendingConfirmation = !user.ConfirmationDate.HasValue
            });
        }
Ejemplo n.º 15
0
        public DashboardResponse GetDashboardData()
        {
            var cutDayForActivity = Data.GetDateTimeNow().AddDays(-7);
            var advisors          = AdvisorBusiness.ListAllAdvisors();
            var users             = Task.Factory.StartNew(() => UserBusiness.ListAllUsersData());
            var advisorFollowers  = Task.Factory.StartNew(() => FollowAdvisorBusiness.ListFollowers(advisors.Select(c => c.Id).Distinct(), false));
            var assetFollowers    = Task.Factory.StartNew(() => FollowAssetBusiness.ListFollowers());
            var activities        = Task.Factory.StartNew(() => Data.FilterActivity(cutDayForActivity, ActionType.NewAucVerification, ActionType.NewLogin));

            Task.WaitAll(users, advisorFollowers, assetFollowers, activities);

            var adminsId                   = users.Result.Where(c => Admins?.Any(a => a == c.Email) == true).Select(c => c.Id).ToHashSet();
            var consideredUsers            = users.Result.Where(c => !adminsId.Contains(c.Id) && (!c.ReferredId.HasValue || !adminsId.Contains(c.ReferredId.Value))).ToList();
            var consideredAdvisors         = advisors.Where(c => !adminsId.Contains(c.Id) && (!c.ReferredId.HasValue || !adminsId.Contains(c.ReferredId.Value))).ToList();
            var consideredAdvisorFollowers = advisorFollowers.Result.Where(c => consideredUsers.Any(u => u.Id == c.UserId)).ToList();
            var consideredAssetFollowers   = assetFollowers.Result.Where(c => consideredUsers.Any(u => u.Id == c.UserId)).ToList();
            var consideredActivities       = activities.Result.Where(c => consideredUsers.Any(u => u.Id == c.UserId)).ToList();

            var result = new DashboardResponse();

            result.TotalUsersConfirmed                       = consideredUsers.Count(c => c.Wallets.Any());
            result.TotalUsersConfirmedFromReferral           = consideredUsers.Count(c => c.ReferredId.HasValue && c.Wallets.Any());
            result.TotalUsersStartedRegistration             = consideredUsers.Count(c => !consideredAdvisors.Any(a => a.Id == c.Id) && !c.Wallets.Any());
            result.TotalUsersStartedRegistrationFromReferral = consideredUsers.Count(c => c.ReferredId.HasValue && !consideredAdvisors.Any(a => a.Id == c.Id) && !c.Wallets.Any());
            result.TotalAdvisors          = consideredAdvisors.Count;
            result.TotalActiveUsers       = consideredActivities.Any() ? consideredActivities.Select(c => c.UserId).Distinct().Count(c => !consideredAdvisors.Any(a => a.Id == c) && consideredUsers.Any(u => u.Id == c && u.Wallets.Any())) : 0;
            result.TotalWalletsInProgress = consideredUsers.Count(c => c.ReferralStatusType == ReferralStatusType.InProgress);
            result.TotalFollowing         = consideredAdvisorFollowers.Count + consideredAssetFollowers.Count;
            result.TotalAdvisorsFollowed  = consideredAdvisorFollowers.Any() ? consideredAdvisorFollowers.Select(c => c.AdvisorId).Distinct().Count() : 0;
            result.TotalUsersFollowing    = consideredAdvisorFollowers.Any() || consideredAssetFollowers.Any() ?
                                            consideredAdvisorFollowers.Select(c => c.UserId).Concat(consideredAssetFollowers.Select(c => c.UserId)).Distinct().Count() : 0;

            var confirmedUsers = new Dictionary <int, DateTime>();

            foreach (var user in consideredUsers.Where(c => c.Wallets.Any()))
            {
                if (!consideredAdvisors.Any(c => c.Id == user.Id))
                {
                    confirmedUsers[user.Id] = user.Wallets.OrderBy(c => c.CreationDate).First().CreationDate;
                }

                var currentWallet = user.Wallets.OrderByDescending(c => c.CreationDate).First();
                result.TotalWalletsWithAuc += currentWallet.AUCBalance > 0 ? 1 : 0;
                result.AucHolded           += Convert.ToDouble(currentWallet.AUCBalance ?? 0);
                result.AucHoldedInProgress += user.ReferralStatusType == ReferralStatusType.InProgress ? Convert.ToDouble(currentWallet.AUCBalance ?? 0) : 0;
            }
            result.AucRatioPerConfirmedUser  = result.TotalUsersConfirmed > 0 ? result.AucHolded / result.TotalUsersConfirmed : 0;
            result.AucRatioPerUserInProgress = result.TotalWalletsInProgress > 0 ? result.AucHoldedInProgress / result.TotalWalletsInProgress : 0;

            var usersConfirmedData = !confirmedUsers.Any() ? null : confirmedUsers.GroupBy(c => c.Value.ToString("yyyy-MM-dd"))
                                     .Select(g => new DashboardResponse.RegistrationData()
            {
                Date = DateTime.Parse(g.Key), Value = g.Count()
            }).OrderBy(c => c.Date);

            var advisorsData = !consideredAdvisors.Any() ? null : consideredAdvisors.GroupBy(c => c.BecameAdvisorDate.ToString("yyyy-MM-dd"))
                               .Select(g => new DashboardResponse.RegistrationData()
            {
                Date = DateTime.Parse(g.Key), Value = g.Count()
            }).OrderBy(c => c.Date);

            var usersStartedRegistrationData = !consideredUsers.Any(c => !consideredAdvisors.Any(a => a.Id == c.Id) && !c.Wallets.Any()) ? null :
                                               consideredUsers.Where(c => !consideredAdvisors.Any(a => a.Id == c.Id) && !c.Wallets.Any()).GroupBy(c => c.CreationDate.ToString("yyyy-MM-dd"))
                                               .Select(g => new DashboardResponse.RegistrationData()
            {
                Date = DateTime.Parse(g.Key), Value = g.Count()
            }).OrderBy(c => c.Date);

            var minDate = GetMinDate(usersConfirmedData, advisorsData, usersStartedRegistrationData);

            result.UsersConfirmed                         = GetRegistrationData(usersConfirmedData, minDate);
            result.Advisors                               = GetRegistrationData(advisorsData, minDate);
            result.UsersStartedRegistration               = GetRegistrationData(usersStartedRegistrationData, minDate);
            result.UsersConfirmedLastSitutation           = GetFlagData(result.UsersConfirmed);
            result.AdvisorsLastSitutation                 = GetFlagData(result.Advisors);
            result.UsersStartedRegistrationLastSitutation = GetFlagData(result.UsersStartedRegistration);

            result.UsersConfirmed.Add(new DashboardResponse.RegistrationData()
            {
                Date = Data.GetDateTimeNow().Date.AddDays(1), Value = result.UsersConfirmed.LastOrDefault()?.Value ?? 0
            });
            result.Advisors.Add(new DashboardResponse.RegistrationData()
            {
                Date = Data.GetDateTimeNow().Date.AddDays(1), Value = result.Advisors.LastOrDefault()?.Value ?? 0
            });
            result.UsersStartedRegistration.Add(new DashboardResponse.RegistrationData()
            {
                Date = Data.GetDateTimeNow().Date.AddDays(1), Value = result.UsersStartedRegistration.LastOrDefault()?.Value ?? 0
            });

            result.Following.Add(new DashboardResponse.DistributionData()
            {
                Name = "Asset", Amount = consideredAssetFollowers.Count()
            });
            result.Following.Add(new DashboardResponse.DistributionData()
            {
                Name = "Expert", Amount = consideredAdvisorFollowers.Count()
            });

            var usersWithReferral = consideredUsers.Where(c => c.ReferralStatus.HasValue);

            result.ReferralStatus = !usersWithReferral.Any() ? new List <DashboardResponse.DistributionData>() : usersWithReferral.GroupBy(c => c.ReferralStatus.Value)
                                    .Select(g => new DashboardResponse.DistributionData()
            {
                Name = ReferralStatusType.Get(g.Key).GetDescription(), Amount = g.Count()
            }).ToList();

            var groupedFollowers = !consideredAdvisorFollowers.Any() ? null : consideredAdvisorFollowers.GroupBy(c => c.AdvisorId).Select(g => new { Id = g.Key, Value = g.Count() }).OrderByDescending(c => c.Value);

            if (groupedFollowers?.Any() == true)
            {
                groupedFollowers = groupedFollowers.Take(groupedFollowers.Count() > 10 ? 10 : groupedFollowers.Count()).OrderByDescending(c => c.Value);
                var consideredFollowers = consideredAdvisorFollowers.Where(c => groupedFollowers.Any(a => a.Id == c.AdvisorId));
                result.AdvisorFollowers = groupedFollowers.Select(c => new DashboardResponse.AdvisorData()
                {
                    Id        = c.Id,
                    Name      = consideredAdvisors.First(a => a.Id == c.Id).Name,
                    UrlGuid   = consideredAdvisors.First(a => a.Id == c.Id).UrlGuid.ToString(),
                    Total     = c.Value,
                    SubValue1 = consideredFollowers.Count(a => a.CreationDate >= cutDayForActivity && a.AdvisorId == c.Id)
                }).ToList();
            }

            var groupedReferred = !usersWithReferral.Any() ? null : usersWithReferral.GroupBy(c => c.ReferredId.Value).Select(g => new { Id = g.Key, Value = g.Count() }).OrderByDescending(c => c.Value);

            if (groupedReferred?.Any() == true)
            {
                groupedReferred = groupedReferred.Take(groupedReferred.Count() > 10 ? 10 : groupedReferred.Count()).OrderByDescending(c => c.Value);
                var consideredReferred = consideredUsers.Where(c => c.ReferralStatus.HasValue).Where(c => groupedReferred.Any(a => a.Id == c.ReferredId));
                result.AdvisorReferral = groupedReferred.Select(c => new DashboardResponse.AdvisorData()
                {
                    Id   = c.Id,
                    Name = consideredAdvisors.Any(a => a.Id == c.Id) ? consideredAdvisors.First(a => a.Id == c.Id).Name :
                           consideredUsers.Any(u => u.Id == c.Id) ? consideredUsers.First(u => u.Id == c.Id).Email : "(ADMIN) " + users.Result.First(u => u.Id == c.Id).Email,
                    UrlGuid   = consideredAdvisors.Any(a => a.Id == c.Id) ? consideredAdvisors.First(a => a.Id == c.Id).UrlGuid.ToString() : null,
                    Total     = c.Value,
                    SubValue1 = consideredReferred.Count(a => a.ReferredId == c.Id && a.ReferralStatusType == ReferralStatusType.InProgress),
                    SubValue2 = consideredReferred.Count(a => a.ReferredId == c.Id && a.ReferralStatusType == ReferralStatusType.Interrupted),
                    SubValue3 = consideredReferred.Count(a => a.ReferredId == c.Id && (a.ReferralStatusType == ReferralStatusType.Finished || a.ReferralStatusType == ReferralStatusType.Paid))
                }).ToList();
            }

            return(result);
        }
Ejemplo n.º 16
0
        public List <ApiAccess> List(string email)
        {
            var user = UserBusiness.GetValidUser(email);

            return(Data.List(user.Id));
        }