public async Task DeleteFileInfo(int serviceId, File file)
        {
            try
            {
                var service = Context.Services.FirstOrDefault(s => s.Id == serviceId);
                if (service == null)
                {
                    LoggingHandler.LogError("The specified service does not exist");
                    throw new UseCaseException()
                          {
                              UserErrorMessage = "The specified service does not exist"
                          };
                }
                service.ImageId = null;
                Context.Services.Attach(service);
                await Context.SaveChangesAsync().ConfigureAwait(false);

                Context.Files.Remove(file);
                await Context.SaveChangesAsync().ConfigureAwait(false);

                LoggingHandler.LogInfo("Image deleted successfully.");
            }
            catch (Exception e)
            {
                LoggingHandler.LogError("Error deleting image");
                LoggingHandler.LogError(e.Message);
                LoggingHandler.LogError(e.StackTrace);
                throw;
            }
        }
        public SynonymGroupResponseList ExecuteGet(SynonymGroupSearchRequest requestParams)
        {
            LoggingHandler.LogInfo("Call synonyms gateway.");
            var gatewayResponse = _synonymGroupsGateway.SearchSynonymGroups(requestParams);

            return(gatewayResponse == null ? null : gatewayResponse.ToResponse());
        }
Example #3
0
        public LoginUserQueryParam ChangePassword(ResetPasswordQueryParams changePasswordParams)
        {
            var userPool    = new CognitoUserPool(_connectionInfo.UserPoolId, _connectionInfo.ClientId, _provider);
            var cognitoUser = new CognitoUser(changePasswordParams.Email, _connectionInfo.ClientId, userPool, _provider);

            try
            {
                AuthFlowResponse authResponse = null;

                authResponse = cognitoUser.StartWithSrpAuthAsync(new InitiateSrpAuthRequest()
                {
                    Password = changePasswordParams.Password
                }).Result;

                while (authResponse.AuthenticationResult == null)
                {
                    if (authResponse.ChallengeName == ChallengeNameType.NEW_PASSWORD_REQUIRED)
                    {
                        authResponse =
                            cognitoUser.RespondToNewPasswordRequiredAsync(new RespondToNewPasswordRequiredRequest()
                        {
                            SessionID   = authResponse.SessionID,
                            NewPassword = changePasswordParams.NewPassword,
                        }).Result;
                    }
                }
                if (authResponse.AuthenticationResult != null)
                {
                    LoggingHandler.LogInfo("User successfully authenticated.");
                    var loginParams = new LoginUserQueryParam();
                    loginParams.Email    = changePasswordParams.Email;
                    loginParams.Password = changePasswordParams.NewPassword;
                    return(loginParams);
                }
                else
                {
                    LoggingHandler.LogError("Error in authentication process.");
                }
            }
            catch (AggregateException e)
            {
                e.Handle((x) =>
                {
                    if (x is NotAuthorizedException)  // This we know how to handle.
                    {
                        LoggingHandler.LogInfo("Authentication Gateway:  Invalid credentials provided.");
                        return(true);
                    }
                    if (x is UserNotFoundException)  // This we know how to handle.
                    {
                        LoggingHandler.LogInfo("Authentication Gateway:  User not found.");
                        return(true);
                    }
                    return(false); // Let anything else stop the application.
                });
            }
            return(null);
        }
        public async Task <SynonymsResponse> ExecuteUpdate(string accessToken, SynonymUpdateRequest requestParams)
        {
            LoggingHandler.LogInfo("Initiating update process.");
            SynonymsResponse response = new SynonymsResponse();

            await UpdateSynonymChanges(accessToken, requestParams.GoogleFileId, requestParams.SheetName,
                                       requestParams.SheetRange, requestParams.GoogleApiKey).ConfigureAwait(false);

            response.Success = true;
            return(response);
        }
        public async Task <IList <IList <object> > > ReadSheetToObjectRowListAsync(string spreadSheetId, string sheetName, string sheetRange)
        {
            SpreadsheetsResource.ValuesResource.GetRequest getter =
                _sheetsService.Spreadsheets.Values.Get(spreadSheetId, $"{sheetName}!{sheetRange}");
            LoggingHandler.LogInfo("Executing client API call");
            ValueRange response = await getter.ExecuteAsync().ConfigureAwait(false);

            LoggingHandler.LogInfo("Execution completed");
            IList <IList <object> > values = response.Values;

            return(values);
        }
        public async Task <IDictionary <string, string[]> > ReadSpreadsheetAsync(string spreadSheetId, string sheetName, string sheetRange, string googleApiKey)
        {
            LoggingHandler.LogInfo("Initialise Google API.");
            await _googleClient.InitialiseWithGoogleApiKey(googleApiKey).ConfigureAwait(false);

            LoggingHandler.LogInfo("Initialisation complete.  Getting spreadsheet rows.");
            IList <IList <object> > values =
                await _googleClient.ReadSheetToObjectRowListAsync(spreadSheetId, sheetName, sheetRange).ConfigureAwait(false);

            if (values == null || !values.Any())
            {
                LoggingHandler.LogError("No data found.  Unresolved issue, so just return without making any updates.");
                return(null);
            }
            LoggingHandler.LogInfo("Spreadsheet rows received.  Parsing data.");
            //Start Synonyms
            IDictionary <string, string[]> synonymGroups = new Dictionary <string, string[]>();

            foreach (IList <object> row in values.Skip(2))
            {
                if (row.Count > 1)
                {
                    try
                    {
                        string synonymGroupName = row[0].ToString().Trim();
                        if (synonymGroupName.Length > 0)
                        {
                            List <string> words = new List <string>();
                            foreach (object cell in row) //Include group name.
                            {
                                if (cell != null)
                                {
                                    string word = cell.ToString().Trim();
                                    if (word.Length > 0)
                                    {
                                        words.Add(word);
                                    }
                                }
                            }
                            synonymGroups.Add(synonymGroupName, words.ToArray());
                        }
                    }
                    catch (NullReferenceException e)
                    {
                        LoggingHandler.LogError(e.Message);
                        LoggingHandler.LogError(e.StackTrace);
                        Debugger.Break();
                    }
                }
            }
            return(synonymGroups);
        }
        public async Task UpdateSynonyms()
        {
            var updateRequest = new SynonymUpdateRequest
            {
                GoogleFileId = Environment.GetEnvironmentVariable("SYNONYMS_GOOGLE_FILE_ID"),
                SheetName    = Environment.GetEnvironmentVariable("SYNONYMS_SHEET_NAME"),
                SheetRange   = Environment.GetEnvironmentVariable("SYNONYMS_SHEET_RANGE"),
                GoogleApiKey = Environment.GetEnvironmentVariable("GOOGLE_API_KEY")
            };

            LoggingHandler.LogInfo("Starting process of updating synonyms.");
            await _synonymsUseCase.ExecuteUpdate(null, updateRequest).ConfigureAwait(false);
        }
