public ValueTask <IFileBaseContext> BuildContext(IPhotoDirectory photoDirectory, IReadOnlyList <IndexedFile> indexedFiles)
        {
            var dictionary           = indexedFiles.ToDictionary(x => x.Hash, x => x);
            var similarityDictionary = _similarityDictionaryFactory.Create(indexedFiles);

            return(new ValueTask <IFileBaseContext>(new FileBaseContext(photoDirectory, indexedFiles, dictionary, similarityDictionary)));
        }
 private IEnumerable <IFileIssue> CheckForIssues(FileInformation file, IPhotoDirectory photoDirectory)
 {
     if (photoDirectory.MemoryManager.DirectoryMemory.DeletedFiles.TryGetValue(file.Hash.ToString(), out var deletedFile))
     {
         yield return(new FormerlyDeletedIssue(file, deletedFile));
     }
 }
Example #3
0
 public FileBaseContext(IPhotoDirectory photoDirectory, IReadOnlyList <IndexedFile> indexedFiles, IReadOnlyDictionary <string, IndexedFile> indexedFileMap,
                        SimilarityDictionary similarityDictionary)
 {
     _indexedFileMap       = indexedFileMap;
     _similarityDictionary = similarityDictionary;
     PhotoDirectory        = photoDirectory;
     IndexedFiles          = indexedFiles;
 }
        public async ValueTask <IFileBaseContext> BuildContext(IPhotoDirectory photoDirectory)
        {
            IReadOnlyList <IndexedFile> indexedFiles;

            await using (var context = photoDirectory.GetDataContext())
            {
                indexedFiles = await context.FileRepository.GetAllReadOnlyBySpecs(new IncludeFileLocationsSpec());
            }

            return(await BuildContext(photoDirectory, indexedFiles));
        }
        public DecisionManagerContext(List <IssueDecisionWrapperViewModel> issues, IPhotoDirectory photoDirectory, Action resyncDatabaseAction)
        {
            Issues               = issues;
            PhotoDirectory       = photoDirectory;
            ResyncDatabaseAction = resyncDatabaseAction;

            OnUpdateOperations();

            foreach (var viewModel in Issues)
            {
                viewModel.PropertyChanged          += ViewModelOnPropertyChanged;
                viewModel.Decision.PropertyChanged += DecisionOnPropertyChanged;
            }

            IssueFilter = new[] { typeof(InvalidFileLocationIssue), typeof(DuplicateFilesIssue), typeof(SimilarFilesIssue), typeof(FormerlyDeletedIssue) }
            .Select(x => new Checkable <Type>(x, true)).ToList();
        }
Example #6
0
        private async Task ExecuteWorker(IPhotoDirectory photoDirectory)
        {
            try
            {
                await _synchronizeIndexWorker.Execute(new SynchronizeIndexRequest(photoDirectory));
            }
            catch (Exception e)
            {
                _windowService.ShowError(e);
                _regionManager.RequestNavigate(RegionNames.MainView, "OpenFolderView");
                return;
            }

            _synchronizationEvent.OnPhotoFolderSynchronized();

            var parameters = new NavigationParameters {
                { "photoDirectory", photoDirectory }
            };

            _regionManager.RequestNavigate(RegionNames.MainView, "PhotoFolderView", parameters);
        }
 public static IEnumerable <IFileInfo> ToFileInfos(this IndexedFile file, IPhotoDirectory photoDirectory)
 {
     return(file.Files.Select(x => photoDirectory.ToFileInformation(file, x)));
 }
 public static FileInformation ToFileInformation(this IndexedFile file, IPhotoDirectory photoDirectory)
 {
     return(photoDirectory.ToFileInformation(file, file.Files.First()));
 }
        public static FileInformation ToFileInformation(this IndexedFile file, string relativeFilename, IPhotoDirectory photoDirectory)
        {
            var fileLocation = file.GetFileByFilename(relativeFilename);

            if (fileLocation == null)
            {
                throw new ArgumentException($"The indexed file is not located at {relativeFilename}");
            }

            return(photoDirectory.ToFileInformation(file, fileLocation));
        }
