using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Events;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Scoping;
namespace Umbraco.Core.Services.Implement
{
///
/// Represents the Macro Service, which is an easy access to operations involving
///
public class MacroService : ScopeRepositoryService, IMacroService
{
private readonly IMacroRepository _macroRepository;
private readonly IAuditRepository _auditRepository;
public MacroService(IScopeProvider provider, ILogger logger, IEventMessagesFactory eventMessagesFactory,
IMacroRepository macroRepository, IAuditRepository auditRepository)
: base(provider, logger, eventMessagesFactory)
{
_macroRepository = macroRepository;
_auditRepository = auditRepository;
}
///
/// Gets an object by its alias
///
/// Alias to retrieve an for
/// An object
public IMacro GetByAlias(string alias)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
var q = Query().Where(x => x.Alias == alias);
return _macroRepository.Get(q).FirstOrDefault();
}
}
public IEnumerable GetAll()
{
return GetAll(new int[0]);
}
public IEnumerable GetAll(params int[] ids)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
return _macroRepository.GetMany(ids);
}
}
public IEnumerable GetAll(params Guid[] ids)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
return _macroRepository.GetMany(ids);
}
}
public IMacro GetById(int id)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
return _macroRepository.Get(id);
}
}
public IMacro GetById(Guid id)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
{
return _macroRepository.Get(id);
}
}
///
/// Deletes an
///
/// to delete
/// Optional id of the user deleting the macro
public void Delete(IMacro macro, int userId = Constants.Security.SuperUserId)
{
using (var scope = ScopeProvider.CreateScope())
{
var deleteEventArgs = new DeleteEventArgs(macro);
if (scope.Events.DispatchCancelable(Deleting, this, deleteEventArgs))
{
scope.Complete();
return;
}
_macroRepository.Delete(macro);
deleteEventArgs.CanCancel = false;
scope.Events.Dispatch(Deleted, this, deleteEventArgs);
Audit(AuditType.Delete, userId, -1);
scope.Complete();
}
}
///
/// Saves an
///
/// to save
/// Optional Id of the user deleting the macro
public void Save(IMacro macro, int userId = Constants.Security.SuperUserId)
{
using (var scope = ScopeProvider.CreateScope())
{
var saveEventArgs = new SaveEventArgs(macro);
if (scope.Events.DispatchCancelable(Saving, this, saveEventArgs))
{
scope.Complete();
return;
}
if (string.IsNullOrWhiteSpace(macro.Name))
{
throw new ArgumentException("Cannot save macro with empty name.");
}
_macroRepository.Save(macro);
saveEventArgs.CanCancel = false;
scope.Events.Dispatch(Saved, this, saveEventArgs);
Audit(AuditType.Save, userId, -1);
scope.Complete();
}
}
/////
///// 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);
//}
private void Audit(AuditType type, int userId, int objectId)
{
_auditRepository.Save(new AuditItem(objectId, type, userId, "Macro"));
}
#region Event Handlers
///
/// Occurs before Delete
///
public static event TypedEventHandler> Deleting;
///
/// Occurs after Delete
///
public static event TypedEventHandler> Deleted;
///
/// Occurs before Save
///
public static event TypedEventHandler> Saving;
///
/// Occurs after Save
///
public static event TypedEventHandler> Saved;
#endregion
}
}