Wraps the MemberService from the legacy Member object

This commit is contained in:
Shannon
2014-01-23 11:41:01 +11:00
parent 80697cf9ca
commit a272675ed8
6 changed files with 236 additions and 228 deletions

View File

@@ -31,6 +31,7 @@ namespace Umbraco.Core.Models
_contentType = contentType;
}
//TODO: Should we just get rid of this one? no reason to have a level set.
internal Member(string name, string email, string username, string password, int parentId, IMemberType contentType)
: base(name, parentId, contentType, new PropertyCollection())
{

View File

@@ -30,6 +30,8 @@ namespace Umbraco.Core.Security
return (membershipProvider is UmbracoMembershipProviderBase);
}
//TODO: Add role provider checks too
public static UmbracoMembershipProviderBase AsUmbracoMembershipProvider(this MembershipProvider membershipProvider)
{
return (UmbracoMembershipProviderBase)membershipProvider;

View File

@@ -577,7 +577,10 @@ namespace Umbraco.Core.Services
if (raiseEvents)
{
if (Saving.IsRaisedEventCancelled(new SaveEventArgs<IMember>(member), this))
{
member.WasCancelled = true;
return member;
}
}
var uow = _uowProvider.GetUnitOfWork();
@@ -709,7 +712,10 @@ namespace Umbraco.Core.Services
if (raiseEvents)
{
if (Saving.IsRaisedEventCancelled(new SaveEventArgs<IMember>(member), this))
{
return;
}
}
var uow = _uowProvider.GetUnitOfWork();

View File

@@ -22,18 +22,7 @@ namespace umbraco.cms.businesslogic.media
#region Constants and static members
protected internal IMedia MediaItem;
private const string m_SQLOptimizedMany = @"
select
count(children.id) as children, cmsContentType.isContainer, umbracoNode.id, umbracoNode.uniqueId, umbracoNode.level, umbracoNode.parentId, umbracoNode.path, umbracoNode.sortOrder, umbracoNode.createDate, umbracoNode.nodeUser, umbracoNode.text,
cmsContentType.icon, cmsContentType.alias, cmsContentType.thumbnail, cmsContentType.description, cmsContentType.nodeId as contentTypeId
from umbracoNode
left join umbracoNode children on children.parentId = umbracoNode.id
inner join cmsContent on cmsContent.nodeId = umbracoNode.id
inner join cmsContentType on cmsContentType.nodeId = cmsContent.contentType
where umbracoNode.nodeObjectType = @nodeObjectType AND {0}
group by cmsContentType.isContainer, umbracoNode.id, umbracoNode.uniqueId, umbracoNode.level, umbracoNode.parentId, umbracoNode.path, umbracoNode.sortOrder, umbracoNode.createDate, umbracoNode.nodeUser, umbracoNode.text,
cmsContentType.icon, cmsContentType.alias, cmsContentType.thumbnail, cmsContentType.description, cmsContentType.nodeId
order by {1}";
#endregion
#region Constructors

View File

@@ -11,6 +11,7 @@ using Umbraco.Core;
using Umbraco.Core.Cache;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models.Rdbms;
using Umbraco.Core.Persistence.Querying;
using umbraco.cms.businesslogic.cache;
@@ -56,12 +57,10 @@ namespace umbraco.cms.businesslogic.member
#endregion
#region Private members
private string _text;
private string _email;
private string _password;
private string _loginName;
private Hashtable _groups = null;
protected internal IMember Content;
protected internal IMember MemberItem;
#endregion
#region Constructors
@@ -128,20 +127,21 @@ namespace umbraco.cms.businesslogic.member
//NOTE: This hasn't been ported to the new service layer because it is an edge case, it is only used to render the tree nodes but in v7 we plan on
// changing how the members are shown and not having to worry about letters.
var tmp = new List<Member>();
var ids = new List<int>();
using (var dr = SqlHelper.ExecuteReader(
string.Format(_sQLOptimizedMany.Trim(), "LOWER(SUBSTRING(text, 1, 1)) NOT IN ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z')", "umbracoNode.text"),
SqlHelper.CreateParameter("@nodeObjectType", Member._objectType)))
{
while (dr.Read())
{
var m = new Member(dr.GetInt("id"), true);
m.PopulateMemberFromReader(dr);
tmp.Add(m);
ids.Add(dr.GetInt("id"));
}
}
return tmp.ToArray();
return ApplicationContext.Current.Services.MemberService.GetAllMembers(ids.ToArray())
.Select(x => new Member(x))
.ToArray();
}
/// <summary>
@@ -224,37 +224,22 @@ namespace umbraco.cms.businesslogic.member
if (GetMemberFromLoginName(loginName) != null)
throw new Exception(string.Format("Duplicate User name! A member with the user name {0} already exists", loginName));
// Lowercased to prevent duplicates
Email = Email.ToLower();
var newId = Guid.NewGuid();
var model = ApplicationContext.Current.Services.MemberService.CreateMemberWithIdentity(
Email.ToLower(), loginName, "", mbt.MemberTypeItem);
model.Name = Name;
//create the cms node first
var newNode = MakeNew(-1, _objectType, u.Id, 1, Name, newId);
//we need to create an empty member and set the underlying text property
var tmp = new Member(newId, true);
tmp.SetText(Name);
//create the content data for the new member
tmp.CreateContent(mbt);
// Create member specific data ..
SqlHelper.ExecuteNonQuery(
"insert into cmsMember (nodeId,Email,LoginName,Password) values (@id,@email,@loginName,'')",
SqlHelper.CreateParameter("@id", tmp.Id),
SqlHelper.CreateParameter("@loginName", loginName),
SqlHelper.CreateParameter("@email", Email));
//read the whole object from the db
var m = new Member(newId);
//The content object will only have the 'WasCancelled' flag set to 'True' if the 'Creating' event has been cancelled, so we return null.
if (((Entity)model).WasCancelled)
return null;
var legacy = new Member(model);
var e = new NewEventArgs();
m.OnNew(e);
legacy.OnNew(e);
legacy.Save();
m.Save();
return m;
return legacy;
}
/// <summary>
@@ -319,6 +304,7 @@ namespace umbraco.cms.businesslogic.member
/// <param name="loginName">Member login</param>
/// <param name="password">Member password</param>
/// <returns>The member with the credentials - null if none exists</returns>
[Obsolete("Use the MembershipProvider methods to validate a member")]
public static Member GetMemberFromLoginNameAndPassword(string loginName, string password)
{
if (IsMember(loginName))
@@ -399,25 +385,82 @@ namespace umbraco.cms.businesslogic.member
#region Public Properties
/// <summary>
/// The name of the member
/// </summary>
public override int sortOrder
{
get
{
return MemberItem == null ? base.sortOrder : MemberItem.SortOrder;
}
set
{
if (MemberItem == null)
{
base.sortOrder = value;
}
else
{
MemberItem.SortOrder = value;
}
}
}
public override int Level
{
get
{
return MemberItem == null ? base.Level : MemberItem.Level;
}
set
{
if (MemberItem == null)
{
base.Level = value;
}
else
{
MemberItem.Level = value;
}
}
}
public override int ParentId
{
get
{
return MemberItem == null ? base.ParentId : MemberItem.ParentId;
}
}
public override string Path
{
get
{
return MemberItem == null ? base.Path : MemberItem.Path;
}
set
{
if (MemberItem == null)
{
base.Path = value;
}
else
{
MemberItem.Path = value;
}
}
}
[Obsolete("Obsolete, Use Name property on Umbraco.Core.Models.Content", false)]
public override string Text
{
get
{
if (string.IsNullOrEmpty(_text))
{
_text = SqlHelper.ExecuteScalar<string>(
"select text from umbracoNode where id = @id",
SqlHelper.CreateParameter("@id", Id));
}
return _text;
return MemberItem.Name;
}
set
{
_text = value;
base.Text = value;
value = value.Trim();
MemberItem.Name = value;
}
}
@@ -429,14 +472,7 @@ namespace umbraco.cms.businesslogic.member
{
get
{
if (string.IsNullOrEmpty(_password))
{
_password = SqlHelper.ExecuteScalar<string>(
"select Password from cmsMember where nodeId = @id",
SqlHelper.CreateParameter("@id", Id));
}
return _password;
return MemberItem.Password;
}
set
{
@@ -444,7 +480,7 @@ namespace umbraco.cms.businesslogic.member
// To write directly to the db use the ChangePassword method
// this is not pretty but nessecary due to a design flaw (the membership provider should have been a part of the cms project)
var helper = new MemberShipHelper();
ChangePassword(helper.EncodePassword(value, Membership.Provider.PasswordFormat));
MemberItem.Password = helper.EncodePassword(value, Membership.Provider.PasswordFormat);
}
}
@@ -455,13 +491,7 @@ namespace umbraco.cms.businesslogic.member
{
get
{
if (string.IsNullOrEmpty(_loginName))
{
_loginName = SqlHelper.ExecuteScalar<string>(
"select LoginName from cmsMember where nodeId = @id",
SqlHelper.CreateParameter("@id", Id));
}
return _loginName;
return MemberItem.Username;
}
set
{
@@ -469,11 +499,7 @@ namespace umbraco.cms.businesslogic.member
throw new ArgumentException("The loginname must be different from an empty string", "LoginName");
if (value.Contains(","))
throw new ArgumentException("The parameter 'LoginName' must not contain commas.");
SqlHelper.ExecuteNonQuery(
"update cmsMember set LoginName = @loginName where nodeId = @id",
SqlHelper.CreateParameter("@loginName", value),
SqlHelper.CreateParameter("@id", Id));
_loginName = value;
MemberItem.Username = value;
}
}
@@ -497,39 +523,11 @@ namespace umbraco.cms.businesslogic.member
{
get
{
if (string.IsNullOrEmpty(_email))
{
_email = SqlHelper.ExecuteScalar<string>(
"select Email from cmsMember where nodeId = @id",
SqlHelper.CreateParameter("@id", Id));
}
return string.IsNullOrWhiteSpace(_email) ? _email : _email.ToLower();
return MemberItem.Email.IsNullOrWhiteSpace() ? string.Empty : MemberItem.Email.ToLower();
}
set
{
var oldEmail = Email;
var newEmail = string.IsNullOrWhiteSpace(value) ? value : value.ToLower();
var requireUniqueEmail = Membership.Providers[UmbracoMemberProviderName].RequiresUniqueEmail;
var howManyMembersWithEmail = 0;
var membersWithEmail = GetMembersFromEmail(newEmail);
if (membersWithEmail != null)
howManyMembersWithEmail = membersWithEmail.Length;
if (((oldEmail == newEmail && howManyMembersWithEmail > 1) ||
(oldEmail != newEmail && howManyMembersWithEmail > 0))
&& requireUniqueEmail)
{
// If the value hasn't changed and there are more than 1 member with that email, then throw
// If the value has changed and there are any member with that new email, then throw
throw new Exception(string.Format("Duplicate Email! A member with the e-mail {0} already exists", newEmail));
}
SqlHelper.ExecuteNonQuery(
"update cmsMember set Email = @email where nodeId = @id",
SqlHelper.CreateParameter("@id", Id), SqlHelper.CreateParameter("@email", newEmail));
// Set the backing field to new value
_email = newEmail;
MemberItem.Email = value == null ? "" : value.ToLower();
}
}
#endregion
@@ -555,21 +553,16 @@ namespace umbraco.cms.businesslogic.member
private void SetupNode(IMember content)
{
Content = content;
MemberItem = content;
//Also need to set the ContentBase item to this one so all the propery values load from it
ContentBase = Content;
ContentBase = MemberItem;
//Setting private properties from IContentBase replacing CMSNode.setupNode() / CMSNode.PopulateCMSNodeFromReader()
base.PopulateCMSNodeFromUmbracoEntity(Content, _objectType);
base.PopulateCMSNodeFromUmbracoEntity(MemberItem, _objectType);
//If the version is empty we update with the latest version from the current IContent.
if (Version == Guid.Empty)
Version = Content.Version;
_email = Content.Email;
_loginName = Content.Username;
_password = Content.Password;
Version = MemberItem.Version;
}
@@ -578,85 +571,124 @@ namespace umbraco.cms.businesslogic.member
/// </summary>
public override void Save()
{
//Due to backwards compatibility with this API we need to check for duplicate emails here if required.
// This check should not be done here, as this logic is based on the MembershipProvider
var requireUniqueEmail = Membership.Providers[UmbracoMemberProviderName].RequiresUniqueEmail;
//check if there's anyone with this email in the db that isn't us
if (requireUniqueEmail && GetMembersFromEmail(Email).Any(x => x.Id != Id))
{
throw new Exception(string.Format("Duplicate Email! A member with the e-mail {0} already exists", Email));
}
var e = new SaveEventArgs();
FireBeforeSave(e);
foreach (var property in GenericProperties)
{
MemberItem.SetValue(property.PropertyType.Alias, property.Value);
}
if (!e.Cancel)
{
var db = ApplicationContext.Current.DatabaseContext.Database;
using (var transaction = db.GetTransaction())
{
foreach (var property in GenericProperties)
{
var poco = new PropertyDataDto
{
Id = property.Id,
PropertyTypeId = property.PropertyType.Id,
NodeId = Id,
VersionId = property.VersionId
};
if (property.Value != null)
{
string dbType = property.PropertyType.DataTypeDefinition.DbType;
if (dbType.Equals("Integer"))
{
if (property.Value is bool || property.PropertyType.DataTypeDefinition.DataType.Id == new Guid("38b352c1-e9f8-4fd8-9324-9a2eab06d97a"))
{
poco.Integer = property.Value != null && string.IsNullOrEmpty(property.Value.ToString())
? 0
: Convert.ToInt32(property.Value);
}
else
{
int value = 0;
if (int.TryParse(property.Value.ToString(), out value))
{
poco.Integer = value;
}
}
}
else if (dbType.Equals("Date"))
{
DateTime date;
ApplicationContext.Current.Services.MemberService.Save(MemberItem);
if (DateTime.TryParse(property.Value.ToString(), out date))
poco.Date = date;
}
else if (dbType.Equals("Nvarchar"))
{
poco.VarChar = property.Value.ToString();
}
else
{
poco.Text = property.Value.ToString();
}
}
bool isNew = db.IsNew(poco);
if (isNew)
{
db.Insert(poco);
}
else
{
db.Update(poco);
}
}
transaction.Complete();
}
//base.VersionDate = MemberItem.UpdateDate;
// re-generate xml
var xd = new XmlDocument();
base.Save();
XmlDocument xd = new XmlDocument();
XmlGenerate(xd);
// generate preview for blame history?
if (UmbracoSettings.EnableGlobalPreviewStorage)
{
// Version as new guid to ensure different versions are generated as members are not versioned currently!
// Version as new guid to ensure different versions are generated as media are not versioned currently!
SavePreviewXml(generateXmlWithoutSaving(xd), Guid.NewGuid());
}
FireAfterSave(e);
}
//var e = new SaveEventArgs();
//FireBeforeSave(e);
//if (!e.Cancel)
//{
// var db = ApplicationContext.Current.DatabaseContext.Database;
// using (var transaction = db.GetTransaction())
// {
// foreach (var property in GenericProperties)
// {
// var poco = new PropertyDataDto
// {
// Id = property.Id,
// PropertyTypeId = property.PropertyType.Id,
// NodeId = Id,
// VersionId = property.VersionId
// };
// if (property.Value != null)
// {
// string dbType = property.PropertyType.DataTypeDefinition.DbType;
// if (dbType.Equals("Integer"))
// {
// if (property.Value is bool || property.PropertyType.DataTypeDefinition.DataType.Id == new Guid("38b352c1-e9f8-4fd8-9324-9a2eab06d97a"))
// {
// poco.Integer = property.Value != null && string.IsNullOrEmpty(property.Value.ToString())
// ? 0
// : Convert.ToInt32(property.Value);
// }
// else
// {
// int value = 0;
// if (int.TryParse(property.Value.ToString(), out value))
// {
// poco.Integer = value;
// }
// }
// }
// else if (dbType.Equals("Date"))
// {
// DateTime date;
// if (DateTime.TryParse(property.Value.ToString(), out date))
// poco.Date = date;
// }
// else if (dbType.Equals("Nvarchar"))
// {
// poco.VarChar = property.Value.ToString();
// }
// else
// {
// poco.Text = property.Value.ToString();
// }
// }
// bool isNew = db.IsNew(poco);
// if (isNew)
// {
// db.Insert(poco);
// }
// else
// {
// db.Update(poco);
// }
// }
// transaction.Complete();
// }
// // re-generate xml
// var xd = new XmlDocument();
// XmlGenerate(xd);
// // generate preview for blame history?
// if (UmbracoSettings.EnableGlobalPreviewStorage)
// {
// // Version as new guid to ensure different versions are generated as members are not versioned currently!
// SavePreviewXml(generateXmlWithoutSaving(xd), Guid.NewGuid());
// }
// FireAfterSave(e);
//}
}
/// <summary>
@@ -679,6 +711,7 @@ namespace umbraco.cms.businesslogic.member
/// <summary>
/// Deltes the current member
/// </summary>
[Obsolete("Obsolete, Use Umbraco.Core.Services.MemberService.Delete()", false)]
public override void delete()
{
var e = new DeleteEventArgs();
@@ -686,15 +719,15 @@ namespace umbraco.cms.businesslogic.member
if (!e.Cancel)
{
// delete all relations to groups
foreach (int groupId in this.Groups.Keys)
if (MemberItem != null)
{
RemoveGroup(groupId);
ApplicationContext.Current.Services.MemberService.Delete(MemberItem);
}
else
{
var member = ApplicationContext.Current.Services.MemberService.GetById(Id);
ApplicationContext.Current.Services.MemberService.Delete(member);
}
// delete memeberspecific data!
SqlHelper.ExecuteNonQuery("Delete from cmsMember where nodeId = @id",
SqlHelper.CreateParameter("@id", Id));
// Delete all content and cmsnode specific data!
base.delete();
@@ -704,18 +737,13 @@ namespace umbraco.cms.businesslogic.member
}
/// <summary>
/// Sets the password for the user - ensure it is encrypted or hashed based on the active membership provider.
/// Sets the password for the user - ensure it is encrypted or hashed based on the active membership provider - you must
/// call Save() after using this method
/// </summary>
/// <param name="newPassword"></param>
public void ChangePassword(string newPassword)
{
SqlHelper.ExecuteNonQuery(
"update cmsMember set Password = @password where nodeId = @id",
SqlHelper.CreateParameter("@password", newPassword),
SqlHelper.CreateParameter("@id", Id));
//update this object's password
_password = newPassword;
Password = newPassword;
}
/// <summary>
@@ -724,7 +752,7 @@ namespace umbraco.cms.businesslogic.member
/// <returns></returns>
public string GetPassword()
{
return Content.Password;
return MemberItem.Password;
}
/// <summary>
@@ -784,24 +812,6 @@ namespace umbraco.cms.businesslogic.member
return node;
}
protected void PopulateMemberFromReader(IRecordsReader dr)
{
SetupNodeForTree(dr.GetGuid("uniqueId"),
_objectType, dr.GetShort("level"),
dr.GetInt("parentId"),
dr.GetInt("nodeUser"),
dr.GetString("path"),
dr.GetString("text"),
dr.GetDateTime("createDate"), false);
if (!dr.IsNull("Email"))
_email = dr.GetString("Email");
_loginName = dr.GetString("LoginName");
_password = dr.GetString("Password");
}
#endregion
#region Private methods

View File

@@ -19,7 +19,7 @@ namespace umbraco.cms.businesslogic.member
#region Private Members
internal static readonly Guid ObjectType = new Guid(Constants.ObjectTypes.MemberType);
private IMemberType _contentType;
internal IMemberType MemberTypeItem;
#endregion
@@ -78,7 +78,7 @@ namespace umbraco.cms.businesslogic.member
/// <returns>True if the Member can edit the data</returns>
public bool MemberCanEdit(PropertyType pt)
{
return _contentType.MemberCanEditProperty(pt.Alias);
return MemberTypeItem.MemberCanEditProperty(pt.Alias);
}
/// <summary>
@@ -88,7 +88,7 @@ namespace umbraco.cms.businesslogic.member
/// <returns>True if the data should be displayed on the profilepage</returns>
public bool ViewOnProfile(PropertyType pt)
{
return _contentType.MemberCanViewProperty(pt.Alias);
return MemberTypeItem.MemberCanViewProperty(pt.Alias);
}
/// <summary>
@@ -98,8 +98,8 @@ namespace umbraco.cms.businesslogic.member
/// <param name="value">True/False if Members of the type shoúld be able to edit the data</param>
public void setMemberCanEdit(PropertyType pt, bool value)
{
_contentType.SetMemberCanEditProperty(pt.Alias, value);
ApplicationContext.Current.Services.MemberTypeService.Save(_contentType);
MemberTypeItem.SetMemberCanEditProperty(pt.Alias, value);
ApplicationContext.Current.Services.MemberTypeService.Save(MemberTypeItem);
}
/// <summary>
@@ -109,8 +109,8 @@ namespace umbraco.cms.businesslogic.member
/// <param name="value">True/False if the data should be displayed</param>
public void setMemberViewOnProfile(PropertyType pt, bool value)
{
_contentType.SetMemberCanViewProperty(pt.Alias, value);
ApplicationContext.Current.Services.MemberTypeService.Save(_contentType);
MemberTypeItem.SetMemberCanViewProperty(pt.Alias, value);
ApplicationContext.Current.Services.MemberTypeService.Save(MemberTypeItem);
}
/// <summary>
@@ -128,7 +128,7 @@ namespace umbraco.cms.businesslogic.member
if (e.Cancel == false) {
ApplicationContext.Current.Services.MemberTypeService.Delete(_contentType);
ApplicationContext.Current.Services.MemberTypeService.Delete(MemberTypeItem);
// delete all documents of this type
FireAfterDelete(e);
@@ -145,7 +145,7 @@ namespace umbraco.cms.businesslogic.member
if (e.Cancel == false)
{
ApplicationContext.Current.Services.MemberTypeService.Save(_contentType);
ApplicationContext.Current.Services.MemberTypeService.Save(MemberTypeItem);
base.Save();
FireAfterSave(e);
}
@@ -247,10 +247,10 @@ namespace umbraco.cms.businesslogic.member
private void SetupNode(IMemberType contentType)
{
_contentType = contentType;
MemberTypeItem = contentType;
base.PopulateContentTypeFromContentTypeBase(_contentType);
base.PopulateCMSNodeFromUmbracoEntity(_contentType, ObjectType);
base.PopulateContentTypeFromContentTypeBase(MemberTypeItem);
base.PopulateCMSNodeFromUmbracoEntity(MemberTypeItem, ObjectType);
}
#endregion