Example #10
0
 private FileInformation GetFileInformationFromPath(string relativeFilename, IReadOnlyList <IndexedFile> indexedFiles, IPhotoDirectory photoDirectory)
 {
     return(indexedFiles.First(y => y.HasPath(relativeFilename)).ToFileInformation(relativeFilename, photoDirectory));
 }
Example #11
0
 public CheckFilesRequest(IReadOnlyList <FileInformation> files, IPhotoDirectory directory)
 {
     Files     = files;
     Directory = directory;
 }
        private static IIssueDecisionViewModel Create(DuplicateFilesIssue duplicateFilesIssue, IPhotoDirectory photoDirectory)
        {
            IEnumerable <Checkable <FileInformation> > filesToKeep;

            if (duplicateFilesIssue.File.RelativeFilename != null)
            {
                // just keep one file, try to find the file that is located correctly
                var bestFile = duplicateFilesIssue.RelevantFiles.FirstOrDefault(x =>
                                                                                x.RelativeFilename != null && Regex.IsMatch(x.RelativeFilename, photoDirectory.GetFilenameTemplate(x).ToRegexPattern())) ??
                               duplicateFilesIssue.File;

                filesToKeep = new[] { duplicateFilesIssue.File }.Concat(duplicateFilesIssue.RelevantFiles)
                .Select(x => new Checkable <FileInformation>(x, x == bestFile));
            }
            else
            {
                // in case of import, we just delete the file that would be imported
                filesToKeep = new[] { new Checkable <FileInformation>(duplicateFilesIssue.File) }.Concat(
                    duplicateFilesIssue.RelevantFiles.Select(x => new Checkable <FileInformation>(x, true)));
            }

            return(new DuplicateFileDecisionViewModel(duplicateFilesIssue, filesToKeep.ToList()));
        }
 public RemoveFileFromIndexRequest(string relativeFilename, IPhotoDirectory photoDirectory)
 {
     RelativeFilename = relativeFilename;
     PhotoDirectory   = photoDirectory;
 }
Example #14
0
 public ImportFilesRequest(IReadOnlyList <string> files, IPhotoDirectory directory)
 {
     Files     = files;
     Directory = directory;
 }
Example #15
0
 public SynchronizeIndexRequest(IPhotoDirectory directory)
 {
     Directory = directory;
 }
 public static IEnumerable <IIssueDecisionViewModel> Create(FileCheckReport report, IPhotoDirectory photoDirectory)
 {
     foreach (var issue in report.Issues)
     {
         if (issue is DuplicateFilesIssue duplicateFilesIssue)
         {
             yield return(Create(duplicateFilesIssue, photoDirectory));
         }
         else if (issue is InvalidFileLocationIssue invalidFileLocationIssue)
         {
             yield return(new InvalidLocationFileDecisionViewModel(invalidFileLocationIssue));
         }
         else if (issue is SimilarFilesIssue similarFilesIssue)
         {
             yield return(new SimilarFileDecisionViewModel(similarFilesIssue,
                                                           similarFilesIssue.RelevantFiles.Concat(new[] { similarFilesIssue.File }).Select(x => new Checkable <FileInformation>(x, true)).ToList()));
         }
         else if (issue is FormerlyDeletedIssue formerlyDeletedIssue)
         {
             yield return(new FormerlyDeletedFileDecisionViewModel(formerlyDeletedIssue));
         }
     }
 }
Example #17
0
 public CheckIndexRequest(IPhotoDirectory directory)
 {
     Directory = directory;
 }
 public AddFileToIndexRequest(string filename, IPhotoDirectory directory)
 {
     Filename  = filename;
     Directory = directory;
 }
Example #19
0
        private async Task <(IUseCaseErrors, AddFileToIndexResponse?)> IndexFile(string filename, IPhotoDirectory photoDirectory)
        {
            var action = _serviceProvider.GetRequiredService <IAddFileToIndexUseCase>();

            AddFileToIndexResponse?response;

            try
            {
                response = await action.Handle(new AddFileToIndexRequest(filename, photoDirectory));
            }
            catch (Exception e)
            {
                if (e.GetType().Name.Equals("DbUpdateException"))
                {
                    response = await action.Handle(new AddFileToIndexRequest(filename, photoDirectory));
                }
                else
                {
                    throw;
                }
            }

            return(action, response);
        }