Adding and updating code comments for the Membership service interfaces and implementations

This commit is contained in:
Morten Christensen
2014-08-15 14:42:05 +02:00
parent 6dbc30e094
commit 9236225bdf
5 changed files with 433 additions and 253 deletions

View File

@@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Models.Membership
{
/// <summary>
/// Defines the base contract for <see cref="IMember"/> and <see cref="IUser"/>
/// </summary>
public interface IMembershipUser : IAggregateRoot
{
object ProviderUserKey { get; set; }

View File

@@ -5,128 +5,180 @@ using Umbraco.Core.Persistence.Querying;
namespace Umbraco.Core.Services
{
/// <summary>
/// Defines the MemberService, which is an easy access to operations involving (umbraco) members.
/// </summary>
public interface IMemberService : IMembershipMemberService
{
int Count(string contentTypeAlias = null);
/// <summary>
/// Creates an <see cref="IMember"/> object without persisting it
/// </summary>
/// <remarks>This method is convenient for when you need to add properties to a new Member
/// before persisting it in order to limit the amount of times its saved.
/// Also note that the returned <see cref="IMember"/> will not have an Id until its saved.</remarks>
/// <param name="username">Username of the Member to create</param>
/// <param name="email">Email of the Member to create</param>
/// <param name="name">Name of the Member to create</param>
/// <param name="memberTypeAlias">Alias of the MemberType the Member should be based on</param>
/// <returns><see cref="IMember"/></returns>
IMember CreateMember(string username, string email, string name, string memberTypeAlias);
/// <summary>
/// Creates an <see cref="IMember"/> object without persisting it
/// </summary>
/// <remarks>This method is convenient for when you need to add properties to a new Member
/// before persisting it in order to limit the amount of times its saved.
/// Also note that the returned <see cref="IMember"/> will not have an Id until its saved.</remarks>
/// <param name="username">Username of the Member to create</param>
/// <param name="email">Email of the Member to create</param>
/// <param name="name">Name of the Member to create</param>
/// <param name="memberType">MemberType the Member should be based on</param>
/// <returns><see cref="IMember"/></returns>
IMember CreateMember(string username, string email, string name, IMemberType memberType);
/// <summary>
/// Creates and persists a Member
/// </summary>
/// <remarks>Using this method will persist the Member object before its returned
/// meaning that it will have an Id available (unlike the CreateMember method)</remarks>
/// <param name="username">Username of the Member to create</param>
/// <param name="email">Email of the Member to create</param>
/// <param name="name">Name of the Member to create</param>
/// <param name="memberTypeAlias">Alias of the MemberType the Member should be based on</param>
/// <returns><see cref="IMember"/></returns>
IMember CreateMemberWithIdentity(string username, string email, string name, string memberTypeAlias);
/// <summary>
/// Creates and persists a Member
/// </summary>
/// <remarks>Using this method will persist the Member object before its returned
/// meaning that it will have an Id available (unlike the CreateMember method)</remarks>
/// <param name="username">Username of the Member to create</param>
/// <param name="email">Email of the Member to create</param>
/// <param name="name">Name of the Member to create</param>
/// <param name="memberType">MemberType the Member should be based on</param>
/// <returns><see cref="IMember"/></returns>
IMember CreateMemberWithIdentity(string username, string email, string name, IMemberType memberType);
/// <summary>
/// This is simply a helper method which essentially just wraps the MembershipProvider's ChangePassword method
/// </summary>
/// <param name="member">The member to save the password for</param>
/// <param name="password"></param>
/// <remarks>
/// This method exists so that Umbraco developers can use one entry point to create/update members if they choose to.
/// </remarks>
/// <remarks>This method exists so that Umbraco developers can use one entry point to create/update
/// Members if they choose to. </remarks>
/// <param name="member">The Member to save the password for</param>
/// <param name="password">The password to encrypt and save</param>
void SavePassword(IMember member, string password);
/// <summary>
/// Checks if a member with the id exists
/// Gets the count of Members by an optional MemberType alias
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
/// <remarks>If no alias is supplied then the count for all Member will be returned</remarks>
/// <param name="memberTypeAlias">Optional alias for the MemberType when counting number of Members</param>
/// <returns><see cref="System.int"/> with number of Members</returns>
int Count(string memberTypeAlias = null);
/// <summary>
/// Checks if a Member with the id exists
/// </summary>
/// <param name="id">Id of the Member</param>
/// <returns><c>True</c> if the Member exists otherwise <c>False</c></returns>
bool Exists(int id);
/// <summary>
/// Get a member by the unique key
/// Gets a Member by the unique key
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
/// <remarks>The guid key corresponds to the unique id in the database
/// and the user id in the membership provider.</remarks>
/// <param name="id"><see cref="Guid"/> Id</param>
/// <returns><see cref="IMember"/></returns>
IMember GetByKey(Guid id);
/// <summary>
/// Gets a member by it's id
/// Gets a Member by its integer id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
/// <param name="id"><see cref="System.int"/> Id</param>
/// <returns><see cref="IMember"/></returns>
IMember GetById(int id);
/// <summary>
/// Get all members for the member type alias
/// Gets all Members for the specified MemberType alias
/// </summary>
/// <param name="memberTypeAlias"></param>
/// <returns></returns>
/// <param name="memberTypeAlias">Alias of the MemberType</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
IEnumerable<IMember> GetMembersByMemberType(string memberTypeAlias);
/// <summary>
/// Get all members for the member type id
/// Gets all Members for the MemberType id
/// </summary>
/// <param name="memberTypeId"></param>
/// <returns></returns>
/// <param name="memberTypeId">Id of the MemberType</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
IEnumerable<IMember> GetMembersByMemberType(int memberTypeId);
/// <summary>
/// Get all members in the member group name specified
/// Gets all Members within the specified MemberGroup name
/// </summary>
/// <param name="memberGroupName"></param>
/// <returns></returns>
/// <param name="memberGroupName">Name of the MemberGroup</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
IEnumerable<IMember> GetMembersByGroup(string memberGroupName);
/// <summary>
/// Get all members with the ids specified
/// Gets all Members with the ids specified
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
/// <remarks>If no Ids are specified all Members will be retrieved</remarks>
/// <param name="ids">Optional list of Member Ids</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
IEnumerable<IMember> GetAllMembers(params int[] ids);
/// <summary>
/// Delete members of the specified member type id
/// Delete Members of the specified MemberType id
/// </summary>
/// <param name="memberTypeId"></param>
/// <param name="memberTypeId">Id of the MemberType</param>
void DeleteMembersOfType(int memberTypeId);
/// <summary>
/// Find members based on their display name
/// Finds Members based on their display name
/// </summary>
/// <param name="displayNameToMatch"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="totalRecords"></param>
/// <param name="matchType"></param>
/// <returns></returns>
/// <param name="displayNameToMatch">Display name to match</param>
/// <param name="pageIndex">Current page index</param>
/// <param name="pageSize">Size of the page</param>
/// <param name="totalRecords">Total number of records found (out)</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.StartsWith"/></param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
IEnumerable<IMember> FindMembersByDisplayName(string displayNameToMatch, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
/// <summary>
/// Get members based on a property search
/// Gets a list of Members based on a property search
/// </summary>
/// <param name="propertyTypeAlias"></param>
/// <param name="value"></param>
/// <param name="matchType"></param>
/// <returns></returns>
/// <param name="propertyTypeAlias">Alias of the PropertyType to search for</param>
/// <param name="value"><see cref="System.string"/> Value to match</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.Exact"/></param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
IEnumerable<IMember> GetMembersByPropertyValue(string propertyTypeAlias, string value, StringPropertyMatchType matchType = StringPropertyMatchType.Exact);
/// <summary>
/// Get members based on a property search
/// Gets a list of Members based on a property search
/// </summary>
/// <param name="propertyTypeAlias"></param>
/// <param name="value"></param>
/// <param name="matchType"></param>
/// <returns></returns>
/// <param name="propertyTypeAlias">Alias of the PropertyType to search for</param>
/// <param name="value"><see cref="System.int"/> Value to match</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.Exact"/></param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
IEnumerable<IMember> GetMembersByPropertyValue(string propertyTypeAlias, int value, ValuePropertyMatchType matchType = ValuePropertyMatchType.Exact);
/// <summary>
/// Get members based on a property search
/// Gets a list of Members based on a property search
/// </summary>
/// <param name="propertyTypeAlias"></param>
/// <param name="value"></param>
/// <returns></returns>
/// <param name="propertyTypeAlias">Alias of the PropertyType to search for</param>
/// <param name="value"><see cref="System.bool"/> Value to match</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
IEnumerable<IMember> GetMembersByPropertyValue(string propertyTypeAlias, bool value);
/// <summary>
/// Get members based on a property search
/// Gets a list of Members based on a property search
/// </summary>
/// <param name="propertyTypeAlias"></param>
/// <param name="value"></param>
/// <param name="matchType"></param>
/// <returns></returns>
/// <param name="propertyTypeAlias">Alias of the PropertyType to search for</param>
/// <param name="value"><see cref="System.DateTime"/> Value to match</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.Exact"/></param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
IEnumerable<IMember> GetMembersByPropertyValue(string propertyTypeAlias, DateTime value, ValuePropertyMatchType matchType = ValuePropertyMatchType.Exact);
}
}

View File

@@ -1,6 +1,5 @@
using System.Collections.Generic;
using Umbraco.Core.Models;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Persistence.Querying;
@@ -13,12 +12,21 @@ namespace Umbraco.Core.Services
/// Idea is to have this is an isolated interface so that it can be easily 'replaced' in the membership provider impl.
/// </remarks>
public interface IMembershipMemberService : IMembershipMemberService<IMember>, IMembershipRoleService<IMember>
{
{
/// <summary>
/// Creates and persists a new Member
/// </summary>
/// <param name="username">Username of the Member to create</param>
/// <param name="email">Email of the Member to create</param>
/// <param name="memberType"><see cref="IMemberType"/> which the Member should be based on</param>
/// <returns><see cref="IMember"/></returns>
IMember CreateMemberWithIdentity(string username, string email, IMemberType memberType);
}
/// <summary>
/// Defines part of the UserService/MemberService, which is specific to methods used by the membership provider.
/// The generic type is restricted to <see cref="IMembershipUser"/>. The implementation of this interface uses
/// either <see cref="IMember"/> for the MemberService or <see cref="IUser"/> for the UserService.
/// </summary>
/// <remarks>
/// Idea is to have this is an isolated interface so that it can be easily 'replaced' in the membership provider impl.
@@ -27,69 +35,124 @@ namespace Umbraco.Core.Services
where T : class, IMembershipUser
{
/// <summary>
/// Returns the default member type alias
/// Gets the total number of Members or Users based on the count type
/// </summary>
/// <returns></returns>
string GetDefaultMemberType();
/// <summary>
/// Checks if a member with the username exists
/// </summary>
/// <param name="username"></param>
/// <returns></returns>
bool Exists(string username);
/// <summary>
/// Creates and persists a new member
/// </summary>
/// <param name="username"></param>
/// <param name="email"></param>
/// <param name="rawPasswordValue">
/// This value should be the encoded/encrypted/hashed value for the password that will be stored in the database
/// </param>
/// <param name="memberTypeAlias"></param>
/// <returns></returns>
T CreateWithIdentity(string username, string email, string rawPasswordValue, string memberTypeAlias);
/// <summary>
/// Gets the member by the provider key
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
T GetByProviderKey(object id);
/// <summary>
/// Get a member by email
/// </summary>
/// <param name="email"></param>
/// <returns></returns>
T GetByEmail(string email);
T GetByUsername(string login);
void Delete(T membershipUser);
void Save(T entity, bool raiseEvents = true);
void Save(IEnumerable<T> entities, bool raiseEvents = true);
IEnumerable<T> FindByEmail(string emailStringToMatch, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
IEnumerable<T> FindByUsername(string login, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
/// <summary>
/// Gets the total number of members based on the count type
/// </summary>
/// <returns></returns>
/// <remarks>
/// The way the Online count is done is the same way that it is done in the MS SqlMembershipProvider - We query for any members
/// that have their last active date within the Membership.UserIsOnlineTimeWindow (which is in minutes). It isn't exact science
/// but that is how MS have made theirs so we'll follow that principal.
/// </remarks>
/// <param name="countType"><see cref="MemberCountType"/> to count by</param>
/// <returns><see cref="System.int"/> with number of Members or Users for passed in type</returns>
int GetCount(MemberCountType countType);
/// <summary>
/// Gets a list of paged member data
/// Gets the default MemberType alias
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="totalRecords"></param>
/// <returns></returns>
/// <remarks>By default we'll return the 'writer', but we need to check it exists. If it doesn't we'll
/// return the first type that is not an admin, otherwise if there's only one we will return that one.</remarks>
/// <returns>Alias of the default MemberType</returns>
string GetDefaultMemberType();
/// <summary>
/// Checks if a Member with the username exists
/// </summary>
/// <param name="username">Username to check</param>
/// <returns><c>True</c> if the Member exists otherwise <c>False</c></returns>
bool Exists(string username);
/// <summary>
/// Creates and persists a new <see cref="IMembershipUser"/>
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="username">Username of the <see cref="IMembershipUser"/> to create</param>
/// <param name="email">Email of the <see cref="IMembershipUser"/> to create</param>
/// <param name="passwordValue">This value should be the encoded/encrypted/hashed value for the password that will be stored in the database</param>
/// <param name="memberTypeAlias">Alias of the Type</param>
/// <returns><see cref="IMembershipUser"/></returns>
T CreateWithIdentity(string username, string email, string passwordValue, string memberTypeAlias);
/// <summary>
/// Gets an <see cref="IMembershipUser"/> by its provider key
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="id">Id to use for retrieval</param>
/// <returns><see cref="IMembershipUser"/></returns>
T GetByProviderKey(object id);
/// <summary>
/// Get an <see cref="IMembershipUser"/> by email
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="email">Email to use for retrieval</param>
/// <returns><see cref="IMembershipUser"/></returns>
T GetByEmail(string email);
/// <summary>
/// Get an <see cref="IMembershipUser"/> by username
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="username">Username to use for retrieval</param>
/// <returns><see cref="IMembershipUser"/></returns>
T GetByUsername(string username);
/// <summary>
/// Deletes an <see cref="IMembershipUser"/>
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="membershipUser"><see cref="IMember"/> or <see cref="IUser"/> to Delete</param>
void Delete(T membershipUser);
/// <summary>
/// Saves an <see cref="IMembershipUser"/>
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="entity"><see cref="IMember"/> or <see cref="IUser"/> to Save</param>
/// <param name="raiseEvents">Optional parameter to raise events.
/// Default is <c>True</c> otherwise set to <c>False</c> to not raise events</param>
void Save(T entity, bool raiseEvents = true);
/// <summary>
/// Saves a list of <see cref="IMembershipUser"/> objects
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="entities"><see cref="IEnumerable{T}"/> to save</param>
/// <param name="raiseEvents">Optional parameter to raise events.
/// Default is <c>True</c> otherwise set to <c>False</c> to not raise events</param>
void Save(IEnumerable<T> entities, bool raiseEvents = true);
/// <summary>
/// Finds a list of <see cref="IMembershipUser"/> objects by a partial email string
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="emailStringToMatch">Partial email string to match</param>
/// <param name="pageIndex">Current page index</param>
/// <param name="pageSize">Size of the page</param>
/// <param name="totalRecords">Total number of records found (out)</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.StartsWith"/></param>
/// <returns><see cref="IEnumerable{T}"/></returns>
IEnumerable<T> FindByEmail(string emailStringToMatch, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
/// <summary>
/// Finds a list of <see cref="IMembershipUser"/> objects by a partial username
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="login">Partial username to match</param>
/// <param name="pageIndex">Current page index</param>
/// <param name="pageSize">Size of the page</param>
/// <param name="totalRecords">Total number of records found (out)</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.StartsWith"/></param>
/// <returns><see cref="IEnumerable{T}"/></returns>
IEnumerable<T> FindByUsername(string login, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith);
/// <summary>
/// Gets a list of paged <see cref="IMembershipUser"/> objects
/// </summary>
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="pageIndex">Current page index</param>
/// <param name="pageSize">Size of the page</param>
/// <param name="totalRecords">Total number of records found (out)</param>
/// <returns><see cref="IEnumerable{T}"/></returns>
IEnumerable<T> GetAll(int pageIndex, int pageSize, out int totalRecords);
}
}

View File

@@ -10,6 +10,16 @@ namespace Umbraco.Core.Services
/// </remarks>
public interface IMembershipUserService : IMembershipMemberService<IUser>
{
/// <summary>
/// Creates and persists a new User
/// </summary>
/// <remarks>The user will be saved in the database and returned with an Id.
/// This method is convenient when you need to perform operations, which needs the
/// Id of the user once its been created.</remarks>
/// <param name="username">Username of the User to create</param>
/// <param name="email">Email of the User to create</param>
/// <param name="userType"><see cref="IUserType"/> which the User should be based on</param>
/// <returns><see cref="IUser"/></returns>
IUser CreateUserWithIdentity(string username, string email, IUserType userType);
}
}

View File

@@ -1,21 +1,15 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Web.Security;
using System.Xml.Linq;
using System.Xml.Linq;
using Umbraco.Core.Auditing;
using Umbraco.Core.Configuration;
using Umbraco.Core.Events;
using Umbraco.Core.Events;
using Umbraco.Core.Models;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Models.Rdbms;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Querying;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.SqlSyntax;
using Umbraco.Core.Persistence.UnitOfWork;
using System.Linq;
@@ -23,7 +17,6 @@ using Umbraco.Core.Security;
namespace Umbraco.Core.Services
{
/// <summary>
/// Represents the MemberService.
/// </summary>
@@ -77,9 +70,11 @@ namespace Umbraco.Core.Services
#region IMemberService Implementation
/// <summary>
/// Get the default member type from the database - first check if the type "Member" is there, if not choose the first one found
/// Gets the default MemberType alias
/// </summary>
/// <returns></returns>
/// <remarks>By default we'll return the 'writer', but we need to check it exists. If it doesn't we'll
/// return the first type that is not an admin, otherwise if there's only one we will return that one.</remarks>
/// <returns>Alias of the default MemberType</returns>
public string GetDefaultMemberType()
{
using (var repository = _repositoryFactory.CreateMemberTypeRepository(_uowProvider.GetUnitOfWork()))
@@ -101,10 +96,10 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Checks if a member with the username exists
/// Checks if a Member with the username exists
/// </summary>
/// <param name="username"></param>
/// <returns></returns>
/// <param name="username">Username to check</param>
/// <returns><c>True</c> if the Member exists otherwise <c>False</c></returns>
public bool Exists(string username)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
@@ -116,11 +111,10 @@ namespace Umbraco.Core.Services
/// <summary>
/// This is simply a helper method which essentially just wraps the MembershipProvider's ChangePassword method
/// </summary>
/// <param name="member">The member to save the password for</param>
/// <param name="password"></param>
/// <remarks>
/// This method exists so that Umbraco developers can use one entry point to create/update members if they choose to.
/// </remarks>
/// <remarks>This method exists so that Umbraco developers can use one entry point to create/update
/// Members if they choose to. </remarks>
/// <param name="member">The Member to save the password for</param>
/// <param name="password">The password to encrypt and save</param>
public void SavePassword(IMember member, string password)
{
if (member == null) throw new ArgumentNullException("member");
@@ -148,10 +142,10 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Checks if a member with the id exists
/// Checks if a Member with the id exists
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
/// <param name="id">Id of the Member</param>
/// <returns><c>True</c> if the Member exists otherwise <c>False</c></returns>
public bool Exists(int id)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
@@ -161,10 +155,10 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Gets a Member by its integer Id
/// Gets a Member by its integer id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
/// <param name="id"><see cref="System.int"/> Id</param>
/// <returns><see cref="IMember"/></returns>
public IMember GetById(int id)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
@@ -174,14 +168,12 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Gets a Member by its Guid key
/// Gets a Member by the unique key
/// </summary>
/// <remarks>
/// The guid key corresponds to the unique id in the database
/// and the user id in the membership provider.
/// </remarks>
/// <param name="id"></param>
/// <returns></returns>
/// <remarks>The guid key corresponds to the unique id in the database
/// and the user id in the membership provider.</remarks>
/// <param name="id"><see cref="Guid"/> Id</param>
/// <returns><see cref="IMember"/></returns>
public IMember GetByKey(Guid id)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
@@ -193,10 +185,10 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Gets a list of Members by their MemberType
/// Gets all Members for the specified MemberType alias
/// </summary>
/// <param name="memberTypeAlias"></param>
/// <returns></returns>
/// <param name="memberTypeAlias">Alias of the MemberType</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
public IEnumerable<IMember> GetMembersByMemberType(string memberTypeAlias)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
@@ -208,10 +200,10 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Gets a list of Members by their MemberType
/// Gets all Members for the MemberType id
/// </summary>
/// <param name="memberTypeId"></param>
/// <returns></returns>
/// <param name="memberTypeId">Id of the MemberType</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
public IEnumerable<IMember> GetMembersByMemberType(int memberTypeId)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
@@ -224,10 +216,10 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Gets a list of Members by the MemberGroup they are part of
/// Gets all Members within the specified MemberGroup name
/// </summary>
/// <param name="memberGroupName"></param>
/// <returns></returns>
/// <param name="memberGroupName">Name of the MemberGroup</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
public IEnumerable<IMember> GetMembersByGroup(string memberGroupName)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
@@ -237,10 +229,11 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Gets a list of all Members
/// Gets all Members with the ids specified
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
/// <remarks>If no Ids are specified all Members will be retrieved</remarks>
/// <param name="ids">Optional list of Member Ids</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
public IEnumerable<IMember> GetAllMembers(params int[] ids)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
@@ -249,6 +242,10 @@ namespace Umbraco.Core.Services
}
}
/// <summary>
/// Delete Members of the specified MemberType id
/// </summary>
/// <param name="memberTypeId">Id of the MemberType</param>
public void DeleteMembersOfType(int memberTypeId)
{
using (new WriteLock(Locker))
@@ -272,6 +269,15 @@ namespace Umbraco.Core.Services
}
}
/// <summary>
/// Finds Members based on their display name
/// </summary>
/// <param name="displayNameToMatch">Display name to match</param>
/// <param name="pageIndex">Current page index</param>
/// <param name="pageSize">Size of the page</param>
/// <param name="totalRecords">Total number of records found (out)</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.StartsWith"/></param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
public IEnumerable<IMember> FindMembersByDisplayName(string displayNameToMatch, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith)
{
var uow = _uowProvider.GetUnitOfWork();
@@ -314,14 +320,14 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Does a search for members that contain the specified string in their email address
/// Finds a list of <see cref="IMember"/> objects by a partial email string
/// </summary>
/// <param name="emailStringToMatch"></param>
/// <param name="totalRecords"></param>
/// <param name="matchType"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
/// <param name="emailStringToMatch">Partial email string to match</param>
/// <param name="pageIndex">Current page index</param>
/// <param name="pageSize">Size of the page</param>
/// <param name="totalRecords">Total number of records found (out)</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.StartsWith"/></param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
public IEnumerable<IMember> FindByEmail(string emailStringToMatch, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith)
{
var uow = _uowProvider.GetUnitOfWork();
@@ -354,6 +360,15 @@ namespace Umbraco.Core.Services
}
}
/// <summary>
/// Finds a list of <see cref="IMember"/> objects by a partial username
/// </summary>
/// <param name="login">Partial username to match</param>
/// <param name="pageIndex">Current page index</param>
/// <param name="pageSize">Size of the page</param>
/// <param name="totalRecords">Total number of records found (out)</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.StartsWith"/></param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
public IEnumerable<IMember> FindByUsername(string login, int pageIndex, int pageSize, out int totalRecords, StringPropertyMatchType matchType = StringPropertyMatchType.StartsWith)
{
var uow = _uowProvider.GetUnitOfWork();
@@ -387,12 +402,12 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Gets a list of Members with a certain string property value
/// Gets a list of Members based on a property search
/// </summary>
/// <param name="propertyTypeAlias"></param>
/// <param name="value"></param>
/// <param name="matchType"></param>
/// <returns></returns>
/// <param name="propertyTypeAlias">Alias of the PropertyType to search for</param>
/// <param name="value"><see cref="System.string"/> Value to match</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.Exact"/></param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
public IEnumerable<IMember> GetMembersByPropertyValue(string propertyTypeAlias, string value, StringPropertyMatchType matchType = StringPropertyMatchType.Exact)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
@@ -443,12 +458,12 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Gets a list of Members with a certain integer property value
/// Gets a list of Members based on a property search
/// </summary>
/// <param name="propertyTypeAlias"></param>
/// <param name="value"></param>
/// <param name="matchType"></param>
/// <returns></returns>
/// <param name="propertyTypeAlias">Alias of the PropertyType to search for</param>
/// <param name="value"><see cref="System.int"/> Value to match</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.Exact"/></param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
public IEnumerable<IMember> GetMembersByPropertyValue(string propertyTypeAlias, int value, ValuePropertyMatchType matchType = ValuePropertyMatchType.Exact)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
@@ -502,11 +517,11 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Gets a list of Members with a certain boolean property value
/// Gets a list of Members based on a property search
/// </summary>
/// <param name="propertyTypeAlias"></param>
/// <param name="value"></param>
/// <returns></returns>
/// <param name="propertyTypeAlias">Alias of the PropertyType to search for</param>
/// <param name="value"><see cref="System.bool"/> Value to match</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
public IEnumerable<IMember> GetMembersByPropertyValue(string propertyTypeAlias, bool value)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
@@ -523,12 +538,12 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Gets a list of Members with a certain date time property value
/// Gets a list of Members based on a property search
/// </summary>
/// <param name="propertyTypeAlias"></param>
/// <param name="value"></param>
/// <param name="matchType"></param>
/// <returns></returns>
/// <param name="propertyTypeAlias">Alias of the PropertyType to search for</param>
/// <param name="value"><see cref="System.DateTime"/> Value to match</param>
/// <param name="matchType">The type of match to make as <see cref="StringPropertyMatchType"/>. Default is <see cref="StringPropertyMatchType.Exact"/></param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
public IEnumerable<IMember> GetMembersByPropertyValue(string propertyTypeAlias, DateTime value, ValuePropertyMatchType matchType = ValuePropertyMatchType.Exact)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
@@ -586,15 +601,15 @@ namespace Umbraco.Core.Services
#region IMembershipMemberService Implementation
/// <summary>
/// Returns the count of members based on the countType
/// Gets the total number of Members based on the count type
/// </summary>
/// <param name="countType"></param>
/// <returns></returns>
/// <remarks>
/// The way the Online count is done is the same way that it is done in the MS SqlMembershipProvider - We query for any members
/// that have their last active date within the Membership.UserIsOnlineTimeWindow (which is in minutes). It isn't exact science
/// but that is how MS have made theirs so we'll follow that principal.
/// </remarks>
/// <param name="countType"><see cref="MemberCountType"/> to count by</param>
/// <returns><see cref="System.int"/> with number of Members for passed in type</returns>
public int GetCount(MemberCountType countType)
{
using (var repository = _repositoryFactory.CreateMemberRepository(_uowProvider.GetUnitOfWork()))
@@ -635,6 +650,13 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Gets a list of paged <see cref="IMember"/> objects
/// </summary>
/// <param name="pageIndex">Current page index</param>
/// <param name="pageSize">Size of the page</param>
/// <param name="totalRecords">Total number of records found (out)</param>
/// <returns><see cref="IEnumerable{IMember}"/></returns>
public IEnumerable<IMember> GetAll(int pageIndex, int pageSize, out int totalRecords)
{
var uow = _uowProvider.GetUnitOfWork();
@@ -644,23 +666,32 @@ namespace Umbraco.Core.Services
}
}
public int Count(string contentTypeAlias = null)
/// <summary>
/// Gets the count of Members by an optional MemberType alias
/// </summary>
/// <remarks>If no alias is supplied then the count for all Member will be returned</remarks>
/// <param name="memberTypeAlias">Optional alias for the MemberType when counting number of Members</param>
/// <returns><see cref="System.int"/> with number of Members</returns>
public int Count(string memberTypeAlias = null)
{
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateMemberRepository(uow))
{
return repository.Count(contentTypeAlias);
return repository.Count(memberTypeAlias);
}
}
/// <summary>
/// Creates a member object
/// Creates an <see cref="IMember"/> object without persisting it
/// </summary>
/// <param name="username"></param>
/// <param name="email"></param>
/// <param name="name"></param>
/// <param name="memberTypeAlias"></param>
/// <returns></returns>
/// <remarks>This method is convenient for when you need to add properties to a new Member
/// before persisting it in order to limit the amount of times its saved.
/// Also note that the returned <see cref="IMember"/> will not have an Id until its saved.</remarks>
/// <param name="username">Username of the Member to create</param>
/// <param name="email">Email of the Member to create</param>
/// <param name="name">Name of the Member to create</param>
/// <param name="memberTypeAlias">Alias of the MemberType the Member should be based on</param>
/// <returns><see cref="IMember"/></returns>
public IMember CreateMember(string username, string email, string name, string memberTypeAlias)
{
var memberType = FindMemberTypeByAlias(memberTypeAlias);
@@ -668,13 +699,16 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Creates a new member object
/// Creates an <see cref="IMember"/> object without persisting it
/// </summary>
/// <param name="username"></param>
/// <param name="email"></param>
/// <param name="name"></param>
/// <param name="memberType"></param>
/// <returns></returns>
/// <remarks>This method is convenient for when you need to add properties to a new Member
/// before persisting it in order to limit the amount of times its saved.
/// Also note that the returned <see cref="IMember"/> will not have an Id until its saved.</remarks>
/// <param name="username">Username of the Member to create</param>
/// <param name="email">Email of the Member to create</param>
/// <param name="name">Name of the Member to create</param>
/// <param name="memberType">MemberType the Member should be based on</param>
/// <returns><see cref="IMember"/></returns>
public IMember CreateMember(string username, string email, string name, IMemberType memberType)
{
var member = new Member(name, email.ToLower().Trim(), username, memberType);
@@ -685,13 +719,15 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Creates a member with an Id
/// Creates and persists a Member
/// </summary>
/// <param name="username"></param>
/// <param name="email"></param>
/// <param name="name"></param>
/// <param name="memberTypeAlias"></param>
/// <returns></returns>
/// <remarks>Using this method will persist the Member object before its returned
/// meaning that it will have an Id available (unlike the CreateMember method)</remarks>
/// <param name="username">Username of the Member to create</param>
/// <param name="email">Email of the Member to create</param>
/// <param name="name">Name of the Member to create</param>
/// <param name="memberTypeAlias">Alias of the MemberType the Member should be based on</param>
/// <returns><see cref="IMember"/></returns>
public IMember CreateMemberWithIdentity(string username, string email, string name, string memberTypeAlias)
{
var memberType = FindMemberTypeByAlias(memberTypeAlias);
@@ -699,49 +735,65 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Creates a member with an Id, the username will be used as their name
/// Creates and persists a Member
/// </summary>
/// <param name="username"></param>
/// <param name="email"></param>
/// <param name="memberType"></param>
/// <returns></returns>
/// <remarks>Using this method will persist the Member object before its returned
/// meaning that it will have an Id available (unlike the CreateMember method)</remarks>
/// <param name="username">Username of the Member to create</param>
/// <param name="email">Email of the Member to create</param>
/// <param name="memberType">MemberType the Member should be based on</param>
/// <returns><see cref="IMember"/></returns>
public IMember CreateMemberWithIdentity(string username, string email, IMemberType memberType)
{
return CreateMemberWithIdentity(username, email, username, memberType);
}
/// <summary>
/// Creates a member with an Id
/// Creates and persists a Member
/// </summary>
/// <param name="username"></param>
/// <param name="email"></param>
/// <param name="name"></param>
/// <param name="memberType"></param>
/// <returns></returns>
/// <remarks>Using this method will persist the Member object before its returned
/// meaning that it will have an Id available (unlike the CreateMember method)</remarks>
/// <param name="username">Username of the Member to create</param>
/// <param name="email">Email of the Member to create</param>
/// <param name="name">Name of the Member to create</param>
/// <param name="memberType">MemberType the Member should be based on</param>
/// <returns><see cref="IMember"/></returns>
public IMember CreateMemberWithIdentity(string username, string email, string name, IMemberType memberType)
{
return CreateMemberWithIdentity(username, email, name, "", memberType);
}
/// <summary>
/// Creates and persists a new Member
/// Creates and persists a new <see cref="IMember"/>
/// </summary>
/// <param name="email"></param>
/// <param name="username"></param>
/// <param name="rawPasswordValue"></param>
/// <param name="memberTypeAlias"></param>
/// <returns></returns>
IMember IMembershipMemberService<IMember>.CreateWithIdentity(string username, string email, string rawPasswordValue, string memberTypeAlias)
/// <remarks>An <see cref="IMembershipUser"/> can be of type <see cref="IMember"/> or <see cref="IUser"/></remarks>
/// <param name="username">Username of the <see cref="IMembershipUser"/> to create</param>
/// <param name="email">Email of the <see cref="IMembershipUser"/> to create</param>
/// <param name="passwordValue">This value should be the encoded/encrypted/hashed value for the password that will be stored in the database</param>
/// <param name="memberTypeAlias">Alias of the Type</param>
/// <returns><see cref="IMember"/></returns>
IMember IMembershipMemberService<IMember>.CreateWithIdentity(string username, string email, string passwordValue, string memberTypeAlias)
{
var memberType = FindMemberTypeByAlias(memberTypeAlias);
return CreateMemberWithIdentity(username, email, username, rawPasswordValue, memberType);
return CreateMemberWithIdentity(username, email, username, passwordValue, memberType);
}
private IMember CreateMemberWithIdentity(string username, string email, string name, string rawPasswordValue, IMemberType memberType)
/// <summary>
/// Creates and persists a Member
/// </summary>
/// <remarks>Using this method will persist the Member object before its returned
/// meaning that it will have an Id available (unlike the CreateMember method)</remarks>
/// <param name="username">Username of the Member to create</param>
/// <param name="email">Email of the Member to create</param>
/// <param name="name">Name of the Member to create</param>
/// <param name="passwordValue">This value should be the encoded/encrypted/hashed value for the password that will be stored in the database</param>
/// <param name="memberType">MemberType the Member should be based on</param>
/// <returns><see cref="IMember"/></returns>
private IMember CreateMemberWithIdentity(string username, string email, string name, string passwordValue, IMemberType memberType)
{
if (memberType == null) throw new ArgumentNullException("memberType");
var member = new Member(name, email.ToLower().Trim(), username, rawPasswordValue, memberType);
var member = new Member(name, email.ToLower().Trim(), username, passwordValue, memberType);
if (Saving.IsRaisedEventCancelled(new SaveEventArgs<IMember>(member), this))
{
@@ -771,13 +823,10 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Gets a Member by its Id
/// Gets an <see cref="IMember"/> by its provider key
/// </summary>
/// <remarks>
/// The Id should be an integer or Guid.
/// </remarks>
/// <param name="id"></param>
/// <returns></returns>
/// <param name="id">Id to use for retrieval</param>
/// <returns><see cref="IMember"/></returns>
public IMember GetByProviderKey(object id)
{
var asGuid = id.TryConvertTo<Guid>();
@@ -795,10 +844,10 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Gets a Member by its Email
/// Get an <see cref="IMember"/> by email
/// </summary>
/// <param name="email"></param>
/// <returns></returns>
/// <param name="email">Email to use for retrieval</param>
/// <returns><see cref="IMember"/></returns>
public IMember GetByEmail(string email)
{
var uow = _uowProvider.GetUnitOfWork();
@@ -812,16 +861,16 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Gets a Member by its Username
/// Get an <see cref="IMember"/> by username
/// </summary>
/// <param name="userName"></param>
/// <returns></returns>
public IMember GetByUsername(string userName)
/// <param name="username">Username to use for retrieval</param>
/// <returns><see cref="IMember"/></returns>
public IMember GetByUsername(string username)
{
var uow = _uowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateMemberRepository(uow))
{
var query = Query<IMember>.Builder.Where(x => x.Username.Equals(userName));
var query = Query<IMember>.Builder.Where(x => x.Username.Equals(username));
var member = repository.GetByQuery(query).FirstOrDefault();
return member;
@@ -829,9 +878,9 @@ namespace Umbraco.Core.Services
}
/// <summary>
/// Deletes a Member
/// Deletes an <see cref="IMember"/>
/// </summary>
/// <param name="member"></param>
/// <param name="member"><see cref="IMember"/> to Delete</param>
public void Delete(IMember member)
{
if (Deleting.IsRaisedEventCancelled(new DeleteEventArgs<IMember>(member), this))
@@ -846,12 +895,13 @@ namespace Umbraco.Core.Services
Deleted.RaiseEvent(new DeleteEventArgs<IMember>(member, false), this);
}
/// <summary>
/// Saves an updated Member
/// Saves an <see cref="IMember"/>
/// </summary>
/// <param name="entity"></param>
/// <param name="raiseEvents"></param>
/// <param name="entity"><see cref="IMember"/> to Save</param>
/// <param name="raiseEvents">Optional parameter to raise events.
/// Default is <c>True</c> otherwise set to <c>False</c> to not raise events</param>
public void Save(IMember entity, bool raiseEvents = true)
{
if (raiseEvents)
@@ -860,7 +910,6 @@ namespace Umbraco.Core.Services
{
return;
}
}
var uow = _uowProvider.GetUnitOfWork();
@@ -881,6 +930,12 @@ namespace Umbraco.Core.Services
Saved.RaiseEvent(new SaveEventArgs<IMember>(entity, false), this);
}
/// <summary>
/// Saves a list of <see cref="IMember"/> objects
/// </summary>
/// <param name="entities"><see cref="IEnumerable{IMember}"/> to save</param>
/// <param name="raiseEvents">Optional parameter to raise events.
/// Default is <c>True</c> otherwise set to <c>False</c> to not raise events</param>
public void Save(IEnumerable<IMember> entities, bool raiseEvents = true)
{
var asArray = entities.ToArray();
@@ -1261,7 +1316,5 @@ namespace Umbraco.Core.Services
return new Member(name, email, username, password, memType);
}
}
}