From 4744d711ed8673eaf88bf30e05394f8a35bf8e78 Mon Sep 17 00:00:00 2001 From: Mole Date: Tue, 6 Jun 2023 12:00:53 +0200 Subject: [PATCH] Use scopes in PackaginService (#14343) --- .../CreatedPackageSchemaRepository.cs | 65 ++++++++++++++++--- .../Services/Implement/PackagingService.cs | 63 ++++++++++++++++-- 2 files changed, 112 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/CreatedPackageSchemaRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/CreatedPackageSchemaRepository.cs index 9f921266ca..61f0fe126d 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/CreatedPackageSchemaRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/CreatedPackageSchemaRepository.cs @@ -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; /// @@ -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, + 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(), + mediaFolderPath, + tempFolderPath) + { + } + + private IUmbracoDatabase Database => _scopeAccessor.AmbientScope?.Database ?? throw new InvalidOperationException("A scope is required to query the database"); + public IEnumerable GetAll() { - Sql query = new Sql(_umbracoDatabase!.SqlContext) + Sql query = new Sql(Database.SqlContext) .Select() .From() .OrderBy(x => x.Id); var packageDefinitions = new List(); - List xmlSchemas = _umbracoDatabase.Fetch(query); + List xmlSchemas = Database.Fetch(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 query = new Sql(_umbracoDatabase!.SqlContext) + Sql query = new Sql(Database.SqlContext) .Select() .From() .Where(x => x.Id == id); - List schemaDtos = _umbracoDatabase.Fetch(query); + List schemaDtos = Database.Fetch(query); if (schemaDtos.IsCollectionEmpty()) { @@ -135,11 +180,11 @@ public class CreatedPackageSchemaRepository : ICreatedPackagesRepository File.Delete(packageDef.PackagePath); } - Sql query = new Sql(_umbracoDatabase!.SqlContext) + Sql query = new Sql(Database.SqlContext) .Delete() .Where(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; } diff --git a/src/Umbraco.Infrastructure/Services/Implement/PackagingService.cs b/src/Umbraco.Infrastructure/Services/Implement/PackagingService.cs index 5ed48329fd..34ede610a0 100644 --- a/src/Umbraco.Infrastructure/Services/Implement/PackagingService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/PackagingService.cs @@ -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()) + { } #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 GetAllCreatedPackages() => _createdPackages.GetAll(); + public IEnumerable 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 GetAllInstalledPackages() { + using ICoreScope scope = _coreScopeProvider.CreateCoreScope(autoComplete: true); + IReadOnlyDictionary? keyValues = _keyValueService.FindByKeyPrefix(Constants.Conventions.Migrations.KeyValuePrefix); var installedPackages = new List(); @@ -145,7 +196,7 @@ public class PackagingService : IPackagingService installedPackages.Add(installedPackage); } - + if (installedPackage.Version is null && plan.GetType().Assembly.TryGetInformationalVersion(out string? version)) {