private void ManageChangedFile(PhotographerFolder folder, Metadata deletedItem, ListFolderResult changesInFolder) { var dbFile = GetFile(folder, deletedItem.AsDeleted.PathLower); var fileDropboxId = dbFile.DropboxFileId; var newFiles = changesInFolder.Entries.Where(item => item.IsFile); if (newFiles.Count() == 0) { // this means that the file was just deleted // need to delete file with "dropbox id" = fileDropboxId from db !!! Db.PhotographerFiles.Remove(dbFile); Db.SaveChanges(); RedundantMetadata.Add(deletedItem); //changesInFolder.Entries.Remove(deletedItem); // return or break, dunno return; } var existingFile = newFiles.SingleOrDefault(f => f.AsFile.Id == fileDropboxId); if (existingFile != null) // it is a renamed file { // rename file with "dropbox id" = fileDropboxId in folder.PhotographerFiles collection dbFile.Name = existingFile.Name; dbFile.Path = existingFile.PathLower; Db.SaveChanges(); // removing file from changesInFolder RedundantMetadata.AddRange(new List <Metadata> { deletedItem, existingFile }); //changesInFolder.Entries.Remove(deletedItem); //changesInFolder.Entries.Remove(existingFile); } else // it is a deleted file { // need to delete file with "dropbox id" = fileDropboxId from db !!! Db.PhotographerFiles.Remove(dbFile); Db.SaveChanges(); RedundantMetadata.Add(deletedItem); //changesInFolder.Entries.Remove(deletedItem); } }
private async Task SyncDropboxFolder(string folderpath) { var folder = CurrUser.PhotographerFolders.SingleOrDefault(f => f.Path == folderpath); if (folder == null) { // folder doesnt exist return; } RedundantMetadata.Clear(); var changesInFolder = await Dbx.Files.ListFolderContinueAsync(folder.DropboxCursor); // update current folder "dropbox cursor" in db (changesInFolder.Cursor) folder.DropboxCursor = changesInFolder.Cursor; Db.SaveChanges(); if (changesInFolder.Entries.Count == 0) { // this folder is synched with dropbox account // syncing subfolders if needed if (folderpath == "/") { folderpath = string.Empty; } var subfolders = await Dbx.Files.ListFolderAsync(folderpath); foreach (var subfolder in subfolders.Entries.Where(subf => subf.IsFolder)) { await SyncDropboxFolder(subfolder.PathLower); } return; } // adding to list of synced folders SyncedDropboxFolders.Add(folder); foreach (var deletedItem in changesInFolder.Entries.Where(c => c.IsDeleted)) { var pathDeleted = deletedItem.AsDeleted.PathLower; if (!IsFolder(pathDeleted)) // it is a deleted or renamed file { ManageChangedFile(folder, deletedItem, changesInFolder); } else // it is a deleted or renamed folder { await ManageChangedFolder(folder, deletedItem, changesInFolder); } } foreach (var redundantMet in RedundantMetadata) { changesInFolder.Entries.Remove(redundantMet); } // first iterating to all subfolders of current folder to check for changes var nestedFolders = CurrUser.PhotographerFolders.Where(f => IsDirectSubfolder(folder, f) == true).ToList(); foreach (var nestedFolder in nestedFolders) { await SyncDropboxFolder(nestedFolder.Path); } // adding items that are left in changesInFolder to db foreach (var newfile in changesInFolder.Entries.Where(e => e.IsFile)) { await AddFileFromDropboxToDB(newfile, folder); } foreach (var newFolder in changesInFolder.Entries.Where(e => e.IsFolder)) { await AddFolderBranchFromDropboxToDB(newFolder, folder.Depth + 1); } }
private async Task ManageChangedFolder(PhotographerFolder folder, Metadata deletedItem, ListFolderResult changesInFolder) { var dbFolder = GetFolder(deletedItem.AsDeleted.PathLower); var folderDropboxId = dbFolder.DropboxFolderId; var newFolders = changesInFolder.Entries.Where(item => item.IsFolder); if (newFolders.Count() == 0) { // this means that the folder was just deleted // need to delete folder with "dropbox id" = folderDropboxId from db !!! // also delete all subfolders of deleted folder var allSubFolders = GetSubfolders(dbFolder); allSubFolders.Add(dbFolder); Db.PhotographerFolders.RemoveRange(allSubFolders); Db.SaveChanges(); RedundantMetadata.Add(deletedItem); //changesInFolder.Entries.Remove(deletedItem); // return or break, dunno return; } var existingFolder = newFolders.SingleOrDefault(f => f.AsFolder.Id == folderDropboxId); if (existingFolder != null) // it is a renamed folder { // TODO // foreach nested file and folder change path to new path var allSubFolders = GetSubfolders(dbFolder); await RenamePath(allSubFolders, existingFolder, deletedItem); // TODO // rename folder with "dropbox id" = folderDropboxId in CurrUser.PhotographerFolders collection and assign new cursor var listSubFolder = await Dbx.Files.ListFolderAsync(existingFolder.PathLower); dbFolder.DropboxCursor = listSubFolder.Cursor; dbFolder.Name = existingFolder.Name; dbFolder.Path = existingFolder.PathLower; foreach (var dbFile in dbFolder.PhotographerFiles) { var newfolderFilePath = existingFolder.PathLower + "/" + dbFile.Name; dbFile.Path = newfolderFilePath; Db.Entry(dbFile).State = System.Data.Entity.EntityState.Modified; } Db.SaveChanges(); // removing folder from changesInFolder RedundantMetadata.AddRange(new List <Metadata> { deletedItem, existingFolder }); //changesInFolder.Entries.Remove(deletedItem); //changesInFolder.Entries.Remove(existingFolder); } else // it is a deleted folder { // need to delete folder with "dropbox id" = fileDropboxId from db !!! // also delete all subfolders of deleted folder var allSubFolders = GetSubfolders(dbFolder); allSubFolders.Add(dbFolder); Db.PhotographerFolders.RemoveRange(allSubFolders); Db.SaveChanges(); RedundantMetadata.Add(deletedItem); //changesInFolder.Entries.Remove(deletedItem); } }