Use scopes in PackaginService (#14343)

This commit is contained in:
Mole
2023-06-06 12:00:53 +02:00
committed by GitHub
parent 2dd7d610da
commit 4744d711ed
2 changed files with 112 additions and 16 deletions

View File

@@ -2,16 +2,19 @@ using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.IO.Compression;
using System.Xml.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using NPoco;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Core.Hosting;
using Umbraco.Cms.Core.IO;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Packaging;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Infrastructure.Persistence.Dtos;
using Umbraco.Cms.Infrastructure.Scoping;
using Umbraco.Extensions;
using File = System.IO.File;
@@ -22,6 +25,7 @@ public class CreatedPackageSchemaRepository : ICreatedPackagesRepository
{
private readonly IContentService _contentService;
private readonly IContentTypeService _contentTypeService;
private readonly IScopeAccessor _scopeAccessor;
private readonly string _createdPackagesFolderPath;
private readonly IDataTypeService _dataTypeService;
private readonly IFileService _fileService;
@@ -34,7 +38,6 @@ public class CreatedPackageSchemaRepository : ICreatedPackagesRepository
private readonly IMediaTypeService _mediaTypeService;
private readonly IEntityXmlSerializer _serializer;
private readonly string _tempFolderPath;
private readonly IUmbracoDatabase? _umbracoDatabase;
private readonly PackageDefinitionXmlParser _xmlParser;
/// <summary>
@@ -55,10 +58,10 @@ public class CreatedPackageSchemaRepository : ICreatedPackagesRepository
MediaFileManager mediaFileManager,
IMacroService macroService,
IContentTypeService contentTypeService,
IScopeAccessor scopeAccessor,
string? mediaFolderPath = null,
string? tempFolderPath = null)
{
_umbracoDatabase = umbracoDatabaseFactory.CreateDatabase();
_hostingEnvironment = hostingEnvironment;
_fileSystems = fileSystems;
_serializer = serializer;
@@ -71,21 +74,63 @@ public class CreatedPackageSchemaRepository : ICreatedPackagesRepository
_mediaFileManager = mediaFileManager;
_macroService = macroService;
_contentTypeService = contentTypeService;
_scopeAccessor = scopeAccessor;
_xmlParser = new PackageDefinitionXmlParser();
_createdPackagesFolderPath = mediaFolderPath ?? Constants.SystemDirectories.CreatedPackages;
_tempFolderPath = tempFolderPath ?? Constants.SystemDirectories.TempData + "/PackageFiles";
}
[Obsolete("use ctor with all dependencies instead")]
public CreatedPackageSchemaRepository(
IUmbracoDatabaseFactory umbracoDatabaseFactory,
IHostingEnvironment hostingEnvironment,
IOptions<GlobalSettings> globalSettings,
FileSystems fileSystems,
IEntityXmlSerializer serializer,
IDataTypeService dataTypeService,
ILocalizationService localizationService,
IFileService fileService,
IMediaService mediaService,
IMediaTypeService mediaTypeService,
IContentService contentService,
MediaFileManager mediaFileManager,
IMacroService macroService,
IContentTypeService contentTypeService,
string? mediaFolderPath = null,
string? tempFolderPath = null)
: this(
umbracoDatabaseFactory,
hostingEnvironment,
globalSettings,
fileSystems,
serializer,
dataTypeService,
localizationService,
fileService,
mediaService,
mediaTypeService,
contentService,
mediaFileManager,
macroService,
contentTypeService,
StaticServiceProvider.Instance.GetRequiredService<IScopeAccessor>(),
mediaFolderPath,
tempFolderPath)
{
}
private IUmbracoDatabase Database => _scopeAccessor.AmbientScope?.Database ?? throw new InvalidOperationException("A scope is required to query the database");
public IEnumerable<PackageDefinition> GetAll()
{
Sql<ISqlContext> query = new Sql<ISqlContext>(_umbracoDatabase!.SqlContext)
Sql<ISqlContext> query = new Sql<ISqlContext>(Database.SqlContext)
.Select<CreatedPackageSchemaDto>()
.From<CreatedPackageSchemaDto>()
.OrderBy<CreatedPackageSchemaDto>(x => x.Id);
var packageDefinitions = new List<PackageDefinition>();
List<CreatedPackageSchemaDto> xmlSchemas = _umbracoDatabase.Fetch<CreatedPackageSchemaDto>(query);
List<CreatedPackageSchemaDto> xmlSchemas = Database.Fetch<CreatedPackageSchemaDto>(query);
foreach (CreatedPackageSchemaDto packageSchema in xmlSchemas)
{
var packageDefinition = _xmlParser.ToPackageDefinition(XElement.Parse(packageSchema.Value));
@@ -103,11 +148,11 @@ public class CreatedPackageSchemaRepository : ICreatedPackagesRepository
public PackageDefinition? GetById(int id)
{
Sql<ISqlContext> query = new Sql<ISqlContext>(_umbracoDatabase!.SqlContext)
Sql<ISqlContext> query = new Sql<ISqlContext>(Database.SqlContext)
.Select<CreatedPackageSchemaDto>()
.From<CreatedPackageSchemaDto>()
.Where<CreatedPackageSchemaDto>(x => x.Id == id);
List<CreatedPackageSchemaDto> schemaDtos = _umbracoDatabase.Fetch<CreatedPackageSchemaDto>(query);
List<CreatedPackageSchemaDto> schemaDtos = Database.Fetch<CreatedPackageSchemaDto>(query);
if (schemaDtos.IsCollectionEmpty())
{
@@ -135,11 +180,11 @@ public class CreatedPackageSchemaRepository : ICreatedPackagesRepository
File.Delete(packageDef.PackagePath);
}
Sql<ISqlContext> query = new Sql<ISqlContext>(_umbracoDatabase!.SqlContext)
Sql<ISqlContext> query = new Sql<ISqlContext>(Database.SqlContext)
.Delete<CreatedPackageSchemaDto>()
.Where<CreatedPackageSchemaDto>(x => x.Id == id);
_umbracoDatabase.Execute(query);
Database.Execute(query);
}
public bool SavePackage(PackageDefinition? definition)
@@ -169,7 +214,7 @@ public class CreatedPackageSchemaRepository : ICreatedPackagesRepository
};
// Set the ids, we have to save in database first to get the Id
_umbracoDatabase!.Insert(dto);
Database!.Insert(dto);
definition.Id = dto.Id;
}
@@ -185,7 +230,7 @@ public class CreatedPackageSchemaRepository : ICreatedPackagesRepository
PackageId = definition.PackageId,
UpdateDate = DateTime.Now,
};
_umbracoDatabase?.Update(updatedDto);
Database?.Update(updatedDto);
return true;
}

