/// <summary> /// Adds the given new file to our in-memory data structures and to our database. Updates all clients on success. /// </summary> /// <param name="newFile"></param> /// <param name="parent"></param> private FileResult UploadOnNewFile(SoundboxNode newFile, SoundboxDirectory parent) { try { DatabaseLock.EnterWriteLock(); //save previous watermark for event Guid previousWatermark = GetRootWatermark(); Guid newWatermark = Guid.NewGuid(); //add to cache parent.AddChild(newFile); NodesCache[newFile.ID] = newFile; //add to database //TODO async Database.Insert(newFile); //update cache and database watermarks (this will call Update for parent) SetWatermark(newFile, newWatermark); //update our clients GetHub().OnFileEvent(new SoundboxFileChangeEvent() { Event = SoundboxFileChangeEvent.Type.ADDED, File = FlattenForEvent(newFile), PreviousWatermark = previousWatermark }); if (newFile is Sound sound) { SpeechRecognition_OnSoundChanged(sound, null); } return(new FileResult(BaseResultStatus.OK, newFile, previousWatermark)); } finally { DatabaseLock.ExitWriteLock(); } }
/// <summary> /// Moves a file to a new directory without performing an <see cref="Edit(SoundboxNode)"/>. /// </summary> /// <param name="file"></param> /// <param name="directory"> /// Null: uses the root directory instead. /// </param> /// <returns></returns> public async Task <FileResult> Move(SoundboxNode file, SoundboxDirectory directory) { file = GetCleanFile(file); if (file == null) { return(new FileResult(BaseResultStatus.INVALID_PARAMETER)); } if (IsRootDirectory(file)) { return(new FileResult(FileResultStatus.ILLEGAL_FILE_EDIT_DENIED_ROOT)); } if (directory == null) { directory = GetRootDirectory(); } else { directory = GetCleanFile(directory); if (directory == null) { return(new FileResult(BaseResultStatus.INVALID_PARAMETER)); } } if (file == directory) { //not possible return(new FileResult(FileResultStatus.MOVE_TARGET_INVALID)); } if (file.ParentDirectory == directory) { //no change return(new FileResult(BaseResultStatus.OK_NO_CHANGE)); } try { DatabaseLock.EnterWriteLock(); //save previous watermark for event Guid previousWatermark = GetRootWatermark(); Guid newWatermark = Guid.NewGuid(); //move in cache SoundboxDirectory oldParent = file.ParentDirectory; oldParent.Children.Remove(file); directory.AddChild(file); //update file in database if (!(file is SoundboxDirectory)) { //TODO async Database.Update(file); } //else: is updated anyways in SetWatermak //update cache and database watermarks (this will call Update for parent) SetWatermark(file, newWatermark); SetWatermark(oldParent, newWatermark); //update our clients GetHub().OnFileEvent(new SoundboxFileMoveEvent() { Event = SoundboxFileChangeEvent.Type.MOVED, File = FlattenForEvent(file), FromDirectory = oldParent, PreviousWatermark = previousWatermark }); return(new FileResult(BaseResultStatus.OK, file, previousWatermark, oldParent)); } catch (Exception ex) { Log(ex); return(new FileResult(BaseResultStatus.INTERNAL_SERVER_ERROR)); } finally { DatabaseLock.ExitWriteLock(); } }