Skip to content

Commit bef1cce

Browse files
authored
Exposes the entity containers (folders) created during a package installation in the summary available from the ImportedPackageNotification. (#11303)
* Exposes the entity containers (folders) created during a package installation in the summary available from the ImportedPackageNotification. * Restored original constructors. * Refactored to use out parameters for tracking installed entity containers. * Removed unnecessary variable initialization.
1 parent e786491 commit bef1cce

File tree

2 files changed

+71
-11
lines changed

2 files changed

+71
-11
lines changed

src/Umbraco.Core/Packaging/InstallationSummary.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public InstallationSummary(string packageName)
3232
public IEnumerable<IPartialView> PartialViewsInstalled { get; set; } = Enumerable.Empty<IPartialView>();
3333
public IEnumerable<IContent> ContentInstalled { get; set; } = Enumerable.Empty<IContent>();
3434
public IEnumerable<IMedia> MediaInstalled { get; set; } = Enumerable.Empty<IMedia>();
35+
public IEnumerable<EntityContainer> EntityContainersInstalled { get; set; } = Enumerable.Empty<EntityContainer>();
3536

3637
public override string ToString()
3738
{
@@ -77,6 +78,7 @@ void WriteCount<T>(string message, IEnumerable<T> source, bool appendLine = true
7778
WriteCount("Stylesheets installed: ", StylesheetsInstalled);
7879
WriteCount("Scripts installed: ", ScriptsInstalled);
7980
WriteCount("Partial views installed: ", PartialViewsInstalled);
81+
WriteCount("Entity containers installed: ", EntityContainersInstalled);
8082
WriteCount("Content items installed: ", ContentInstalled);
8183
WriteCount("Media items installed: ", MediaInstalled, false);
8284

src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs

Lines changed: 69 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -91,19 +91,25 @@ public InstallationSummary InstallPackageData(CompiledPackage compiledPackage, i
9191
var installationSummary = new InstallationSummary(compiledPackage.Name)
9292
{
9393
Warnings = compiledPackage.Warnings,
94-
DataTypesInstalled = ImportDataTypes(compiledPackage.DataTypes.ToList(), userId),
94+
DataTypesInstalled = ImportDataTypes(compiledPackage.DataTypes.ToList(), userId, out IEnumerable<EntityContainer> dataTypeEntityContainersInstalled),
9595
LanguagesInstalled = ImportLanguages(compiledPackage.Languages, userId),
9696
DictionaryItemsInstalled = ImportDictionaryItems(compiledPackage.DictionaryItems, userId),
9797
MacrosInstalled = ImportMacros(compiledPackage.Macros, userId),
9898
MacroPartialViewsInstalled = ImportMacroPartialViews(compiledPackage.MacroPartialViews, userId),
9999
TemplatesInstalled = ImportTemplates(compiledPackage.Templates.ToList(), userId),
100-
DocumentTypesInstalled = ImportDocumentTypes(compiledPackage.DocumentTypes, userId),
101-
MediaTypesInstalled = ImportMediaTypes(compiledPackage.MediaTypes, userId),
100+
DocumentTypesInstalled = ImportDocumentTypes(compiledPackage.DocumentTypes, userId, out IEnumerable<EntityContainer> documentTypeEntityContainersInstalled),
101+
MediaTypesInstalled = ImportMediaTypes(compiledPackage.MediaTypes, userId, out IEnumerable<EntityContainer> mediaTypeEntityContainersInstalled),
102102
StylesheetsInstalled = ImportStylesheets(compiledPackage.Stylesheets, userId),
103103
ScriptsInstalled = ImportScripts(compiledPackage.Scripts, userId),
104104
PartialViewsInstalled = ImportPartialViews(compiledPackage.PartialViews, userId)
105105
};
106106

107+
var entityContainersInstalled = new List<EntityContainer>();
108+
entityContainersInstalled.AddRange(dataTypeEntityContainersInstalled);
109+
entityContainersInstalled.AddRange(documentTypeEntityContainersInstalled);
110+
entityContainersInstalled.AddRange(mediaTypeEntityContainersInstalled);
111+
installationSummary.EntityContainersInstalled = entityContainersInstalled;
112+
107113
// We need a reference to the imported doc types to continue
108114
var importedDocTypes = installationSummary.DocumentTypesInstalled.ToDictionary(x => x.Alias, x => x);
109115
var importedMediaTypes = installationSummary.MediaTypesInstalled.ToDictionary(x => x.Alias, x => x);
@@ -116,14 +122,25 @@ public InstallationSummary InstallPackageData(CompiledPackage compiledPackage, i
116122
return installationSummary;
117123
}
118124
}
125+
119126
/// <summary>
120127
/// Imports and saves package xml as <see cref="IContentType"/>
121128
/// </summary>
122129
/// <param name="docTypeElements">Xml to import</param>
123130
/// <param name="userId">Optional id of the User performing the operation. Default is zero (admin).</param>
124131
/// <returns>An enumerable list of generated ContentTypes</returns>
125132
public IReadOnlyList<IMediaType> ImportMediaTypes(IEnumerable<XElement> docTypeElements, int userId)
126-
=> ImportDocumentTypes(docTypeElements.ToList(), true, userId, _mediaTypeService);
133+
=> ImportMediaTypes(docTypeElements, userId, out _);
134+
135+
/// <summary>
136+
/// Imports and saves package xml as <see cref="IContentType"/>
137+
/// </summary>
138+
/// <param name="docTypeElements">Xml to import</param>
139+
/// <param name="userId">Optional id of the User performing the operation. Default is zero (admin).</param>
140+
/// <param name="entityContainersInstalled">Collection of entity containers installed by the package to be populated with those created in installing data types.</param>
141+
/// <returns>An enumerable list of generated ContentTypes</returns>
142+
public IReadOnlyList<IMediaType> ImportMediaTypes(IEnumerable<XElement> docTypeElements, int userId, out IEnumerable<EntityContainer> entityContainersInstalled)
143+
=> ImportDocumentTypes(docTypeElements.ToList(), true, userId, _mediaTypeService, out entityContainersInstalled);
127144

128145
#endregion
129146

@@ -408,7 +425,7 @@ private TContentBase CreateContent<TContentBase, TContentTypeComposition>(string
408425
#region DocumentTypes
409426

410427
public IReadOnlyList<IContentType> ImportDocumentType(XElement docTypeElement, int userId)
411-
=> ImportDocumentTypes(new[] { docTypeElement }, userId);
428+
=> ImportDocumentTypes(new[] { docTypeElement }, userId, out _);
412429

413430
/// <summary>
414431
/// Imports and saves package xml as <see cref="IContentType"/>
@@ -417,7 +434,17 @@ public IReadOnlyList<IContentType> ImportDocumentType(XElement docTypeElement, i
417434
/// <param name="userId">Optional id of the User performing the operation. Default is zero (admin).</param>
418435
/// <returns>An enumerable list of generated ContentTypes</returns>
419436
public IReadOnlyList<IContentType> ImportDocumentTypes(IEnumerable<XElement> docTypeElements, int userId)
420-
=> ImportDocumentTypes(docTypeElements.ToList(), true, userId, _contentTypeService);
437+
=> ImportDocumentTypes(docTypeElements.ToList(), true, userId, _contentTypeService, out _);
438+
439+
/// <summary>
440+
/// Imports and saves package xml as <see cref="IContentType"/>
441+
/// </summary>
442+
/// <param name="docTypeElements">Xml to import</param>
443+
/// <param name="userId">Optional id of the User performing the operation. Default is zero (admin).</param>
444+
/// <param name="entityContainersInstalled">Collection of entity containers installed by the package to be populated with those created in installing data types.</param>
445+
/// <returns>An enumerable list of generated ContentTypes</returns>
446+
public IReadOnlyList<IContentType> ImportDocumentTypes(IEnumerable<XElement> docTypeElements, int userId, out IEnumerable<EntityContainer> entityContainersInstalled)
447+
=> ImportDocumentTypes(docTypeElements.ToList(), true, userId, _contentTypeService, out entityContainersInstalled);
421448

422449
/// <summary>
423450
/// Imports and saves package xml as <see cref="IContentType"/>
@@ -428,6 +455,18 @@ public IReadOnlyList<IContentType> ImportDocumentTypes(IEnumerable<XElement> doc
428455
/// <returns>An enumerable list of generated ContentTypes</returns>
429456
public IReadOnlyList<T> ImportDocumentTypes<T>(IReadOnlyCollection<XElement> unsortedDocumentTypes, bool importStructure, int userId, IContentTypeBaseService<T> service)
430457
where T : class, IContentTypeComposition
458+
=> ImportDocumentTypes(unsortedDocumentTypes, importStructure, userId, service);
459+
460+
/// <summary>
461+
/// Imports and saves package xml as <see cref="IContentType"/>
462+
/// </summary>
463+
/// <param name="unsortedDocumentTypes">Xml to import</param>
464+
/// <param name="importStructure">Boolean indicating whether or not to import the </param>
465+
/// <param name="userId">Optional id of the User performing the operation. Default is zero (admin).</param>
466+
/// <param name="entityContainersInstalled">Collection of entity containers installed by the package to be populated with those created in installing data types.</param>
467+
/// <returns>An enumerable list of generated ContentTypes</returns>
468+
public IReadOnlyList<T> ImportDocumentTypes<T>(IReadOnlyCollection<XElement> unsortedDocumentTypes, bool importStructure, int userId, IContentTypeBaseService<T> service, out IEnumerable<EntityContainer> entityContainersInstalled)
469+
where T : class, IContentTypeComposition
431470
{
432471
var importedContentTypes = new Dictionary<string, T>();
433472

@@ -436,7 +475,7 @@ public IReadOnlyList<T> ImportDocumentTypes<T>(IReadOnlyCollection<XElement> uns
436475
var graph = new TopoGraph<string, TopoGraph.Node<string, XElement>>(x => x.Key, x => x.Dependencies);
437476
var isSingleDocTypeImport = unsortedDocumentTypes.Count == 1;
438477

439-
var importedFolders = CreateContentTypeFolderStructure(unsortedDocumentTypes);
478+
var importedFolders = CreateContentTypeFolderStructure(unsortedDocumentTypes, out entityContainersInstalled);
440479

441480
if (isSingleDocTypeImport == false)
442481
{
@@ -532,9 +571,10 @@ public IReadOnlyList<T> ImportDocumentTypes<T>(IReadOnlyCollection<XElement> uns
532571
return list;
533572
}
534573

535-
private Dictionary<string, int> CreateContentTypeFolderStructure(IEnumerable<XElement> unsortedDocumentTypes)
574+
private Dictionary<string, int> CreateContentTypeFolderStructure(IEnumerable<XElement> unsortedDocumentTypes, out IEnumerable<EntityContainer> entityContainersInstalled)
536575
{
537576
var importedFolders = new Dictionary<string, int>();
577+
var trackEntityContainersInstalled = new List<EntityContainer>();
538578
foreach (var documentType in unsortedDocumentTypes)
539579
{
540580
var foldersAttribute = documentType.Attribute("Folders");
@@ -578,8 +618,10 @@ private Dictionary<string, int> CreateContentTypeFolderStructure(IEnumerable<XEl
578618
_logger.LogError(tryCreateFolder.Exception, "Could not create folder: {FolderName}", rootFolder);
579619
throw tryCreateFolder.Exception;
580620
}
621+
581622
var rootFolderId = tryCreateFolder.Result.Entity.Id;
582623
current = _contentTypeService.GetContainer(rootFolderId);
624+
trackEntityContainersInstalled.Add(current);
583625
}
584626

585627
importedFolders.Add(alias, current.Id);
@@ -589,11 +631,13 @@ private Dictionary<string, int> CreateContentTypeFolderStructure(IEnumerable<XEl
589631
var folderName = WebUtility.UrlDecode(folders[i]);
590632
Guid? folderKey = (folderKeys.Length == folders.Length) ? folderKeys[i] : null;
591633
current = CreateContentTypeChildFolder(folderName, folderKey ?? Guid.NewGuid(), current);
634+
trackEntityContainersInstalled.Add(current);
592635
importedFolders[alias] = current.Id;
593636
}
594637
}
595638
}
596639

640+
entityContainersInstalled = trackEntityContainersInstalled;
597641
return importedFolders;
598642
}
599643

@@ -1012,10 +1056,20 @@ private T FindContentTypeByAlias<T>(string contentTypeAlias, IContentTypeBaseSer
10121056
/// <param name="userId">Optional id of the user</param>
10131057
/// <returns>An enumerable list of generated DataTypeDefinitions</returns>
10141058
public IReadOnlyList<IDataType> ImportDataTypes(IReadOnlyCollection<XElement> dataTypeElements, int userId)
1059+
=> ImportDataTypes(dataTypeElements, userId, out _);
1060+
1061+
/// <summary>
1062+
/// Imports and saves package xml as <see cref="IDataType"/>
1063+
/// </summary>
1064+
/// <param name="dataTypeElements">Xml to import</param>
1065+
/// <param name="userId">Optional id of the user</param>
1066+
/// <param name="entityContainersInstalled">Collection of entity containers installed by the package to be populated with those created in installing data types.</param>
1067+
/// <returns>An enumerable list of generated DataTypeDefinitions</returns>
1068+
public IReadOnlyList<IDataType> ImportDataTypes(IReadOnlyCollection<XElement> dataTypeElements, int userId, out IEnumerable<EntityContainer> entityContainersInstalled)
10151069
{
10161070
var dataTypes = new List<IDataType>();
10171071

1018-
var importedFolders = CreateDataTypeFolderStructure(dataTypeElements);
1072+
var importedFolders = CreateDataTypeFolderStructure(dataTypeElements, out entityContainersInstalled);
10191073

10201074
foreach (var dataTypeElement in dataTypeElements)
10211075
{
@@ -1072,9 +1126,10 @@ public IReadOnlyList<IDataType> ImportDataTypes(IReadOnlyCollection<XElement> da
10721126
return dataTypes;
10731127
}
10741128

1075-
private Dictionary<string, int> CreateDataTypeFolderStructure(IEnumerable<XElement> datatypeElements)
1129+
private Dictionary<string, int> CreateDataTypeFolderStructure(IEnumerable<XElement> datatypeElements, out IEnumerable<EntityContainer> entityContainersInstalled)
10761130
{
10771131
var importedFolders = new Dictionary<string, int>();
1132+
var trackEntityContainersInstalled = new List<EntityContainer>();
10781133
foreach (var datatypeElement in datatypeElements)
10791134
{
10801135
var foldersAttribute = datatypeElement.Attribute("Folders");
@@ -1103,7 +1158,9 @@ private Dictionary<string, int> CreateDataTypeFolderStructure(IEnumerable<XEleme
11031158
_logger.LogError(tryCreateFolder.Exception, "Could not create folder: {FolderName}", rootFolder);
11041159
throw tryCreateFolder.Exception;
11051160
}
1161+
11061162
current = _dataTypeService.GetContainer(tryCreateFolder.Result.Entity.Id);
1163+
trackEntityContainersInstalled.Add(current);
11071164
}
11081165

11091166
importedFolders.Add(name, current.Id);
@@ -1113,11 +1170,12 @@ private Dictionary<string, int> CreateDataTypeFolderStructure(IEnumerable<XEleme
11131170
var folderName = WebUtility.UrlDecode(folders[i]);
11141171
Guid? folderKey = (folderKeys.Length == folders.Length) ? folderKeys[i] : null;
11151172
current = CreateDataTypeChildFolder(folderName, folderKey ?? Guid.NewGuid(), current);
1173+
trackEntityContainersInstalled.Add(current);
11161174
importedFolders[name] = current.Id;
11171175
}
11181176
}
11191177
}
1120-
1178+
entityContainersInstalled = trackEntityContainersInstalled;
11211179
return importedFolders;
11221180
}
11231181

0 commit comments

Comments
 (0)