public async Task <Result <bool> > CreateUploadAsync(UploadPost post, int failureCount) { var result = false; // Escape condition for recursive call if exception is thrown. if (failureCount >= Constants.OperationRetry) { return(SystemUtilityService.CreateResult(Constants.UploadCreationErrorMessage, result, true)); } try { if (!await _userManagementService.CheckUserExistenceAsync(post.Username).ConfigureAwait(false)) { // Log the fact user was invalid. await _loggingManager.LogAsync(DateTime.UtcNow.ToString(Constants.LoggingFormatString), Constants.CreateUploadOperation, post.Username, post.IPAddress, Constants.UploadUserDNESystemMessage).ConfigureAwait(false); return(SystemUtilityService.CreateResult(Constants.UploadUserDNEUserMessage, result, false)); } var latLong = LocationUtilityService.GetImageLatitudeAndLongitude(post.Image); var latitude = latLong.Item1; var longitude = latLong.Item2; var withinScope = LocationUtilityService.CheckLocationWithinPolygon(latitude, longitude, Constants.CurrentScopePolygon); if (!withinScope) { // Log the fact that scope was violated. await _loggingManager.LogAsync(DateTime.UtcNow.ToString(Constants.LoggingFormatString), Constants.CreateUploadOperation, post.Username, post.IPAddress, Constants.ImageNotWithinScopeSystemMessage).ConfigureAwait(false); return(SystemUtilityService.CreateResult(Constants.ImageNotWithinScopeUserMessage, result, false)); } var storeID = await _storeService.FindStoreAsync(latitude, longitude).ConfigureAwait(false); if (storeID == Constants.NoStoreFoundCode) { // Log the fact that scope was violated. await _loggingManager.LogAsync(DateTime.UtcNow.ToString(Constants.LoggingFormatString), Constants.CreateUploadOperation, post.Username, post.IPAddress, Constants.NoStoreFoundSystemMessage).ConfigureAwait(false); return(SystemUtilityService.CreateResult(Constants.NoStoreFoundUserMessage, result, false)); } var imagePath = Constants.PhotoFolder + "\\" + post.Username + "_" + TimeUtilityService.CurrentUnixTime() + post.FileExtension; var uploadDTO = new UploadDTO(imagePath, post.Image, post.Category, post.Name, (DateTime)post.PostTime, post.Username, post.Description, post.Rating, post.Price, post.PriceUnit, post.ImageSize); var verification = _uploadService.VerifyUpload(uploadDTO, Constants.MaximumPhotoCharacters, Constants.MinimumPhotoCharacters, Constants.MinimumImageSizeMB, Constants.MaximumImageSizeMB, Constants.ValidImageExtensions, Constants.IngredientNameMaximumCharacters, Constants.IngredientNameMinimumCharacters, Constants.MaximumIngredientPrice, Constants.DescriptionMaximumCharacters, Constants.DescriptionMinimumCharacters, Constants.ExogredientCategories, Constants.ExogredientPriceUnits, Constants.ValidTimeBufferMinutes, Constants.MaximumRating, Constants.MinimumRating); if (!verification.VerificationStatus) { // Log the fact that scope was violated. await _loggingManager.LogAsync(DateTime.UtcNow.ToString(Constants.LoggingFormatString), Constants.CreateUploadOperation, post.Username, post.IPAddress, Constants.UploadNotValidSystemMessage).ConfigureAwait(false); return(SystemUtilityService.CreateResult(verification.Message, result, false)); } Directory.CreateDirectory(Constants.PhotoFolder); post.Image.Save(imagePath); var uploadRecord = new UploadRecord(post.PostTime, post.Username, storeID, post.Description, post.Rating.ToString(), imagePath, post.Price, post.PriceUnit, post.Name, Constants.NoValueInt, Constants.NoValueInt, Constants.NotInProgressStatus, post.Category); await _uploadService.CreateUploadAsync(uploadRecord).ConfigureAwait(false); result = true; } catch (Exception ex) { // Log exception. await _loggingManager.LogAsync(DateTime.UtcNow.ToString(Constants.LoggingFormatString), Constants.CreateUploadOperation, post.Username, post.IPAddress, ex.ToString()).ConfigureAwait(false); // Recursively retry the operation until the maximum amount of retries is reached. await CreateUploadAsync(post, ++failureCount).ConfigureAwait(false); } // Log the fact that the operation was successful. await _loggingManager.LogAsync(DateTime.UtcNow.ToString(Constants.LoggingFormatString), Constants.CreateUploadOperation, post.Username, post.IPAddress).ConfigureAwait(false); return(SystemUtilityService.CreateResult(Constants.UploadCreationSuccessMessage, result, false)); }