private async Task <IActionResult> StoreBookmark(IFormFileCollection formFileCollection, string bookmarkPath, DateTime lastWriteDate, FileWriteMode writeMode) { FormatPath(ref bookmarkPath); lastWriteDate = new DateTime(lastWriteDate.Year, lastWriteDate.Month, lastWriteDate.Day, lastWriteDate.Hour, lastWriteDate.Minute, lastWriteDate.Second, lastWriteDate.Kind); // truncate milliseconds off var dataDictionary = new Dictionary <BookmarkFileType, Stream>(); foreach (var formFile in formFileCollection) { var formFileHeader = formFile.Headers["Extension"]; dataDictionary.Add(EnumsHelper.ParseType(formFileHeader), formFile.OpenReadStream()); } var fileTypes = formFileCollection.Select(formFile => formFile.Headers["Extension"].ToString()).Select(EnumsHelper.ParseType).ToArray(); if (EnumsHelper.RecognizeFilesGroupType(fileTypes) == null) { return(BadRequest("bookmark type isn't recognized")); } var fakeFilesGroup = _storageService.MakeFake(bookmarkPath); var filesGroup = new ProxyFilesGroup(fakeFilesGroup, dataDictionary, lastWriteDate); var result = await _storageService.Save(filesGroup, writeMode); return(result ? (IActionResult)Ok() : BadRequest()); }
public override async Task <bool> Move(BookmarkHierarchyElement element, string newPath) { if (element is FakeFilesGroup) { throw new Exception("can't move thing that doesn't exist!"); } if (element is FilesGroup filesGroup) { if (await Find(newPath).ConfigureAwait(false) != null) { return(false); } var fake = MakeFake(newPath); var newFilesGroup = new ProxyFilesGroup(fake, filesGroup); var saveSuccessful = await Save(newFilesGroup, FileWriteMode.CreateNew).ConfigureAwait(false); if (!saveSuccessful) { return(false); } return(await DeleteBookmark(filesGroup).ConfigureAwait(false)); } if (element is Folder folder) { if (await FindFolder(newPath).ConfigureAwait(false) != null) { return(false); // it exists } var oldFolderFullPath = GetFullPath(folder); var newFolderFullPath = GetFullPath(newPath); var directoryInfo = new DirectoryInfo(oldFolderFullPath); try { // adding and deleting file for invoking event (needed for FolderChangeWatcher) var touchFileInfo = new FileInfo($"{oldFolderFullPath}\\{Guid.NewGuid()}.touch"); touchFileInfo.Create().Dispose(); touchFileInfo.Delete(); directoryInfo.Attributes = FileAttributes.Normal; directoryInfo.MoveTo(newFolderFullPath); return(true); } catch { return(false); } } throw new ArgumentException("derived type isn't recognized!"); }