using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Auditing;
using Umbraco.Core.Configuration;
using Umbraco.Core.Events;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Querying;
using Umbraco.Core.Persistence.UnitOfWork;
namespace Umbraco.Core.Services
{
///
/// Represents the Localization Service, which is an easy access to operations involving and
///
public class LocalizationService : ILocalizationService
{
private readonly RepositoryFactory _repositoryFactory;
private readonly IDatabaseUnitOfWorkProvider _uowProvider;
private static readonly Guid RootParentId = new Guid(Constants.Conventions.Localization.DictionaryItemRootId);
[Obsolete("Use the constructors that specify all dependencies instead")]
public LocalizationService()
: this(new RepositoryFactory(false, LoggerResolver.Current.Logger, UmbracoConfig.For.UmbracoSettings()))
{}
[Obsolete("Use the constructors that specify all dependencies instead")]
public LocalizationService(RepositoryFactory repositoryFactory)
: this(new PetaPocoUnitOfWorkProvider(LoggerResolver.Current.Logger), repositoryFactory)
{
}
[Obsolete("Use the constructors that specify all dependencies instead")]
public LocalizationService(IDatabaseUnitOfWorkProvider provider)
: this(provider, new RepositoryFactory(false, LoggerResolver.Current.Logger, UmbracoConfig.For.UmbracoSettings()))
{
}
public LocalizationService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory)
{
_repositoryFactory = repositoryFactory;
_uowProvider = provider;
}
///
/// Creates and saves a new dictionary item and assigns a value to all languages if defaultValue is specified.
///
///
///
///
///
public IDictionaryItem CreateDictionaryItemWithIdentity(string key, Guid? parentId, string defaultValue = null)
{
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateDictionaryRepository(uow))
{
//validate the parent
if (parentId.HasValue && parentId.Value != Guid.Empty)
{
var parent = GetDictionaryItemById(parentId.Value);
if (parent == null)
{
throw new ArgumentException("No parent dictionary item was found with id " + parentId.Value);
}
}
var item = new DictionaryItem(parentId.HasValue ? parentId.Value : RootParentId, key);
if (defaultValue.IsNullOrWhiteSpace() == false)
{
var langs = GetAllLanguages();
var translations = langs.Select(language => new DictionaryTranslation(language, defaultValue))
.Cast()
.ToList();
item.Translations = translations;
}
if (SavingDictionaryItem.IsRaisedEventCancelled(new SaveEventArgs(item), this))
return item;
repository.AddOrUpdate(item);
uow.Commit();
SavedDictionaryItem.RaiseEvent(new SaveEventArgs(item), this);
return item;
}
}
///
/// Gets a by its id
///
/// Id of the
///
public IDictionaryItem GetDictionaryItemById(int id)
{
using (var repository = _repositoryFactory.CreateDictionaryRepository(_uowProvider.GetUnitOfWork()))
{
return repository.Get(id);
}
}
///
/// Gets a by its id
///
/// Id of the
///
public IDictionaryItem GetDictionaryItemById(Guid id)
{
using (var repository = _repositoryFactory.CreateDictionaryRepository(_uowProvider.GetUnitOfWork()))
{
var query = Query.Builder.Where(x => x.Key == id);
var items = repository.GetByQuery(query);
return items.FirstOrDefault();
}
}
///
/// Gets a by its key
///
/// Key of the
///
public IDictionaryItem GetDictionaryItemByKey(string key)
{
using (var repository = _repositoryFactory.CreateDictionaryRepository(_uowProvider.GetUnitOfWork()))
{
var query = Query.Builder.Where(x => x.ItemKey == key);
var items = repository.GetByQuery(query);
return items.FirstOrDefault();
}
}
///
/// Gets a list of children for a
///
/// Id of the parent
/// An enumerable list of objects
public IEnumerable GetDictionaryItemChildren(Guid parentId)
{
using (var repository = _repositoryFactory.CreateDictionaryRepository(_uowProvider.GetUnitOfWork()))
{
var query = Query.Builder.Where(x => x.ParentId == parentId);
var items = repository.GetByQuery(query);
return items;
}
}
///
/// Gets the root/top objects
///
/// An enumerable list of objects
public IEnumerable GetRootDictionaryItems()
{
using (var repository = _repositoryFactory.CreateDictionaryRepository(_uowProvider.GetUnitOfWork()))
{
var query = Query.Builder.Where(x => x.ParentId == RootParentId);
var items = repository.GetByQuery(query);
return items;
}
}
///
/// Checks if a with given key exists
///
/// Key of the
/// True if a exists, otherwise false
public bool DictionaryItemExists(string key)
{
using (var repository = _repositoryFactory.CreateDictionaryRepository(_uowProvider.GetUnitOfWork()))
{
var query = Query.Builder.Where(x => x.ItemKey == key);
var items = repository.GetByQuery(query);
return items.Any();
}
}
///
/// Saves a object
///
/// to save
/// Optional id of the user saving the dictionary item
public void Save(IDictionaryItem dictionaryItem, int userId = 0)
{
if (SavingDictionaryItem.IsRaisedEventCancelled(new SaveEventArgs(dictionaryItem), this))
return;
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateDictionaryRepository(uow))
{
repository.AddOrUpdate(dictionaryItem);
uow.Commit();
}
SavedDictionaryItem.RaiseEvent(new SaveEventArgs(dictionaryItem, false), this);
Audit.Add(AuditTypes.Save, "Save DictionaryItem performed by user", userId, dictionaryItem.Id);
}
///
/// Deletes a object and its related translations
/// as well as its children.
///
/// to delete
/// Optional id of the user deleting the dictionary item
public void Delete(IDictionaryItem dictionaryItem, int userId = 0)
{
if (DeletingDictionaryItem.IsRaisedEventCancelled(new DeleteEventArgs(dictionaryItem), this))
return;
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateDictionaryRepository(uow))
{
//NOTE: The recursive delete is done in the repository
repository.Delete(dictionaryItem);
uow.Commit();
}
DeletedDictionaryItem.RaiseEvent(new DeleteEventArgs(dictionaryItem, false), this);
Audit.Add(AuditTypes.Delete, "Delete DictionaryItem performed by user", userId, dictionaryItem.Id);
}
///
/// Gets a by its id
///
/// Id of the
///
public ILanguage GetLanguageById(int id)
{
using (var repository = _repositoryFactory.CreateLanguageRepository(_uowProvider.GetUnitOfWork()))
{
return repository.Get(id);
}
}
///
/// Gets a by its culture code
///
/// Culture Name - also refered to as the Friendly name
///
public ILanguage GetLanguageByCultureCode(string cultureName)
{
using (var repository = _repositoryFactory.CreateLanguageRepository(_uowProvider.GetUnitOfWork()))
{
var query = Query.Builder.Where(x => x.CultureName == cultureName);
var items = repository.GetByQuery(query);
return items.FirstOrDefault();
}
}
///
/// Gets a by its iso code
///
/// Iso Code of the language (ie. en-US)
///
public ILanguage GetLanguageByIsoCode(string isoCode)
{
using (var repository = _repositoryFactory.CreateLanguageRepository(_uowProvider.GetUnitOfWork()))
{
var query = Query.Builder.Where(x => x.IsoCode == isoCode);
var items = repository.GetByQuery(query);
return items.FirstOrDefault();
}
}
///
/// Gets all available languages
///
/// An enumerable list of objects
public IEnumerable GetAllLanguages()
{
using (var repository = _repositoryFactory.CreateLanguageRepository(_uowProvider.GetUnitOfWork()))
{
var languages = repository.GetAll();
return languages;
}
}
///
/// Saves a object
///
/// to save
/// Optional id of the user saving the language
public void Save(ILanguage language, int userId = 0)
{
if (SavingLanguage.IsRaisedEventCancelled(new SaveEventArgs(language), this))
return;
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateLanguageRepository(uow))
{
repository.AddOrUpdate(language);
uow.Commit();
}
SavedLanguage.RaiseEvent(new SaveEventArgs(language, false), this);
Audit.Add(AuditTypes.Save, "Save Language performed by user", userId, language.Id);
}
///
/// Deletes a by removing it (but not its usages) from the db
///
/// to delete
/// Optional id of the user deleting the language
public void Delete(ILanguage language, int userId = 0)
{
if (DeletingLanguage.IsRaisedEventCancelled(new DeleteEventArgs(language), this))
return;
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateLanguageRepository(uow))
{
//NOTE: There isn't any constraints in the db, so possible references aren't deleted
repository.Delete(language);
uow.Commit();
}
DeletedLanguage.RaiseEvent(new DeleteEventArgs(language, false), this);
Audit.Add(AuditTypes.Delete, "Delete Language performed by user", userId, language.Id);
}
#region Event Handlers
///
/// Occurs before Delete
///
public static event TypedEventHandler> DeletingLanguage;
///
/// Occurs after Delete
///
public static event TypedEventHandler> DeletedLanguage;
///
/// Occurs before Delete
///
public static event TypedEventHandler> DeletingDictionaryItem;
///
/// Occurs after Delete
///
public static event TypedEventHandler> DeletedDictionaryItem;
///
/// Occurs before Save
///
public static event TypedEventHandler> SavingDictionaryItem;
///
/// Occurs after Save
///
public static event TypedEventHandler> SavedDictionaryItem;
///
/// Occurs before Save
///
public static event TypedEventHandler> SavingLanguage;
///
/// Occurs after Save
///
public static event TypedEventHandler> SavedLanguage;
#endregion
}
}