using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Auditing;
using Umbraco.Core.Events;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.UnitOfWork;
namespace Umbraco.Core.Services
{
///
/// Represents the Macro Service, which is an easy access to operations involving
///
internal class MacroService : IMacroService
{
private readonly RepositoryFactory _repositoryFactory;
private readonly IUnitOfWorkProvider _uowProvider;
public MacroService()
: this(new RepositoryFactory())
{
}
public MacroService(RepositoryFactory repositoryFactory)
: this(new FileUnitOfWorkProvider(), repositoryFactory)
{
}
public MacroService(IUnitOfWorkProvider provider)
: this(provider, new RepositoryFactory())
{
}
public MacroService(IUnitOfWorkProvider provider, RepositoryFactory repositoryFactory) : this(provider, repositoryFactory, false)
{
}
public MacroService(IUnitOfWorkProvider provider, RepositoryFactory repositoryFactory, bool ensureCachedMacros)
{
_uowProvider = provider;
_repositoryFactory = repositoryFactory;
if(ensureCachedMacros)
EnsureMacroCache();
}
///
/// Ensures the macro cache by getting all macros
/// from the repository and thus caching them.
///
private void EnsureMacroCache()
{
IEnumerable macros = GetAll();
}
///
/// Gets an object by its alias
///
/// Alias to retrieve an for
/// An object
public IMacro GetByAlias(string alias)
{
using (var repository = _repositoryFactory.CreateMacroRepository(_uowProvider.GetUnitOfWork()))
{
return repository.Get(alias);
}
}
///
/// Gets a list all available objects
///
/// Optional array of aliases to limit the results
/// An enumerable list of objects
public IEnumerable GetAll(params string[] aliases)
{
using (var repository = _repositoryFactory.CreateMacroRepository(_uowProvider.GetUnitOfWork()))
{
return repository.GetAll(aliases);
}
}
///
/// Deletes an
///
/// to delete
/// Optional id of the user deleting the macro
public void Delete(IMacro macro, int userId = -1)
{
var e = new DeleteEventArgs();
if (Deleting != null)
Deleting(macro, e);
if (!e.Cancel)
{
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateMacroRepository(uow))
{
repository.Delete(macro);
uow.Commit();
if (Deleted != null)
Deleted(macro, e);
}
Audit.Add(AuditTypes.Delete, "Delete Macro performed by user", userId > -1 ? userId : 0, -1);
}
}
///
/// Saves an
///
/// to save
/// Optional Id of the user deleting the macro
public void Save(IMacro macro, int userId = -1)
{
var e = new SaveEventArgs();
if (Saving != null)
Saving(macro, e);
if (!e.Cancel)
{
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateMacroRepository(uow))
{
repository.AddOrUpdate(macro);
uow.Commit();
if (Saved != null)
Saved(macro, e);
}
Audit.Add(AuditTypes.Save, "Save Macro performed by user", userId > -1 ? userId : 0, -1);
}
}
///
/// Gets a list all available plugins
///
/// An enumerable list of objects
public IEnumerable GetMacroPropertyTypes()
{
return MacroPropertyTypeResolver.Current.MacroPropertyTypes;
}
///
/// Gets an by its alias
///
/// Alias to retrieve an for
/// An object
public IMacroPropertyType GetMacroPropertyTypeByAlias(string alias)
{
return MacroPropertyTypeResolver.Current.MacroPropertyTypes.FirstOrDefault(x => x.Alias == alias);
}
#region Event Handlers
///
/// Occurs before Delete
///
public static event EventHandler Deleting;
///
/// Occurs after Delete
///
public static event EventHandler Deleted;
///
/// Occurs before Save
///
public static event EventHandler Saving;
///
/// Occurs after Save
///
public static event EventHandler Saved;
#endregion
}
}