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