diff --git a/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs b/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs index 60e176096f..273d605bef 100644 --- a/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs +++ b/src/Umbraco.Core/Persistence/Caching/RuntimeCacheProvider.cs @@ -151,6 +151,21 @@ namespace Umbraco.Core.Persistence.Caching _keyTracker.Remove(key); } + public void Delete(Type type, int entityId) + { + var key = GetCompositeId(type, entityId); + if (_memoryCache != null) + { + _memoryCache.Remove(key); + } + else + { + HttpRuntime.Cache.Remove(key); + } + + _keyTracker.Remove(key); + } + /// /// Clear cache by type /// diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs index cd2e0c373b..ae76216800 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs @@ -512,6 +512,10 @@ namespace Umbraco.Core.Persistence.Repositories totalRecords = Convert.ToInt32(pagedResult.TotalItems); //now that we have the member dto's we need to construct true members from the list. + if (totalRecords == 0) + { + return Enumerable.Empty(); + } var result = GetAll(pagedResult.Items.Select(x => x.NodeId).ToArray()); //now we need to ensure this result is also ordered by the same order by clause diff --git a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs index e5074758b7..3bae7f7f2c 100644 --- a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs @@ -298,6 +298,11 @@ namespace Umbraco.Core.Persistence.Repositories totalRecords = Convert.ToInt32(pagedResult.TotalItems); //now that we have the user dto's we need to construct true members from the list. + if (totalRecords == 0) + { + return Enumerable.Empty(); + } + var result = GetAll(pagedResult.Items.Select(x => x.Id).ToArray()); //now we need to ensure this result is also ordered by the same order by clause diff --git a/src/Umbraco.Core/Services/MemberService.cs b/src/Umbraco.Core/Services/MemberService.cs index db3bdb9c48..a256430879 100644 --- a/src/Umbraco.Core/Services/MemberService.cs +++ b/src/Umbraco.Core/Services/MemberService.cs @@ -189,7 +189,7 @@ namespace Umbraco.Core.Services using (var uow = _uowProvider.GetUnitOfWork()) { var repository = _repositoryFactory.CreateMemberRepository(uow); - //NOTE What about content that has the contenttype as part of its composition? + //TODO: What about content that has the contenttype as part of its composition? var query = Query.Builder.Where(x => x.ContentTypeId == memberTypeId); var members = repository.GetByQuery(query).ToArray(); diff --git a/src/Umbraco.Web/Cache/MemberCacheRefresher.cs b/src/Umbraco.Web/Cache/MemberCacheRefresher.cs index 8f6437c8b6..2b740e826d 100644 --- a/src/Umbraco.Web/Cache/MemberCacheRefresher.cs +++ b/src/Umbraco.Web/Cache/MemberCacheRefresher.cs @@ -1,6 +1,8 @@ using System; using Umbraco.Core; using Umbraco.Core.Cache; +using Umbraco.Core.Models; +using Umbraco.Core.Persistence.Caching; using umbraco.cms.businesslogic.member; using umbraco.interfaces; @@ -50,6 +52,8 @@ namespace Umbraco.Web.Cache ClearCacheByKeySearch(string.Format("{0}_{1}", CacheKeys.MemberLibraryCacheKey, id)); ApplicationContext.Current.ApplicationCache. ClearCacheByKeySearch(string.Format("{0}{1}", CacheKeys.MemberBusinessLogicCacheKey, id)); + + RuntimeCacheProvider.Current.Delete(typeof(IMember), id); } } } \ No newline at end of file diff --git a/src/umbraco.cms/businesslogic/member/Member.cs b/src/umbraco.cms/businesslogic/member/Member.cs index 40275672d1..9bb8638773 100644 --- a/src/umbraco.cms/businesslogic/member/Member.cs +++ b/src/umbraco.cms/businesslogic/member/Member.cs @@ -3,6 +3,7 @@ using System.Collections; using System.Collections.Generic; using System.Data; using System.Diagnostics; +using System.Globalization; using System.Runtime.CompilerServices; using System.Web; using System.Xml; @@ -11,6 +12,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence.Querying; using umbraco.cms.businesslogic.cache; using umbraco.BusinessLogic; using umbraco.DataLayer; @@ -63,6 +65,12 @@ namespace umbraco.cms.businesslogic.member #region Constructors + internal Member(IMember member) + : base(member) + { + SetupNode(member); + } + /// /// Initializes a new instance of the Member class. /// @@ -103,20 +111,10 @@ namespace umbraco.cms.businesslogic.member public static IEnumerable GetAllAsList() { - var tmp = new List(); - using (var dr = SqlHelper.ExecuteReader( - string.Format(_sQLOptimizedMany.Trim(), "1=1", "umbracoNode.text"), - SqlHelper.CreateParameter("@nodeObjectType", Member._objectType))) - { - while (dr.Read()) - { - var m = new Member(dr.GetInt("id"), true); - m.PopulateMemberFromReader(dr); - tmp.Add(m); - } - } - - return tmp.ToArray(); + int totalRecs; + return ApplicationContext.Current.Services.MemberService.GetAllMembers(0, int.MaxValue, out totalRecs) + .Select(x => new Member(x)) + .ToArray(); } /// @@ -149,7 +147,11 @@ namespace umbraco.cms.businesslogic.member /// public static Member[] getMemberFromFirstLetter(char letter) { - return GetMemberByName(letter.ToString(), true); + int totalRecs; + return ApplicationContext.Current.Services.MemberService.FindMembersByUsername( + letter.ToString(CultureInfo.InvariantCulture), 0, int.MaxValue, out totalRecs, StringPropertyMatchType.StartsWith) + .Select(x => new Member(x)) + .ToArray(); } public static Member[] GetMemberByName(string usernameToMatch, bool matchByNameInsteadOfLogin) @@ -214,7 +216,7 @@ namespace umbraco.cms.businesslogic.member { if (mbt == null) throw new ArgumentNullException("mbt"); - var loginName = (!string.IsNullOrEmpty(LoginName)) ? LoginName : Name; + var loginName = (string.IsNullOrEmpty(LoginName) == false) ? LoginName : Name; if (string.IsNullOrEmpty(loginName)) throw new ArgumentException("The loginname must be different from an empty string", "loginName"); @@ -267,27 +269,12 @@ namespace umbraco.cms.businesslogic.member /// The member with the specified loginname - null if no Member with the login exists public static Member GetMemberFromLoginName(string loginName) { - if (string.IsNullOrEmpty(loginName)) - throw new ArgumentException("The username of a Member must be different from an emptry string", "loginName"); - if (IsMember(loginName)) - { - var o = SqlHelper.ExecuteScalar( - "select nodeID from cmsMember where LoginName = @loginName", - SqlHelper.CreateParameter("@loginName", loginName)); + Mandate.ParameterNotNullOrEmpty(loginName, "loginName"); - if (o == null) - return null; + var found = ApplicationContext.Current.Services.MemberService.GetByUsername(loginName); + if (found == null) return null; - int tmpId; - if (!int.TryParse(o.ToString(), out tmpId)) - return null; - - return new Member(tmpId); - } - else - HttpContext.Current.Trace.Warn("No member with loginname: " + loginName + " Exists"); - - return null; + return new Member(found); } /// @@ -302,18 +289,10 @@ namespace umbraco.cms.businesslogic.member if (string.IsNullOrEmpty(email)) return null; - var o = SqlHelper.ExecuteScalar( - "select nodeID from cmsMember where Email = @email", - SqlHelper.CreateParameter("@email", email.ToLower())); + var found = ApplicationContext.Current.Services.MemberService.GetByEmail(email); + if (found == null) return null; - if (o == null) - return null; - - int tmpId; - if (!int.TryParse(o.ToString(), out tmpId)) - return null; - - return new Member(tmpId); + return new Member(found); } /// @@ -328,21 +307,11 @@ namespace umbraco.cms.businesslogic.member if (string.IsNullOrEmpty(email)) return null; - var tmp = new List(); - using (var dr = SqlHelper.ExecuteReader(string.Format(_sQLOptimizedMany.Trim(), - "Email = @email", - "umbracoNode.text"), - SqlHelper.CreateParameter("@nodeObjectType", Member._objectType), - SqlHelper.CreateParameter("@email", email.ToLower()))) - { - while (dr.Read()) - { - var m = new Member(dr.GetInt("id"), true); - m.PopulateMemberFromReader(dr); - tmp.Add(m); - } - } - return tmp.ToArray(); + int totalRecs; + var found = ApplicationContext.Current.Services.MemberService.FindMembersByEmail( + email, 0, int.MaxValue, out totalRecs, StringPropertyMatchType.Exact); + + return found.Select(x => new Member(x)).ToArray(); } /// @@ -425,16 +394,7 @@ namespace umbraco.cms.businesslogic.member /// The membertype which are being deleted public static void DeleteFromType(MemberType dt) { - var objs = getContentOfContentType(dt); - foreach (var c in objs) - { - // due to recursive structure document might already been deleted.. - if (IsNode(c.UniqueId)) - { - var tmp = new Member(c.UniqueId); - tmp.delete(); - } - } + ApplicationContext.Current.Services.MemberService.DeleteMembersOfType(dt.Id); } #endregion @@ -766,13 +726,7 @@ namespace umbraco.cms.businesslogic.member /// public string GetPassword() { - if (string.IsNullOrEmpty(_password)) - { - _password = SqlHelper.ExecuteScalar( - "select Password from cmsMember where nodeId = @id", - SqlHelper.CreateParameter("@id", Id)); - } - return _password; + return Content.Password; } /// @@ -1113,19 +1067,7 @@ namespace umbraco.cms.businesslogic.member return HttpContext.Current.User.Identity.IsAuthenticated; } - - - /// - /// Make a lookup in the database to verify if a member truely exists - /// - /// The node id of the member - /// True is a record exists in db - private static bool MemberExists(int nodeId) - { - return ApplicationContext.Current.Services.MemberService.Exists(nodeId); - } - - + /// /// Gets the current visitors memberid ///