2012-11-07 13:56:52 -01:00
|
|
|
using System;
|
2012-10-24 12:22:52 -02:00
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
2012-12-10 14:53:36 -01:00
|
|
|
using Umbraco.Core.Auditing;
|
2012-12-15 10:43:03 +05:00
|
|
|
using Umbraco.Core.Events;
|
2012-10-24 12:22:52 -02:00
|
|
|
using Umbraco.Core.Models;
|
|
|
|
|
using Umbraco.Core.Persistence;
|
|
|
|
|
using Umbraco.Core.Persistence.Querying;
|
|
|
|
|
using Umbraco.Core.Persistence.UnitOfWork;
|
|
|
|
|
|
2012-11-12 07:40:11 -01:00
|
|
|
namespace Umbraco.Core.Services
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Represents the Localization Service, which is an easy access to operations involving <see cref="Language"/> and <see cref="DictionaryItem"/>
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class LocalizationService : ILocalizationService
|
|
|
|
|
{
|
2012-12-14 08:22:42 +05:00
|
|
|
private readonly RepositoryFactory _repositoryFactory;
|
2012-12-14 13:06:58 -01:00
|
|
|
private readonly IDatabaseUnitOfWorkProvider _uowProvider;
|
2012-12-14 08:22:42 +05:00
|
|
|
private static readonly Guid RootParentId = new Guid("41c7638d-f529-4bff-853e-59a0c2fb1bde");
|
2012-12-14 13:06:58 -01:00
|
|
|
|
2012-12-14 13:27:10 -01:00
|
|
|
public LocalizationService()
|
|
|
|
|
: this(new RepositoryFactory())
|
|
|
|
|
{}
|
2012-10-24 12:22:52 -02:00
|
|
|
|
2012-12-14 08:22:42 +05:00
|
|
|
public LocalizationService(RepositoryFactory repositoryFactory)
|
|
|
|
|
: this(new PetaPocoUnitOfWorkProvider(), repositoryFactory)
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
2012-12-14 13:27:10 -01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public LocalizationService(IDatabaseUnitOfWorkProvider provider)
|
|
|
|
|
: this(provider, new RepositoryFactory())
|
|
|
|
|
{
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
2012-12-14 08:22:42 +05:00
|
|
|
public LocalizationService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory)
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
2012-12-14 08:22:42 +05:00
|
|
|
_repositoryFactory = repositoryFactory;
|
2012-12-14 13:06:58 -01:00
|
|
|
_uowProvider = provider;
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a <see cref="IDictionaryItem"/> by its <see cref="Int32"/> id
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="id">Id of the <see cref="IDictionaryItem"/></param>
|
|
|
|
|
/// <returns><see cref="IDictionaryItem"/></returns>
|
|
|
|
|
public IDictionaryItem GetDictionaryItemById(int id)
|
|
|
|
|
{
|
2012-12-14 13:06:58 -01:00
|
|
|
using (var repository = _repositoryFactory.CreateDictionaryRepository(_uowProvider.GetUnitOfWork()))
|
|
|
|
|
{
|
|
|
|
|
return repository.Get(id);
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a <see cref="IDictionaryItem"/> by its <see cref="Guid"/> id
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="id">Id of the <see cref="IDictionaryItem"/></param>
|
|
|
|
|
/// <returns><see cref="DictionaryItem"/></returns>
|
|
|
|
|
public IDictionaryItem GetDictionaryItemById(Guid id)
|
|
|
|
|
{
|
2012-12-14 13:06:58 -01:00
|
|
|
using (var repository = _repositoryFactory.CreateDictionaryRepository(_uowProvider.GetUnitOfWork()))
|
|
|
|
|
{
|
|
|
|
|
var query = Query<IDictionaryItem>.Builder.Where(x => x.Key == id);
|
|
|
|
|
var items = repository.GetByQuery(query);
|
2012-10-24 12:22:52 -02:00
|
|
|
|
2012-12-14 13:06:58 -01:00
|
|
|
return items.FirstOrDefault();
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a <see cref="IDictionaryItem"/> by its key
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="key">Key of the <see cref="IDictionaryItem"/></param>
|
|
|
|
|
/// <returns><see cref="IDictionaryItem"/></returns>
|
|
|
|
|
public IDictionaryItem GetDictionaryItemByKey(string key)
|
|
|
|
|
{
|
2012-12-14 13:06:58 -01:00
|
|
|
using (var repository = _repositoryFactory.CreateDictionaryRepository(_uowProvider.GetUnitOfWork()))
|
|
|
|
|
{
|
|
|
|
|
var query = Query<IDictionaryItem>.Builder.Where(x => x.ItemKey == key);
|
|
|
|
|
var items = repository.GetByQuery(query);
|
2012-10-24 12:22:52 -02:00
|
|
|
|
2012-12-14 13:06:58 -01:00
|
|
|
return items.FirstOrDefault();
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a list of children for a <see cref="IDictionaryItem"/>
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="parentId">Id of the parent</param>
|
|
|
|
|
/// <returns>An enumerable list of <see cref="IDictionaryItem"/> objects</returns>
|
|
|
|
|
public IEnumerable<IDictionaryItem> GetDictionaryItemChildren(Guid parentId)
|
|
|
|
|
{
|
2012-12-14 13:06:58 -01:00
|
|
|
using (var repository = _repositoryFactory.CreateDictionaryRepository(_uowProvider.GetUnitOfWork()))
|
|
|
|
|
{
|
|
|
|
|
var query = Query<IDictionaryItem>.Builder.Where(x => x.ParentId == parentId);
|
|
|
|
|
var items = repository.GetByQuery(query);
|
2012-10-24 12:22:52 -02:00
|
|
|
|
2012-12-14 13:06:58 -01:00
|
|
|
return items;
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the root/top <see cref="IDictionaryItem"/> objects
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns>An enumerable list of <see cref="IDictionaryItem"/> objects</returns>
|
|
|
|
|
public IEnumerable<IDictionaryItem> GetRootDictionaryItems()
|
|
|
|
|
{
|
2012-12-14 13:06:58 -01:00
|
|
|
using (var repository = _repositoryFactory.CreateDictionaryRepository(_uowProvider.GetUnitOfWork()))
|
|
|
|
|
{
|
|
|
|
|
var query = Query<IDictionaryItem>.Builder.Where(x => x.ParentId == RootParentId);
|
|
|
|
|
var items = repository.GetByQuery(query);
|
2012-10-24 12:22:52 -02:00
|
|
|
|
2012-12-14 13:06:58 -01:00
|
|
|
return items;
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Checks if a <see cref="IDictionaryItem"/> with given key exists
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="key">Key of the <see cref="IDictionaryItem"/></param>
|
|
|
|
|
/// <returns>True if a <see cref="IDictionaryItem"/> exists, otherwise false</returns>
|
|
|
|
|
public bool DictionaryItemExists(string key)
|
|
|
|
|
{
|
2012-12-14 13:06:58 -01:00
|
|
|
using (var repository = _repositoryFactory.CreateDictionaryRepository(_uowProvider.GetUnitOfWork()))
|
|
|
|
|
{
|
|
|
|
|
var query = Query<IDictionaryItem>.Builder.Where(x => x.ItemKey == key);
|
|
|
|
|
var items = repository.GetByQuery(query);
|
2012-10-24 12:22:52 -02:00
|
|
|
|
2012-12-14 13:06:58 -01:00
|
|
|
return items.Any();
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Saves a <see cref="IDictionaryItem"/> object
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dictionaryItem"><see cref="IDictionaryItem"/> to save</param>
|
2012-12-10 14:53:36 -01:00
|
|
|
/// <param name="userId">Optional id of the user saving the dictionary item</param>
|
|
|
|
|
public void Save(IDictionaryItem dictionaryItem, int userId = -1)
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
2012-12-10 14:53:36 -01:00
|
|
|
var e = new SaveEventArgs();
|
|
|
|
|
if (Saving != null)
|
|
|
|
|
Saving(dictionaryItem, e);
|
|
|
|
|
|
|
|
|
|
if (!e.Cancel)
|
|
|
|
|
{
|
2012-12-14 13:06:58 -01:00
|
|
|
var uow = _uowProvider.GetUnitOfWork();
|
|
|
|
|
using (var repository = _repositoryFactory.CreateDictionaryRepository(uow))
|
|
|
|
|
{
|
|
|
|
|
repository.AddOrUpdate(dictionaryItem);
|
|
|
|
|
uow.Commit();
|
2012-12-10 14:53:36 -01:00
|
|
|
|
2012-12-14 13:06:58 -01:00
|
|
|
if (Saved != null)
|
|
|
|
|
Saved(dictionaryItem, e);
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
|
2012-12-10 14:53:36 -01:00
|
|
|
Audit.Add(AuditTypes.Save, "Save DictionaryItem performed by user", userId == -1 ? 0 : userId,
|
|
|
|
|
dictionaryItem.Id);
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Deletes a <see cref="IDictionaryItem"/> object and its related translations
|
|
|
|
|
/// as well as its children.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="dictionaryItem"><see cref="IDictionaryItem"/> to delete</param>
|
2012-12-10 14:53:36 -01:00
|
|
|
/// <param name="userId">Optional id of the user deleting the dictionary item</param>
|
|
|
|
|
public void Delete(IDictionaryItem dictionaryItem, int userId = -1)
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
2012-12-10 14:53:36 -01:00
|
|
|
var e = new DeleteEventArgs { Id = dictionaryItem.Id };
|
|
|
|
|
if (Deleting != null)
|
|
|
|
|
Deleting(dictionaryItem, e);
|
|
|
|
|
|
|
|
|
|
if (!e.Cancel)
|
|
|
|
|
{
|
2012-12-14 13:06:58 -01:00
|
|
|
var uow = _uowProvider.GetUnitOfWork();
|
|
|
|
|
using (var repository = _repositoryFactory.CreateDictionaryRepository(uow))
|
|
|
|
|
{
|
|
|
|
|
//NOTE: The recursive delete is done in the repository
|
|
|
|
|
repository.Delete(dictionaryItem);
|
|
|
|
|
uow.Commit();
|
2012-12-10 14:53:36 -01:00
|
|
|
|
2012-12-14 13:06:58 -01:00
|
|
|
if (Deleted != null)
|
|
|
|
|
Deleted(dictionaryItem, e);
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
|
2012-12-10 14:53:36 -01:00
|
|
|
Audit.Add(AuditTypes.Delete, "Delete DictionaryItem performed by user", userId == -1 ? 0 : userId, dictionaryItem.Id);
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a <see cref="Language"/> by its id
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="id">Id of the <see cref="Language"/></param>
|
|
|
|
|
/// <returns><see cref="Language"/></returns>
|
|
|
|
|
public ILanguage GetLanguageById(int id)
|
|
|
|
|
{
|
2012-12-14 13:06:58 -01:00
|
|
|
using (var repository = _repositoryFactory.CreateLanguageRepository(_uowProvider.GetUnitOfWork()))
|
|
|
|
|
{
|
|
|
|
|
return repository.Get(id);
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a <see cref="Language"/> by its culture code
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="culture">Culture Code</param>
|
|
|
|
|
/// <returns><see cref="Language"/></returns>
|
|
|
|
|
public ILanguage GetLanguageByCultureCode(string culture)
|
|
|
|
|
{
|
2012-12-14 13:06:58 -01:00
|
|
|
using (var repository = _repositoryFactory.CreateLanguageRepository(_uowProvider.GetUnitOfWork()))
|
|
|
|
|
{
|
|
|
|
|
var query = Query<ILanguage>.Builder.Where(x => x.CultureName == culture);
|
|
|
|
|
var items = repository.GetByQuery(query);
|
2012-10-24 12:22:52 -02:00
|
|
|
|
2012-12-14 13:06:58 -01:00
|
|
|
return items.FirstOrDefault();
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets all available languages
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns>An enumerable list of <see cref="ILanguage"/> objects</returns>
|
|
|
|
|
public IEnumerable<ILanguage> GetAllLanguages()
|
|
|
|
|
{
|
2012-12-14 13:06:58 -01:00
|
|
|
using (var repository = _repositoryFactory.CreateLanguageRepository(_uowProvider.GetUnitOfWork()))
|
|
|
|
|
{
|
|
|
|
|
var languages = repository.GetAll();
|
|
|
|
|
return languages;
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Saves a <see cref="ILanguage"/> object
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="language"><see cref="ILanguage"/> to save</param>
|
2012-12-10 14:53:36 -01:00
|
|
|
/// <param name="userId">Optional id of the user saving the language</param>
|
|
|
|
|
public void Save(ILanguage language, int userId = -1)
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
2012-12-10 14:53:36 -01:00
|
|
|
var e = new SaveEventArgs();
|
|
|
|
|
if (Saving != null)
|
|
|
|
|
Saving(language, e);
|
|
|
|
|
|
|
|
|
|
if (!e.Cancel)
|
|
|
|
|
{
|
2012-12-14 13:06:58 -01:00
|
|
|
var uow = _uowProvider.GetUnitOfWork();
|
|
|
|
|
using (var repository = _repositoryFactory.CreateLanguageRepository(uow))
|
|
|
|
|
{
|
|
|
|
|
repository.AddOrUpdate(language);
|
|
|
|
|
uow.Commit();
|
2012-12-10 14:53:36 -01:00
|
|
|
|
2012-12-14 13:06:58 -01:00
|
|
|
if (Saved != null)
|
|
|
|
|
Saved(language, e);
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
|
2012-12-10 14:53:36 -01:00
|
|
|
Audit.Add(AuditTypes.Save, "Save Language performed by user", userId == -1 ? 0 : userId, language.Id);
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Deletes a <see cref="ILanguage"/> by removing it (but not its usages) from the db
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="language"><see cref="ILanguage"/> to delete</param>
|
2012-12-10 14:53:36 -01:00
|
|
|
/// <param name="userId">Optional id of the user deleting the language</param>
|
|
|
|
|
public void Delete(ILanguage language, int userId = -1)
|
2012-10-24 12:22:52 -02:00
|
|
|
{
|
2012-12-10 14:53:36 -01:00
|
|
|
var e = new DeleteEventArgs { Id = language.Id };
|
|
|
|
|
if (Deleting != null)
|
|
|
|
|
Deleting(language, e);
|
|
|
|
|
|
|
|
|
|
if (!e.Cancel)
|
|
|
|
|
{
|
2012-12-14 13:06:58 -01:00
|
|
|
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();
|
|
|
|
|
|
|
|
|
|
if (Deleted != null)
|
|
|
|
|
Deleted(language, e);
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
|
2012-12-10 14:53:36 -01:00
|
|
|
Audit.Add(AuditTypes.Delete, "Delete Language performed by user", userId == -1 ? 0 : userId, language.Id);
|
|
|
|
|
}
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
2012-12-10 14:53:36 -01:00
|
|
|
|
|
|
|
|
#region Event Handlers
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs before Delete
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static event EventHandler<DeleteEventArgs> Deleting;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs after Delete
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static event EventHandler<DeleteEventArgs> Deleted;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs before Save
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static event EventHandler<SaveEventArgs> Saving;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Occurs after Save
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static event EventHandler<SaveEventArgs> Saved;
|
|
|
|
|
#endregion
|
2012-10-24 12:22:52 -02:00
|
|
|
}
|
|
|
|
|
}
|