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