Example #8
0
        public AuthenticationResult LoginUser(LoginUserQueryParam loginUserQueryParam)
        {
            InitiateAuthRequest iaRequest = new InitiateAuthRequest
            {
                ClientId = _connectionInfo.ClientId,
                AuthFlow = AuthFlowType.USER_PASSWORD_AUTH
            };

            iaRequest.AuthParameters.Add("USERNAME", loginUserQueryParam.Email);
            iaRequest.AuthParameters.Add("PASSWORD", loginUserQueryParam.Password);
            InitiateAuthResponse authResp = new InitiateAuthResponse();
            var authResult = new AuthenticationResult();

            try
            {
                authResp = _provider.InitiateAuthAsync(iaRequest).Result;
                authResult.AccessToken  = authResp.AuthenticationResult.AccessToken;
                authResult.IdToken      = authResp.AuthenticationResult.IdToken;
                authResult.RefreshToken = authResp.AuthenticationResult.RefreshToken;
                authResult.TokenType    = authResp.AuthenticationResult.TokenType;
                authResult.ExpiresIn    = authResp.AuthenticationResult.ExpiresIn;
                authResult.Success      = true;
            }
            catch (AggregateException e)
            {
                e.Handle((x) =>
                {
                    if (x is UserNotConfirmedException)  // This we know how to handle.
                    {
                        LoggingHandler.LogInfo("User not confirmed.");
                        authResult.Success         = false;
                        authResult.ResponseMessage = "User not confirmed";
                        return(true);
                    }
                    if (x is NotAuthorizedException)  // This we know how to handle.
                    {
                        LoggingHandler.LogInfo("Invalid credentials provided.");
                        authResult.Success         = false;
                        authResult.ResponseMessage = "Invalid credentials provided.";
                        return(true);
                    }
                    return(false); // Let anything else stop the application.
                });
            }
            return(authResult);
        }
