Adds IContentCrudService registration to UmbracoBuilder alongside IContentService. Both services are now resolvable from DI. Includes integration test verifying successful resolution. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
6.0 KiB
6.0 KiB
date, researcher, git_commit, branch, repository, topic, tags, status, last_updated, last_updated_by, type
| date | researcher | git_commit | branch | repository | topic | tags | status | last_updated | last_updated_by | type | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2025-12-20T20:21:01+00:00 | Claude | a079c44afb |
refactor/ContentService | Umbraco-CMS | ContentService Refactoring Phase 0 - Test Infrastructure Complete |
|
complete | 2025-12-20 | Claude | implementation_strategy |
Handoff: ContentService Refactoring Phase 0 Complete
Task(s)
Phase 0 Implementation - COMPLETED
Executed Tasks 9-11 from the Phase 0 implementation plan (Tasks 0-8 were completed in a prior session):
| Task | Status | Description |
|---|---|---|
| Task 9 | Completed | Run All Tests and Verify - all 15 integration tests pass |
| Task 10 | Completed | Capture Baseline Benchmarks - 32 benchmark entries captured to JSON |
| Task 11 | Completed | Final Verification and Summary - git tag created, all files verified |
Working from plan: docs/plans/2025-12-20-contentservice-refactor-phase0-implementation.md
Critical References
docs/plans/2025-12-20-contentservice-refactor-phase0-implementation.md- The Phase 0 implementation plan (v1.3)src/Umbraco.Core/CLAUDE.md- Core architecture patterns (notification system, scoping pattern)src/Umbraco.Infrastructure/Services/ContentService.cs- The service being refactored (target of future phases)
Recent changes
Made by this session:
- No code changes - Tasks 9-11 were verification and benchmark capture tasks
- Ran benchmarks and captured output to
docs/plans/baseline-phase0.json - Created git tag
phase-0-baseline - Committed benchmark data:
a079c44afb"chore: capture Phase 0 baseline benchmarks"
Made in prior session (Tasks 0-8):
tests/Umbraco.Tests.Integration/Testing/ContentServiceBenchmarkBase.cs- Benchmark infrastructuretests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServiceRefactoringTests.cs- 15 integration teststests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServiceRefactoringBenchmarks.cs- 33 benchmarkstests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Services/ContentServiceBaseTests.cs- Tracking test skeleton
Learnings
-
Benchmark test failures are test implementation issues, not ContentService bugs:
- 4 benchmarks fail (GetVersions, GetVersionsSlim, HasChildren, Rollback)
- Root cause: Test assumes
Save()creates new versions, but it updates existing version - Root cause:
MeasureAndRecordwarmup causes double-counting in HasChildren test - These do not block refactoring work
-
MeasureAndRecord warmup pattern:
ContentServiceBenchmarkBase.cs:63-84- Action overload withskipWarmupparameterContentServiceBenchmarkBase.cs:93-103- Func overload always includes warmup- Use
skipWarmup: truefor destructive operations (Delete, EmptyRecycleBin)
-
Notification behavior for MoveToRecycleBin:
- MoveToRecycleBin does NOT fire unpublish notifications - content is "masked" not unpublished
- Tests 1-2 validate this behavior (
ContentServiceRefactoringTests.cs:389-476)
Artifacts
Test Infrastructure:
tests/Umbraco.Tests.Integration/Testing/ContentServiceBenchmarkBase.cs- Benchmark base class with timing infrastructuretests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServiceRefactoringTests.cs- 15 integration tests (all pass)tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServiceRefactoringBenchmarks.cs- 33 benchmarks (29 pass, 4 fail)tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Services/ContentServiceBaseTests.cs- Tracking test for Phase 1
Baseline Data:
docs/plans/baseline-phase0.json- 32 benchmark timing entries in JSON formatbenchmark-6db0554b1e.txt- Raw benchmark output (838 lines)
Git Tag:
phase-0-baseline- Marks the commit before baseline data was captured
Action Items & Next Steps
- Phase 0 is complete - Ready to proceed to Phase 1
- Branch decision needed: User was presented with finishing options:
- Merge back to main locally
- Push and create a Pull Request
- Keep the branch as-is
- Discard this work
- Optional: Fix 4 failing benchmark tests (low priority, does not block refactoring):
- Version creation tests need different approach (publish between saves)
- HasChildren test needs counter reset before measurement
Other Notes
Commit History (12 commits on branch):
f4a01ed50d docs: add ContentService refactoring design plan
bf054e9d62 docs: add performance benchmarks to ContentService refactor design
336adef2c2 test: add ContentServiceBenchmarkBase infrastructure class
0f408dd299 test: add ContentServiceRefactoringTests skeleton for Phase 0
0c22afa3cf test: add notification ordering tests for MoveToRecycleBin
86b0d3d803 test: add sort operation tests for ContentService refactoring
cf74f7850e test: add DeleteOfType tests for ContentService refactoring
7e989c0f8c test: add permission tests for ContentService refactoring
3239a4534e test: add transaction boundary tests for ContentService refactoring
0ef17bb1fc test: add ContentServiceRefactoringBenchmarks for Phase 0 baseline
6db0554b1e test: add ContentServiceBaseTests skeleton for Phase 0
a079c44afb chore: capture Phase 0 baseline benchmarks
Key Performance Baselines (from baseline-phase0.json):
Save_SingleItem: 7msSave_BatchOf1000: 7.65ms/itemPublish_BatchOf100: 24.56ms/itemMoveToRecycleBin_LargeTree: 8.95ms/item (1001 items)Copy_Recursive_100Items: 27.81ms/item
Test Commands:
# Run integration tests
dotnet test tests/Umbraco.Tests.Integration --filter "FullyQualifiedName~ContentServiceRefactoringTests" -v n
# Run single benchmark
dotnet test tests/Umbraco.Tests.Integration --filter "FullyQualifiedName~ContentServiceRefactoringBenchmarks.Benchmark_Save_SingleItem" -v n
# Run all benchmarks (10+ minutes)
dotnet test tests/Umbraco.Tests.Integration --filter "Category=Benchmark&FullyQualifiedName~ContentServiceRefactoringBenchmarks"