public async Task <LoginResponse> Handle(LoginRequest request, CancellationToken cancellationToken) { var result = new LoginResponse(); var member = await _context.Members .Where(x => x.MemberUsername == request.MemberUsername) .SingleOrDefaultAsync(cancellationToken); if (member != null) { result.UsernameExists = true; if (member.AuthenticationScheme == SchemeProvider.Fortifex) { result.UsingFortifexAuthentication = true; if (FortifexUtility.VerifyPasswordHash(request.Password, member.PasswordSalt, member.PasswordHash)) { result.PasswordIsCorrect = true; if (member.ActivationStatus == ActivationStatus.Active) { string securityKey = _config.GetSection("Fortifex:TokenSecurityKey").Value; result.AccountIsActive = true; result.IsSuccessful = true; result.Token = TokenHelper.GenerateToken(member, securityKey); } else { result.IsSuccessful = false; result.ErrorMessage = ErrorMessage.InactiveAccount; } } else { result.ErrorMessage = ErrorMessage.InvalidPassword; } } var project = await _context.Projects .Where(x => x.MemberUsername == request.MemberUsername) .SingleOrDefaultAsync(cancellationToken); if (project != null) { result.ProjectID = project.ProjectID; } } else { result.ErrorMessage = ErrorMessage.MemberUsernameNotFound; } return(result); }
public async Task <LoginExternalResponse> Handle(LoginExternalRequest request, CancellationToken cancellationToken) { var result = new LoginExternalResponse(); var member = await _context.Members .Where(x => x.MemberUsername == request.MemberUsername) .SingleOrDefaultAsync(cancellationToken); if (member == null) { var defaultRegion = await _context.Regions .Where(x => x.Name == RegionName.Default) .SingleOrDefaultAsync(cancellationToken); if (defaultRegion == null) { throw new NotFoundException(nameof(Region), RegionName.Default); } var defaultPreferredFiatCurrency = await _context.Currencies .Where(x => x.Symbol == CurrencySymbol.USD && x.CurrencyType == CurrencyType.Fiat) .SingleOrDefaultAsync(cancellationToken); if (defaultPreferredFiatCurrency == null) { throw new NotFoundException(nameof(Currency), CurrencySymbol.USD); } var defaultPreferredCoinCurrency = await _context.Currencies .Where(x => x.Symbol == CurrencySymbol.BTC && x.CurrencyType == CurrencyType.Coin) .SingleOrDefaultAsync(cancellationToken); if (defaultPreferredCoinCurrency == null) { throw new NotFoundException(nameof(Currency), CurrencySymbol.BTC); } FortifexUtility.SplitFullName(request.FullName, out string firstName, out string lastName); member = new Member { MemberUsername = request.MemberUsername, FirstName = firstName, LastName = lastName, AuthenticationScheme = request.SchemeProvider, ExternalID = request.ExternalID, RegionID = defaultRegion.RegionID, GenderID = GenderID.Default, BirthDate = MemberBirthDate.Default, PreferredFiatCurrencyID = defaultPreferredFiatCurrency.CurrencyID, PreferredCoinCurrencyID = defaultPreferredCoinCurrency.CurrencyID, PreferredTimeFrameID = TimeFrameID.Default, PictureURL = request.PictureURL, ActivationCode = Guid.NewGuid(), ActivationStatus = ActivationStatus.Active }; await _context.Members.AddAsync(member); await _context.SaveChangesAsync(cancellationToken); result.IsNewMember = true; } string securityKey = _config.GetSection("Fortifex:TokenSecurityKey").Value; result.Token = TokenHelper.GenerateToken(member, securityKey); return(result); }
public async Task <CreateMemberResponse> Handle(CreateMemberRequest request, CancellationToken cancellationToken) { var result = new CreateMemberResponse(); if (await _context.Members.AnyAsync(x => x.MemberUsername == request.MemberUsername, cancellationToken)) { result.IsSuccessful = false; result.ErrorMessage = "Username already taken"; } else { var defaultRegion = await _context.Regions .Where(x => x.Name == RegionName.Default) .SingleOrDefaultAsync(cancellationToken); if (defaultRegion == null) { throw new NotFoundException(nameof(Region), RegionName.Default); } var defaultPreferredFiatCurrency = await _context.Currencies .Where(x => x.Symbol == CurrencySymbol.USD && x.CurrencyType == CurrencyType.Fiat) .SingleOrDefaultAsync(cancellationToken); if (defaultPreferredFiatCurrency == null) { throw new NotFoundException(nameof(Currency), CurrencySymbol.USD); } var defaultPreferredCoinCurrency = await _context.Currencies .Where(x => x.Symbol == CurrencySymbol.BTC && x.CurrencyType == CurrencyType.Coin) .SingleOrDefaultAsync(cancellationToken); if (defaultPreferredCoinCurrency == null) { throw new NotFoundException(nameof(Currency), CurrencySymbol.BTC); } string passwordSalt = FortifexUtility.CreatePasswordSalt(); string passwordHash = FortifexUtility.CreatePasswordHash(request.Password, passwordSalt); var member = new Member { MemberUsername = request.MemberUsername, PasswordHash = passwordHash, PasswordSalt = passwordSalt, AuthenticationScheme = SchemeProvider.Fortifex, RegionID = defaultRegion.RegionID, GenderID = GenderID.Default, BirthDate = MemberBirthDate.Default, PreferredFiatCurrencyID = defaultPreferredFiatCurrency.CurrencyID, PreferredCoinCurrencyID = defaultPreferredCoinCurrency.CurrencyID, PreferredTimeFrameID = TimeFrameID.Default, ActivationCode = Guid.NewGuid(), ActivationStatus = ActivationStatus.Inactive }; await _context.Members.AddAsync(member); await _context.SaveChangesAsync(cancellationToken); result.ActivationCode = member.ActivationCode; result.MemberUsername = member.MemberUsername; StringBuilder emailBodyStringBuilder = new StringBuilder(); emailBodyStringBuilder.AppendLine("Please click below link to activate your Fortifex account."); emailBodyStringBuilder.AppendLine("<div>"); emailBodyStringBuilder.AppendLine($"<a href=\"{_currentWeb.BaseURL}/account/activate?activationCode={member.ActivationCode}\">Activate my Fortifex account</a>"); emailBodyStringBuilder.AppendLine("</div>"); EmailItem mailItem = new EmailItem { ToAdress = "*****@*****.**", Subject = "Welcome to Fortifex", Body = emailBodyStringBuilder.ToString() }; await _emailService.SendEmailAsync(mailItem); result.IsSuccessful = true; } return(result); }
public async Task <CreateExternalMemberResponse> Handle(CreateExternalMemberRequest request, CancellationToken cancellationToken) { var result = new CreateExternalMemberResponse(); if (await _context.Members.AnyAsync(x => x.MemberUsername == request.MemberUsername, cancellationToken)) { result.IsSuccessful = false; result.ErrorMessage = "Username already taken"; } else if (await _context.Members.AnyAsync(x => x.ExternalID == request.ExternalID && x.AuthenticationScheme == request.ClaimType, cancellationToken)) { result.IsSuccessful = false; result.ErrorMessage = $"ExternalID {request.ExternalID} in {request.ClaimType} already exists"; } else { var defaultRegion = await _context.Regions .Where(x => x.Name == RegionName.Default) .SingleOrDefaultAsync(cancellationToken); if (defaultRegion == null) { throw new NotFoundException(nameof(Region), RegionName.Default); } var defaultPreferredFiatCurrency = await _context.Currencies .Where(x => x.Symbol == CurrencySymbol.USD && x.CurrencyType == CurrencyType.Fiat) .SingleOrDefaultAsync(cancellationToken); if (defaultPreferredFiatCurrency == null) { throw new NotFoundException(nameof(Currency), CurrencySymbol.USD); } var defaultPreferredCoinCurrency = await _context.Currencies .Where(x => x.Symbol == CurrencySymbol.BTC && x.CurrencyType == CurrencyType.Coin) .SingleOrDefaultAsync(cancellationToken); if (defaultPreferredCoinCurrency == null) { throw new NotFoundException(nameof(Currency), CurrencySymbol.BTC); } FortifexUtility.SplitFullName(request.FullName, out string firstName, out string lastName); var member = new Member { MemberUsername = request.MemberUsername, FirstName = firstName, LastName = lastName, AuthenticationScheme = request.ClaimType, ExternalID = request.ExternalID, RegionID = defaultRegion.RegionID, GenderID = GenderID.Default, BirthDate = MemberBirthDate.Default, PreferredFiatCurrencyID = defaultPreferredFiatCurrency.CurrencyID, PreferredCoinCurrencyID = defaultPreferredCoinCurrency.CurrencyID, PreferredTimeFrameID = TimeFrameID.Default, PictureURL = request.PictureURL, ActivationCode = Guid.NewGuid(), ActivationStatus = ActivationStatus.Active }; await _context.Members.AddAsync(member); await _context.SaveChangesAsync(cancellationToken); result.IsSuccessful = true; } return(result); }