Example #9
0
        public async Task DeleteImage(string request)
        {
            var deleteObjectRequest = new DeleteObjectRequest();

            deleteObjectRequest.BucketName = _repositoryBucket;
            deleteObjectRequest.Key        = _imagesFolder + "/" + request;
            try
            {
                await _s3Client.DeleteObjectAsync(deleteObjectRequest).ConfigureAwait(false);

                LoggingHandler.LogInfo($"File {request} deleted successfully.");
            }
            catch (Exception e)
            {
                LoggingHandler.LogError($"Error deleting file {request}.");
                LoggingHandler.LogError(e.Message);
                LoggingHandler.LogError(e.StackTrace);
                throw;
            }
        }
        /// <summary>
        /// Reads the given spreadsheet and updates database changes asynchronous.
        /// </summary>
        /// <param name="accessToken">Access token..</param>
        /// <param name="spreadSheetId">The spread sheet identifier.</param>
        /// <param name="sheetName">Name of the sheet to read.</param>
        /// <param name="sheetRange">The sheet range to read.</param>
        /// <param name="googleApiKey">The Google Api Key.</param>
        public async Task UpdateSynonymChanges(string accessToken, string spreadSheetId, string sheetName,
                                               string sheetRange, string googleApiKey)
        {
            LoggingHandler.LogInfo("Get data from source.");
            IDictionary <string, string[]> synonymGroups =
                await ReadSpreadsheetAsync(spreadSheetId, sheetName, sheetRange, googleApiKey).ConfigureAwait(false);

            if (synonymGroups == null || synonymGroups.Count == 0)
            {
                LoggingHandler.LogInfo("There is no synonym data from the google spreadsheet.");
                return;
            }

            //compare groups with database results and delete anything that has been removed.
            SynonymGroupSearchRequest requestParams = new SynonymGroupSearchRequest()
            {
                Direction = "asc",
                Search    = string.Empty,
                Sort      = "name"
            };

            LoggingHandler.LogInfo("Received synonyms from source.  Getting current data to update.");
            SynonymGroupResponseList synonymGroupsResponseList = ExecuteGet(requestParams);

            try
            {
                LoggingHandler.LogInfo("Deleting any items removed.");
                await LoopDatabaseAndDeleteAnythingRemovedFromSpreadsheet(accessToken, synonymGroupsResponseList, synonymGroups).ConfigureAwait(false);

                LoggingHandler.LogInfo("Updating any changed items.");
                await LoopSpreadsheetAndUpdateDatabaseWithChanges(accessToken, synonymGroupsResponseList, synonymGroups).ConfigureAwait(false);
            }
            catch (Exception e)
            {
                LoggingHandler.LogError("Error updating data.");
                LoggingHandler.LogError(e.Message);
                Debugger.Break();
            }
            LoggingHandler.LogInfo("Synonyms sync process complete.");
        }
Example #11
0
        public UserOrganisationDomain LinkUserToOrganisation(int organisationId, int userId)
        {
            LoggingHandler.LogInfo($"Linking userId {userId} to organisation {organisationId}");
            var userOrganisation = new UserOrganisation {
                UserId = userId, OrganisationId = organisationId, CreatedAt = DateTime.Now
            };

            try
            {
                Context.UserOrganisations.Add(userOrganisation);
                Context.SaveChanges();
            }
            catch (DbUpdateException dbex)
            {
                LoggingHandler.LogError("Error linking user to organisation");
                LoggingHandler.LogError(dbex.Message);
                LoggingHandler.LogError(dbex.StackTrace);
                var deverror = dbex.Message;
                if (dbex.InnerException != null)
                {
                    deverror += "-" + dbex.InnerException.Message;
                }
                throw new UseCaseException()
                      {
                          UserErrorMessage = "Error linking user to organisation",
                          DevErrorMessage  = deverror
                      };
            }
            catch (Exception e)
            {
                LoggingHandler.LogError("Error linking user to organisation");
                LoggingHandler.LogError(e.Message);
                LoggingHandler.LogError(e.StackTrace);
                throw;
            }
            userOrganisation = GetUserOrganisationById(userOrganisation.Id);
            return(_mapper.ToDomain(userOrganisation));
        }