View File

@@ -1,10 +1,13 @@
using System.Xml.Linq;
using Microsoft.Extensions.DependencyInjection;
using Umbraco.Cms.Core.DependencyInjection;
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.Cms.Core.Scoping;
using Umbraco.Extensions;
using File = System.IO.File;
@@ -23,6 +26,7 @@ public class PackagingService : IPackagingService
private readonly IManifestParser _manifestParser;
private readonly IPackageInstallation _packageInstallation;
private readonly PackageMigrationPlanCollection _packageMigrationPlans;
private readonly ICoreScopeProvider _coreScopeProvider;
public PackagingService(
IAuditService auditService,
@@ -31,7 +35,8 @@ public class PackagingService : IPackagingService
IEventAggregator eventAggregator,
IManifestParser manifestParser,
IKeyValueService keyValueService,
PackageMigrationPlanCollection packageMigrationPlans)
PackageMigrationPlanCollection packageMigrationPlans,
ICoreScopeProvider coreScopeProvider)
{
_auditService = auditService;
_createdPackages = createdPackages;
@@ -40,6 +45,28 @@ public class PackagingService : IPackagingService
_manifestParser = manifestParser;
_keyValueService = keyValueService;
_packageMigrationPlans = packageMigrationPlans;
_coreScopeProvider = coreScopeProvider;
}
[Obsolete("Use the ctor which is not obsolete, scheduled for removal in v15")]
public PackagingService(
IAuditService auditService,
ICreatedPackagesRepository createdPackages,
IPackageInstallation packageInstallation,
IEventAggregator eventAggregator,
IManifestParser manifestParser,
IKeyValueService keyValueService,
PackageMigrationPlanCollection packageMigrationPlans)
: this(
auditService,
createdPackages,
packageInstallation,
eventAggregator,
manifestParser,
keyValueService,
packageMigrationPlans,
StaticServiceProvider.Instance.GetRequiredService<ICoreScopeProvider>())
{
}
#region Installation
@@ -93,6 +120,7 @@ public class PackagingService : IPackagingService
public void DeleteCreatedPackage(int id, int userId = Constants.Security.SuperUserId)
{
using ICoreScope scope = _coreScopeProvider.CreateCoreScope();
PackageDefinition? package = GetCreatedPackageById(id);
if (package == null)
{
@@ -101,21 +129,44 @@ public class PackagingService : IPackagingService
_auditService.Add(AuditType.PackagerUninstall, userId, -1, "Package", $"Created package '{package.Name}' deleted. Package id: {package.Id}");
_createdPackages.Delete(id);
scope.Complete();
}
public IEnumerable<PackageDefinition?> GetAllCreatedPackages() => _createdPackages.GetAll();
public IEnumerable<PackageDefinition?> GetAllCreatedPackages()
{
using ICoreScope scope = _coreScopeProvider.CreateCoreScope(autoComplete: true);
return _createdPackages.GetAll();
}
public PackageDefinition? GetCreatedPackageById(int id) => _createdPackages.GetById(id);
public PackageDefinition? GetCreatedPackageById(int id)
{
using ICoreScope scope = _coreScopeProvider.CreateCoreScope(autoComplete: true);
return _createdPackages.GetById(id);
}
public bool SaveCreatedPackage(PackageDefinition definition) => _createdPackages.SavePackage(definition);
public bool SaveCreatedPackage(PackageDefinition definition)
{
using ICoreScope scope = _coreScopeProvider.CreateCoreScope();
public string ExportCreatedPackage(PackageDefinition definition) => _createdPackages.ExportPackage(definition);
var success = _createdPackages.SavePackage(definition);
scope.Complete();
return success;
}
public string ExportCreatedPackage(PackageDefinition definition)
{
using ICoreScope scope = _coreScopeProvider.CreateCoreScope(autoComplete: true);
return _createdPackages.ExportPackage(definition);
}
public InstalledPackage? GetInstalledPackageByName(string packageName)
=> GetAllInstalledPackages().Where(x => x.PackageName?.InvariantEquals(packageName) ?? false).FirstOrDefault();
public IEnumerable<InstalledPackage> GetAllInstalledPackages()
{
using ICoreScope scope = _coreScopeProvider.CreateCoreScope(autoComplete: true);
IReadOnlyDictionary<string, string?>? keyValues = _keyValueService.FindByKeyPrefix(Constants.Conventions.Migrations.KeyValuePrefix);
var installedPackages = new List<InstalledPackage>();
@@ -145,7 +196,7 @@ public class PackagingService : IPackagingService
installedPackages.Add(installedPackage);
}
if (installedPackage.Version is null &&
plan.GetType().Assembly.TryGetInformationalVersion(out string? version))
{