/// <summary> /// Delete an upload and perform business logic to check for user existence and permission. /// Retries operation when there is an exception and logs all actions. /// </summary> /// <param name="ids">Ids of uploads to delete.</param> /// <param name="performingUser">User that is trying to delete the upload.</param> /// <param name="ipAddress">Ipaddress for logging.</param> /// <param name="failureCount">Current failure count of the operation.</param> /// <param name="ex">Exception that is thrown.</param> /// <returns>bool that represents whether the operation passed.</returns> public async Task <bool> DeleteUploadsAsync(List <int> ids, string performingUser, string ipAddress, int failureCount, Exception ex) { // Escape condition for recursive call if exception is thrown. if (failureCount >= Constants.OperationRetry) { throw ex; } // Condition to return. bool deleteResult = false; try { // Check that the user exists. var userExists = await _userManagementService.CheckUserExistenceAsync(performingUser).ConfigureAwait(false); if (!userExists) { throw new ArgumentException(Constants.UsernameDNE); } // Check that all the Ids exists. if (!await _uploadService.CheckUploadsExistenceAsync(ids).ConfigureAwait(false)) { throw new ArgumentException(Constants.UploadIdsDNE); } // Get user type. var userType = await _userManagementService.GetUserTypeAsync(performingUser).ConfigureAwait(false); // Check is user is admin. if true then let him perform if (userType.Equals(Constants.AdminUserType)) { // Let execution continue. } else if (userType.Equals(Constants.CustomerUserType) || userType.Equals(Constants.StoreOwnerUserType)) { // Check if use is allowed to perform operation if (!await _uploadService.CheckUploadOwnerAsync(ids, performingUser).ConfigureAwait(false)) { throw new NotAuthorizedException(Constants.UserNotAllowed); } } else { throw new NotAuthorizedException(Constants.UserNotAllowed); } // Perform operation. deleteResult = await _uploadService.DeleteUploadsAsync(ids).ConfigureAwait(false); } catch (Exception e) { // Log everytime we catch an exception. await _loggingManager.LogAsync(DateTime.UtcNow.ToString(Constants.LoggingFormatString), Constants.DeleteUploadOperation, performingUser, ipAddress, e.ToString()).ConfigureAwait(false); // Retry operation Constant.OperationRetry amount of times when there is exception await DeleteUploadsAsync(ids, performingUser, ipAddress, ++failureCount, e).ConfigureAwait(false); } // Log the successful operations. await _loggingManager.LogAsync(DateTime.UtcNow.ToString(Constants.LoggingFormatString), Constants.DeleteUploadOperation, performingUser, ipAddress).ConfigureAwait(false); return(deleteResult); }