Example #12
0
 public void DeleteUserOrganisationLink(int userId)
 {
     try
     {
         var userOrganisationLink = Context.UserOrganisations
                                    .FirstOrDefault(o => o.UserId == userId);
         if (userOrganisationLink == null)
         {
             LoggingHandler.LogWarning("User Organisation Link does not exist");
         }
         else
         {
             Context.UserOrganisations.Remove(userOrganisationLink);
             Context.SaveChanges();
             LoggingHandler.LogInfo("User organisation link removed successfully");
         }
     }
     catch (Exception e)
     {
         LoggingHandler.LogError(e.Message);
         LoggingHandler.LogError(e.StackTrace);
         throw;
     }
 }
        public LoginUserResponse ExecuteFirstLogin(ResetPasswordQueryParams loginParams, string ipAddress)
        {
            if (string.IsNullOrWhiteSpace(loginParams.Email))
            {
                throw new UseCaseException()
                      {
                          UserErrorMessage = "Could not login as the email address was invalid"
                      }
            }
            ;

            if (string.IsNullOrWhiteSpace(loginParams.Password))
            {
                throw new UseCaseException()
                      {
                          UserErrorMessage = "Could not login as the password was invalid"
                      }
            }
            ;
            var loginResult = _authenticateGateway.ChangePassword(loginParams);

            if (loginResult == null)
            {
                throw new UseCaseException()
                      {
                          UserErrorMessage = "Could not login as the email and/or password was invalid"
                      }
            }
            ;
            loginResult.IpAddress = ipAddress;
            var user = _usersGateway.GetUserByEmail(loginParams.Email, UserStatus.Invited);

            _usersGateway.SetUserStatus(user, UserStatus.Active);
            var loginResponse = CreateLoginSession(loginResult, user);

            return(loginResponse);
        }

        LoginUserResponse CreateLoginSession(LoginUserQueryParam loginParams, UserDomain user)
        {
            var timestamp = DateTime.UtcNow;
            var sessionId = Guid.NewGuid().ToString();

            LoggingHandler.LogInfo(loginParams.IpAddress);
            LoggingHandler.LogInfo(user.Id.ToString());

            Session session = new Session()
            {
                IpAddress    = loginParams.IpAddress,
                CreatedAt    = timestamp,
                LastAccessAt = timestamp,
                UserId       = user.Id,
                Payload      = sessionId,
            };

            _sessionsGateway.AddSession(session);

            return(new LoginUserResponse()
            {
                AccessToken = sessionId
            });
        }
Example #14
0
        public List <SynonymGroupDomain> SearchSynonymGroups(SynonymGroupSearchRequest requestParams)
        {
            // Search       search term to use (searches on [name] column for the MVP)
            // Sort         the column name by which to sort
            // Direction    sort order; asc, desc

            List <SynonymGroupDomain> response = new List <SynonymGroupDomain>();
            var direction = ConvertToEnum(requestParams.Direction);

            if (direction == SortDirection.None)
            {
                throw new UseCaseException()
                      {
                          UserErrorMessage = "The sort direction was not valid (must be one of asc, desc)"
                      }
            }
            ;
            LoggingHandler.LogInfo("Getting existing synonyms from the db.");
            var matchingSynonymGroups = Context.SynonymGroups.AsQueryable();

            // handle search
            if (!string.IsNullOrWhiteSpace(requestParams.Search))
            {
                matchingSynonymGroups = matchingSynonymGroups.Where(o => EF.Functions.ILike(o.Name, $"%{requestParams.Search}%"));
            }

            // handle sort by column name and sort direction
            var entityPropName = GetEntityPropertyForColumnName(typeof(SynonymGroup), requestParams.Sort);

            if (entityPropName == null)
            {
                throw new UseCaseException()
                      {
                          UserErrorMessage = $"The 'Sort' parameter contained the value '{requestParams.Sort}' " +
                                             "which is not a valid column name"
                      }
            }
            ;

            matchingSynonymGroups = (direction == SortDirection.Asc) ?
                                    matchingSynonymGroups.OrderBy(u => EF.Property <SynonymGroup>(u, entityPropName)) :
                                    matchingSynonymGroups.OrderByDescending(u => EF.Property <SynonymGroup>(u, entityPropName));

            try
            {
                var synonymGroupList = matchingSynonymGroups
                                       .Include(o => o.SynonymWords)
                                       .AsNoTracking()
                                       .ToList();

                response = _mapper.ToDomain(synonymGroupList);
            }
            catch (InvalidOperationException e)
            {
                throw new UseCaseException()
                      {
                          UserErrorMessage = "Could not run the synonym group search query with the supplied input parameters",
                          DevErrorMessage  = e.Message
                      };
            }
            return(response);
        }
    }
}