Remove or simplify internal helper methods that are no longer needed
after service extraction.
Removed methods:
- GetAllPublished(): Was only used in tests, replaced with public query methods
- QueryNotTrashed field and property: No longer needed after GetAllPublished removal
- HasUnsavedChanges(): Duplicated in ContentPublishOperationService where it's used
- TryGetParentKey(): Duplicated in ContentMoveOperationService where it's used
Kept methods:
- Audit() and AuditAsync(): Still used by MoveToRecycleBin and DeleteOfTypes
Test refactoring:
- DeliveryApiContentIndexHelperTests.GetExpectedNumberOfContentItems() now uses
public GetPagedDescendants method instead of internal GetAllPublished
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
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 <noreply@anthropic.com>
Make existing private DeleteLocked method public and add to interface.
Update ContentService.DeleteOfTypes to delegate to the service.
Remove duplicate DeleteLocked from ContentService.
Unify implementations by having ContentMoveOperationService.EmptyRecycleBin
call IContentCrudService.DeleteLocked instead of its own local method.
This eliminates the duplicate implementation and reduces maintenance burden.
The ContentCrudService implementation includes iteration bounds
and proper logging for edge cases.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Make existing private PerformMoveLocked method public and add to interface.
Update ContentService.MoveToRecycleBin and DeleteOfTypes to delegate to the service.
Remove duplicate helper methods from ContentService:
- PerformMoveLocked
- PerformMoveContentLocked
- GetPagedDescendantQuery
- GetPagedLocked
This reduces ContentService complexity while maintaining MoveToRecycleBin
orchestration in the facade.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Remove fields that are now handled by extracted services:
- IDocumentBlueprintRepository (BlueprintManager)
- IPropertyValidationService (extracted services)
- ICultureImpactFactory (extracted services)
- PropertyEditorCollection (extracted services)
- ContentSettings + optionsMonitor.OnChange callback
- IRelationService (ContentMoveOperationService)
- IEntityRepository (unused)
- ILanguageRepository (extracted services)
Keep _shortStringHelper temporarily (will move to ContentCrudService in Task 5).
Simplify constructor to only inject dependencies still used directly.
Update UmbracoBuilder.cs DI registration to match new constructor.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Remove backward-compatibility constructors that used StaticServiceProvider
for lazy resolution. All dependencies are now injected directly through
the main constructor.
Removed obsolete constructors:
- Constructor with IAuditRepository parameter (legacy signature)
- Constructor without Phase 2-7 service parameters (intermediate signature)
Removed Lazy field declarations no longer needed:
- _queryOperationServiceLazy
- _versionOperationServiceLazy
- _moveOperationServiceLazy
- _publishOperationServiceLazy
- _permissionManagerLazy
- _blueprintManagerLazy
Simplified service accessor properties to remove null checks for
lazy fields (now only check the non-lazy field).
BREAKING CHANGE: External code using obsolete constructors must update
to use dependency injection.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Phase 7 documentation:
- Critical review iterations (v1, v2, v3)
- Completion summary with plan vs actual comparison
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Implementation plan v1.3 with 4 critical review iterations
- Completion summary confirming all 8 tasks done
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add missing using directive for Extensions namespace
- Change SuperUserId to SuperUserKey (Guid) for SaveAsync calls
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Phase 6: Add constructor parameter and lazy fallback for ContentPermissionManager.
Changes:
- Add private fields _permissionManager and _permissionManagerLazy to ContentService
- Add PermissionManager property accessor with null safety check
- Update primary constructor to accept ContentPermissionManager as parameter 23
- Update all obsolete constructors with lazy resolution via StaticServiceProvider
- Update DI factory in UmbracoBuilder to pass ContentPermissionManager
- Make ContentPermissionManager public for DI compatibility
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Implementation plan for ContentPublishOperationService extraction
- Two critical review documents with recommendations
- Completion summary documenting all 9 tasks completed
Part of ContentService refactoring Phase 5.
Phase 5 Summary:
- Created IContentPublishOperationService interface (30+ methods)
- Created ContentPublishOperationService implementation (~1500 lines)
- Updated DI registration
- Updated ContentService to inject and delegate to new service
- All tests passing
ContentService reduced from ~3000 to ~1500 lines.
Tests DI resolution and basic publish/unpublish operations
delegated through ContentService to the new service.
Part of ContentService refactoring Phase 5.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Adds field, property, and constructor parameter for the new
publish operation service. Obsolete constructors use lazy
resolution for backward compatibility.
Part of ContentService refactoring Phase 5.
Adds DI registration for the new publish operation service
and updates ContentService factory to inject it.
Part of ContentService refactoring Phase 5.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Defines interface for content publishing operations:
- Publish/Unpublish operations
- Scheduled publishing (release/expiration)
- Schedule management
- Path checks (IsPathPublishable/IsPathPublished)
- Workflow (SendToPublication)
- Published content queries
Part of ContentService refactoring Phase 5 - extracting ~1,500 lines
of publishing logic into a dedicated service.
Named IContentPublishOperationService to avoid collision with existing
IContentPublishingService (API-layer orchestrator).
Includes CommitDocumentChanges as [EditorBrowsable(Advanced)] to support
orchestration scenarios (e.g., MoveToRecycleBin unpublishes before moving).
Follows established pattern from Phases 1-4:
- Extends IService
- Implementation will inherit from ContentServiceBase
- Additive-only versioning policy
- Implementation plan for ContentMoveOperationService extraction
- Two critical review documents with identified issues
- Completion summary confirming all tasks executed
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Tests for Move, Copy, Sort, RecycleBin operations with notification verification.
Includes behavioral equivalence tests against ContentService.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implements Move, Copy, Sort, and Recycle Bin operations.
Follows established patterns from Phase 1-3 implementations.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Defines interface for Move, Copy, Sort, and Recycle Bin operations.
MoveToRecycleBin deliberately excluded as it requires facade orchestration.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Updates revision history and phase details with Phase 3 completion.
VersionOperationService extracted with 7 methods.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Part of ContentService refactoring Phase 3.
Covers version retrieval, rollback, and version deletion.
Current status: 10/16 tests passing
- Core functionality tests pass (version retrieval, basic operations)
- 6 tests fail due to version creation behavior (requires investigation)
Known issues to address in follow-up:
- Multiple consecutive saves not creating separate versions
- Version deletion and rollback tests affected by version behavior
v1.1 fixes applied:
- Deterministic date comparison instead of Thread.Sleep (Issue 2.5)
- Added Rollback cancellation test (Issue 3.2)
- Added published version protection test (Issue 3.3)
v1.2 fixes applied:
- Fixed notification handler registration pattern (Issue 3.2)
- Fixed Publish method signature using ContentPublishingService (Issue 3.4)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Part of ContentService refactoring Phase 3.
Notification ordering preserved: RollingBack -> RolledBack.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Part of ContentService refactoring Phase 3.
Delegates GetVersion, GetVersions, GetVersionsSlim, GetVersionIds.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Part of ContentService refactoring Phase 3.
Adds constructor parameter and property for version operations delegation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>