Updates IMemberService with methods to search on string properties with an option to define how to match the string property, adds all supporting unit tests.

This commit is contained in:
Shannon
2013-12-18 17:37:46 +11:00
parent a21aa079ff
commit fec55e9d1c
7 changed files with 439 additions and 35 deletions

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence.Querying;
namespace Umbraco.Core.Services
{
@@ -22,10 +23,13 @@ namespace Umbraco.Core.Services
IEnumerable<IMember> GetMembersByMemberType(int memberTypeId);
IEnumerable<IMember> GetMembersByGroup(string memberGroupName);
IEnumerable<IMember> GetAllMembers(params int[] ids);
//TODO: Need to get all members that start with a certain letter
void DeleteMembersOfType(int memberTypeId);
IEnumerable<IMember> GetMembersByPropertyValue(string propertyTypeAlias, string value, StringPropertyMatchType matchType = StringPropertyMatchType.Exact);
IEnumerable<IMember> GetMembersByPropertyValue(string propertyTypeAlias, int value);
IEnumerable<IMember> GetMembersByPropertyValue(string propertyTypeAlias, bool value);
IEnumerable<IMember> GetMembersByPropertyValue(string propertyTypeAlias, DateTime value);
}
/// <summary>
@@ -43,6 +47,14 @@ namespace Umbraco.Core.Services
/// <returns></returns>
bool Exists(string username);
/// <summary>
/// Creates and persists a new member
/// </summary>
/// <param name="username"></param>
/// <param name="email"></param>
/// <param name="password"></param>
/// <param name="memberTypeAlias"></param>
/// <returns></returns>
IMember CreateMember(string username, string email, string password, string memberTypeAlias);
IMember GetById(object id);
@@ -55,6 +67,10 @@ namespace Umbraco.Core.Services
void Save(IMember membershipUser, bool raiseEvents = true);
IEnumerable<IMember> FindMembersByEmail(string emailStringToMatch);
void Save(IEnumerable<IMember> members, bool raiseEvents = true);
IEnumerable<IMember> FindMembersByEmail(string emailStringToMatch, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
IEnumerable<IMember> FindMembersByUsername(string login, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
}
}

View File

@@ -760,30 +760,31 @@ namespace Umbraco.Core.Services
if (Saving.IsRaisedEventCancelled(new SaveEventArgs<IMedia>(medias), this))
return;
}
using (new WriteLock(Locker))
{
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateMediaRepository(uow))
{
foreach (var media in medias)
{
media.CreatorId = userId;
repository.AddOrUpdate(media);
}
var mediaXml = new Dictionary<int, Lazy<XElement>>();
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateMediaRepository(uow))
{
foreach (var media in medias)
{
media.CreatorId = userId;
repository.AddOrUpdate(media);
}
//commit the whole lot in one go
uow.Commit();
//commit the whole lot in one go
uow.Commit();
foreach (var media in medias)
{
CreateAndSaveMediaXml(media.ToXml(), media.Id, uow.Database);
}
}
foreach (var media in medias)
{
CreateAndSaveMediaXml(media.ToXml(), media.Id, uow.Database);
}
}
if (raiseEvents)
Saved.RaiseEvent(new SaveEventArgs<IMedia>(medias, false), this);
if(raiseEvents)
Saved.RaiseEvent(new SaveEventArgs<IMedia>(medias, false), this);
Audit.Add(AuditTypes.Save, "Save Media items performed by user", userId, -1);
Audit.Add(AuditTypes.Save, "Save Media items performed by user", userId, -1);
}
}
/// <summary>

View File

