Fixes up and implements more if the IMemberService, repository and membership providers (both legacy and what seems to be the new one).

This commit is contained in:
Shannon
2013-10-10 13:39:17 +11:00
parent 71e6ea70b2
commit 0843388a41
12 changed files with 155 additions and 8 deletions

View File

@@ -99,6 +99,10 @@ namespace Umbraco.Core
/// </summary>
public static class Member
{
public static readonly string UmbracoMemberProviderName = "UmbracoMembershipProvider";
public static readonly string UmbracoRoleProviderName = "UmbracoRoleProvider";
/// <summary>
/// Property alias for a Members Password Question
/// </summary>

View File

@@ -0,0 +1,63 @@
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace Umbraco.Core.Models
{
/// <summary>
/// Represents a paged result for a model collection
/// </summary>
/// <typeparam name="T"></typeparam>
[DataContract(Name = "pagedCollection", Namespace = "")]
public class PagedResult<T>
{
public PagedResult(long totalItems, long pageNumber, long pageSize)
{
TotalItems = totalItems;
PageNumber = pageNumber;
PageSize = pageSize;
if (pageSize > 0)
{
TotalPages = (long) Math.Ceiling(totalItems/(Decimal) pageSize);
}
else
{
TotalPages = 1;
}
}
[DataMember(Name = "pageNumber")]
public long PageNumber { get; private set; }
[DataMember(Name = "pageSize")]
public long PageSize { get; private set; }
[DataMember(Name = "totalPages")]
public long TotalPages { get; private set; }
[DataMember(Name = "totalItems")]
public long TotalItems { get; private set; }
[DataMember(Name = "items")]
public IEnumerable<T> Items { get; set; }
/// <summary>
/// Calculates the skip size based on the paged parameters specified
/// </summary>
/// <remarks>
/// Returns 0 if the page number or page size is zero
/// </remarks>
internal int SkipSize
{
get
{
if (PageNumber > 0 && PageSize > 0)
{
return Convert.ToInt32((PageNumber - 1)*PageSize);
}
return 0;
}
}
}
}

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text.RegularExpressions;
using Umbraco.Core.Logging;
using Umbraco.Core.Models.Rdbms;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
@@ -17,6 +18,19 @@ namespace Umbraco.Core.Persistence
internal static event CreateTableEventHandler NewTable;
/// <summary>
/// This will escape single @ symbols for peta poco values so it doesn't think it's a parameter
/// </summary>
/// <param name="db"></param>
/// <param name="value"></param>
/// <returns></returns>
public static string EscapeAtSymbols(this Database db, string value)
{
//this fancy regex will only match a single @ not a double, etc...
var regex = new Regex("(?<!@)@(?!@)");
return regex.Replace(value, "@@");
}
public static void CreateTable<T>(this Database db)
where T : new()
{

View File

@@ -11,5 +11,7 @@ namespace Umbraco.Core.Persistence.Repositories
/// <param name="groupName"></param>
/// <returns></returns>
IEnumerable<IMember> GetByMemberGroup(string groupName);
IEnumerable<IMember> GetMembersByEmails(params string[] emails);
}
}

View File

@@ -437,6 +437,28 @@ namespace Umbraco.Core.Persistence.Repositories
return BuildFromDtos(dtos);
}
public IEnumerable<IMember> GetMembersByEmails(params string[] emails)
{
var sql = GetBaseQuery(false);
if (emails.Any())
{
var statement = string.Join(" OR ",
emails.Select(x =>
string.Format(
"cmsMember.Email='{0}'",
//we have to escape the @ symbol for petapoco to work!! with 2 @@ symbols
Database.EscapeAtSymbols(x))));
sql.Where(statement);
}
sql.OrderByDescending<ContentVersionDto>(x => x.VersionDate);
var dtos =
Database.Fetch<MemberReadOnlyDto, PropertyDataReadOnlyDto, MemberReadOnlyDto>(
new PropertyDataRelator().Map, sql);
return BuildFromDtos(dtos);
}
private IMember BuildFromDto(List<MemberReadOnlyDto> dtos)
{
if (dtos == null || dtos.Any() == false)

View File

@@ -40,6 +40,7 @@ using System.Security.Permissions;
[assembly: InternalsVisibleTo("Concorde.Sync")]
[assembly: InternalsVisibleTo("Umbraco.Belle")]
[assembly: InternalsVisibleTo("Umbraco.VisualStudio")]
[assembly: InternalsVisibleTo("umbraco.providers")]
//allow this to be mocked in our unit tests
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

View File

@@ -14,7 +14,7 @@ namespace Umbraco.Core.Services
IEnumerable<IMember> GetMembersByMemberType(string memberTypeAlias);
IEnumerable<IMember> GetMembersByGroup(string memberGroupName);
IEnumerable<IMember> GetAllMembers(params int[] ids);
//TODO: Need to get all members that start with a certain letter
}
@@ -37,5 +37,7 @@ namespace Umbraco.Core.Services
void Delete(IMember membershipUser);
void Save(IMember membershipUser);
IEnumerable<IMember> GetMembersByEmails(params string[] emails);
}
}

