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) }); }
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) }); }
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 }); }
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 }); }
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); } }
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); } }
private ApiAccess BaseCreation(string email) { var user = UserBusiness.GetValidUser(email); var apiAccess = new ApiAccess(); apiAccess.CreationDate = DateTime.UtcNow; apiAccess.UserId = user.Id; return(apiAccess); }
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); }
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) }); }
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); } }
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 }); }
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); }
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)); }
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 }); }
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); }
public List <ApiAccess> List(string email) { var user = UserBusiness.GetValidUser(email); return(Data.List(user.Id)); }