diff --git a/src/Umbraco.Core/Models/AuditItem.cs b/src/Umbraco.Core/Models/AuditItem.cs index 7e019fa4af..7fb38c4ae3 100644 --- a/src/Umbraco.Core/Models/AuditItem.cs +++ b/src/Umbraco.Core/Models/AuditItem.cs @@ -23,33 +23,9 @@ namespace Umbraco.Core.Models EnableChangeTracking(); } - /// - /// Constructor for creating an item that is returned from the database - /// - /// - /// - /// - /// - /// - /// - public AuditItem(int objectId, string comment, AuditType type, int userId, string userName, string userAvatar) - { - DisableChangeTracking(); - - Id = objectId; - Comment = comment; - AuditType = type; - UserId = userId; - UserName = userName; - UserAvatar = userAvatar; - - EnableChangeTracking(); - } - public string Comment { get; private set; } public AuditType AuditType { get; private set; } public int UserId { get; private set; } - public string UserName { get; private set; } - public string UserAvatar { get; private set; } + } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/IAuditItem.cs b/src/Umbraco.Core/Models/IAuditItem.cs index 4e4a39ab59..4a8b3554cd 100644 --- a/src/Umbraco.Core/Models/IAuditItem.cs +++ b/src/Umbraco.Core/Models/IAuditItem.cs @@ -8,7 +8,5 @@ namespace Umbraco.Core.Models string Comment { get; } AuditType AuditType { get; } int UserId { get; } - string UserName { get; } - string UserAvatar { get; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Rdbms/ReadOnlyLogDto.cs b/src/Umbraco.Core/Models/Rdbms/ReadOnlyLogDto.cs deleted file mode 100644 index 0de10333f8..0000000000 --- a/src/Umbraco.Core/Models/Rdbms/ReadOnlyLogDto.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.DatabaseAnnotations; -using Umbraco.Core.Persistence.DatabaseModelDefinitions; - -namespace Umbraco.Core.Models.Rdbms -{ - /// - /// object used for returning data from the umbracoLog table - /// - [TableName("umbracoLog")] - [PrimaryKey("id")] - [ExplicitColumns] - internal class ReadOnlyLogDto - { - [Column("id")] - [PrimaryKeyColumn] - public int Id { get; set; } - - [Column("userId")] - public int UserId { get; set; } - - [Column("NodeId")] - public int NodeId { get; set; } - - [Column("Datestamp")] - public DateTime Datestamp { get; set; } - - [Column("logHeader")] - public string Header { get; set; } - - [Column("logComment")] - public string Comment { get; set; } - - [ResultColumn("userName")] - public string UserName { get; set; } - - [ResultColumn("userAvatar")] - public string UserAvatar { get; set; } - } -} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/UserExtensions.cs b/src/Umbraco.Core/Models/UserExtensions.cs index b842fb8f54..7836a7f58f 100644 --- a/src/Umbraco.Core/Models/UserExtensions.cs +++ b/src/Umbraco.Core/Models/UserExtensions.cs @@ -24,12 +24,11 @@ namespace Umbraco.Core.Models /// Tries to lookup the user's gravatar to see if the endpoint can be reached, if so it returns the valid URL /// /// - /// /// /// /// A list of 5 different sized avatar URLs /// - internal static string[] GetCurrentUserAvatarUrls(this IUser user, IUserService userService, ICacheProvider staticCache) + internal static string[] GetUserAvatarUrls(this IUser user, ICacheProvider staticCache) { //check if the user has explicitly removed all avatars including a gravatar, this will be possible and the value will be "none" if (user.Avatar == "none") diff --git a/src/Umbraco.Core/Persistence/Repositories/AuditRepository.cs b/src/Umbraco.Core/Persistence/Repositories/AuditRepository.cs index ae959b249e..6881c77831 100644 --- a/src/Umbraco.Core/Persistence/Repositories/AuditRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/AuditRepository.cs @@ -92,11 +92,11 @@ namespace Umbraco.Core.Persistence.Repositories translatedQuery.OrderBy("Datestamp"); // Get page of results and total count - var pagedResult = Database.Page(pageIndex + 1, pageSize, translatedQuery); + var pagedResult = Database.Page(pageIndex + 1, pageSize, translatedQuery); totalRecords = pagedResult.TotalItems; return pagedResult.Items.Select( - dto => new AuditItem(dto.Id, dto.Comment, Enum.Parse(dto.Header), dto.UserId, dto.UserName, dto.UserAvatar)).ToArray(); + dto => new AuditItem(dto.Id, dto.Comment, Enum.Parse(dto.Header), dto.UserId)).ToArray(); } protected override void PersistUpdatedItem(IAuditItem entity) diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index be1366ab3c..7499d8dfda 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -371,7 +371,6 @@ - diff --git a/src/Umbraco.Web/Editors/LogController.cs b/src/Umbraco.Web/Editors/LogController.cs index 511ecf92cc..5638af740f 100644 --- a/src/Umbraco.Web/Editors/LogController.cs +++ b/src/Umbraco.Web/Editors/LogController.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net; +using System.Net.Http; using System.Text; using System.Threading.Tasks; using System.Web.Http; @@ -31,9 +33,10 @@ namespace Umbraco.Web.Editors var dateQuery = sinceDate.HasValue ? Query.Builder.Where(x => x.CreateDate >= sinceDate) : null; var result = Services.AuditService.GetPagedItemsByEntity(id, pageNumber - 1, pageSize, out totalRecords, orderDirection, customFilter: dateQuery); var mapped = Mapper.Map>(result); + return new PagedResult(totalRecords, pageNumber, pageSize) { - Items = mapped + Items = MapAvatars(mapped) }; } @@ -49,7 +52,7 @@ namespace Umbraco.Web.Editors var mapped = Mapper.Map>(result); return new PagedResult(totalRecords, pageNumber + 1, pageSize) { - Items = mapped + Items = MapAvatars(mapped) }; } @@ -81,5 +84,16 @@ namespace Umbraco.Web.Editors Log.Instance.GetLogItems(Enum.Parse(logType.ToString()), sinceDate.Value)); } + private IEnumerable MapAvatars(IEnumerable items) + { + var userIds = items.Select(x => x.UserId).ToArray(); + var users = Services.UserService.GetUsersById(userIds) + .ToDictionary(x => x.Id, x => x.GetUserAvatarUrls(ApplicationContext.ApplicationCache.RuntimeCache)); + foreach (var item in items) + { + item.UserAvatars = users[item.UserId]; + } + return items; + } } } diff --git a/src/Umbraco.Web/Editors/UsersController.cs b/src/Umbraco.Web/Editors/UsersController.cs index cb2963124f..37bcd97214 100644 --- a/src/Umbraco.Web/Editors/UsersController.cs +++ b/src/Umbraco.Web/Editors/UsersController.cs @@ -73,7 +73,7 @@ namespace Umbraco.Web.Editors /// public string[] GetCurrentUserAvatarUrls() { - var urls = UmbracoContext.Security.CurrentUser.GetCurrentUserAvatarUrls(Services.UserService, ApplicationContext.ApplicationCache.StaticCache); + var urls = UmbracoContext.Security.CurrentUser.GetUserAvatarUrls(ApplicationContext.ApplicationCache.StaticCache); if (urls == null) throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Could not access Gravatar endpoint")); @@ -141,7 +141,7 @@ namespace Umbraco.Web.Editors }); } - return request.CreateResponse(HttpStatusCode.OK, user.GetCurrentUserAvatarUrls(userService, staticCache)); + return request.CreateResponse(HttpStatusCode.OK, user.GetUserAvatarUrls(staticCache)); } [AppendUserModifiedHeader("id")] @@ -174,7 +174,7 @@ namespace Umbraco.Web.Editors FileSystemProviderManager.Current.MediaFileSystem.DeleteFile(filePath); } - return Request.CreateResponse(HttpStatusCode.OK, found.GetCurrentUserAvatarUrls(Services.UserService, ApplicationContext.ApplicationCache.StaticCache)); + return Request.CreateResponse(HttpStatusCode.OK, found.GetUserAvatarUrls(ApplicationContext.ApplicationCache.StaticCache)); } /// diff --git a/src/Umbraco.Web/Models/ContentEditing/AuditLog.cs b/src/Umbraco.Web/Models/ContentEditing/AuditLog.cs index f42bfc9d83..acc913c40e 100644 --- a/src/Umbraco.Web/Models/ContentEditing/AuditLog.cs +++ b/src/Umbraco.Web/Models/ContentEditing/AuditLog.cs @@ -13,8 +13,8 @@ namespace Umbraco.Web.Models.ContentEditing [DataMember(Name = "userName")] public string UserName { get; set; } - [DataMember(Name = "userAvatar")] - public string UserAvatar { get; set; } + [DataMember(Name = "userAvatars")] + public string[] UserAvatars { get; set; } [DataMember(Name = "nodeId")] public int NodeId { get; set; } diff --git a/src/Umbraco.Web/Models/Mapping/MiscModelsMapper.cs b/src/Umbraco.Web/Models/Mapping/MiscModelsMapper.cs index dac7648782..16794bc21c 100644 --- a/src/Umbraco.Web/Models/Mapping/MiscModelsMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/MiscModelsMapper.cs @@ -24,11 +24,13 @@ namespace Umbraco.Web.Models.Mapping //for the logging controller (and assuming dashboard that is used in uaas? otherwise not sure what that controller is used for) config.CreateMap() - .ForMember(log => log.UserAvatar, expression => expression.Ignore()) + .ForMember(log => log.UserAvatars, expression => expression.Ignore()) .ForMember(log => log.UserName, expression => expression.Ignore()) .ForMember(log => log.LogType, expression => expression.MapFrom(item => Enum.Parse(item.LogType.ToString()))); config.CreateMap() + .ForMember(log => log.UserAvatars, expression => expression.Ignore()) + .ForMember(log => log.UserName, expression => expression.Ignore()) .ForMember(log => log.NodeId, expression => expression.MapFrom(item => item.Id)) .ForMember(log => log.Timestamp, expression => expression.MapFrom(item => item.CreateDate)) .ForMember(log => log.LogType, expression => expression.MapFrom(item => item.AuditType)); diff --git a/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs b/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs index 7f4fb222ca..341a0a6fb3 100644 --- a/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/UserModelMapper.cs @@ -231,7 +231,7 @@ namespace Umbraco.Web.Models.Mapping //Important! Currently we are never mapping to multiple UserDisplay objects but if we start doing that // this will cause an N+1 and we'll need to change how this works. config.CreateMap() - .ForMember(detail => detail.Avatars, opt => opt.MapFrom(user => user.GetCurrentUserAvatarUrls(applicationContext.Services.UserService, applicationContext.ApplicationCache.RuntimeCache))) + .ForMember(detail => detail.Avatars, opt => opt.MapFrom(user => user.GetUserAvatarUrls(applicationContext.ApplicationCache.RuntimeCache))) .ForMember(detail => detail.Username, opt => opt.MapFrom(user => user.Username)) .ForMember(detail => detail.LastLoginDate, opt => opt.MapFrom(user => user.LastLoginDate == default(DateTime) ? null : (DateTime?) user.LastLoginDate)) .ForMember(detail => detail.UserGroups, opt => opt.MapFrom(user => user.Groups)) @@ -292,7 +292,7 @@ namespace Umbraco.Web.Models.Mapping //like the load time is waiting. .ForMember(detail => detail.Avatars, - opt => opt.MapFrom(user => user.GetCurrentUserAvatarUrls(applicationContext.Services.UserService, applicationContext.ApplicationCache.RuntimeCache))) + opt => opt.MapFrom(user => user.GetUserAvatarUrls(applicationContext.ApplicationCache.RuntimeCache))) .ForMember(detail => detail.Username, opt => opt.MapFrom(user => user.Username)) .ForMember(detail => detail.UserGroups, opt => opt.MapFrom(user => user.Groups)) .ForMember(detail => detail.LastLoginDate, opt => opt.MapFrom(user => user.LastLoginDate == default(DateTime) ? null : (DateTime?) user.LastLoginDate)) @@ -312,7 +312,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(detail => detail.AdditionalData, opt => opt.Ignore()); config.CreateMap() - .ForMember(detail => detail.Avatars, opt => opt.MapFrom(user => user.GetCurrentUserAvatarUrls(applicationContext.Services.UserService, applicationContext.ApplicationCache.RuntimeCache))) + .ForMember(detail => detail.Avatars, opt => opt.MapFrom(user => user.GetUserAvatarUrls(applicationContext.ApplicationCache.RuntimeCache))) .ForMember(detail => detail.UserId, opt => opt.MapFrom(user => GetIntId(user.Id))) .ForMember(detail => detail.StartContentIds, opt => opt.MapFrom(user => user.CalculateContentStartNodeIds(applicationContext.Services.EntityService))) .ForMember(detail => detail.StartMediaIds, opt => opt.MapFrom(user => user.CalculateMediaStartNodeIds(applicationContext.Services.EntityService)))