コード例 #1
0
        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}");
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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
            });
        }