View File

@@ -108,6 +108,14 @@ namespace Umbraco.Core.Services
}
}
public IEnumerable<IMember> GetMembersByEmails(params string[] emails)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
{
return repository.GetMembersByEmails(emails);
}
}
/// <summary>
/// Gets a list of Members with a certain string property value
/// </summary>

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Specialized;
using System.Configuration.Provider;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
@@ -8,6 +9,7 @@ using System.Web.Hosting;
using System.Web.Security;
using Umbraco.Core;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Services;
using Umbraco.Core.Models.Membership;
@@ -687,7 +689,16 @@ namespace Umbraco.Web.Security.Providers
/// </returns>
public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
{
throw new System.NotImplementedException();
var byEmail = MemberService.GetMembersByEmails(emailToMatch).ToArray();
totalRecords = byEmail.Length;
var pagedResult = new PagedResult<IMember>(totalRecords, pageIndex, pageSize);
var collection = new MembershipUserCollection();
foreach (var m in byEmail.Skip(pagedResult.SkipSize).Take(pageSize))
{
collection.Add(m.AsConcreteMembershipUser());
}
return collection;
}
#region Private methods

View File

@@ -31,8 +31,8 @@ namespace umbraco.cms.businesslogic.member
public class Member : Content
{
#region Constants and static members
public static readonly string UmbracoMemberProviderName = "UmbracoMembershipProvider";
public static readonly string UmbracoRoleProviderName = "UmbracoRoleProvider";
public static readonly string UmbracoMemberProviderName = Constants.Conventions.Member.UmbracoMemberProviderName;
public static readonly string UmbracoRoleProviderName = Constants.Conventions.Member.UmbracoRoleProviderName;
public static readonly Guid _objectType = new Guid(Constants.ObjectTypes.Member);
private static readonly object m_Locker = new object();

View File

@@ -1,20 +1,26 @@
#region namespace
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Security;
using System.Configuration;
using Umbraco.Core;
using Umbraco.Core.Models;
using umbraco.BusinessLogic;
using System.Security.Cryptography;
using System.Web.Util;
using System.Collections.Specialized;
using System.Configuration.Provider;
using umbraco.cms.businesslogic;
using umbraco.cms.businesslogic.member;
using System.Security;
using System.Security.Permissions;
using System.Runtime.CompilerServices;
using Member = umbraco.cms.businesslogic.member.Member;
using MemberType = umbraco.cms.businesslogic.member.MemberType;
using Umbraco.Core.Models.Membership;
using User = umbraco.BusinessLogic.User;
#endregion
namespace umbraco.providers.members
@@ -439,7 +445,16 @@ namespace umbraco.providers.members
/// </returns>
public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
{
throw new Exception("The method or operation is not implemented.");
var byEmail = ApplicationContext.Current.Services.MemberService.GetMembersByEmails(emailToMatch).ToArray();
totalRecords = byEmail.Length;
var pagedResult = new PagedResult<IMember>(totalRecords, pageIndex, pageSize);
var collection = new MembershipUserCollection();
foreach (var m in byEmail.Skip(pagedResult.SkipSize).Take(pageSize))
{
collection.Add(m.AsConcreteMembershipUser());
}
return collection;
}
/// <summary>
@@ -751,7 +766,7 @@ namespace umbraco.providers.members
return null;
}
/// <summary>
/// Verifies that the specified user name and password exist in the data source.
/// </summary>
@@ -973,6 +988,7 @@ namespace umbraco.providers.members
DateTime.Now, DateTime.Now, DateTime.Now);
}
}
#endregion
}
}

View File

@@ -99,6 +99,10 @@
<Project>{ccd75ec3-63db-4184-b49d-51c1dd337230}</Project>
<Name>umbraco.cms</Name>
</ProjectReference>
<ProjectReference Include="..\Umbraco.Core\Umbraco.Core.csproj">
<Project>{31785bc3-256c-4613-b2f5-a1b0bdded8c1}</Project>
<Name>Umbraco.Core</Name>
</ProjectReference>
<ProjectReference Include="..\umbraco.datalayer\umbraco.datalayer.csproj">
<Project>{C7CB79F0-1C97-4B33-BFA7-00731B579AE2}</Project>
<Name>umbraco.datalayer</Name>