| 01-foundation |
03 |
persistence |
| dotnet10 |
| csharp |
| system-text-json |
| semaphoreslim |
| write-then-replace |
| unit-tests |
| xunit |
|
| 01-01 (solution scaffold, test project) |
| 01-02 (TenantProfile model) |
|
| ProfileRepository |
| file I/O for profiles JSON with SemaphoreSlim write lock and write-then-replace |
|
| ProfileService |
| CRUD (GetProfiles/AddProfile/RenameProfile/DeleteProfile) with input validation |
|
| SettingsRepository |
| file I/O for settings JSON with same write-then-replace safety pattern |
|
| SettingsService |
| GetSettings/SetLanguage/SetDataFolder with supported-language validation |
|
| AppSettings model |
| DataFolder + Lang with camelCase JSON compatibility |
|
|
| 01-04 (MsalClientFactory may use ProfileService for tenant list) |
| 01-05 (TranslationSource uses SettingsService for lang) |
| 01-06 (FeatureViewModelBase may use ProfileService/SettingsService) |
| all feature plans (profile and settings are the core data contracts) |
|
| added |
patterns |
|
|
| Write-then-replace |
| write to .tmp, validate JSON round-trip via JsonDocument.Parse, then File.Move(overwrite:true) |
|
| SemaphoreSlim(1,1) for async exclusive write access on per-repository basis |
| System.Text.Json with PropertyNamingPolicy.CamelCase for schema-compatible serialization |
| PropertyNameCaseInsensitive=true for deserialization to handle both old and new JSON |
| TDD with IDisposable temp file pattern for isolated unit tests |
|
|
| created |
modified |
| SharepointToolbox/Core/Models/AppSettings.cs |
| SharepointToolbox/Infrastructure/Persistence/ProfileRepository.cs |
| SharepointToolbox/Infrastructure/Persistence/SettingsRepository.cs |
| SharepointToolbox/Services/ProfileService.cs |
| SharepointToolbox/Services/SettingsService.cs |
| SharepointToolbox.Tests/Services/ProfileServiceTests.cs |
| SharepointToolbox.Tests/Services/SettingsServiceTests.cs |
|
|
|
| Explicit System.IO using required in WPF project — WPF temp build project does not include System.IO in implicit usings; all file I/O classes need explicit namespace import |
| SettingsService validates only 'en' and 'fr' — matches app's supported locales; throws ArgumentException for any other code |
| LoadAsync on corrupt JSON throws InvalidDataException (not silent empty) — explicit failure is safer than silently discarding user data |
|
| Write-then-replace: all file persistence uses .tmp write + JsonDocument.Parse validation + File.Move(overwrite:true) to protect against crash-corruption |
| IDisposable test pattern: unit tests use Path.GetTempFileName() + Dispose() for clean isolated file I/O tests |
|
| FOUND-02 |
| FOUND-10 |
| FOUND-12 |
|
8min |
2026-04-02 |