@@ -183,16 +183,61 @@ namespace Umbraco.Core.Services
/// Does a search for members that contain the specified string in their email address
/// </summary>
/// <param name="emailStringToMatch"></param>
/// <param name="matchType"></param>
/// <returns></returns>
public IEnumerable<IMember> FindMembersByEmail(string emailStringToMatch)
public IEnumerable<IMember> FindMembersByEmail(string emailStringToMatch, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith)
{
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateMemberRepository(uow))
{
var query = new Query<IMember>();
switch (matchType)
{
case StringPropertyMatchType.Exact:
query.Where(member => member.Email.Equals(emailStringToMatch));
break;
case StringPropertyMatchType.Contains:
query.Where(member => member.Email.Contains(emailStringToMatch));
break;
case StringPropertyMatchType.StartsWith:
query.Where(member => member.Email.StartsWith(emailStringToMatch));
break;
case StringPropertyMatchType.EndsWith:
query.Where(member => member.Email.EndsWith(emailStringToMatch));
break;
default:
throw new ArgumentOutOfRangeException("matchType");
}
query.Where(member => member.Email.Contains(emailStringToMatch));
return repository.GetByQuery(query);
}
}
public IEnumerable<IMember> FindMembersByUsername(string login, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith)
{
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateMemberRepository(uow))
{
var query = new Query<IMember>();
switch (matchType)
{
case StringPropertyMatchType.Exact:
query.Where(member => member.Username.Equals(login));
break;
case StringPropertyMatchType.Contains:
query.Where(member => member.Username.Contains(login));
break;
case StringPropertyMatchType.StartsWith:
query.Where(member => member.Username.StartsWith(login));
break;
case StringPropertyMatchType.EndsWith:
query.Where(member => member.Username.EndsWith(login));
break;
default:
throw new ArgumentOutOfRangeException("matchType");
}
return repository.GetByQuery(query);
}
@@ -203,17 +248,51 @@ namespace Umbraco.Core.Services
/// </summary>
/// <param name="propertyTypeAlias"></param>
/// <param name="value"></param>
/// <param name="matchType"></param>
/// <returns></returns>
public IEnumerable<IMember> GetMembersByPropertyValue(string propertyTypeAlias, string value)
public IEnumerable<IMember> GetMembersByPropertyValue(string propertyTypeAlias, string value, StringPropertyMatchType matchType = StringPropertyMatchType.Exact)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
{
var query =
Query<IMember>.Builder.Where(
x =>
((Member)x).PropertyTypeAlias == propertyTypeAlias &&
(((Member)x).LongStringPropertyValue.Contains(value) ||
((Member)x).ShortStringPropertyValue.Contains(value)));
IQuery<IMember> query;
switch (matchType)
{
case StringPropertyMatchType.Exact:
query =
Query<IMember>.Builder.Where(
x =>
((Member) x).PropertyTypeAlias == propertyTypeAlias &&
(((Member)x).LongStringPropertyValue.SqlEquals(value, TextColumnType.NText) ||
((Member)x).ShortStringPropertyValue.SqlEquals(value, TextColumnType.NVarchar)));
break;
case StringPropertyMatchType.Contains:
query =
Query<IMember>.Builder.Where(
x =>
((Member) x).PropertyTypeAlias == propertyTypeAlias &&
(((Member)x).LongStringPropertyValue.SqlContains(value, TextColumnType.NText) ||
((Member)x).ShortStringPropertyValue.SqlContains(value, TextColumnType.NVarchar)));
break;
case StringPropertyMatchType.StartsWith:
query =
Query<IMember>.Builder.Where(
x =>
((Member) x).PropertyTypeAlias == propertyTypeAlias &&
(((Member)x).LongStringPropertyValue.SqlStartsWith(value, TextColumnType.NText) ||
((Member)x).ShortStringPropertyValue.SqlStartsWith(value, TextColumnType.NVarchar)));
break;
case StringPropertyMatchType.EndsWith:
query =
Query<IMember>.Builder.Where(
x =>
((Member) x).PropertyTypeAlias == propertyTypeAlias &&
(((Member)x).LongStringPropertyValue.SqlEndsWith(value, TextColumnType.NText) ||
((Member)x).ShortStringPropertyValue.SqlEndsWith(value, TextColumnType.NVarchar)));
break;
default:
throw new ArgumentOutOfRangeException("matchType");
}
var members = repository.GetByQuery(query);
return members;
@@ -352,7 +431,7 @@ namespace Umbraco.Core.Services
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
{
var query = Query<IMember>.Builder.Where(x => x.Email == email);
var query = Query<IMember>.Builder.Where(x => x.Email.Equals(email));
var member = repository.GetByQuery(query).FirstOrDefault();
return member;
@@ -381,12 +460,17 @@ namespace Umbraco.Core.Services
/// <param name="member"></param>
public void Delete(IMember member)
{
if (Deleting.IsRaisedEventCancelled(new DeleteEventArgs<IMember>(member), this))
return;
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateMemberRepository(uow))
{
repository.Delete(member);
uow.Commit();
}
Deleted.RaiseEvent(new DeleteEventArgs<IMember>(member, false), this);
}
/// <summary>
@@ -416,6 +500,37 @@ namespace Umbraco.Core.Services
Saved.RaiseEvent(new SaveEventArgs<IMember>(member, false), this);
}
public void Save(IEnumerable<IMember> members, bool raiseEvents = true)
{
if (raiseEvents)
{
if (Saving.IsRaisedEventCancelled(new SaveEventArgs<IMember>(members), this))
return;
}
using (new WriteLock(Locker))
{
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateMemberRepository(uow))
{
foreach (var member in members)
{
repository.AddOrUpdate(member);
}
//commit the whole lot in one go
uow.Commit();
foreach (var member in members)
{
CreateAndSaveMemberXml(member.ToXml(), member.Id, uow.Database);
}
}
if (raiseEvents)
Saved.RaiseEvent(new SaveEventArgs<IMember>(members, false), this);
}
}
#endregion
/// <summary>