public void OnMediaFolderDeleted(MediaFolder mediaFolder)
 {
     if (MediaFolderDeleted != null)
     {
         MediaFolderDeleted(new SingleItemEventArgs<MediaFolder>(mediaFolder));
     }
 }
        private bool DeleteFolder(MediaFolder folder, bool checkSecurity, IPrincipal currentPrincipal)
        {
            try
            {
                var allItemsDeleted = true;
                var folderItems = folder.Medias.ToList();
                foreach (var item in folderItems)
                {
                    var fileToDelete = item as MediaFile;
                    if (fileToDelete != null && !DeleteFile(fileToDelete, checkSecurity, currentPrincipal))
                    {
                        allItemsDeleted = false;
                    }
                    var folderToDelete = item as MediaFolder;
                    if (folderToDelete != null && !DeleteFolder(folderToDelete, checkSecurity, currentPrincipal))
                    {
                        allItemsDeleted = false;
                    }
                }

                if (!allItemsDeleted)
                {
                    return false;
                }

                unitOfWork.BeginTransaction();
                repository.AsQueryable<MediaFolder>(f => f.Id == folder.Id || f.Original.Id == folder.Id)
                    .Fetch(f => f.Categories)
                    .Fetch(f => f.MediaTags)
                    .ToList()
                    .ForEach(
                        media =>
                            {
                                if (media.MediaTags != null)
                                {
                                    foreach (var mediaTag in media.MediaTags)
                                    {
                                        repository.Delete(mediaTag);
                                    }
                                }
                                if (media.Categories != null)
                                {
                                    foreach (var category in media.Categories)
                                    {
                                        repository.Delete(category);
                                    }
                                }

                                repository.Delete(media);
                            });
                unitOfWork.Commit();
            }
            catch (Exception ex)
            {
                Log.ErrorFormat("Failed to delete folder with id={0}.", ex, folder.Id);
                return false;
            }

            Events.MediaManagerEvents.Instance.OnMediaFolderDeleted(folder);
            return true;
        }
        /// <summary>
        /// Replaces the folder or if it doesn't exist, creates it.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>
        ///   <c>PutFolderResponse</c> with a folder id.
        /// </returns>
        public PutFolderResponse Put(PutFolderRequest request)
        {
            IEnumerable<MediaFolder> parentFolderFuture = null;
            if (request.Data.ParentFolderId.HasValue)
            {
                parentFolderFuture = repository.AsQueryable<MediaFolder>()
                    .Where(c => c.Id == request.Data.ParentFolderId.Value && !c.IsDeleted)
                    .ToFuture();
            }

            var mediaFolder = repository.AsQueryable<MediaFolder>()
                .Fetch(media => media.Folder)
                .Distinct()
                .ToFuture()
                .FirstOrDefault(folder => folder.Id == request.Id);

            MediaFolder parentFolder = null;
            if (parentFolderFuture != null)
            {
                parentFolder = parentFolderFuture.First();
                if (parentFolder.Type != (Module.MediaManager.Models.MediaType)(int)request.Data.Type)
                {
                    throw new CmsApiValidationException("Parent folder type does not match to this folder type.");
                }
            }

            var createFolder = mediaFolder == null;
            if (createFolder)
            {
                mediaFolder = new MediaFolder
                                  {
                                      Id = request.Id.GetValueOrDefault(),
                                      ContentType = Module.MediaManager.Models.MediaContentType.Folder,
                                      Type = (Module.MediaManager.Models.MediaType)(int)request.Data.Type
                                  };
            }
            else if (request.Data.Version > 0)
            {
                mediaFolder.Version = request.Data.Version;
            }

            unitOfWork.BeginTransaction();

            mediaFolder.Title = request.Data.Title;
            mediaFolder.Folder = parentFolder;

            mediaFolder.PublishedOn = DateTime.Now;

            var archivedMedias = new List<Media>();
            var unarchivedMedias = new List<Media>();
            if (mediaFolder.IsArchived != request.Data.IsArchived)
            {
                if (request.Data.IsArchived)
                {
                    archivedMedias.Add(mediaFolder);
                    mediaService.ArchiveSubMedias(mediaFolder, archivedMedias);
                }
                else
                {
                    unarchivedMedias.Add(mediaFolder);
                    mediaService.UnarchiveSubMedias(mediaFolder, unarchivedMedias);
                }
            }

            mediaFolder.IsArchived = request.Data.IsArchived;

            repository.Save(mediaFolder);

            unitOfWork.Commit();

            // Fire events.
            if (createFolder)
            {
                Events.MediaManagerEvents.Instance.OnMediaFolderCreated(mediaFolder);
            }
            else
            {
                Events.MediaManagerEvents.Instance.OnMediaFolderUpdated(mediaFolder);
            }

            foreach (var archivedMedia in archivedMedias.Distinct())
            {
                Events.MediaManagerEvents.Instance.OnMediaArchived(archivedMedia);
            }

            foreach (var archivedMedia in unarchivedMedias.Distinct())
            {
                Events.MediaManagerEvents.Instance.OnMediaUnarchived(archivedMedia);
            }

            return new PutFolderResponse { Data = mediaFolder.Id };
        }