From bdda754db96297366188d9ea8aaf6b28856212ae Mon Sep 17 00:00:00 2001 From: yv01p Date: Wed, 24 Dec 2025 20:03:36 +0000 Subject: [PATCH] refactor(core): extract CheckDataIntegrity to ContentCrudService MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move CheckDataIntegrity from ContentService to ContentCrudService. Add IShortStringHelper dependency to ContentCrudService. Remove IShortStringHelper from ContentService as it's no longer needed. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../DependencyInjection/UmbracoBuilder.cs | 1 - .../Services/ContentCrudService.cs | 31 ++++++++++++++++++- src/Umbraco.Core/Services/ContentService.cs | 24 +------------- .../Services/IContentCrudService.cs | 11 +++++++ 4 files changed, 42 insertions(+), 25 deletions(-) diff --git a/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs b/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs index a2ca60f312..cef400d114 100644 --- a/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs +++ b/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs @@ -315,7 +315,6 @@ namespace Umbraco.Cms.Core.DependencyInjection sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), - sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService(), diff --git a/src/Umbraco.Core/Services/ContentCrudService.cs b/src/Umbraco.Core/Services/ContentCrudService.cs index 20a89bac50..84db4fc055 100644 --- a/src/Umbraco.Core/Services/ContentCrudService.cs +++ b/src/Umbraco.Core/Services/ContentCrudService.cs @@ -8,6 +8,7 @@ using Umbraco.Cms.Core.Persistence.Querying; using Umbraco.Cms.Core.Persistence.Repositories; using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Core.Services.Changes; +using Umbraco.Cms.Core.Strings; using Umbraco.Extensions; namespace Umbraco.Cms.Core.Services; @@ -20,6 +21,7 @@ public class ContentCrudService : ContentServiceBase, IContentCrudService private readonly IEntityRepository _entityRepository; private readonly IContentTypeRepository _contentTypeRepository; private readonly ILanguageRepository _languageRepository; + private readonly IShortStringHelper _shortStringHelper; private readonly ILogger _logger; public ContentCrudService( @@ -31,12 +33,14 @@ public class ContentCrudService : ContentServiceBase, IContentCrudService IContentTypeRepository contentTypeRepository, IAuditService auditService, IUserIdKeyResolver userIdKeyResolver, - ILanguageRepository languageRepository) + ILanguageRepository languageRepository, + IShortStringHelper shortStringHelper) : base(provider, loggerFactory, eventMessagesFactory, documentRepository, auditService, userIdKeyResolver) { _entityRepository = entityRepository ?? throw new ArgumentNullException(nameof(entityRepository)); _contentTypeRepository = contentTypeRepository ?? throw new ArgumentNullException(nameof(contentTypeRepository)); _languageRepository = languageRepository ?? throw new ArgumentNullException(nameof(languageRepository)); + _shortStringHelper = shortStringHelper ?? throw new ArgumentNullException(nameof(shortStringHelper)); _logger = loggerFactory.CreateLogger(); } @@ -529,6 +533,31 @@ public class ContentCrudService : ContentServiceBase, IContentCrudService #endregion + #region Data Integrity + + /// + public ContentDataIntegrityReport CheckDataIntegrity(ContentDataIntegrityReportOptions options) + { + using (ICoreScope scope = ScopeProvider.CreateCoreScope()) + { + scope.WriteLock(Constants.Locks.ContentTree); + + ContentDataIntegrityReport report = DocumentRepository.CheckDataIntegrity(options); + + if (report.FixedIssues.Count > 0) + { + var root = new Content("root", -1, new ContentType(_shortStringHelper, -1)) { Id = -1, Key = Guid.Empty }; + scope.Notifications.Publish(new ContentTreeChangeNotification(root, TreeChangeTypes.RefreshAll, EventMessagesFactory.Get())); + } + + scope.Complete(); + + return report; + } + } + + #endregion + #region Private Helpers /// diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index 9ccf5a31c5..b0bdbc6edc 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -20,7 +20,6 @@ using Umbraco.Cms.Core.Persistence.Repositories; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Core.Services.Changes; -using Umbraco.Cms.Core.Strings; using Umbraco.Extensions; namespace Umbraco.Cms.Core.Services; @@ -34,7 +33,6 @@ public class ContentService : RepositoryService, IContentService private readonly IContentTypeRepository _contentTypeRepository; private readonly IDocumentRepository _documentRepository; private readonly ILogger _logger; - private readonly IShortStringHelper _shortStringHelper; private readonly IUserIdKeyResolver _userIdKeyResolver; private readonly IIdKeyMap _idKeyMap; private IQuery? _queryNotTrashed; @@ -89,7 +87,6 @@ public class ContentService : RepositoryService, IContentService IDocumentRepository documentRepository, IAuditService auditService, IContentTypeRepository contentTypeRepository, - IShortStringHelper shortStringHelper, IUserIdKeyResolver userIdKeyResolver, IIdKeyMap idKeyMap, IContentCrudService crudService, @@ -104,7 +101,6 @@ public class ContentService : RepositoryService, IContentService _documentRepository = documentRepository; _auditService = auditService; _contentTypeRepository = contentTypeRepository; - _shortStringHelper = shortStringHelper; _userIdKeyResolver = userIdKeyResolver; _idKeyMap = idKeyMap; _logger = loggerFactory.CreateLogger(); @@ -737,25 +733,7 @@ public class ContentService : RepositoryService, IContentService private static bool HasUnsavedChanges(IContent content) => content.HasIdentity is false || content.IsDirty(); public ContentDataIntegrityReport CheckDataIntegrity(ContentDataIntegrityReportOptions options) - { - using (ICoreScope scope = ScopeProvider.CreateCoreScope()) - { - scope.WriteLock(Constants.Locks.ContentTree); - - ContentDataIntegrityReport report = _documentRepository.CheckDataIntegrity(options); - - if (report.FixedIssues.Count > 0) - { - // The event args needs a content item so we'll make a fake one with enough properties to not cause a null ref - var root = new Content("root", -1, new ContentType(_shortStringHelper, -1)) { Id = -1, Key = Guid.Empty }; - scope.Notifications.Publish(new ContentTreeChangeNotification(root, TreeChangeTypes.RefreshAll, EventMessagesFactory.Get())); - } - - scope.Complete(); - - return report; - } - } + => CrudService.CheckDataIntegrity(options); #endregion diff --git a/src/Umbraco.Core/Services/IContentCrudService.cs b/src/Umbraco.Core/Services/IContentCrudService.cs index b7f8d06330..da517e8067 100644 --- a/src/Umbraco.Core/Services/IContentCrudService.cs +++ b/src/Umbraco.Core/Services/IContentCrudService.cs @@ -259,4 +259,15 @@ public interface IContentCrudService : IService void DeleteLocked(ICoreScope scope, IContent content, EventMessages evtMsgs); #endregion + + #region Data Integrity + + /// + /// Checks content data integrity and optionally fixes issues. + /// + /// Options for the integrity check. + /// A report of detected and fixed issues. + ContentDataIntegrityReport CheckDataIntegrity(ContentDataIntegrityReportOptions options); + + #endregion }