| 04-bulk-operations-and-provisioning |
06 |
bulk-operations |
| csom |
| pnp-framework |
| template |
| folder-structure |
| sharepoint |
| dotnet |
|
| phase |
plan |
provides |
| 04-bulk-operations-and-provisioning |
01 |
SiteTemplate, SiteTemplateOptions, TemplateLibraryInfo, TemplateFolderInfo, TemplatePermissionGroup, FolderStructureRow models and ITemplateService, IFolderStructureService interfaces |
|
|
| TemplateService: CSOM site template capture (libraries, folders, permission groups, logo, settings) and apply via PnP Framework site creation |
| FolderStructureService: folder hierarchy creation from CSV rows with parent-first ordering via BulkOperationRunner |
| FolderStructureServiceTests: 4 unit tests (BuildUniquePaths logic) + 1 live-skip |
| TemplateServiceTests: 3 unit tests (interface impl, model defaults) + 2 live-skip |
|
|
| added |
patterns |
|
|
| TemplateService.CaptureTemplateAsync — reads Web properties, filters hidden+system lists, enumerates folders recursively, captures SiteGroups with role assignments |
| TemplateService.ApplyTemplateAsync — creates Team or Communication site via PnP Framework CreateSiteAsync, then recreates libraries/folders/groups via CSOM |
| FolderStructureService.BuildUniquePaths — deduplicates and sorts CSV-derived folder paths parent-first by counting '/' separators |
| System list filter via HashSet<string> — normalized comparison against known system list names (Style Library, Form Templates, etc.) |
| ModelSiteTemplate alias — resolves CSOM SiteTemplate vs Core.Models.SiteTemplate ambiguity |
|
|
| created |
modified |
| SharepointToolbox/Services/TemplateService.cs |
| SharepointToolbox/Services/FolderStructureService.cs |
| SharepointToolbox.Tests/Services/FolderStructureServiceTests.cs |
| SharepointToolbox.Tests/Services/TemplateServiceTests.cs |
|
|
|
| TemplateService uses ModelSiteTemplate alias — same pattern as ITemplateService; CSOM SiteTemplate and Core.Models.SiteTemplate are both in scope |
| FolderStructureService.BuildUniquePaths sorts by slash count for parent-first ordering — ensures intermediate folders exist before children when using Folders.Add |
| System list filter uses HashSet<string> with OrdinalIgnoreCase — fast O(1) lookup, handles case differences in SharePoint list names |
| TemplateService.ApplyTemplateAsync creates new ClientContext for new site URL — adminCtx.Url points to admin site, new site needs separate context |
|
| BuildUniquePaths internal static — enables direct unit testing without ClientContext mock |
| Parent-first folder ordering via depth sort — critical for Folders.Add which does not create intermediates automatically |
|
|
10min |
2026-04-03 |