Implementing the mapper for Member. Refactoring the MemberProfile, IMember and IMembershipUser interfaces
This commit is contained in:
12
src/Umbraco.Core/Models/Membership/IMember.cs
Normal file
12
src/Umbraco.Core/Models/Membership/IMember.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
namespace Umbraco.Core.Models.Membership
|
||||
{
|
||||
internal interface IMember : IMembershipUser, IMemberProfile
|
||||
{
|
||||
new int Id { get; set; }
|
||||
}
|
||||
|
||||
internal interface IMemberProfile : IProfile
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@ namespace Umbraco.Core.Models.Membership
|
||||
{
|
||||
internal interface IMembershipUser : IMembershipUserId, IAggregateRoot
|
||||
{
|
||||
new object Id { get; set; }
|
||||
/*new object Id { get; set; }*/
|
||||
string Username { get; set; }
|
||||
string Email { get; set; }
|
||||
string Password { get; set; }
|
||||
@@ -16,10 +16,6 @@ namespace Umbraco.Core.Models.Membership
|
||||
bool IsApproved { get; set; }
|
||||
bool IsOnline { get; set; }
|
||||
bool IsLockedOut { get; set; }
|
||||
//Was CreationDate
|
||||
//DateTime CreateDate { get; set; }
|
||||
//LastActivityDate
|
||||
//DateTime UpdateDate { get; set; }
|
||||
DateTime LastLoginDate { get; set; }
|
||||
DateTime LastPasswordChangeDate { get; set; }
|
||||
DateTime LastLockoutDate { get; set; }
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Diagnostics;
|
||||
using System.Reflection;
|
||||
using System.Runtime.Serialization;
|
||||
@@ -17,27 +16,24 @@ namespace Umbraco.Core.Models.Membership
|
||||
[Serializable]
|
||||
[DataContract(IsReference = true)]
|
||||
[DebuggerDisplay("Id: {Id}")]
|
||||
internal class Member : MemberProfile, IMembershipUser
|
||||
internal class Member : MemberProfile, IMember
|
||||
{
|
||||
private bool _hasIdentity;
|
||||
private int _id;
|
||||
private Guid _key;
|
||||
private DateTime _createDate;
|
||||
private DateTime _updateDate;
|
||||
private PropertyCollection _properties;
|
||||
private int _contentTypeId;
|
||||
private string _contentTypeAlias;
|
||||
|
||||
private static readonly PropertyInfo IdSelector = ExpressionHelper.GetPropertyInfo<Member, int>(x => x.Id);
|
||||
private static readonly PropertyInfo KeySelector = ExpressionHelper.GetPropertyInfo<Member, Guid>(x => x.Key);
|
||||
private static readonly PropertyInfo CreateDateSelector = ExpressionHelper.GetPropertyInfo<Member, DateTime>(x => x.CreateDate);
|
||||
private static readonly PropertyInfo UpdateDateSelector = ExpressionHelper.GetPropertyInfo<Member, DateTime>(x => x.UpdateDate);
|
||||
private static readonly PropertyInfo HasIdentitySelector = ExpressionHelper.GetPropertyInfo<Member, bool>(x => x.HasIdentity);
|
||||
private readonly static PropertyInfo PropertyCollectionSelector = ExpressionHelper.GetPropertyInfo<Member, PropertyCollection>(x => x.Properties);
|
||||
|
||||
protected void PropertiesChanged(object sender, NotifyCollectionChangedEventArgs e)
|
||||
{
|
||||
OnPropertyChanged(PropertyCollectionSelector);
|
||||
}
|
||||
|
||||
private static readonly PropertyInfo DefaultContentTypeIdSelector = ExpressionHelper.GetPropertyInfo<Member, int>(x => x.ContentTypeId);
|
||||
private static readonly PropertyInfo DefaultContentTypeAliasSelector = ExpressionHelper.GetPropertyInfo<Member, string>(x => x.ContentTypeAlias);
|
||||
|
||||
/// <summary>
|
||||
/// Integer Id
|
||||
/// </summary>
|
||||
@@ -386,20 +382,49 @@ namespace Umbraco.Core.Models.Membership
|
||||
[IgnoreDataMember]
|
||||
public bool IsOnline { get; set; }
|
||||
|
||||
public object ProfileId { get; set; }
|
||||
public IEnumerable<object> Groups { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Guid Id of the curent Version
|
||||
/// </summary>
|
||||
[DataMember]
|
||||
public PropertyCollection Properties
|
||||
public Guid Version { get; internal set; }
|
||||
|
||||
/// <summary>
|
||||
/// Integer Id of the default ContentType
|
||||
/// </summary>
|
||||
[DataMember]
|
||||
public virtual int ContentTypeId
|
||||
{
|
||||
get { return _properties; }
|
||||
set
|
||||
get { return _contentTypeId; }
|
||||
internal set
|
||||
{
|
||||
_properties = value;
|
||||
_properties.CollectionChanged += PropertiesChanged;
|
||||
SetPropertyValueAndDetectChanges(o =>
|
||||
{
|
||||
_contentTypeId = value;
|
||||
return _contentTypeId;
|
||||
}, _contentTypeId, DefaultContentTypeIdSelector);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// String alias of the default ContentType
|
||||
/// </summary>
|
||||
[DataMember]
|
||||
public virtual string ContentTypeAlias
|
||||
{
|
||||
get { return _contentTypeAlias; }
|
||||
internal set
|
||||
{
|
||||
SetPropertyValueAndDetectChanges(o =>
|
||||
{
|
||||
_contentTypeAlias = value;
|
||||
return _contentTypeAlias;
|
||||
}, _contentTypeAlias, DefaultContentTypeAliasSelector);
|
||||
}
|
||||
}
|
||||
|
||||
public object ProfileId { get; set; }
|
||||
public IEnumerable<object> Groups { get; set; }
|
||||
|
||||
#region Internal methods
|
||||
|
||||
internal virtual void ResetIdentity()
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Specialized;
|
||||
using System.Reflection;
|
||||
using System.Runtime.Serialization;
|
||||
using Umbraco.Core.Models.EntityBase;
|
||||
|
||||
namespace Umbraco.Core.Models.Membership
|
||||
@@ -12,6 +14,7 @@ namespace Umbraco.Core.Models.Membership
|
||||
private string _path;
|
||||
private int _creatorId;
|
||||
private bool _trashed;
|
||||
private PropertyCollection _properties;
|
||||
|
||||
private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo<MemberProfile, int>(x => ((IUmbracoEntity)x).ParentId);
|
||||
private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo<MemberProfile, int>(x => ((IUmbracoEntity)x).SortOrder);
|
||||
@@ -19,6 +22,12 @@ namespace Umbraco.Core.Models.Membership
|
||||
private static readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo<MemberProfile, string>(x => ((IUmbracoEntity)x).Path);
|
||||
private static readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo<MemberProfile, int>(x => ((IUmbracoEntity)x).CreatorId);
|
||||
private static readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo<MemberProfile, bool>(x => x.Trashed);
|
||||
private readonly static PropertyInfo PropertyCollectionSelector = ExpressionHelper.GetPropertyInfo<Member, PropertyCollection>(x => x.Properties);
|
||||
|
||||
protected void PropertiesChanged(object sender, NotifyCollectionChangedEventArgs e)
|
||||
{
|
||||
OnPropertyChanged(PropertyCollectionSelector);
|
||||
}
|
||||
|
||||
public abstract new int Id { get; set; }
|
||||
public abstract Guid Key { get; set; }
|
||||
@@ -29,6 +38,7 @@ namespace Umbraco.Core.Models.Membership
|
||||
/// <summary>
|
||||
/// Profile of the user who created this Content
|
||||
/// </summary>
|
||||
[DataMember]
|
||||
int IUmbracoEntity.CreatorId
|
||||
{
|
||||
get
|
||||
@@ -48,7 +58,8 @@ namespace Umbraco.Core.Models.Membership
|
||||
/// <summary>
|
||||
/// Gets or sets the level of the content entity
|
||||
/// </summary>
|
||||
int IUmbracoEntity.Level
|
||||
[DataMember]
|
||||
int IUmbracoEntity.Level
|
||||
{
|
||||
get { return _level; }
|
||||
set
|
||||
@@ -63,6 +74,7 @@ namespace Umbraco.Core.Models.Membership
|
||||
/// <summary>
|
||||
/// Gets or sets the Id of the Parent entity
|
||||
/// </summary>
|
||||
[DataMember]
|
||||
int IUmbracoEntity.ParentId
|
||||
{
|
||||
get
|
||||
@@ -84,6 +96,7 @@ namespace Umbraco.Core.Models.Membership
|
||||
/// <summary>
|
||||
/// Gets or sets the path
|
||||
/// </summary>
|
||||
[DataMember]
|
||||
string IUmbracoEntity.Path
|
||||
{
|
||||
get { return _path; }
|
||||
@@ -100,6 +113,7 @@ namespace Umbraco.Core.Models.Membership
|
||||
/// <summary>
|
||||
/// Gets or sets the sort order of the content entity
|
||||
/// </summary>
|
||||
[DataMember]
|
||||
int IUmbracoEntity.SortOrder
|
||||
{
|
||||
get { return _sortOrder; }
|
||||
@@ -117,6 +131,7 @@ namespace Umbraco.Core.Models.Membership
|
||||
/// Boolean indicating whether this Content is Trashed or not.
|
||||
/// If Content is Trashed it will be located in the Recyclebin.
|
||||
/// </summary>
|
||||
[DataMember]
|
||||
public virtual bool Trashed
|
||||
{
|
||||
get { return _trashed; }
|
||||
@@ -129,5 +144,16 @@ namespace Umbraco.Core.Models.Membership
|
||||
}, _trashed, TrashedSelector);
|
||||
}
|
||||
}
|
||||
|
||||
[DataMember]
|
||||
public PropertyCollection Properties
|
||||
{
|
||||
get { return _properties; }
|
||||
set
|
||||
{
|
||||
_properties = value;
|
||||
_properties.CollectionChanged += PropertiesChanged;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,9 +8,9 @@ using Umbraco.Core.Models.Rdbms;
|
||||
|
||||
namespace Umbraco.Core.Persistence.Factories
|
||||
{
|
||||
internal class MemberReadOnlyFactory : IEntityFactory<IMembershipUser, MemberReadOnlyDto>
|
||||
internal class MemberReadOnlyFactory : IEntityFactory<IMember, MemberReadOnlyDto>
|
||||
{
|
||||
public IMembershipUser BuildEntity(MemberReadOnlyDto dto)
|
||||
public IMember BuildEntity(MemberReadOnlyDto dto)
|
||||
{
|
||||
var member = new Member
|
||||
{
|
||||
@@ -24,7 +24,9 @@ namespace Umbraco.Core.Persistence.Factories
|
||||
ProviderUserKey = dto.UniqueId,
|
||||
Trashed = dto.Trashed,
|
||||
Key = dto.UniqueId.Value,
|
||||
ProfileId = dto.UniqueId.Value
|
||||
ProfileId = dto.UniqueId.Value,
|
||||
ContentTypeId = dto.ContentTypeId,
|
||||
ContentTypeAlias = dto.ContentTypeAlias
|
||||
};
|
||||
|
||||
((IUmbracoEntity)member).CreatorId = dto.UserId.Value;
|
||||
@@ -55,7 +57,7 @@ namespace Umbraco.Core.Persistence.Factories
|
||||
return member;
|
||||
}
|
||||
|
||||
public MemberReadOnlyDto BuildDto(IMembershipUser entity)
|
||||
public MemberReadOnlyDto BuildDto(IMember entity)
|
||||
{
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
|
||||
67
src/Umbraco.Core/Persistence/Mappers/MemberMapper.cs
Normal file
67
src/Umbraco.Core/Persistence/Mappers/MemberMapper.cs
Normal file
@@ -0,0 +1,67 @@
|
||||
using System.Collections.Concurrent;
|
||||
using Umbraco.Core.Models.EntityBase;
|
||||
using Umbraco.Core.Models.Membership;
|
||||
using Umbraco.Core.Models.Rdbms;
|
||||
|
||||
namespace Umbraco.Core.Persistence.Mappers
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a <see cref="Member"/> to DTO mapper used to translate the properties of the public api
|
||||
/// implementation to that of the database's DTO as sql: [tableName].[columnName].
|
||||
/// </summary>
|
||||
[MapperFor(typeof(IMember))]
|
||||
[MapperFor(typeof(Member))]
|
||||
public sealed class MemberMapper : BaseMapper
|
||||
{
|
||||
private static readonly ConcurrentDictionary<string, DtoMapModel> PropertyInfoCacheInstance = new ConcurrentDictionary<string, DtoMapModel>();
|
||||
|
||||
//NOTE: its an internal class but the ctor must be public since we're using Activator.CreateInstance to create it
|
||||
// otherwise that would fail because there is no public constructor.
|
||||
public MemberMapper()
|
||||
{
|
||||
BuildMap();
|
||||
}
|
||||
|
||||
#region Overrides of BaseMapper
|
||||
|
||||
internal override ConcurrentDictionary<string, DtoMapModel> PropertyInfoCache
|
||||
{
|
||||
get { return PropertyInfoCacheInstance; }
|
||||
}
|
||||
|
||||
internal override void BuildMap()
|
||||
{
|
||||
CacheMap<Member, NodeDto>(src => src.Id, dto => dto.NodeId);
|
||||
CacheMap<Member, NodeDto>(src => src.CreateDate, dto => dto.CreateDate);
|
||||
CacheMap<Member, NodeDto>(src => ((IUmbracoEntity)src).Level, dto => dto.Level);
|
||||
CacheMap<Member, NodeDto>(src => ((IUmbracoEntity)src).ParentId, dto => dto.ParentId);
|
||||
CacheMap<Member, NodeDto>(src => ((IUmbracoEntity)src).Path, dto => dto.Path);
|
||||
CacheMap<Member, NodeDto>(src => ((IUmbracoEntity)src).SortOrder, dto => dto.SortOrder);
|
||||
CacheMap<Member, NodeDto>(src => ((IUmbracoEntity)src).CreatorId, dto => dto.UserId);
|
||||
CacheMap<Member, NodeDto>(src => src.Name, dto => dto.Text);
|
||||
CacheMap<Member, NodeDto>(src => src.Trashed, dto => dto.Trashed);
|
||||
CacheMap<Member, NodeDto>(src => src.Key, dto => dto.UniqueId);
|
||||
CacheMap<Member, NodeDto>(src => src.ProfileId, dto => dto.UniqueId);
|
||||
CacheMap<Member, ContentDto>(src => src.ContentTypeId, dto => dto.ContentTypeId);
|
||||
CacheMap<Member, ContentTypeDto>(src => src.ContentTypeAlias, dto => dto.Alias);
|
||||
CacheMap<Member, ContentVersionDto>(src => src.UpdateDate, dto => dto.VersionDate);
|
||||
CacheMap<Member, ContentVersionDto>(src => src.Version, dto => dto.VersionId);
|
||||
|
||||
CacheMap<Member, MemberDto>(src => src.Email, dto => dto.Email);
|
||||
CacheMap<Member, MemberDto>(src => src.Username, dto => dto.LoginName);
|
||||
CacheMap<Member, MemberDto>(src => src.Password, dto => dto.Password);
|
||||
|
||||
CacheMap<Member, PropertyDataDto>(src => src.IsApproved, dto => dto.Integer);
|
||||
CacheMap<Member, PropertyDataDto>(src => src.IsLockedOut, dto => dto.Integer);
|
||||
CacheMap<Member, PropertyDataDto>(src => src.Comments, dto => dto.Text);
|
||||
CacheMap<Member, PropertyDataDto>(src => src.PasswordAnswer, dto => dto.VarChar);
|
||||
CacheMap<Member, PropertyDataDto>(src => src.PasswordQuestion, dto => dto.VarChar);
|
||||
CacheMap<Member, PropertyDataDto>(src => src.FailedPasswordAttempts, dto => dto.Integer);
|
||||
CacheMap<Member, PropertyDataDto>(src => src.LastLockoutDate, dto => dto.Date);
|
||||
CacheMap<Member, PropertyDataDto>(src => src.LastLoginDate, dto => dto.Date);
|
||||
CacheMap<Member, PropertyDataDto>(src => src.LastPasswordChangeDate, dto => dto.Date);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace Umbraco.Core.Persistence.Repositories
|
||||
{
|
||||
internal interface IMemberRepository : IRepositoryVersionable<int, IMembershipUser>
|
||||
internal interface IMemberRepository : IRepositoryVersionable<int, IMember>
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ using Umbraco.Core.Persistence.UnitOfWork;
|
||||
|
||||
namespace Umbraco.Core.Persistence.Repositories
|
||||
{
|
||||
internal class MemberRepository : VersionableRepositoryBase<int, IMembershipUser>, IMemberRepository
|
||||
internal class MemberRepository : VersionableRepositoryBase<int, IMember>, IMemberRepository
|
||||
{
|
||||
public MemberRepository(IDatabaseUnitOfWork work) : base(work)
|
||||
{
|
||||
@@ -33,7 +33,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
|
||||
#region Overrides of RepositoryBase<int, IMembershipUser>
|
||||
|
||||
protected override IMembershipUser PerformGet(int id)
|
||||
protected override IMember PerformGet(int id)
|
||||
{
|
||||
var sql = GetBaseQuery(false);
|
||||
sql.Where(GetBaseWhereClause(), new { Id = id });
|
||||
@@ -52,12 +52,12 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
return member;
|
||||
}
|
||||
|
||||
protected override IEnumerable<IMembershipUser> PerformGetAll(params int[] ids)
|
||||
protected override IEnumerable<IMember> PerformGetAll(params int[] ids)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected override IEnumerable<IMembershipUser> PerformGetByQuery(IQuery<IMembershipUser> query)
|
||||
protected override IEnumerable<IMember> PerformGetByQuery(IQuery<IMember> query)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
@@ -110,12 +110,12 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
|
||||
#region Unit of Work Implementation
|
||||
|
||||
protected override void PersistNewItem(IMembershipUser entity)
|
||||
protected override void PersistNewItem(IMember entity)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected override void PersistUpdatedItem(IMembershipUser entity)
|
||||
protected override void PersistUpdatedItem(IMember entity)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
@@ -124,7 +124,7 @@ namespace Umbraco.Core.Persistence.Repositories
|
||||
|
||||
#region Overrides of VersionableRepositoryBase<IMembershipUser>
|
||||
|
||||
public override IMembershipUser GetByVersion(Guid versionId)
|
||||
public override IMember GetByVersion(Guid versionId)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
@@ -200,6 +200,7 @@
|
||||
<Compile Include="Models\IDictionaryTranslation.cs" />
|
||||
<Compile Include="Models\IFile.cs" />
|
||||
<Compile Include="Models\ILanguage.cs" />
|
||||
<Compile Include="Models\Membership\IMember.cs" />
|
||||
<Compile Include="Models\Membership\UmbracoMember.cs" />
|
||||
<Compile Include="Models\Membership\UmbracoMembershipUser.cs" />
|
||||
<Compile Include="Models\Rdbms\MemberReadOnlyDto.cs" />
|
||||
@@ -264,6 +265,7 @@
|
||||
<Compile Include="Persistence\FaultHandling\Strategies\SqlAzureTransientErrorDetectionStrategy.cs" />
|
||||
<Compile Include="Persistence\FaultHandling\ThrottlingCondition.cs" />
|
||||
<Compile Include="Persistence\Mappers\MapperForAttribute.cs" />
|
||||
<Compile Include="Persistence\Mappers\MemberMapper.cs" />
|
||||
<Compile Include="Persistence\Mappers\PetaPocoMapper.cs" />
|
||||
<Compile Include="Persistence\DatabaseAnnotations\ConstraintAttribute.cs" />
|
||||
<Compile Include="Persistence\DatabaseAnnotations\SpecialDbTypeAttribute.cs" />
|
||||
|
||||
Reference in New Issue
Block a user