Files
Umbraco-CMS/src/Umbraco.Infrastructure/Services/Implement/PackagingService.cs

174 lines
7.1 KiB
C#
Raw Normal View History

using System;
2017-12-28 09:18:09 +01:00
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using Umbraco.Cms.Core.Events;
using Umbraco.Cms.Core.Manifest;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.Packaging;
using Umbraco.Cms.Core.Notifications;
using Umbraco.Cms.Core.Packaging;
using Umbraco.Extensions;
2017-12-28 09:18:09 +01:00
namespace Umbraco.Cms.Core.Services.Implement
2017-12-28 09:18:09 +01:00
{
/// <summary>
/// Represents the Packaging Service, which provides import/export functionality for the Core models of the API
/// using xml representation. This is primarily used by the Package functionality.
/// </summary>
public class PackagingService : IPackagingService
{
private readonly IPackageInstallation _packageInstallation;
private readonly IEventAggregator _eventAggregator;
private readonly IManifestParser _manifestParser;
private readonly IKeyValueService _keyValueService;
private readonly PackageMigrationPlanCollection _packageMigrationPlans;
private readonly IAuditService _auditService;
private readonly ICreatedPackagesRepository _createdPackages;
2017-12-28 09:18:09 +01:00
public PackagingService(
IAuditService auditService,
ICreatedPackagesRepository createdPackages,
2019-11-13 21:00:54 +01:00
IPackageInstallation packageInstallation,
IEventAggregator eventAggregator,
IManifestParser manifestParser,
IKeyValueService keyValueService,
PackageMigrationPlanCollection packageMigrationPlans)
{
_auditService = auditService;
_createdPackages = createdPackages;
_packageInstallation = packageInstallation;
_eventAggregator = eventAggregator;
_manifestParser = manifestParser;
_keyValueService = keyValueService;
_packageMigrationPlans = packageMigrationPlans;
2017-12-28 09:18:09 +01:00
}
#region Installation
2022-02-22 13:35:32 +01:00
public CompiledPackage GetCompiledPackageInfo(XDocument? xml) => _packageInstallation.ReadPackage(xml);
2022-02-22 13:35:32 +01:00
public InstallationSummary InstallCompiledPackageData(XDocument? packageXml, int userId = Constants.Security.SuperUserId)
2017-12-28 09:18:09 +01:00
{
CompiledPackage compiledPackage = GetCompiledPackageInfo(packageXml);
if (compiledPackage == null)
{
throw new InvalidOperationException("Could not read the package file " + packageXml);
}
// Trigger the Importing Package Notification and stop execution if event/user is cancelling it
var importingPackageNotification = new ImportingPackageNotification(compiledPackage.Name);
if (_eventAggregator.PublishCancelable(importingPackageNotification))
{
2021-06-11 12:47:35 -06:00
return new InstallationSummary(compiledPackage.Name);
}
var summary = _packageInstallation.InstallPackageData(compiledPackage, userId, out _);
_auditService.Add(AuditType.PackagerInstall, userId, -1, "Package", $"Package data installed for package '{compiledPackage.Name}'.");
// trigger the ImportedPackage event
_eventAggregator.Publish(new ImportedPackageNotification(summary).WithStateFrom(importingPackageNotification));
2019-01-15 22:08:08 +11:00
return summary;
}
public InstallationSummary InstallCompiledPackageData(FileInfo packageXmlFile, int userId = Constants.Security.SuperUserId)
{
XDocument xml;
using (StreamReader streamReader = System.IO.File.OpenText(packageXmlFile.FullName))
{
xml = XDocument.Load(streamReader);
}
return InstallCompiledPackageData(xml, userId);
}
2017-12-28 09:18:09 +01:00
#endregion
#region Created/Installed Package Repositories
public void DeleteCreatedPackage(int id, int userId = Cms.Core.Constants.Security.SuperUserId)
{
var package = GetCreatedPackageById(id);
if (package == null) return;
_auditService.Add(AuditType.PackagerUninstall, userId, -1, "Package", $"Created package '{package.Name}' deleted. Package id: {package.Id}");
_createdPackages.Delete(id);
}
2022-02-22 13:35:32 +01:00
public IEnumerable<PackageDefinition?> GetAllCreatedPackages() => _createdPackages.GetAll();
2022-02-22 13:35:32 +01:00
public PackageDefinition? GetCreatedPackageById(int id) => _createdPackages.GetById(id);
public bool SaveCreatedPackage(PackageDefinition definition) => _createdPackages.SavePackage(definition);
public string ExportCreatedPackage(PackageDefinition definition) => _createdPackages.ExportPackage(definition);
2022-02-22 13:35:32 +01:00
public InstalledPackage? GetInstalledPackageByName(string packageName)
=> GetAllInstalledPackages().Where(x => x.PackageName?.InvariantEquals(packageName) ?? false).FirstOrDefault();
2021-06-18 12:45:22 -06:00
public IEnumerable<InstalledPackage> GetAllInstalledPackages()
{
2022-02-24 14:39:29 +01:00
IReadOnlyDictionary<string, string?>? keyValues = _keyValueService.FindByKeyPrefix(Constants.Conventions.Migrations.KeyValuePrefix);
var installedPackages = new Dictionary<string, InstalledPackage>();
// Collect the package from the package migration plans
foreach (PackageMigrationPlan plan in _packageMigrationPlans)
{
2022-02-22 13:35:32 +01:00
if (!installedPackages.TryGetValue(plan.PackageName, out InstalledPackage? installedPackage))
{
installedPackage = new InstalledPackage
{
PackageName = plan.PackageName
};
installedPackages.Add(plan.PackageName, installedPackage);
}
var currentPlans = installedPackage.PackageMigrationPlans.ToList();
2022-02-24 14:39:29 +01:00
if (keyValues is null || keyValues.TryGetValue(Constants.Conventions.Migrations.KeyValuePrefix + plan.Name,
out var currentState))
{
currentState = null;
}
currentPlans.Add(new InstalledPackageMigrationPlans
{
CurrentMigrationId = currentState,
FinalMigrationId = plan.FinalState
});
installedPackage.PackageMigrationPlans = currentPlans;
}
// Collect and merge the packages from the manifests
foreach (PackageManifest package in _manifestParser.GetManifests())
{
2022-02-28 13:14:02 +01:00
if (package.PackageName is null)
{
continue;
}
2022-02-22 13:35:32 +01:00
if (!installedPackages.TryGetValue(package.PackageName, out InstalledPackage? installedPackage))
{
installedPackage = new InstalledPackage
{
PackageName = package.PackageName
};
installedPackages.Add(package.PackageName, installedPackage);
}
installedPackage.PackageView = package.PackageView;
}
// Return all packages with a name in the package.manifest or package migrations
return installedPackages.Values;
}
2017-12-28 09:18:09 +01:00
#endregion
}
}