public async Task A23_PhotoDeleteAndRestoreTest() { var db = await Db.Context(); var treePhoto = db.PhotoContents.Single(x => x.Title == IronwoodPhotoInfo.IronwoodTreeContent02_SlugTitleSummaryTagsUpdateNotesUpdatedBy.Title); var preDeleteTreePhotoHistoricEntryCount = db.HistoricPhotoContents.Count(x => x.ContentId == treePhoto.ContentId); await Db.DeletePhotoContent(treePhoto.ContentId, DebugTrackers.DebugProgressTracker()); var postDeleteTreePhotoHistoricEntryCount = db.HistoricPhotoContents.Count(x => x.ContentId == treePhoto.ContentId); Assert.AreEqual(preDeleteTreePhotoHistoricEntryCount + 1, postDeleteTreePhotoHistoricEntryCount, "After deleting the historic entry count should have increased by one but " + $"found {preDeleteTreePhotoHistoricEntryCount} entries before and {postDeleteTreePhotoHistoricEntryCount} entries after?"); Assert.IsEmpty(db.PhotoContents.Where(x => x.ContentId == treePhoto.ContentId).ToList(), $"Photo Content Id {treePhoto.ContentId} still" + "found in DB after delete."); var deletedItem = await Db.DeletedPhotoContent(); Assert.AreEqual(1, deletedItem.Count, $"There should be one deleted content return - found {deletedItem.Count}"); Assert.AreEqual(treePhoto.ContentId, deletedItem.First().ContentId, "Deleted Item doesn't have the correct Content Id"); var latestHistoricEntry = db.HistoricPhotoContents.Where(x => x.ContentId == treePhoto.ContentId) .OrderByDescending(x => x.ContentVersion).First(); Assert.AreEqual(latestHistoricEntry.Id, latestHistoricEntry.Id, "Deleted Item doesn't match the Id of the last historic entry?"); var saveAgainResult = await PhotoGenerator.SaveAndGenerateHtml(treePhoto, UserSettingsSingleton.CurrentSettings().LocalMediaArchivePhotoContentFile(treePhoto), true, null, DebugTrackers.DebugProgressTracker()); Assert.IsFalse(saveAgainResult.generationReturn.HasError, $"Error Saving after Deleting? {saveAgainResult.generationReturn.GenerationNote}"); }
public async Task A10_Photo1705Ironwood02Import() { var fullSizePhotoTest = new FileInfo(Path.Combine(Directory.GetCurrentDirectory(), "IronwoodTestContent", PhotoPhotoMayIronwood02FileName)); Assert.True(fullSizePhotoTest.Exists, "Test File Found"); var(metadataGenerationReturn, newPhotoContent) = await PhotoGenerator.PhotoMetadataToNewPhotoContent(fullSizePhotoTest, DebugProgressTracker()); Assert.False(metadataGenerationReturn.HasError, metadataGenerationReturn.GenerationNote); var photoComparison = PhotoComparePhotoReferenceToPhotoObject(PhotoMayIronwood02Reference, newPhotoContent); Assert.True(photoComparison.areSame, photoComparison.comparisonNotes); var validationReturn = await PhotoGenerator.Validate(newPhotoContent, fullSizePhotoTest); Assert.False(validationReturn.HasError, $"Unexpected Validation Error - {validationReturn.GenerationNote}"); var saveReturn = await PhotoGenerator.SaveAndGenerateHtml(newPhotoContent, fullSizePhotoTest, true, DebugProgressTracker()); Assert.False(saveReturn.generationReturn.HasError, $"Unexpected Save Error - {saveReturn.generationReturn.GenerationNote}"); Assert.IsTrue(newPhotoContent.MainPicture == newPhotoContent.ContentId, $"Main Picture - {newPhotoContent.MainPicture} - Should be set to Content Id {newPhotoContent.ContentId}"); PhotoCheckOriginalFileInContentAndMediaArchiveAfterHtmlGeneration(newPhotoContent); PhotoCheckFileCountAndPictureAssetsAfterHtmlGeneration(newPhotoContent, PhotoMayIronwood02Width); PhotoJsonTest(newPhotoContent); PhotoHtmlChecks(newPhotoContent); }
public static async Task <(bool hasError, string errorMessage)> SaveAndGenerateHtmlFromExcelImport( ExcelContentTableImportResults contentTableImportResult, IProgress <string> progress) { var errorList = new List <string>(); var totalToUpdate = contentTableImportResult.ToUpdate.Count; var currentUpdate = 0; foreach (var loopUpdates in contentTableImportResult.ToUpdate) { currentUpdate++; progress?.Report($"Excel Import Update {currentUpdate} of {totalToUpdate}"); GenerationReturn generationResult; switch (loopUpdates.ToUpdate) { case PhotoContent photo: { generationResult = (await PhotoGenerator.SaveAndGenerateHtml(photo, UserSettingsSingleton.CurrentSettings().LocalMediaArchivePhotoContentFile(photo), false, null, progress)).generationReturn; break; } case FileContent file: { generationResult = (await FileGenerator.SaveAndGenerateHtml(file, UserSettingsSingleton.CurrentSettings().LocalMediaArchiveFileContentFile(file), false, null, progress)).generationReturn; break; } case ImageContent image: { generationResult = (await ImageGenerator.SaveAndGenerateHtml(image, UserSettingsSingleton.CurrentSettings().LocalMediaArchiveImageContentFile(image), false, null, progress)).generationReturn; break; } case PointContentDto point: { generationResult = (await PointGenerator.SaveAndGenerateHtml(point, null, progress)) .generationReturn; break; } case PostContent post: { generationResult = (await PostGenerator.SaveAndGenerateHtml(post, null, progress)) .generationReturn; break; } case NoteContent note: { generationResult = (await NoteGenerator.SaveAndGenerateHtml(note, null, progress)) .generationReturn; break; } case LinkContent link: { generationResult = (await LinkGenerator.SaveAndGenerateHtml(link, null, progress)) .generationReturn; break; } default: generationResult = await GenerationReturn.Error("Excel Import - No Content Type Generator found?"); break; } if (!generationResult.HasError) { progress?.Report( $"Updated Content Id {loopUpdates.ToUpdate.ContentId} - Title {loopUpdates.Title} - Saved"); } else { errorList.Add( $"Updating Failed: Content Id {loopUpdates} - Title {loopUpdates.Title} - Failed:{Environment.NewLine}{generationResult.GenerationNote}"); } } if (errorList.Any()) { return(true, string.Join(Environment.NewLine, errorList)); } return(false, string.Empty); }
public static async Task <ExcelContentTableImportResults> ImportExcelContentTable(IXLRange toProcess, IProgress <string> progress) { if (toProcess == null || toProcess.Rows().Count() < 2) { return new ExcelContentTableImportResults { HasError = true, ErrorNotes = "Nothing to process", ToUpdate = new List <ExcelImportContentUpdateSuggestion>() } } ; var headerInfo = new ExcelHeaderRow(toProcess.Row(1)); var errorNotes = new List <string>(); var updateList = new List <ExcelImportContentUpdateSuggestion>(); var db = await Db.Context(); var lastRow = toProcess.Rows().Last().RowNumber(); progress?.Report($"{lastRow} to Process"); foreach (var loopRow in toProcess.Rows().Skip(1)) { var importResult = await ImportContentFromExcelRow(headerInfo, loopRow); if (importResult.hasError) { errorNotes.Add($"Excel Row {loopRow.RowNumber()} - {importResult.errorNotes}"); continue; } try { Db.DefaultPropertyCleanup(importResult.processContent); importResult.processContent.Tags = Db.TagListCleanup(importResult.processContent.Tags); } catch { await EventLogContext.TryWriteDiagnosticMessageToLog( $"Excel Row {loopRow.RowNumber()} - Excel Import via dynamics - Tags threw an error on ContentId {importResult.processContent.ContentId ?? "New Entry"} - property probably not present", "Excel Import"); continue; } Guid contentId = importResult.processContent.ContentId; int contentDbId = importResult.processContent.Id; string differenceString; if (contentDbId > 0) { var currentDbEntry = await db.ContentFromContentId(contentId); var compareLogic = new CompareLogic { Config = { MembersToIgnore = new List <string> { "LastUpdatedBy" }, MaxDifferences= 100 } }; ComparisonResult comparisonResult = compareLogic.Compare(currentDbEntry, importResult.processContent); if (comparisonResult.AreEqual) { progress?.Report( $"Excel Row {loopRow.RowNumber()} of {lastRow} - No Changes - Title: {currentDbEntry.Title}"); continue; } var friendlyReport = new UserFriendlyReport(); differenceString = friendlyReport.OutputString(comparisonResult.Differences); importResult.processContent.LastUpdatedOn = DateTime.Now; } else { differenceString = "New Entry"; } GenerationReturn validationResult; switch (importResult.processContent) { case PhotoContent p: validationResult = await PhotoGenerator.Validate(p, UserSettingsSingleton.CurrentSettings().LocalMediaArchivePhotoContentFile(p)); break; case FileContent f: validationResult = await FileGenerator.Validate(f, UserSettingsSingleton.CurrentSettings().LocalMediaArchiveFileContentFile(f)); break; case ImageContent i: validationResult = await ImageGenerator.Validate(i, UserSettingsSingleton.CurrentSettings().LocalMediaArchiveImageContentFile(i)); break; case PointContentDto pc: validationResult = await PointGenerator.Validate(pc); break; case PostContent pc: validationResult = await PostGenerator.Validate(pc); break; case LinkContent l: validationResult = await LinkGenerator.Validate(l); break; case NoteContent n: validationResult = await NoteGenerator.Validate(n); break; default: validationResult = await GenerationReturn.Error("Excel Import - No Content Type Generator found?"); break; } if (validationResult.HasError) { errorNotes.Add($"Excel Row {loopRow.RowNumber()} - {validationResult.GenerationNote}"); progress?.Report($"Excel Row {loopRow.RowNumber()} of {lastRow} - Validation Error."); continue; } updateList.Add(new ExcelImportContentUpdateSuggestion { DifferenceNotes = differenceString, Title = importResult.processContent.Title, ToUpdate = importResult.processContent }); progress?.Report( $"Excel Row {loopRow.RowNumber()} of {lastRow} - Adding To Changed List ({updateList.Count}) - Title: {importResult.processContent.Title}"); } if (!errorNotes.Any()) { var internalContentIdDuplicates = updateList.Select(x => x.ToUpdate).GroupBy(x => x.ContentId) .Where(x => x.Count() > 1).Select(x => x.Key).Cast <Guid>().ToList(); if (internalContentIdDuplicates.Any()) { return new ExcelContentTableImportResults { HasError = true, ErrorNotes = $"Content Ids can only appear once in an update list - {string.Join(", ", internalContentIdDuplicates)}", ToUpdate = updateList } } ; var internalSlugDuplicates = updateList.Select(x => x.ToUpdate).Where(x => !(x is LinkContent)) .GroupBy(x => x.Slug).Where(x => x.Count() > 1).Select(x => x.Key).Cast <string>().ToList(); if (internalSlugDuplicates.Any()) { return new ExcelContentTableImportResults { HasError = true, ErrorNotes = $"This import appears to create duplicate slugs - {string.Join(", ", internalSlugDuplicates)}", ToUpdate = updateList } } ; } return(new ExcelContentTableImportResults { HasError = errorNotes.Any(), ErrorNotes = string.Join(Environment.NewLine, errorNotes), ToUpdate = updateList }); }