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 } }