/// <summary> /// Add a default file finder that has a content folder and a backup location. The /// edity folder in the content folder is not considered content. /// This will only do something if you have not previously registered a IFileFinder service. /// </summary> /// <param name="services">The service collection.</param> /// <returns></returns> public static IServiceCollection AddDefaultFileFinder(this IServiceCollection services) { services.TryAddScoped <IFileFinder>(s => { var userInfo = s.GetRequiredService <IUserInfo>(); var projectFinder = s.GetRequiredService <ProjectFinder>(); var phaseDetector = s.GetRequiredService <IPhaseDetector>(); var compileRequestDetector = s.GetRequiredService <ICompileRequestDetector>(); String projectFolder; if (compileRequestDetector.IsCompileRequest) { projectFolder = projectFinder.PublishedProjectPath; } else { projectFolder = projectFinder.GetUserProjectPath(userInfo.UniqueUserName); } //Any folders that can write should use these permissions, they will prevent the writing of .draft files. var sharedWritePermissions = new DraftFilePermissions(s.GetRequiredService <IHttpContextAccessor>()); //Folder blacklist var edityFolderList = new PathList(); edityFolderList.AddDirectory("edity"); //Editor core location var backupPermissions = new DefaultFileFinderPermissions(); backupPermissions.WritePermission.Permit = false; backupPermissions.TreatAsContentPermission.Permit = false; var editorCoreFinder = new FileFinder(projectFinder.EdityCorePath, backupPermissions); //Site specific files, not editable var projectBackupPermissions = new DefaultFileFinderPermissions(); projectBackupPermissions.WritePermission.Permit = false; projectBackupPermissions.TreatAsContentPermission.Permissions = new PathBlacklist(edityFolderList); var siteFileFinder = new FileFinder(projectFinder.SitePath, projectBackupPermissions, editorCoreFinder); //Project location var contentFolderPermissions = new DefaultFileFinderPermissions(); contentFolderPermissions.TreatAsContentPermission.Permissions = new PathBlacklist(edityFolderList); contentFolderPermissions.WritePermission.Permissions = sharedWritePermissions; //Always use the git draft manager for the project content, this way you can actually create drafts. var draftManager = new GitDraftManager(new PathBlacklist(edityFolderList)); IFileStreamManager streamManager = null; if (phaseDetector.Phase == Phases.Draft || compileRequestDetector.IsCompileRequest) { //If the request is in draft mode, change the content to only files with draft files and change the file stream //manager to read published versions out of git var oldPermissions = contentFolderPermissions.TreatAsContentPermission.Permissions; contentFolderPermissions.TreatAsContentPermission.Permissions = new MustHaveGitDraftFile(draftManager, oldPermissions); streamManager = new GitDraftFileStreamManager(draftManager); } return(new FileFinder(projectFolder, contentFolderPermissions, siteFileFinder, streamManager, draftManager)); }); return(services); }