2012-12-11 12:03:36 +05:00
using System ;
2012-11-07 13:56:52 -01:00
using System.Collections.Generic ;
2015-05-04 11:58:00 +10:00
using System.ComponentModel ;
2013-02-09 11:12:51 -01:00
using System.Globalization ;
2017-01-05 10:29:03 +11:00
using System.IO ;
2012-12-10 14:28:46 -01:00
using System.Linq ;
2014-12-24 17:01:41 +11:00
using System.Text.RegularExpressions ;
2013-03-19 23:46:13 +06:00
using System.Threading ;
2013-01-24 09:50:27 -01:00
using System.Xml.Linq ;
2012-12-10 14:28:46 -01:00
using Umbraco.Core.Auditing ;
2014-04-29 09:58:38 +10:00
using Umbraco.Core.Configuration ;
2012-12-15 10:43:03 +05:00
using Umbraco.Core.Events ;
2015-01-19 18:37:48 +11:00
using Umbraco.Core.Logging ;
2012-10-24 08:36:45 -02:00
using Umbraco.Core.Models ;
2013-01-24 09:50:27 -01:00
using Umbraco.Core.Models.Rdbms ;
2012-10-24 08:36:45 -02:00
using Umbraco.Core.Persistence ;
2014-08-24 23:22:32 +02:00
using Umbraco.Core.Persistence.DatabaseModelDefinitions ;
2012-10-24 08:36:45 -02:00
using Umbraco.Core.Persistence.Querying ;
2014-09-10 15:07:20 +10:00
using Umbraco.Core.Persistence.Repositories ;
2014-01-08 20:19:08 +11:00
using Umbraco.Core.Persistence.SqlSyntax ;
2012-10-24 08:36:45 -02:00
using Umbraco.Core.Persistence.UnitOfWork ;
2013-07-29 13:25:02 +10:00
using Umbraco.Core.Publishing ;
2012-10-24 08:36:45 -02:00
2012-11-12 07:40:11 -01:00
namespace Umbraco.Core.Services
2012-10-24 08:36:45 -02:00
{
2013-07-29 13:25:02 +10:00
/// <summary>
2014-01-08 20:19:08 +11:00
/// Represents the Media Service, which is an easy access to operations involving <see cref="IMedia"/>
/// </summary>
2015-07-29 16:00:06 +02:00
public class MediaService : RepositoryService , IMediaService , IMediaServiceOperations
2014-01-08 20:19:08 +11:00
{
2014-09-10 15:07:20 +10:00
2013-03-19 23:46:13 +06:00
//Support recursive locks because some of the methods that require locking call other methods that require locking.
//for example, the Move method needs to be locked but this calls the Save method which also needs to be locked.
2014-01-08 20:19:08 +11:00
private static readonly ReaderWriterLockSlim Locker = new ReaderWriterLockSlim ( LockRecursionPolicy . SupportsRecursion ) ;
2014-09-10 15:07:20 +10:00
2014-04-28 17:38:24 +10:00
private readonly EntityXmlSerializer _entitySerializer = new EntityXmlSerializer ( ) ;
private readonly IDataTypeService _dataTypeService ;
2014-09-30 18:46:02 +10:00
private readonly IUserService _userService ;
2016-02-26 14:30:32 +00:00
2015-07-23 20:04:40 +02:00
public MediaService ( IDatabaseUnitOfWorkProvider provider , RepositoryFactory repositoryFactory , ILogger logger , IEventMessagesFactory eventMessagesFactory , IDataTypeService dataTypeService , IUserService userService )
: base ( provider , repositoryFactory , logger , eventMessagesFactory )
2014-04-28 17:38:24 +10:00
{
2015-01-19 18:37:48 +11:00
if ( dataTypeService = = null ) throw new ArgumentNullException ( "dataTypeService" ) ;
if ( userService = = null ) throw new ArgumentNullException ( "userService" ) ;
2014-04-28 17:38:24 +10:00
_dataTypeService = dataTypeService ;
2014-09-30 18:46:02 +10:00
_userService = userService ;
2014-01-08 20:19:08 +11:00
}
2012-12-11 23:19:07 +05:00
2014-01-08 20:19:08 +11:00
/// <summary>
/// Creates an <see cref="IMedia"/> object using the alias of the <see cref="IMediaType"/>
2013-05-27 08:45:07 -02:00
/// that this Media should based on.
2014-01-08 20:19:08 +11:00
/// </summary>
2013-05-27 08:45:07 -02:00
/// <remarks>
/// Note that using this method will simply return a new IMedia without any identity
/// as it has not yet been persisted. It is intended as a shortcut to creating new media objects
/// that does not invoke a save operation against the database.
/// </remarks>
2013-01-15 10:12:23 -01:00
/// <param name="name">Name of the Media object</param>
2014-01-08 20:19:08 +11:00
/// <param name="parentId">Id of Parent for the new Media item</param>
/// <param name="mediaTypeAlias">Alias of the <see cref="IMediaType"/></param>
/// <param name="userId">Optional id of the user creating the media item</param>
/// <returns><see cref="IMedia"/></returns>
public IMedia CreateMedia ( string name , int parentId , string mediaTypeAlias , int userId = 0 )
{
2013-05-27 08:45:07 -02:00
var mediaType = FindMediaTypeByAlias ( mediaTypeAlias ) ;
2014-01-08 20:19:08 +11:00
var media = new Models . Media ( name , parentId , mediaType ) ;
2015-11-18 15:52:32 +01:00
var parent = GetById ( media . ParentId ) ;
media . Path = string . Concat ( parent . IfNotNull ( x = > x . Path , media . ParentId . ToString ( ) ) , "," , media . Id ) ;
2012-12-15 11:17:32 -01:00
2013-03-22 12:13:06 -01:00
if ( Creating . IsRaisedEventCancelled ( new NewEventArgs < IMedia > ( media , mediaTypeAlias , parentId ) , this ) )
{
media . WasCancelled = true ;
return media ;
}
2012-12-15 11:17:32 -01:00
2014-01-08 20:19:08 +11:00
media . CreatorId = userId ;
2012-12-15 11:17:32 -01:00
2014-01-08 20:19:08 +11:00
Created . RaiseEvent ( new NewEventArgs < IMedia > ( media , false , mediaTypeAlias , parentId ) , this ) ;
2012-12-21 06:59:30 +05:00
2015-01-19 15:12:34 +11:00
Audit ( AuditType . New , string . Format ( "Media '{0}' was created" , name ) , media . CreatorId , media . Id ) ;
2012-12-15 11:17:32 -01:00
2014-01-08 20:19:08 +11:00
return media ;
}
2012-12-15 11:17:32 -01:00
2013-01-29 12:58:02 -01:00
/// <summary>
/// Creates an <see cref="IMedia"/> object using the alias of the <see cref="IMediaType"/>
2013-05-27 08:45:07 -02:00
/// that this Media should based on.
2013-01-29 12:58:02 -01:00
/// </summary>
2013-05-27 08:45:07 -02:00
/// <remarks>
/// Note that using this method will simply return a new IMedia without any identity
/// as it has not yet been persisted. It is intended as a shortcut to creating new media objects
/// that does not invoke a save operation against the database.
/// </remarks>
2013-01-29 12:58:02 -01:00
/// <param name="name">Name of the Media object</param>
/// <param name="parent">Parent <see cref="IMedia"/> for the new Media item</param>
/// <param name="mediaTypeAlias">Alias of the <see cref="IMediaType"/></param>
/// <param name="userId">Optional id of the user creating the media item</param>
/// <returns><see cref="IMedia"/></returns>
public IMedia CreateMedia ( string name , IMedia parent , string mediaTypeAlias , int userId = 0 )
{
2015-11-18 15:52:32 +01:00
if ( parent = = null ) throw new ArgumentNullException ( "parent" ) ;
2013-05-27 08:45:07 -02:00
var mediaType = FindMediaTypeByAlias ( mediaTypeAlias ) ;
var media = new Models . Media ( name , parent , mediaType ) ;
2015-11-18 09:26:45 +01:00
media . Path = string . Concat ( parent . Path , "," , media . Id ) ;
2013-05-27 08:45:07 -02:00
if ( Creating . IsRaisedEventCancelled ( new NewEventArgs < IMedia > ( media , mediaTypeAlias , parent ) , this ) )
2013-01-29 12:58:02 -01:00
{
2013-05-27 08:45:07 -02:00
media . WasCancelled = true ;
return media ;
}
2013-01-29 12:58:02 -01:00
2013-05-27 08:45:07 -02:00
media . CreatorId = userId ;
2013-01-29 12:58:02 -01:00
2013-05-27 08:45:07 -02:00
Created . RaiseEvent ( new NewEventArgs < IMedia > ( media , false , mediaTypeAlias , parent ) , this ) ;
2013-01-29 12:58:02 -01:00
2015-01-19 15:12:34 +11:00
Audit ( AuditType . New , string . Format ( "Media '{0}' was created" , name ) , media . CreatorId , media . Id ) ;
2013-05-27 08:45:07 -02:00
return media ;
}
/// <summary>
/// Creates an <see cref="IMedia"/> object using the alias of the <see cref="IMediaType"/>
/// that this Media should based on.
/// </summary>
/// <remarks>
/// This method returns an <see cref="IMedia"/> object that has been persisted to the database
/// and therefor has an identity.
/// </remarks>
/// <param name="name">Name of the Media object</param>
/// <param name="parentId">Id of Parent for the new Media item</param>
/// <param name="mediaTypeAlias">Alias of the <see cref="IMediaType"/></param>
/// <param name="userId">Optional id of the user creating the media item</param>
/// <returns><see cref="IMedia"/></returns>
public IMedia CreateMediaWithIdentity ( string name , int parentId , string mediaTypeAlias , int userId = 0 )
{
var mediaType = FindMediaTypeByAlias ( mediaTypeAlias ) ;
var media = new Models . Media ( name , parentId , mediaType ) ;
2014-03-06 17:35:47 +11:00
//NOTE: I really hate the notion of these Creating/Created events - they are so inconsistent, I've only just found
// out that in these 'WithIdentity' methods, the Saving/Saved events were not fired, wtf. Anyways, they're added now.
2013-05-27 08:45:07 -02:00
if ( Creating . IsRaisedEventCancelled ( new NewEventArgs < IMedia > ( media , mediaTypeAlias , parentId ) , this ) )
{
media . WasCancelled = true ;
return media ;
2013-01-29 12:58:02 -01:00
}
2014-03-06 17:35:47 +11:00
if ( Saving . IsRaisedEventCancelled ( new SaveEventArgs < IMedia > ( media ) , this ) )
{
media . WasCancelled = true ;
return media ;
}
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2013-05-27 08:45:07 -02:00
{
2014-09-10 15:07:20 +10:00
media . CreatorId = userId ;
repository . AddOrUpdate ( media ) ;
2014-04-28 18:53:21 +10:00
2014-09-30 18:46:02 +10:00
repository . AddOrUpdateContentXml ( media , m = > _entitySerializer . Serialize ( this , _dataTypeService , _userService , m ) ) ;
2014-09-10 15:07:20 +10:00
// generate preview for blame history?
if ( UmbracoConfig . For . UmbracoSettings ( ) . Content . GlobalPreviewStorageEnabled )
{
2014-09-30 18:46:02 +10:00
repository . AddOrUpdatePreviewXml ( media , m = > _entitySerializer . Serialize ( this , _dataTypeService , _userService , m ) ) ;
2013-05-27 08:45:07 -02:00
}
2014-09-10 15:07:20 +10:00
uow . Commit ( ) ;
2013-05-27 08:45:07 -02:00
}
2014-03-06 17:35:47 +11:00
Saved . RaiseEvent ( new SaveEventArgs < IMedia > ( media , false ) , this ) ;
2013-05-27 08:45:07 -02:00
Created . RaiseEvent ( new NewEventArgs < IMedia > ( media , false , mediaTypeAlias , parentId ) , this ) ;
2015-01-19 15:12:34 +11:00
Audit ( AuditType . New , string . Format ( "Media '{0}' was created with Id {1}" , name , media . Id ) , media . CreatorId , media . Id ) ;
2013-05-27 08:45:07 -02:00
return media ;
}
/// <summary>
/// Creates an <see cref="IMedia"/> object using the alias of the <see cref="IMediaType"/>
/// that this Media should based on.
/// </summary>
/// <remarks>
/// This method returns an <see cref="IMedia"/> object that has been persisted to the database
/// and therefor has an identity.
/// </remarks>
/// <param name="name">Name of the Media object</param>
/// <param name="parent">Parent <see cref="IMedia"/> for the new Media item</param>
/// <param name="mediaTypeAlias">Alias of the <see cref="IMediaType"/></param>
/// <param name="userId">Optional id of the user creating the media item</param>
/// <returns><see cref="IMedia"/></returns>
public IMedia CreateMediaWithIdentity ( string name , IMedia parent , string mediaTypeAlias , int userId = 0 )
{
2015-11-18 16:04:01 +01:00
if ( parent = = null ) throw new ArgumentNullException ( "parent" ) ;
2013-05-27 08:45:07 -02:00
var mediaType = FindMediaTypeByAlias ( mediaTypeAlias ) ;
2013-01-29 12:58:02 -01:00
var media = new Models . Media ( name , parent , mediaType ) ;
2014-03-06 17:35:47 +11:00
//NOTE: I really hate the notion of these Creating/Created events - they are so inconsistent, I've only just found
// out that in these 'WithIdentity' methods, the Saving/Saved events were not fired, wtf. Anyways, they're added now.
2013-01-29 12:58:02 -01:00
if ( Creating . IsRaisedEventCancelled ( new NewEventArgs < IMedia > ( media , mediaTypeAlias , parent ) , this ) )
2013-03-22 12:13:06 -01:00
{
media . WasCancelled = true ;
2013-01-29 12:58:02 -01:00
return media ;
2013-03-22 12:13:06 -01:00
}
2013-01-29 12:58:02 -01:00
2014-03-06 17:35:47 +11:00
if ( Saving . IsRaisedEventCancelled ( new SaveEventArgs < IMedia > ( media ) , this ) )
{
media . WasCancelled = true ;
return media ;
}
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2013-05-27 08:45:07 -02:00
{
2014-09-10 15:07:20 +10:00
media . CreatorId = userId ;
repository . AddOrUpdate ( media ) ;
2014-09-30 18:46:02 +10:00
repository . AddOrUpdateContentXml ( media , m = > _entitySerializer . Serialize ( this , _dataTypeService , _userService , m ) ) ;
2014-09-10 15:07:20 +10:00
// generate preview for blame history?
if ( UmbracoConfig . For . UmbracoSettings ( ) . Content . GlobalPreviewStorageEnabled )
2013-05-27 08:45:07 -02:00
{
2014-09-30 18:46:02 +10:00
repository . AddOrUpdatePreviewXml ( media , m = > _entitySerializer . Serialize ( this , _dataTypeService , _userService , m ) ) ;
2013-05-27 08:45:07 -02:00
}
2014-09-10 15:07:20 +10:00
uow . Commit ( ) ;
2013-05-27 08:45:07 -02:00
}
2013-01-29 12:58:02 -01:00
2014-03-06 17:35:47 +11:00
Saved . RaiseEvent ( new SaveEventArgs < IMedia > ( media , false ) , this ) ;
2013-01-29 12:58:02 -01:00
Created . RaiseEvent ( new NewEventArgs < IMedia > ( media , false , mediaTypeAlias , parent ) , this ) ;
2015-01-19 15:12:34 +11:00
Audit ( AuditType . New , string . Format ( "Media '{0}' was created with Id {1}" , name , media . Id ) , media . CreatorId , media . Id ) ;
2013-01-29 12:58:02 -01:00
return media ;
}
2014-01-08 20:19:08 +11:00
/// <summary>
/// Gets an <see cref="IMedia"/> object by Id
/// </summary>
/// <param name="id">Id of the Content to retrieve</param>
/// <returns><see cref="IMedia"/></returns>
public IMedia GetById ( int id )
{
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2014-01-08 20:19:08 +11:00
{
return repository . Get ( id ) ;
}
}
2012-12-11 23:19:07 +05:00
2014-08-05 12:37:20 -06:00
public int Count ( string contentTypeAlias = null )
{
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2014-08-05 12:37:20 -06:00
{
return repository . Count ( contentTypeAlias ) ;
}
}
public int CountChildren ( int parentId , string contentTypeAlias = null )
{
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2014-08-05 12:37:20 -06:00
{
return repository . CountChildren ( parentId , contentTypeAlias ) ;
}
}
public int CountDescendants ( int parentId , string contentTypeAlias = null )
{
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2014-08-05 12:37:20 -06:00
{
return repository . CountDescendants ( parentId , contentTypeAlias ) ;
}
}
2013-08-28 20:57:33 +02:00
/// <summary>
/// Gets an <see cref="IMedia"/> object by Id
/// </summary>
/// <param name="ids">Ids of the Media to retrieve</param>
/// <returns><see cref="IMedia"/></returns>
2013-10-09 15:21:01 +11:00
public IEnumerable < IMedia > GetByIds ( IEnumerable < int > ids )
2013-08-28 20:57:33 +02:00
{
2015-07-24 18:36:07 +02:00
if ( ids . Any ( ) = = false ) return Enumerable . Empty < IMedia > ( ) ;
2015-01-19 18:37:48 +11:00
using ( var repository = RepositoryFactory . CreateMediaRepository ( UowProvider . GetUnitOfWork ( ) ) )
2013-08-28 20:57:33 +02:00
{
return repository . GetAll ( ids . ToArray ( ) ) ;
}
}
2012-12-15 11:17:32 -01:00
/// <summary>
/// Gets an <see cref="IMedia"/> object by its 'UniqueId'
/// </summary>
/// <param name="key">Guid key of the Media to retrieve</param>
/// <returns><see cref="IMedia"/></returns>
public IMedia GetById ( Guid key )
{
2015-01-19 18:37:48 +11:00
using ( var repository = RepositoryFactory . CreateMediaRepository ( UowProvider . GetUnitOfWork ( ) ) )
2012-12-15 11:17:32 -01:00
{
var query = Query < IMedia > . Builder . Where ( x = > x . Key = = key ) ;
var contents = repository . GetByQuery ( query ) ;
return contents . SingleOrDefault ( ) ;
}
}
2012-12-17 13:37:36 -01:00
/// <summary>
/// Gets a collection of <see cref="IMedia"/> objects by Level
/// </summary>
/// <param name="level">The level to retrieve Media from</param>
/// <returns>An Enumerable list of <see cref="IMedia"/> objects</returns>
public IEnumerable < IMedia > GetByLevel ( int level )
{
2015-01-19 18:37:48 +11:00
using ( var repository = RepositoryFactory . CreateMediaRepository ( UowProvider . GetUnitOfWork ( ) ) )
2012-12-17 13:37:36 -01:00
{
2013-03-07 19:56:10 -01:00
var query = Query < IMedia > . Builder . Where ( x = > x . Level = = level & & ! x . Path . StartsWith ( "-21" ) ) ;
2012-12-17 13:37:36 -01:00
var contents = repository . GetByQuery ( query ) ;
return contents ;
}
}
/// <summary>
/// Gets a specific version of an <see cref="IMedia"/> item.
/// </summary>
/// <param name="versionId">Id of the version to retrieve</param>
/// <returns>An <see cref="IMedia"/> item</returns>
public IMedia GetByVersion ( Guid versionId )
{
2015-01-19 18:37:48 +11:00
using ( var repository = RepositoryFactory . CreateMediaRepository ( UowProvider . GetUnitOfWork ( ) ) )
2012-12-17 13:37:36 -01:00
{
return repository . GetByVersion ( versionId ) ;
}
}
/// <summary>
/// Gets a collection of an <see cref="IMedia"/> objects versions by Id
/// </summary>
/// <param name="id"></param>
/// <returns>An Enumerable list of <see cref="IMedia"/> objects</returns>
public IEnumerable < IMedia > GetVersions ( int id )
{
2015-01-19 18:37:48 +11:00
using ( var repository = RepositoryFactory . CreateMediaRepository ( UowProvider . GetUnitOfWork ( ) ) )
2012-12-17 13:37:36 -01:00
{
var versions = repository . GetAllVersions ( id ) ;
return versions ;
}
}
2013-02-09 11:12:51 -01:00
/// <summary>
/// Gets a collection of <see cref="IMedia"/> objects, which are ancestors of the current media.
/// </summary>
/// <param name="id">Id of the <see cref="IMedia"/> to retrieve ancestors for</param>
/// <returns>An Enumerable list of <see cref="IMedia"/> objects</returns>
public IEnumerable < IMedia > GetAncestors ( int id )
{
var media = GetById ( id ) ;
return GetAncestors ( media ) ;
}
/// <summary>
/// Gets a collection of <see cref="IMedia"/> objects, which are ancestors of the current media.
/// </summary>
/// <param name="media"><see cref="IMedia"/> to retrieve ancestors for</param>
/// <returns>An Enumerable list of <see cref="IMedia"/> objects</returns>
public IEnumerable < IMedia > GetAncestors ( IMedia media )
{
var ids = media . Path . Split ( ',' ) . Where ( x = > x ! = "-1" & & x ! = media . Id . ToString ( CultureInfo . InvariantCulture ) ) . Select ( int . Parse ) . ToArray ( ) ;
2014-01-08 20:19:08 +11:00
if ( ids . Any ( ) = = false )
2013-02-09 11:12:51 -01:00
return new List < IMedia > ( ) ;
2015-01-19 18:37:48 +11:00
using ( var repository = RepositoryFactory . CreateMediaRepository ( UowProvider . GetUnitOfWork ( ) ) )
2013-02-09 11:12:51 -01:00
{
return repository . GetAll ( ids ) ;
}
}
2014-01-08 20:19:08 +11:00
/// <summary>
/// Gets a collection of <see cref="IMedia"/> objects by Parent Id
/// </summary>
/// <param name="id">Id of the Parent to retrieve Children from</param>
/// <returns>An Enumerable list of <see cref="IMedia"/> objects</returns>
public IEnumerable < IMedia > GetChildren ( int id )
{
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2014-01-08 20:19:08 +11:00
{
var query = Query < IMedia > . Builder . Where ( x = > x . ParentId = = id ) ;
var medias = repository . GetByQuery ( query ) ;
return medias ;
}
}
2015-05-04 11:58:00 +10:00
[Obsolete("Use the overload with 'long' parameter types instead")]
[EditorBrowsable(EditorBrowsableState.Never)]
public IEnumerable < IMedia > GetPagedChildren ( int id , int pageIndex , int pageSize , out int totalChildren ,
2016-04-05 16:32:46 +02:00
string orderBy , Direction orderDirection , string filter = "" )
2015-05-04 11:58:00 +10:00
{
2016-04-05 16:00:49 +02:00
long total ;
var result = GetPagedChildren ( id , Convert . ToInt64 ( pageIndex ) , pageSize , out total , orderBy , orderDirection , true , filter ) ;
totalChildren = Convert . ToInt32 ( total ) ;
return result ;
2015-05-04 11:58:00 +10:00
}
2016-04-06 13:23:39 +02:00
/// <summary>
/// Gets a collection of <see cref="IMedia"/> objects by Parent Id
/// </summary>
/// <param name="id">Id of the Parent to retrieve Children from</param>
/// <param name="pageIndex">Page index (zero based)</param>
/// <param name="pageSize">Page size</param>
/// <param name="totalChildren">Total records query would return without paging</param>
/// <param name="orderBy">Field to order by</param>
/// <param name="orderDirection">Direction to order by</param>
/// <param name="filter">Search text filter</param>
/// <returns>An Enumerable list of <see cref="IContent"/> objects</returns>
public IEnumerable < IMedia > GetPagedChildren ( int id , long pageIndex , int pageSize , out long totalChildren ,
string orderBy , Direction orderDirection , string filter = "" )
{
return GetPagedChildren ( id , pageIndex , pageSize , out totalChildren , orderBy , orderDirection , true , filter ) ;
}
2014-08-24 23:22:32 +02:00
/// <summary>
/// Gets a collection of <see cref="IMedia"/> objects by Parent Id
/// </summary>
/// <param name="id">Id of the Parent to retrieve Children from</param>
2014-09-16 23:21:27 +10:00
/// <param name="pageIndex">Page index (zero based)</param>
2014-08-24 23:22:32 +02:00
/// <param name="pageSize">Page size</param>
2014-09-16 23:21:27 +10:00
/// <param name="totalChildren">Total records query would return without paging</param>
2014-08-24 23:22:32 +02:00
/// <param name="orderBy">Field to order by</param>
2014-09-16 23:21:27 +10:00
/// <param name="orderDirection">Direction to order by</param>
2014-12-13 22:00:32 +01:00
/// <param name="orderBySystemField">Flag to indicate when ordering by system field</param>
2014-08-24 23:22:32 +02:00
/// <param name="filter">Search text filter</param>
/// <returns>An Enumerable list of <see cref="IContent"/> objects</returns>
2015-05-04 11:58:00 +10:00
public IEnumerable < IMedia > GetPagedChildren ( int id , long pageIndex , int pageSize , out long totalChildren ,
2016-04-06 13:23:39 +02:00
string orderBy , Direction orderDirection , bool orderBySystemField , string filter )
2014-08-24 23:22:32 +02:00
{
2015-03-24 12:30:28 +11:00
Mandate . ParameterCondition ( pageIndex > = 0 , "pageIndex" ) ;
2014-08-24 23:41:15 +02:00
Mandate . ParameterCondition ( pageSize > 0 , "pageSize" ) ;
2015-01-19 18:37:48 +11:00
using ( var repository = RepositoryFactory . CreateMediaRepository ( UowProvider . GetUnitOfWork ( ) ) )
2014-08-24 23:22:32 +02:00
{
2014-09-30 15:13:10 +10:00
var query = Query < IMedia > . Builder ;
2015-10-21 09:49:45 +02:00
query . Where ( x = > x . ParentId = = id ) ;
2016-02-26 14:30:32 +00:00
2016-04-05 15:31:33 +02:00
var medias = repository . GetPagedResultsByQuery ( query , pageIndex , pageSize , out totalChildren , orderBy , orderDirection , orderBySystemField , filter ) ;
2014-08-24 23:22:32 +02:00
return medias ;
}
}
2015-05-04 11:58:00 +10:00
[Obsolete("Use the overload with 'long' parameter types instead")]
[EditorBrowsable(EditorBrowsableState.Never)]
2016-04-05 16:32:46 +02:00
public IEnumerable < IMedia > GetPagedDescendants ( int id , int pageIndex , int pageSize , out int totalChildren , string orderBy = "Path" , Direction orderDirection = Direction . Ascending , string filter = "" )
2015-05-04 11:58:00 +10:00
{
2016-04-05 16:00:49 +02:00
long total ;
var result = GetPagedDescendants ( id , Convert . ToInt64 ( pageIndex ) , pageSize , out total , orderBy , orderDirection , true , filter ) ;
totalChildren = Convert . ToInt32 ( total ) ;
return result ;
2015-05-04 11:58:00 +10:00
}
2016-04-06 13:23:39 +02:00
/// <summary>
/// Gets a collection of <see cref="IContent"/> objects by Parent Id
/// </summary>
/// <param name="id">Id of the Parent to retrieve Descendants from</param>
/// <param name="pageIndex">Page number</param>
/// <param name="pageSize">Page size</param>
/// <param name="totalChildren">Total records query would return without paging</param>
/// <param name="orderBy">Field to order by</param>
/// <param name="orderDirection">Direction to order by</param>
/// <param name="filter">Search text filter</param>
/// <returns>An Enumerable list of <see cref="IContent"/> objects</returns>
public IEnumerable < IMedia > GetPagedDescendants ( int id , long pageIndex , int pageSize , out long totalChildren , string orderBy = "Path" , Direction orderDirection = Direction . Ascending , string filter = "" )
{
return GetPagedDescendants ( id , pageIndex , pageSize , out totalChildren , orderBy , orderDirection , true , filter ) ;
}
2014-09-30 15:13:10 +10:00
/// <summary>
/// Gets a collection of <see cref="IContent"/> objects by Parent Id
/// </summary>
/// <param name="id">Id of the Parent to retrieve Descendants from</param>
/// <param name="pageIndex">Page number</param>
/// <param name="pageSize">Page size</param>
/// <param name="totalChildren">Total records query would return without paging</param>
/// <param name="orderBy">Field to order by</param>
/// <param name="orderDirection">Direction to order by</param>
2014-12-13 22:00:32 +01:00
/// <param name="orderBySystemField">Flag to indicate when ordering by system field</param>
2014-09-30 15:13:10 +10:00
/// <param name="filter">Search text filter</param>
/// <returns>An Enumerable list of <see cref="IContent"/> objects</returns>
2016-04-06 13:23:39 +02:00
public IEnumerable < IMedia > GetPagedDescendants ( int id , long pageIndex , int pageSize , out long totalChildren , string orderBy , Direction orderDirection , bool orderBySystemField , string filter )
2014-09-30 15:13:10 +10:00
{
2015-03-24 12:30:28 +11:00
Mandate . ParameterCondition ( pageIndex > = 0 , "pageIndex" ) ;
2014-09-30 15:13:10 +10:00
Mandate . ParameterCondition ( pageSize > 0 , "pageSize" ) ;
2015-01-19 18:37:48 +11:00
using ( var repository = RepositoryFactory . CreateMediaRepository ( UowProvider . GetUnitOfWork ( ) ) )
2014-09-30 15:13:10 +10:00
{
var query = Query < IMedia > . Builder ;
//if the id is -1, then just get all
2014-11-18 10:13:21 +11:00
if ( id ! = - 1 )
2014-09-30 15:13:10 +10:00
{
query . Where ( x = > x . Path . SqlContains ( string . Format ( ",{0}," , id ) , TextColumnType . NVarchar ) ) ;
}
2014-12-13 22:00:32 +01:00
var contents = repository . GetPagedResultsByQuery ( query , pageIndex , pageSize , out totalChildren , orderBy , orderDirection , orderBySystemField , filter ) ;
2014-09-30 15:13:10 +10:00
return contents ;
}
}
2014-01-08 20:19:08 +11:00
/// <summary>
/// Gets descendants of a <see cref="IMedia"/> object by its Id
/// </summary>
/// <param name="id">Id of the Parent to retrieve descendants from</param>
/// <returns>An Enumerable flat list of <see cref="IMedia"/> objects</returns>
public IEnumerable < IMedia > GetDescendants ( int id )
{
2013-01-29 10:26:18 -01:00
var media = GetById ( id ) ;
2014-09-26 11:19:54 +10:00
if ( media = = null )
{
return Enumerable . Empty < IMedia > ( ) ;
}
2014-01-08 20:19:08 +11:00
return GetDescendants ( media ) ;
}
2012-12-11 23:19:07 +05:00
2013-01-29 10:26:18 -01:00
/// <summary>
/// Gets descendants of a <see cref="IMedia"/> object by its Id
/// </summary>
/// <param name="media">The Parent <see cref="IMedia"/> object to retrieve descendants from</param>
/// <returns>An Enumerable flat list of <see cref="IMedia"/> objects</returns>
public IEnumerable < IMedia > GetDescendants ( IMedia media )
{
2017-01-05 10:29:03 +11:00
//This is a check to ensure that the path is correct for this entity to avoid problems like: http://issues.umbraco.org/issue/U4-9336 due to data corruption
if ( media . ValidatePath ( ) = = false )
throw new InvalidDataException ( string . Format ( "The content item {0} has an invalid path: {1} with parentID: {2}" , media . Id , media . Path , media . ParentId ) ) ;
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2013-01-29 10:26:18 -01:00
{
2014-10-08 17:23:14 +11:00
var pathMatch = media . Path + "," ;
var query = Query < IMedia > . Builder . Where ( x = > x . Path . StartsWith ( pathMatch ) & & x . Id ! = media . Id ) ;
2013-01-29 10:26:18 -01:00
var medias = repository . GetByQuery ( query ) ;
2012-12-11 23:19:07 +05:00
2013-01-29 10:26:18 -01:00
return medias ;
}
}
2012-12-11 23:19:07 +05:00
2013-02-09 11:12:51 -01:00
/// <summary>
/// Gets the parent of the current media as an <see cref="IMedia"/> item.
/// </summary>
/// <param name="id">Id of the <see cref="IMedia"/> to retrieve the parent from</param>
/// <returns>Parent <see cref="IMedia"/> object</returns>
public IMedia GetParent ( int id )
{
var media = GetById ( id ) ;
return GetParent ( media ) ;
}
/// <summary>
/// Gets the parent of the current media as an <see cref="IMedia"/> item.
/// </summary>
/// <param name="media"><see cref="IMedia"/> to retrieve the parent from</param>
/// <returns>Parent <see cref="IMedia"/> object</returns>
public IMedia GetParent ( IMedia media )
{
if ( media . ParentId = = - 1 | | media . ParentId = = - 21 )
return null ;
return GetById ( media . ParentId ) ;
}
2014-01-08 20:19:08 +11:00
/// <summary>
/// Gets a collection of <see cref="IMedia"/> objects by the Id of the <see cref="IContentType"/>
/// </summary>
/// <param name="id">Id of the <see cref="IMediaType"/></param>
/// <returns>An Enumerable list of <see cref="IMedia"/> objects</returns>
public IEnumerable < IMedia > GetMediaOfMediaType ( int id )
{
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2014-01-08 20:19:08 +11:00
{
var query = Query < IMedia > . Builder . Where ( x = > x . ContentTypeId = = id ) ;
var medias = repository . GetByQuery ( query ) ;
return medias ;
}
}
/// <summary>
/// Gets a collection of <see cref="IMedia"/> objects, which reside at the first level / root
/// </summary>
/// <returns>An Enumerable list of <see cref="IMedia"/> objects</returns>
public IEnumerable < IMedia > GetRootMedia ( )
{
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2014-01-08 20:19:08 +11:00
{
var query = Query < IMedia > . Builder . Where ( x = > x . ParentId = = - 1 ) ;
var medias = repository . GetByQuery ( query ) ;
return medias ;
}
}
/// <summary>
/// Gets a collection of an <see cref="IMedia"/> objects, which resides in the Recycle Bin
/// </summary>
/// <returns>An Enumerable list of <see cref="IMedia"/> objects</returns>
public IEnumerable < IMedia > GetMediaInRecycleBin ( )
{
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2014-01-08 20:19:08 +11:00
{
var query = Query < IMedia > . Builder . Where ( x = > x . Path . Contains ( "-21" ) ) ;
var medias = repository . GetByQuery ( query ) ;
return medias ;
}
}
2012-12-11 23:19:07 +05:00
2013-03-26 05:46:20 -01:00
/// <summary>
2013-03-26 07:15:22 -01:00
/// Gets an <see cref="IMedia"/> object from the path stored in the 'umbracoFile' property.
2013-03-26 05:46:20 -01:00
/// </summary>
2014-03-25 20:49:52 -07:00
/// <param name="mediaPath">Path of the media item to retrieve (for example: /media/1024/koala_403x328.jpg)</param>
2013-03-26 05:46:20 -01:00
/// <returns><see cref="IMedia"/></returns>
2013-03-26 07:15:22 -01:00
public IMedia GetMediaByPath ( string mediaPath )
2013-03-26 05:46:20 -01:00
{
2013-03-26 07:15:22 -01:00
var umbracoFileValue = mediaPath ;
2017-01-05 10:29:03 +11:00
2014-12-17 13:06:46 +00:00
const string Pattern = ".*[_][0-9]+[x][0-9]+[.].*" ;
var isResized = Regex . IsMatch ( mediaPath , Pattern ) ;
2014-01-08 20:19:08 +11:00
2013-03-26 07:19:39 -01:00
// If the image has been resized we strip the "_403x328" of the original "/media/1024/koala_403x328.jpg" url.
2013-03-26 07:15:22 -01:00
if ( isResized )
2013-03-26 05:46:20 -01:00
{
2013-03-26 07:15:22 -01:00
var underscoreIndex = mediaPath . LastIndexOf ( '_' ) ;
var dotIndex = mediaPath . LastIndexOf ( '.' ) ;
umbracoFileValue = string . Concat ( mediaPath . Substring ( 0 , underscoreIndex ) , mediaPath . Substring ( dotIndex ) ) ;
2013-03-26 05:46:20 -01:00
}
2014-12-11 17:59:52 +00:00
Func < string , Sql > createSql = url = > new Sql ( ) . Select ( "*" )
. From < PropertyDataDto > ( )
. InnerJoin < PropertyTypeDto > ( )
. On < PropertyDataDto , PropertyTypeDto > ( left = > left . PropertyTypeId , right = > right . Id )
. Where < PropertyTypeDto > ( x = > x . Alias = = "umbracoFile" )
. Where < PropertyDataDto > ( x = > x . VarChar = = url ) ;
var sql = createSql ( umbracoFileValue ) ;
2013-03-26 05:46:20 -01:00
2015-01-19 18:37:48 +11:00
using ( var uow = UowProvider . GetUnitOfWork ( ) )
2013-03-26 05:46:20 -01:00
{
var propertyDataDto = uow . Database . Fetch < PropertyDataDto , PropertyTypeDto > ( sql ) . FirstOrDefault ( ) ;
2014-12-11 17:59:52 +00:00
// If the stripped-down url returns null, we try again with the original url.
// Previously, the function would fail on e.g. "my_x_image.jpg"
if ( propertyDataDto = = null )
{
sql = createSql ( mediaPath ) ;
propertyDataDto = uow . Database . Fetch < PropertyDataDto , PropertyTypeDto > ( sql ) . FirstOrDefault ( ) ;
}
2016-06-14 17:43:46 +02:00
// If no reults far, try getting from a json value stored in the ntext column query
if ( propertyDataDto = = null )
{
var ntextQuery = new Sql ( ) . Select ( "*" )
. From < PropertyDataDto > ( )
. InnerJoin < PropertyTypeDto > ( )
. On < PropertyDataDto , PropertyTypeDto > ( left = > left . PropertyTypeId , right = > right . Id )
. Where < PropertyTypeDto > ( x = > x . Alias = = "umbracoFile" )
. Where ( "dataNtext LIKE @0" , "%" + umbracoFileValue + "%" ) ;
propertyDataDto = uow . Database . Fetch < PropertyDataDto , PropertyTypeDto > ( ntextQuery ) . FirstOrDefault ( ) ;
}
// If still no results, try getting from a json value stored in the nvarchar column
if ( propertyDataDto = = null )
{
var nvarcharQuery = new Sql ( ) . Select ( "*" )
. From < PropertyDataDto > ( )
. InnerJoin < PropertyTypeDto > ( )
. On < PropertyDataDto , PropertyTypeDto > ( left = > left . PropertyTypeId , right = > right . Id )
. Where < PropertyTypeDto > ( x = > x . Alias = = "umbracoFile" )
. Where ( "dataNvarchar LIKE @0" , "%" + umbracoFileValue + "%" ) ;
propertyDataDto = uow . Database . Fetch < PropertyDataDto , PropertyTypeDto > ( nvarcharQuery ) . FirstOrDefault ( ) ;
}
2013-03-26 07:15:22 -01:00
return propertyDataDto = = null ? null : GetById ( propertyDataDto . NodeId ) ;
2013-03-26 05:46:20 -01:00
}
}
2012-12-17 13:37:36 -01:00
/// <summary>
/// Checks whether an <see cref="IMedia"/> item has any children
/// </summary>
/// <param name="id">Id of the <see cref="IMedia"/></param>
/// <returns>True if the media has any children otherwise False</returns>
public bool HasChildren ( int id )
{
2015-01-19 18:37:48 +11:00
using ( var repository = RepositoryFactory . CreateMediaRepository ( UowProvider . GetUnitOfWork ( ) ) )
2012-12-17 13:37:36 -01:00
{
var query = Query < IMedia > . Builder . Where ( x = > x . ParentId = = id ) ;
int count = repository . Count ( query ) ;
return count > 0 ;
}
}
2014-01-08 20:19:08 +11:00
/// <summary>
/// Moves an <see cref="IMedia"/> object to a new location
/// </summary>
/// <param name="media">The <see cref="IMedia"/> to move</param>
/// <param name="parentId">Id of the Media's new Parent</param>
/// <param name="userId">Id of the User moving the Media</param>
public void Move ( IMedia media , int parentId , int userId = 0 )
{
2014-09-10 15:07:20 +10:00
//TODO: This all needs to be on the repo layer in one transaction!
2014-01-08 20:19:08 +11:00
if ( media = = null ) throw new ArgumentNullException ( "media" ) ;
using ( new WriteLock ( Locker ) )
{
//This ensures that the correct method is called if this method is used to Move to recycle bin.
if ( parentId = = - 21 )
{
MoveToRecycleBin ( media , userId ) ;
return ;
}
2014-04-23 20:19:36 +10:00
var originalPath = media . Path ;
2013-03-19 23:46:13 +06:00
2014-04-23 20:19:36 +10:00
if ( Moving . IsRaisedEventCancelled (
new MoveEventArgs < IMedia > (
new MoveEventInfo < IMedia > ( media , originalPath , parentId ) ) , this ) )
{
return ;
}
2014-10-23 18:31:08 +10:00
2013-09-13 10:29:03 +02:00
media . ParentId = parentId ;
if ( media . Trashed )
{
media . ChangeTrashedState ( false , parentId ) ;
}
2014-04-23 20:19:36 +10:00
Save ( media , userId ,
//no events!
false ) ;
//used to track all the moved entities to be given to the event
var moveInfo = new List < MoveEventInfo < IMedia > >
{
new MoveEventInfo < IMedia > ( media , originalPath , parentId )
} ;
2013-03-19 23:46:13 +06:00
2014-01-08 20:19:08 +11:00
//Ensure that relevant properties are updated on children
var children = GetChildren ( media . Id ) . ToArray ( ) ;
if ( children . Any ( ) )
{
var parentPath = media . Path ;
var parentLevel = media . Level ;
var parentTrashed = media . Trashed ;
2014-04-23 20:19:36 +10:00
var updatedDescendants = UpdatePropertiesOnChildren ( children , parentPath , parentLevel , parentTrashed , moveInfo ) ;
2014-10-23 18:31:08 +10:00
Save ( updatedDescendants , userId ,
2014-04-23 20:19:36 +10:00
//no events!
false ) ;
2014-01-08 20:19:08 +11:00
}
2013-03-19 23:46:13 +06:00
2014-04-23 20:19:36 +10:00
Moved . RaiseEvent ( new MoveEventArgs < IMedia > ( false , moveInfo . ToArray ( ) ) , this ) ;
2013-03-19 23:46:13 +06:00
2015-01-19 15:12:34 +11:00
Audit ( AuditType . Move , "Move Media performed by user" , userId , media . Id ) ;
2014-01-08 20:19:08 +11:00
}
}
2012-12-11 23:19:07 +05:00
2013-12-19 12:27:21 +11:00
/// <summary>
2014-01-08 20:19:08 +11:00
/// Deletes an <see cref="IMedia"/> object by moving it to the Recycle Bin
/// </summary>
/// <param name="media">The <see cref="IMedia"/> to delete</param>
/// <param name="userId">Id of the User deleting the Media</param>
public void MoveToRecycleBin ( IMedia media , int userId = 0 )
{
2016-02-26 14:30:32 +00:00
( ( IMediaServiceOperations ) this ) . MoveToRecycleBin ( media , userId ) ;
2015-07-29 16:00:06 +02:00
}
2013-12-19 12:27:21 +11:00
2015-07-29 16:00:06 +02:00
/// <summary>
/// Permanently deletes an <see cref="IMedia"/> object
/// </summary>
/// <remarks>
/// Please note that this method will completely remove the Media from the database,
/// but current not from the file system.
/// </remarks>
/// <param name="media">The <see cref="IMedia"/> to delete</param>
/// <param name="userId">Id of the User deleting the Media</param>
Attempt < OperationStatus > IMediaServiceOperations . Delete ( IMedia media , int userId )
{
//TODO: IT would be much nicer to mass delete all in one trans in the repo level!
2015-08-04 14:52:34 +02:00
var evtMsgs = EventMessagesFactory . Get ( ) ;
2014-04-23 20:19:36 +10:00
2016-02-26 14:30:32 +00:00
if ( Deleting . IsRaisedEventCancelled (
2015-08-04 14:52:34 +02:00
new DeleteEventArgs < IMedia > ( media , evtMsgs ) , this ) )
2014-04-23 20:19:36 +10:00
{
2016-01-27 15:22:58 +01:00
return OperationStatus . Cancelled ( evtMsgs ) ;
2014-04-23 20:19:36 +10:00
}
2015-07-29 16:00:06 +02:00
//Delete children before deleting the 'possible parent'
var children = GetChildren ( media . Id ) ;
foreach ( var child in children )
2014-04-23 20:19:36 +10:00
{
2015-07-29 16:00:06 +02:00
Delete ( child , userId ) ;
}
2013-01-11 10:38:32 -01:00
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2014-01-08 20:19:08 +11:00
{
2015-07-29 16:00:06 +02:00
repository . Delete ( media ) ;
uow . Commit ( ) ;
2014-04-23 20:19:36 +10:00
2015-08-04 14:52:34 +02:00
var args = new DeleteEventArgs < IMedia > ( media , false , evtMsgs ) ;
Deleted . RaiseEvent ( args , this ) ;
2013-12-09 16:35:12 +11:00
2015-07-29 16:00:06 +02:00
//remove any flagged media files
repository . DeleteMediaFiles ( args . MediaFilesToDelete ) ;
}
2014-10-23 18:31:08 +10:00
2015-07-29 16:00:06 +02:00
Audit ( AuditType . Delete , "Delete Media performed by user" , userId , media . Id ) ;
2016-01-27 15:22:58 +01:00
return OperationStatus . Success ( evtMsgs ) ;
2015-07-29 16:00:06 +02:00
}
/// <summary>
/// Saves a single <see cref="IMedia"/> object
/// </summary>
/// <param name="media">The <see cref="IMedia"/> to save</param>
/// <param name="userId">Id of the User saving the Media</param>
/// <param name="raiseEvents">Optional boolean indicating whether or not to raise events.</param>
Attempt < OperationStatus > IMediaServiceOperations . Save ( IMedia media , int userId , bool raiseEvents )
{
2015-08-04 14:52:34 +02:00
var evtMsgs = EventMessagesFactory . Get ( ) ;
2015-07-29 16:00:06 +02:00
if ( raiseEvents )
{
if ( Saving . IsRaisedEventCancelled (
2015-08-04 14:52:34 +02:00
new SaveEventArgs < IMedia > ( media , evtMsgs ) ,
2015-07-29 16:00:06 +02:00
this ) )
2013-01-29 10:26:18 -01:00
{
2016-01-27 15:22:58 +01:00
return OperationStatus . Cancelled ( evtMsgs ) ;
2015-07-29 16:00:06 +02:00
}
2013-12-09 16:35:12 +11:00
2015-07-29 16:00:06 +02:00
}
2014-04-23 20:19:36 +10:00
2015-07-29 16:00:06 +02:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
{
media . CreatorId = userId ;
repository . AddOrUpdate ( media ) ;
repository . AddOrUpdateContentXml ( media , m = > _entitySerializer . Serialize ( this , _dataTypeService , _userService , m ) ) ;
// generate preview for blame history?
if ( UmbracoConfig . For . UmbracoSettings ( ) . Content . GlobalPreviewStorageEnabled )
{
repository . AddOrUpdatePreviewXml ( media , m = > _entitySerializer . Serialize ( this , _dataTypeService , _userService , m ) ) ;
2013-01-29 10:26:18 -01:00
}
2014-01-08 20:19:08 +11:00
uow . Commit ( ) ;
}
2012-12-21 06:59:30 +05:00
2015-07-29 16:00:06 +02:00
if ( raiseEvents )
2015-08-04 14:52:34 +02:00
Saved . RaiseEvent ( new SaveEventArgs < IMedia > ( media , false , evtMsgs ) , this ) ;
2012-12-21 06:59:30 +05:00
2015-07-29 16:00:06 +02:00
Audit ( AuditType . Save , "Save Media performed by user" , userId , media . Id ) ;
2016-01-27 15:22:58 +01:00
return OperationStatus . Success ( evtMsgs ) ;
2015-07-29 16:00:06 +02:00
}
/// <summary>
/// Saves a collection of <see cref="IMedia"/> objects
/// </summary>
/// <param name="medias">Collection of <see cref="IMedia"/> to save</param>
/// <param name="userId">Id of the User saving the Media</param>
/// <param name="raiseEvents">Optional boolean indicating whether or not to raise events.</param>
Attempt < OperationStatus > IMediaServiceOperations . Save ( IEnumerable < IMedia > medias , int userId , bool raiseEvents )
{
var asArray = medias . ToArray ( ) ;
2015-08-04 14:52:34 +02:00
var evtMsgs = EventMessagesFactory . Get ( ) ;
2015-07-29 16:00:06 +02:00
if ( raiseEvents )
{
if ( Saving . IsRaisedEventCancelled (
2015-08-04 14:52:34 +02:00
new SaveEventArgs < IMedia > ( asArray , evtMsgs ) ,
2015-07-29 16:00:06 +02:00
this ) )
{
2016-01-27 15:22:58 +01:00
return OperationStatus . Cancelled ( evtMsgs ) ;
2015-07-29 16:00:06 +02:00
}
}
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
{
foreach ( var media in asArray )
{
media . CreatorId = userId ;
repository . AddOrUpdate ( media ) ;
repository . AddOrUpdateContentXml ( media , m = > _entitySerializer . Serialize ( this , _dataTypeService , _userService , m ) ) ;
// generate preview for blame history?
if ( UmbracoConfig . For . UmbracoSettings ( ) . Content . GlobalPreviewStorageEnabled )
{
repository . AddOrUpdatePreviewXml ( media , m = > _entitySerializer . Serialize ( this , _dataTypeService , _userService , m ) ) ;
}
}
//commit the whole lot in one go
uow . Commit ( ) ;
}
if ( raiseEvents )
2015-08-04 14:52:34 +02:00
Saved . RaiseEvent ( new SaveEventArgs < IMedia > ( asArray , false , evtMsgs ) , this ) ;
2015-07-29 16:00:06 +02:00
Audit ( AuditType . Save , "Save Media items performed by user" , userId , - 1 ) ;
2016-01-27 15:22:58 +01:00
return OperationStatus . Success ( evtMsgs ) ;
2014-01-08 20:19:08 +11:00
}
2012-12-15 11:17:32 -01:00
2014-01-08 20:19:08 +11:00
/// <summary>
/// Empties the Recycle Bin by deleting all <see cref="IMedia"/> that resides in the bin
/// </summary>
public void EmptyRecycleBin ( )
{
2013-08-14 16:12:13 +02:00
using ( new WriteLock ( Locker ) )
{
2014-09-10 15:07:20 +10:00
Dictionary < int , IEnumerable < Property > > entities ;
2013-08-14 16:12:13 +02:00
List < string > files ;
bool success ;
var nodeObjectType = new Guid ( Constants . ObjectTypes . Media ) ;
2012-12-11 23:19:07 +05:00
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2013-08-14 16:12:13 +02:00
{
2014-09-10 15:07:20 +10:00
//Create a dictionary of ids -> dictionary of property aliases + values
entities = repository . GetEntitiesInRecycleBin ( )
. ToDictionary (
key = > key . Id ,
val = > ( IEnumerable < Property > ) val . Properties ) ;
files = ( ( MediaRepository ) repository ) . GetFilesInRecycleBinForUploadField ( ) ;
2012-12-21 07:42:37 +05:00
2014-09-10 15:07:20 +10:00
if ( EmptyingRecycleBin . IsRaisedEventCancelled ( new RecycleBinEventArgs ( nodeObjectType , entities , files ) , this ) )
2013-08-14 16:12:13 +02:00
return ;
2012-12-21 07:42:37 +05:00
2014-09-10 15:07:20 +10:00
success = repository . EmptyRecycleBin ( ) ;
EmptiedRecycleBin . RaiseEvent ( new RecycleBinEventArgs ( nodeObjectType , entities , files , success ) , this ) ;
2013-08-14 16:12:13 +02:00
if ( success )
2015-07-02 17:20:27 +02:00
repository . DeleteMediaFiles ( files ) ;
2013-08-14 16:12:13 +02:00
}
}
2015-01-19 15:12:34 +11:00
Audit ( AuditType . Delete , "Empty Media Recycle Bin performed by user" , 0 , - 21 ) ;
2014-01-08 20:19:08 +11:00
}
/// <summary>
/// Deletes all media of specified type. All children of deleted media is moved to Recycle Bin.
/// </summary>
/// <remarks>This needs extra care and attention as its potentially a dangerous and extensive operation</remarks>
/// <param name="mediaTypeId">Id of the <see cref="IMediaType"/></param>
/// <param name="userId">Optional id of the user deleting the media</param>
public void DeleteMediaOfType ( int mediaTypeId , int userId = 0 )
2013-03-19 23:46:13 +06:00
{
2014-09-10 15:07:20 +10:00
//TODO: This all needs to be done on the repo level in one trans
2014-01-08 20:19:08 +11:00
using ( new WriteLock ( Locker ) )
{
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2014-01-08 20:19:08 +11:00
{
//NOTE What about media that has the contenttype as part of its composition?
//The ContentType has to be removed from the composition somehow as it would otherwise break
//Dbl.check+test that the ContentType's Id is removed from the ContentType2ContentType table
var query = Query < IMedia > . Builder . Where ( x = > x . ContentTypeId = = mediaTypeId ) ;
var contents = repository . GetByQuery ( query ) . ToArray ( ) ;
if ( Deleting . IsRaisedEventCancelled ( new DeleteEventArgs < IMedia > ( contents ) , this ) )
return ;
foreach ( var content in contents . OrderByDescending ( x = > x . ParentId ) )
{
//Look for children of current content and move that to trash before the current content is deleted
var c = content ;
var childQuery = Query < IMedia > . Builder . Where ( x = > x . Path . StartsWith ( c . Path ) ) ;
var children = repository . GetByQuery ( childQuery ) ;
foreach ( var child in children )
{
if ( child . ContentType . Id ! = mediaTypeId )
MoveToRecycleBin ( child , userId ) ;
}
2014-09-10 15:07:20 +10:00
//Permanently delete the content
2014-01-08 20:19:08 +11:00
Delete ( content , userId ) ;
}
}
2015-01-19 15:12:34 +11:00
Audit ( AuditType . Delete , "Delete Media items by Type performed by user" , userId , - 1 ) ;
2014-01-08 20:19:08 +11:00
}
2013-03-19 23:46:13 +06:00
}
2012-12-15 11:17:32 -01:00
2014-01-08 20:19:08 +11:00
/// <summary>
2015-07-29 16:00:06 +02:00
/// Deletes an <see cref="IMedia"/> object by moving it to the Recycle Bin
2014-01-08 20:19:08 +11:00
/// </summary>
/// <param name="media">The <see cref="IMedia"/> to delete</param>
/// <param name="userId">Id of the User deleting the Media</param>
2015-07-29 16:00:06 +02:00
Attempt < OperationStatus > IMediaServiceOperations . MoveToRecycleBin ( IMedia media , int userId )
2014-01-08 20:19:08 +11:00
{
2015-07-29 16:00:06 +02:00
if ( media = = null ) throw new ArgumentNullException ( "media" ) ;
2014-09-10 15:07:20 +10:00
2015-08-04 14:52:34 +02:00
var evtMsgs = EventMessagesFactory . Get ( ) ;
2017-01-05 10:29:03 +11:00
using ( new WriteLock ( Locker ) )
2015-07-29 16:00:06 +02:00
{
2017-01-05 10:29:03 +11:00
//Hack: this ensures that the entity's path is valid and if not it fixes/persists it
//see: http://issues.umbraco.org/issue/U4-9336
media . EnsureValidPath ( Logger , entity = > GetById ( entity . ParentId ) , QuickUpdate ) ;
2015-07-29 16:00:06 +02:00
2017-01-05 10:29:03 +11:00
var originalPath = media . Path ;
2015-07-29 16:00:06 +02:00
2017-01-05 10:29:03 +11:00
if ( Trashing . IsRaisedEventCancelled (
new MoveEventArgs < IMedia > ( new MoveEventInfo < IMedia > ( media , originalPath , Constants . System . RecycleBinMedia ) ) , this ) )
{
return OperationStatus . Cancelled ( evtMsgs ) ;
}
2012-12-15 11:17:32 -01:00
2017-01-05 10:29:03 +11:00
var moveInfo = new List < MoveEventInfo < IMedia > >
{
new MoveEventInfo < IMedia > ( media , originalPath , Constants . System . RecycleBinMedia )
} ;
2014-09-10 15:07:20 +10:00
2017-01-05 10:29:03 +11:00
//Find Descendants, which will be moved to the recycle bin along with the parent/grandparent.
var descendants = GetDescendants ( media ) . OrderBy ( x = > x . Level ) . ToList ( ) ;
2015-07-29 16:00:06 +02:00
2017-01-05 10:29:03 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2015-07-29 16:00:06 +02:00
{
2017-01-05 10:29:03 +11:00
//TODO: This should be part of the repo!
2015-07-29 16:00:06 +02:00
//Remove 'published' xml from the cmsContentXml table for the unpublished media
2017-01-05 10:29:03 +11:00
uow . Database . Delete < ContentXmlDto > ( "WHERE nodeId = @Id" , new { Id = media . Id } ) ;
2015-07-29 16:00:06 +02:00
2017-01-05 10:29:03 +11:00
media . ChangeTrashedState ( true , Constants . System . RecycleBinMedia ) ;
repository . AddOrUpdate ( media ) ;
2015-07-29 16:00:06 +02:00
2017-01-05 10:29:03 +11:00
//Loop through descendants to update their trash state, but ensuring structure by keeping the ParentId
foreach ( var descendant in descendants )
{
//Remove 'published' xml from the cmsContentXml table for the unpublished media
uow . Database . Delete < ContentXmlDto > ( "WHERE nodeId = @Id" , new { Id = descendant . Id } ) ;
2015-07-29 16:00:06 +02:00
2017-01-05 10:29:03 +11:00
descendant . ChangeTrashedState ( true , descendant . ParentId ) ;
repository . AddOrUpdate ( descendant ) ;
moveInfo . Add ( new MoveEventInfo < IMedia > ( descendant , descendant . Path , descendant . ParentId ) ) ;
}
2012-12-15 11:17:32 -01:00
2017-01-05 10:29:03 +11:00
uow . Commit ( ) ;
}
2015-07-29 16:00:06 +02:00
2017-01-05 10:29:03 +11:00
Trashed . RaiseEvent (
new MoveEventArgs < IMedia > ( false , evtMsgs , moveInfo . ToArray ( ) ) , this ) ;
2015-07-29 16:00:06 +02:00
2017-01-05 10:29:03 +11:00
Audit ( AuditType . Move , "Move Media to Recycle Bin performed by user" , userId , media . Id ) ;
return OperationStatus . Success ( evtMsgs ) ;
}
2015-07-29 16:00:06 +02:00
}
/// <summary>
/// Permanently deletes an <see cref="IMedia"/> object as well as all of its Children.
/// </summary>
/// <remarks>
/// Please note that this method will completely remove the Media from the database,
/// as well as associated media files from the file system.
/// </remarks>
/// <param name="media">The <see cref="IMedia"/> to delete</param>
/// <param name="userId">Id of the User deleting the Media</param>
public void Delete ( IMedia media , int userId = 0 )
{
2015-08-31 13:17:50 +02:00
( ( IMediaServiceOperations ) this ) . Delete ( media , userId ) ;
2014-01-08 20:19:08 +11:00
}
2012-12-15 11:17:32 -01:00
2012-12-17 13:37:36 -01:00
/// <summary>
/// Permanently deletes versions from an <see cref="IMedia"/> object prior to a specific date.
2013-09-18 11:49:36 +02:00
/// This method will never delete the latest version of a content item.
2012-12-17 13:37:36 -01:00
/// </summary>
/// <param name="id">Id of the <see cref="IMedia"/> object to delete versions from</param>
/// <param name="versionDate">Latest version date</param>
/// <param name="userId">Optional Id of the User deleting versions of a Content object</param>
2013-01-25 08:58:21 -01:00
public void DeleteVersions ( int id , DateTime versionDate , int userId = 0 )
2012-12-17 13:37:36 -01:00
{
2014-01-08 20:19:08 +11:00
if ( DeletingVersions . IsRaisedEventCancelled ( new DeleteRevisionsEventArgs ( id , dateToRetain : versionDate ) , this ) )
return ;
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2014-01-08 20:19:08 +11:00
{
repository . DeleteVersions ( id , versionDate ) ;
uow . Commit ( ) ;
}
DeletedVersions . RaiseEvent ( new DeleteRevisionsEventArgs ( id , false , dateToRetain : versionDate ) , this ) ;
2015-01-19 15:12:34 +11:00
Audit ( AuditType . Delete , "Delete Media by version date performed by user" , userId , - 1 ) ;
2012-12-17 13:37:36 -01:00
}
/// <summary>
/// Permanently deletes specific version(s) from an <see cref="IMedia"/> object.
2013-09-18 11:49:36 +02:00
/// This method will never delete the latest version of a content item.
2012-12-17 13:37:36 -01:00
/// </summary>
/// <param name="id">Id of the <see cref="IMedia"/> object to delete a version from</param>
/// <param name="versionId">Id of the version to delete</param>
/// <param name="deletePriorVersions">Boolean indicating whether to delete versions prior to the versionId</param>
/// <param name="userId">Optional Id of the User deleting versions of a Content object</param>
2013-01-25 08:58:21 -01:00
public void DeleteVersion ( int id , Guid versionId , bool deletePriorVersions , int userId = 0 )
2012-12-17 13:37:36 -01:00
{
2013-09-18 11:49:36 +02:00
if ( DeletingVersions . IsRaisedEventCancelled ( new DeleteRevisionsEventArgs ( id , specificVersion : versionId ) , this ) )
return ;
2012-12-17 13:37:36 -01:00
if ( deletePriorVersions )
{
var content = GetByVersion ( versionId ) ;
DeleteVersions ( id , content . UpdateDate , userId ) ;
}
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2014-01-08 20:19:08 +11:00
{
repository . DeleteVersion ( versionId ) ;
uow . Commit ( ) ;
}
2012-12-17 13:37:36 -01:00
2014-01-08 20:19:08 +11:00
DeletedVersions . RaiseEvent ( new DeleteRevisionsEventArgs ( id , false , specificVersion : versionId ) , this ) ;
2012-12-17 13:37:36 -01:00
2015-01-19 15:12:34 +11:00
Audit ( AuditType . Delete , "Delete Media by version performed by user" , userId , - 1 ) ;
2012-12-17 13:37:36 -01:00
}
2016-02-26 14:30:32 +00:00
2015-07-24 11:44:09 +02:00
/// <summary>
/// Saves a single <see cref="IMedia"/> object
/// </summary>
/// <param name="media">The <see cref="IMedia"/> to save</param>
/// <param name="userId">Id of the User saving the Content</param>
/// <param name="raiseEvents">Optional boolean indicating whether or not to raise events.</param>
public void Save ( IMedia media , int userId = 0 , bool raiseEvents = true )
{
2016-02-26 14:30:32 +00:00
( ( IMediaServiceOperations ) this ) . Save ( media , userId , raiseEvents ) ;
2015-07-24 11:44:09 +02:00
}
/// <summary>
/// Saves a collection of <see cref="IMedia"/> objects
/// </summary>
/// <param name="medias">Collection of <see cref="IMedia"/> to save</param>
/// <param name="userId">Id of the User saving the Content</param>
/// <param name="raiseEvents">Optional boolean indicating whether or not to raise events.</param>
public void Save ( IEnumerable < IMedia > medias , int userId = 0 , bool raiseEvents = true )
{
2015-07-29 16:00:06 +02:00
( ( IMediaServiceOperations ) this ) . Save ( medias , userId , raiseEvents ) ;
2014-01-08 20:19:08 +11:00
}
2012-12-11 23:19:07 +05:00
2013-05-23 11:34:06 -02:00
/// <summary>
/// Sorts a collection of <see cref="IMedia"/> objects by updating the SortOrder according
2013-05-29 13:18:03 -02:00
/// to the ordering of items in the passed in <see cref="IEnumerable{T}"/>.
2013-05-23 11:34:06 -02:00
/// </summary>
/// <param name="items"></param>
/// <param name="userId"></param>
/// <param name="raiseEvents"></param>
/// <returns>True if sorting succeeded, otherwise False</returns>
2013-05-29 13:18:03 -02:00
public bool Sort ( IEnumerable < IMedia > items , int userId = 0 , bool raiseEvents = true )
2013-05-23 11:34:06 -02:00
{
2014-04-28 17:38:24 +10:00
var asArray = items . ToArray ( ) ;
2013-05-23 11:34:06 -02:00
if ( raiseEvents )
{
2014-04-28 17:38:24 +10:00
if ( Saving . IsRaisedEventCancelled ( new SaveEventArgs < IMedia > ( asArray ) , this ) )
2013-05-23 11:34:06 -02:00
return false ;
}
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2013-05-23 11:34:06 -02:00
{
2014-09-10 15:07:20 +10:00
int i = 0 ;
foreach ( var media in asArray )
2013-05-23 11:34:06 -02:00
{
2014-09-10 15:07:20 +10:00
//If the current sort order equals that of the media
//we don't need to update it, so just increment the sort order
//and continue.
if ( media . SortOrder = = i )
2013-05-23 11:34:06 -02:00
{
i + + ;
2014-09-10 15:07:20 +10:00
continue ;
2013-05-23 11:34:06 -02:00
}
2014-09-10 15:07:20 +10:00
media . SortOrder = i ;
i + + ;
repository . AddOrUpdate ( media ) ;
2014-09-30 18:46:02 +10:00
repository . AddOrUpdateContentXml ( media , m = > _entitySerializer . Serialize ( this , _dataTypeService , _userService , m ) ) ;
2014-09-10 15:07:20 +10:00
// generate preview for blame history?
if ( UmbracoConfig . For . UmbracoSettings ( ) . Content . GlobalPreviewStorageEnabled )
{
2014-09-30 18:46:02 +10:00
repository . AddOrUpdatePreviewXml ( media , m = > _entitySerializer . Serialize ( this , _dataTypeService , _userService , m ) ) ;
2014-09-10 15:07:20 +10:00
}
2013-05-23 11:34:06 -02:00
}
2014-09-10 15:07:20 +10:00
uow . Commit ( ) ;
2013-05-23 11:34:06 -02:00
}
if ( raiseEvents )
2014-04-28 17:38:24 +10:00
Saved . RaiseEvent ( new SaveEventArgs < IMedia > ( asArray , false ) , this ) ;
2013-05-23 11:34:06 -02:00
2015-01-19 15:12:34 +11:00
Audit ( AuditType . Sort , "Sorting Media performed by user" , userId , 0 ) ;
2013-05-23 11:34:06 -02:00
return true ;
}
2014-04-28 18:53:21 +10:00
2016-10-27 10:47:32 +02:00
/// <summary>
/// Gets paged media descendants as XML by path
/// </summary>
/// <param name="path">Path starts with</param>
/// <param name="pageIndex">Page number</param>
/// <param name="pageSize">Page size</param>
/// <param name="totalRecords">Total records the query would return without paging</param>
/// <returns>A paged enumerable of XML entries of media items</returns>
public IEnumerable < XElement > GetPagedXmlEntries ( string path , long pageIndex , int pageSize , out long totalRecords )
{
Mandate . ParameterCondition ( pageIndex > = 0 , "pageIndex" ) ;
Mandate . ParameterCondition ( pageSize > 0 , "pageSize" ) ;
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
{
var contents = repository . GetPagedXmlEntriesByPath ( path , pageIndex , pageSize , out totalRecords ) ;
return contents ;
}
}
2013-04-25 22:13:05 -10:00
/// <summary>
/// Rebuilds all xml content in the cmsContentXml table for all media
/// </summary>
/// <param name="contentTypeIds">
/// Only rebuild the xml structures for the content type ids passed in, if none then rebuilds the structures
/// for all media
/// </param>
2014-10-23 18:31:08 +10:00
public void RebuildXmlStructures ( params int [ ] contentTypeIds )
2013-04-25 22:13:05 -10:00
{
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
2013-04-25 22:13:05 -10:00
{
2014-10-23 18:31:08 +10:00
repository . RebuildXmlStructures (
media = > _entitySerializer . Serialize ( this , _dataTypeService , _userService , media ) ,
contentTypeIds : contentTypeIds . Length = = 0 ? null : contentTypeIds ) ;
2013-04-25 22:13:05 -10:00
}
2014-10-23 18:31:08 +10:00
2015-01-19 15:12:34 +11:00
Audit ( AuditType . Publish , "MediaService.RebuildXmlStructures completed, the xml has been regenerated in the database" , 0 , - 1 ) ;
2013-04-25 22:13:05 -10:00
}
2013-01-18 10:56:14 -01:00
/// <summary>
/// Updates the Path and Level on a collection of <see cref="IMedia"/> objects
2013-09-13 10:29:03 +02:00
/// based on the Parent's Path and Level. Also change the trashed state if relevant.
2013-01-18 10:56:14 -01:00
/// </summary>
/// <param name="children">Collection of <see cref="IMedia"/> objects to update</param>
/// <param name="parentPath">Path of the Parent media</param>
/// <param name="parentLevel">Level of the Parent media</param>
2013-09-13 10:29:03 +02:00
/// <param name="parentTrashed">Indicates whether the Parent is trashed or not</param>
2014-04-23 20:19:36 +10:00
/// <param name="eventInfo">Used to track the objects to be used in the move event</param>
2013-01-18 10:56:14 -01:00
/// <returns>Collection of updated <see cref="IMedia"/> objects</returns>
2014-04-23 20:19:36 +10:00
private IEnumerable < IMedia > UpdatePropertiesOnChildren ( IEnumerable < IMedia > children , string parentPath , int parentLevel , bool parentTrashed , ICollection < MoveEventInfo < IMedia > > eventInfo )
2013-01-18 10:56:14 -01:00
{
var list = new List < IMedia > ( ) ;
foreach ( var child in children )
{
2014-04-23 20:19:36 +10:00
var originalPath = child . Path ;
2013-01-18 10:56:14 -01:00
child . Path = string . Concat ( parentPath , "," , child . Id ) ;
child . Level = parentLevel + 1 ;
2013-09-13 10:29:03 +02:00
if ( parentTrashed ! = child . Trashed )
{
child . ChangeTrashedState ( parentTrashed , child . ParentId ) ;
}
2014-01-08 20:19:08 +11:00
2014-04-23 20:19:36 +10:00
eventInfo . Add ( new MoveEventInfo < IMedia > ( child , originalPath , child . ParentId ) ) ;
2013-01-18 10:56:14 -01:00
list . Add ( child ) ;
2013-12-19 12:27:21 +11:00
var grandkids = GetChildren ( child . Id ) . ToArray ( ) ;
2013-01-18 10:56:14 -01:00
if ( grandkids . Any ( ) )
{
2014-04-23 20:19:36 +10:00
list . AddRange ( UpdatePropertiesOnChildren ( grandkids , child . Path , child . Level , child . Trashed , eventInfo ) ) ;
2013-01-18 10:56:14 -01:00
}
}
return list ;
}
2014-04-28 18:53:21 +10:00
//private void CreateAndSaveMediaXml(XElement xml, int id, UmbracoDatabase db)
//{
2015-07-06 15:32:06 +02:00
// var poco = new ContentXmlDto { NodeId = id, Xml = xml.ToDataString() };
2014-04-28 18:53:21 +10:00
// var exists = db.FirstOrDefault<ContentXmlDto>("WHERE nodeId = @Id", new { Id = id }) != null;
// int result = exists ? db.Update(poco) : Convert.ToInt32(db.Insert(poco));
//}
2013-05-23 10:29:44 -02:00
2013-05-27 08:45:07 -02:00
private IMediaType FindMediaTypeByAlias ( string mediaTypeAlias )
{
2015-01-13 18:19:52 +11:00
Mandate . ParameterNotNullOrEmpty ( mediaTypeAlias , "mediaTypeAlias" ) ;
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaTypeRepository ( uow ) )
2013-05-27 08:45:07 -02:00
{
var query = Query < IMediaType > . Builder . Where ( x = > x . Alias = = mediaTypeAlias ) ;
var mediaTypes = repository . GetByQuery ( query ) ;
if ( mediaTypes . Any ( ) = = false )
throw new Exception ( string . Format ( "No MediaType matching the passed in Alias: '{0}' was found" ,
mediaTypeAlias ) ) ;
var mediaType = mediaTypes . First ( ) ;
if ( mediaType = = null )
throw new Exception ( string . Format ( "MediaType matching the passed in Alias: '{0}' was null" ,
mediaTypeAlias ) ) ;
return mediaType ;
}
}
2015-01-19 15:12:34 +11:00
private void Audit ( AuditType type , string message , int userId , int objectId )
{
2015-01-19 18:37:48 +11:00
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var auditRepo = RepositoryFactory . CreateAuditRepository ( uow ) )
2015-01-19 15:12:34 +11:00
{
auditRepo . AddOrUpdate ( new AuditItem ( objectId , message , type , userId ) ) ;
uow . Commit ( ) ;
2017-01-05 10:29:03 +11:00
}
}
/// <summary>
/// Hack: This is used to fix some data if an entity's properties are invalid/corrupt
/// </summary>
/// <param name="media"></param>
private void QuickUpdate ( IMedia media )
{
if ( media = = null ) throw new ArgumentNullException ( "media" ) ;
if ( media . HasIdentity = = false ) throw new InvalidOperationException ( "Cannot update an entity without an Identity" ) ;
var uow = UowProvider . GetUnitOfWork ( ) ;
using ( var repository = RepositoryFactory . CreateMediaRepository ( uow ) )
{
repository . AddOrUpdate ( media ) ;
uow . Commit ( ) ;
2015-01-19 15:12:34 +11:00
}
}
2014-01-08 20:19:08 +11:00
#region Event Handlers
/// <summary>
/// Occurs before Delete
/// </summary>
public static event TypedEventHandler < IMediaService , DeleteRevisionsEventArgs > DeletingVersions ;
/// <summary>
/// Occurs after Delete
/// </summary>
public static event TypedEventHandler < IMediaService , DeleteRevisionsEventArgs > DeletedVersions ;
/// <summary>
/// Occurs before Delete
/// </summary>
public static event TypedEventHandler < IMediaService , DeleteEventArgs < IMedia > > Deleting ;
/// <summary>
/// Occurs after Delete
/// </summary>
public static event TypedEventHandler < IMediaService , DeleteEventArgs < IMedia > > Deleted ;
/// <summary>
/// Occurs before Save
/// </summary>
public static event TypedEventHandler < IMediaService , SaveEventArgs < IMedia > > Saving ;
/// <summary>
/// Occurs after Save
/// </summary>
public static event TypedEventHandler < IMediaService , SaveEventArgs < IMedia > > Saved ;
/// <summary>
/// Occurs before Create
/// </summary>
2014-02-25 01:45:41 +11:00
[Obsolete("Use the Created event instead, the Creating and Created events both offer the same functionality, Creating event has been deprecated.")]
2014-01-08 20:19:08 +11:00
public static event TypedEventHandler < IMediaService , NewEventArgs < IMedia > > Creating ;
/// <summary>
/// Occurs after Create
/// </summary>
/// <remarks>
/// Please note that the Media object has been created, but not saved
/// so it does not have an identity yet (meaning no Id has been set).
/// </remarks>
public static event TypedEventHandler < IMediaService , NewEventArgs < IMedia > > Created ;
2012-12-11 23:19:07 +05:00
2014-01-08 20:19:08 +11:00
/// <summary>
/// Occurs before Content is moved to Recycle Bin
/// </summary>
public static event TypedEventHandler < IMediaService , MoveEventArgs < IMedia > > Trashing ;
2012-12-11 23:19:07 +05:00
2014-01-08 20:19:08 +11:00
/// <summary>
/// Occurs after Content is moved to Recycle Bin
/// </summary>
public static event TypedEventHandler < IMediaService , MoveEventArgs < IMedia > > Trashed ;
2012-12-11 23:19:07 +05:00
2014-01-08 20:19:08 +11:00
/// <summary>
/// Occurs before Move
/// </summary>
public static event TypedEventHandler < IMediaService , MoveEventArgs < IMedia > > Moving ;
2012-12-11 23:19:07 +05:00
2014-01-08 20:19:08 +11:00
/// <summary>
/// Occurs after Move
/// </summary>
public static event TypedEventHandler < IMediaService , MoveEventArgs < IMedia > > Moved ;
2013-08-14 16:12:13 +02:00
/// <summary>
/// Occurs before the Recycle Bin is emptied
/// </summary>
public static event TypedEventHandler < IMediaService , RecycleBinEventArgs > EmptyingRecycleBin ;
/// <summary>
/// Occurs after the Recycle Bin has been Emptied
/// </summary>
public static event TypedEventHandler < IMediaService , RecycleBinEventArgs > EmptiedRecycleBin ;
2014-01-08 20:19:08 +11:00
#endregion
}
2014-03-25 20:49:52 -07:00
}