using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using Umbraco.Core.Models; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.UnitOfWork; using System.Linq; namespace Umbraco.Core.Services { /// /// Represents the MemberService. /// internal class MemberService : IMemberService { private readonly RepositoryFactory _repositoryFactory; private readonly IDatabaseUnitOfWorkProvider _uowProvider; public MemberService(RepositoryFactory repositoryFactory) : this(new PetaPocoUnitOfWorkProvider(), repositoryFactory) { } public MemberService(IDatabaseUnitOfWorkProvider provider) : this(provider, new RepositoryFactory()) { } public MemberService(IDatabaseUnitOfWorkProvider provider, RepositoryFactory repositoryFactory) { _repositoryFactory = repositoryFactory; _uowProvider = provider; } #region IMemberService Implementation /// /// Gets a Member by its integer Id /// /// /// public IMember GetById(int id) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { return repository.Get(id); } } /// /// Gets a Member by its Guid key /// /// /// The guid key corresponds to the unique id in the database /// and the user id in the membership provider. /// /// /// public IMember GetByKey(Guid id) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where(x => x.Key == id); var member = repository.GetByQuery(query).FirstOrDefault(); return member; } } /// /// Gets a list of Members by their MemberType /// /// /// public IEnumerable GetMembersByMemberType(string memberTypeAlias) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where(x => x.ContentTypeAlias == memberTypeAlias); var members = repository.GetByQuery(query); return members; } } /// /// Gets a list of Members by the MemberGroup they are part of /// /// /// public IEnumerable GetMembersByGroup(string memberGroupName) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { return repository.GetByMemberGroup(memberGroupName); } } /// /// Gets a list of all Members /// /// /// public IEnumerable GetAllMembers(params int[] ids) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { return repository.GetAll(ids); } } /// /// Gets a list of Members with a certain string property value /// /// /// /// public IEnumerable GetMembersByPropertyValue(string propertyTypeAlias, string value) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where( x => ((Member)x).PropertyTypeAlias == propertyTypeAlias && (((Member)x).LongStringPropertyValue.Contains(value) || ((Member)x).ShortStringPropertyValue.Contains(value))); var members = repository.GetByQuery(query); return members; } } /// /// Gets a list of Members with a certain integer property value /// /// /// /// public IEnumerable GetMembersByPropertyValue(string propertyTypeAlias, int value) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where( x => ((Member)x).PropertyTypeAlias == propertyTypeAlias && ((Member)x).IntegerropertyValue == value); var members = repository.GetByQuery(query); return members; } } /// /// Gets a list of Members with a certain boolean property value /// /// /// /// public IEnumerable GetMembersByPropertyValue(string propertyTypeAlias, bool value) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where( x => ((Member)x).PropertyTypeAlias == propertyTypeAlias && ((Member)x).BoolPropertyValue == value); var members = repository.GetByQuery(query); return members; } } /// /// Gets a list of Members with a certain date time property value /// /// /// /// public IEnumerable GetMembersByPropertyValue(string propertyTypeAlias, DateTime value) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where( x => ((Member)x).PropertyTypeAlias == propertyTypeAlias && ((Member)x).DateTimePropertyValue == value); var members = repository.GetByQuery(query); return members; } } #endregion #region IMembershipMemberService Implementation /// /// Creates a new Member /// /// /// /// /// /// /// public IMember CreateMember(string email, string username, string password, string memberTypeAlias, int userId = 0) { var uow = _uowProvider.GetUnitOfWork(); IMemberType memberType; using (var repository = _repositoryFactory.CreateMemberTypeRepository(uow)) { var query = Query.Builder.Where(x => x.Alias == memberTypeAlias); memberType = repository.GetByQuery(query).FirstOrDefault(); } if (memberType == null) throw new Exception(string.Format("No MemberType matching the passed in Alias: '{0}' was found", memberTypeAlias)); var member = new Member(email, email, username, password, -1, memberType); using (var repository = _repositoryFactory.CreateMemberRepository(uow)) { repository.AddOrUpdate(member); uow.Commit(); } return member; } /// /// Gets a Member by its Id /// /// /// The Id should be an integer or Guid. /// /// /// public IMember GetById(object id) { if (id is int) { return GetById((int)id); } if (id is Guid) { return GetByKey((Guid)id); } return null; } /// /// Gets a Member by its Email /// /// /// public IMember GetByEmail(string email) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where(x => x.Email == email); var member = repository.GetByQuery(query).FirstOrDefault(); return member; } } /// /// Gets a Member by its Username /// /// /// public IMember GetByUsername(string userName) { using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork())) { var query = Query.Builder.Where(x => x.Username == userName); var member = repository.GetByQuery(query).FirstOrDefault(); return member; } } /// /// Deletes a Member /// /// public void Delete(IMember member) { var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateMemberRepository(uow)) { repository.Delete(member); uow.Commit(); } } /// /// Saves an updated Member /// /// public void Save(IMember member) { var uow = _uowProvider.GetUnitOfWork(); using (var repository = _repositoryFactory.CreateMemberRepository(uow)) { repository.AddOrUpdate(member); uow.Commit(); } } #endregion } }