2017-07-19 13:42:47 +02:00
using System ;
2017-09-12 16:22:16 +02:00
using System.Collections.Generic ;
using System.Linq ;
2017-07-19 13:42:47 +02:00
using AutoMapper ;
using Umbraco.Core ;
2017-09-12 16:22:16 +02:00
using Umbraco.Core.Cache ;
2018-04-06 13:51:54 +10:00
using Umbraco.Core.Configuration ;
2017-07-19 13:42:47 +02:00
using Umbraco.Core.Models.Membership ;
using Umbraco.Web.Models.ContentEditing ;
using Umbraco.Core.Models ;
2018-01-15 11:32:30 +01:00
using Umbraco.Core.Models.Entities ;
2017-07-19 13:42:47 +02:00
using Umbraco.Core.Security ;
using Umbraco.Core.Services ;
2018-10-29 17:27:33 +11:00
using Umbraco.Web.Actions ;
2017-07-19 13:42:47 +02:00
namespace Umbraco.Web.Models.Mapping
{
2017-09-20 20:06:46 +02:00
internal class UserMapperProfile : Profile
2017-07-19 13:42:47 +02:00
{
2018-01-15 11:32:30 +01:00
private static string GetContentTypeIcon ( EntitySlim entity )
=> entity is ContentEntitySlim contentEntity ? contentEntity . ContentTypeIcon : null ;
2017-09-20 20:06:46 +02:00
public UserMapperProfile ( ILocalizedTextService textService , IUserService userService , IEntityService entityService , ISectionService sectionService ,
2019-01-17 11:01:23 +01:00
IAppPolicedCache runtimeCache , ActionCollection actions , IGlobalSettings globalSettings )
2017-07-19 13:42:47 +02:00
{
2017-09-12 16:22:16 +02:00
var userGroupDefaultPermissionsResolver = new UserGroupDefaultPermissionsResolver ( textService , actions );
CreateMap < UserGroupSave , IUserGroup >()
2018-03-27 10:04:07 +02:00
. ConstructUsing ( save => new UserGroup { CreateDate = DateTime . UtcNow })
2018-01-10 12:48:51 +01:00
. IgnoreEntityCommonProperties ()
2017-09-12 16:22:16 +02:00
. ForMember ( dest => dest . Id , opt => opt . Condition ( source => GetIntId ( source . Id ) > 0 ))
. ForMember ( dest => dest . Id , opt => opt . MapFrom ( source => GetIntId ( source . Id )))
. ForMember ( dest => dest . Permissions , opt => opt . MapFrom ( source => source . DefaultPermissions ))
. AfterMap (( save , userGroup ) =>
{
userGroup . ClearAllowedSections ();
foreach ( var section in save . Sections )
{
userGroup . AddAllowedSection ( section );
}
});
//Used for merging existing UserSave to an existing IUser instance - this will not create an IUser instance!
CreateMap < UserSave , IUser >()
2018-01-10 12:48:51 +01:00
. IgnoreEntityCommonProperties ()
2017-09-12 16:22:16 +02:00
. ForMember ( dest => dest . Id , opt => opt . Condition ( src => GetIntId ( src . Id ) > 0 ))
2018-03-27 10:04:07 +02:00
. ForMember ( detail => detail . TourData , opt => opt . Ignore ())
2017-09-12 16:22:16 +02:00
. ForMember ( dest => dest . SessionTimeout , opt => opt . Ignore ())
. ForMember ( dest => dest . EmailConfirmedDate , opt => opt . Ignore ())
. ForMember ( dest => dest . InvitedDate , opt => opt . Ignore ())
. ForMember ( dest => dest . SecurityStamp , opt => opt . Ignore ())
. ForMember ( dest => dest . Avatar , opt => opt . Ignore ())
. ForMember ( dest => dest . ProviderUserKey , opt => opt . Ignore ())
. ForMember ( dest => dest . RawPasswordValue , opt => opt . Ignore ())
. ForMember ( dest => dest . RawPasswordAnswerValue , opt => opt . Ignore ())
. ForMember ( dest => dest . PasswordQuestion , opt => opt . Ignore ())
. ForMember ( dest => dest . Comments , opt => opt . Ignore ())
. ForMember ( dest => dest . IsApproved , opt => opt . Ignore ())
. ForMember ( dest => dest . IsLockedOut , opt => opt . Ignore ())
. ForMember ( dest => dest . LastLoginDate , opt => opt . Ignore ())
. ForMember ( dest => dest . LastPasswordChangeDate , opt => opt . Ignore ())
. ForMember ( dest => dest . LastLockoutDate , opt => opt . Ignore ())
. ForMember ( dest => dest . FailedPasswordAttempts , opt => opt . Ignore ())
. ForMember ( user => user . Language , opt => opt . MapFrom ( save => save . Culture ))
. AfterMap (( save , user ) =>
{
user . ClearGroups ();
var foundGroups = userService . GetUserGroupsByAlias ( save . UserGroups . ToArray ());
foreach ( var group in foundGroups )
{
user . AddGroup ( group . ToReadOnlyGroup ());
}
});
CreateMap < UserInvite , IUser >()
2018-01-10 12:48:51 +01:00
. IgnoreEntityCommonProperties ()
2017-09-12 16:22:16 +02:00
. ForMember ( dest => dest . Id , opt => opt . Ignore ())
2018-03-27 10:04:07 +02:00
. ForMember ( detail => detail . TourData , opt => opt . Ignore ())
2017-09-12 16:22:16 +02:00
. ForMember ( dest => dest . StartContentIds , opt => opt . Ignore ())
. ForMember ( dest => dest . StartMediaIds , opt => opt . Ignore ())
. ForMember ( dest => dest . Language , opt => opt . Ignore ())
. ForMember ( dest => dest . Username , opt => opt . Ignore ())
. ForMember ( dest => dest . PasswordQuestion , opt => opt . Ignore ())
. ForMember ( dest => dest . SessionTimeout , opt => opt . Ignore ())
. ForMember ( dest => dest . EmailConfirmedDate , opt => opt . Ignore ())
. ForMember ( dest => dest . InvitedDate , opt => opt . Ignore ())
. ForMember ( dest => dest . SecurityStamp , opt => opt . Ignore ())
. ForMember ( dest => dest . Avatar , opt => opt . Ignore ())
. ForMember ( dest => dest . ProviderUserKey , opt => opt . Ignore ())
. ForMember ( dest => dest . RawPasswordValue , opt => opt . Ignore ())
. ForMember ( dest => dest . RawPasswordAnswerValue , opt => opt . Ignore ())
. ForMember ( dest => dest . Comments , opt => opt . Ignore ())
. ForMember ( dest => dest . IsApproved , opt => opt . Ignore ())
. ForMember ( dest => dest . IsLockedOut , opt => opt . Ignore ())
. ForMember ( dest => dest . LastLoginDate , opt => opt . Ignore ())
. ForMember ( dest => dest . LastPasswordChangeDate , opt => opt . Ignore ())
. ForMember ( dest => dest . LastLockoutDate , opt => opt . Ignore ())
. ForMember ( dest => dest . FailedPasswordAttempts , opt => opt . Ignore ())
//all invited users will not be approved, completing the invite will approve the user
. ForMember ( user => user . IsApproved , opt => opt . UseValue ( false ))
. AfterMap (( invite , user ) =>
{
user . ClearGroups ();
var foundGroups = userService . GetUserGroupsByAlias ( invite . UserGroups . ToArray ());
foreach ( var group in foundGroups )
{
user . AddGroup ( group . ToReadOnlyGroup ());
}
});
CreateMap < IReadOnlyUserGroup , UserGroupBasic >()
. ForMember ( dest => dest . ContentStartNode , opt => opt . Ignore ())
. ForMember ( dest => dest . UserCount , opt => opt . Ignore ())
. ForMember ( dest => dest . MediaStartNode , opt => opt . Ignore ())
. ForMember ( dest => dest . Key , opt => opt . Ignore ())
. ForMember ( dest => dest . Sections , opt => opt . Ignore ())
. ForMember ( dest => dest . Notifications , opt => opt . Ignore ())
. ForMember ( dest => dest . Udi , opt => opt . Ignore ())
. ForMember ( dest => dest . Trashed , opt => opt . Ignore ())
. ForMember ( dest => dest . ParentId , opt => opt . UseValue (- 1 ))
. ForMember ( dest => dest . Path , opt => opt . MapFrom ( userGroup => "-1," + userGroup . Id ))
. ForMember ( dest => dest . AdditionalData , opt => opt . Ignore ())
. AfterMap (( group , display ) =>
{
MapUserGroupBasic ( sectionService , entityService , textService , group , display );
});
CreateMap < IUserGroup , UserGroupBasic >()
. ForMember ( dest => dest . ContentStartNode , opt => opt . Ignore ())
. ForMember ( dest => dest . MediaStartNode , opt => opt . Ignore ())
. ForMember ( dest => dest . Sections , opt => opt . Ignore ())
. ForMember ( dest => dest . Notifications , opt => opt . Ignore ())
. ForMember ( dest => dest . Udi , opt => opt . Ignore ())
. ForMember ( dest => dest . Trashed , opt => opt . Ignore ())
. ForMember ( dest => dest . ParentId , opt => opt . UseValue (- 1 ))
. ForMember ( dest => dest . Path , opt => opt . MapFrom ( userGroup => "-1," + userGroup . Id ))
. ForMember ( dest => dest . AdditionalData , opt => opt . Ignore ())
. AfterMap (( group , display ) =>
{
MapUserGroupBasic ( sectionService , entityService , textService , group , display );
});
//create a map to assign a user group's default permissions to the AssignedUserGroupPermissions instance
CreateMap < IUserGroup , AssignedUserGroupPermissions >()
. ForMember ( dest => dest . Udi , opt => opt . Ignore ())
. ForMember ( dest => dest . Trashed , opt => opt . Ignore ())
. ForMember ( dest => dest . AdditionalData , opt => opt . Ignore ())
. ForMember ( dest => dest . Id , opt => opt . MapFrom ( group => group . Id ))
. ForMember ( dest => dest . ParentId , opt => opt . UseValue (- 1 ))
. ForMember ( dest => dest . Path , opt => opt . MapFrom ( userGroup => "-1," + userGroup . Id ))
. ForMember ( dest => dest . DefaultPermissions , opt => opt . ResolveUsing ( src => userGroupDefaultPermissionsResolver . Resolve ( src )))
//these will be manually mapped and by default they are null
. ForMember ( dest => dest . AssignedPermissions , opt => opt . Ignore ())
. AfterMap (( group , display ) =>
{
if ( display . Icon . IsNullOrWhiteSpace ())
{
display . Icon = "icon-users" ;
}
});
2018-01-15 11:32:30 +01:00
CreateMap < EntitySlim , AssignedContentPermissions >()
. ForMember ( x => x . Udi , opt => opt . MapFrom ( x => Udi . Create ( ObjectTypes . GetUdiType ( x . NodeObjectType ), x . Key )))
. ForMember ( basic => basic . Icon , opt => opt . MapFrom ( entity => GetContentTypeIcon ( entity )))
2017-09-12 16:22:16 +02:00
. ForMember ( dto => dto . Trashed , opt => opt . Ignore ())
. ForMember ( x => x . Alias , opt => opt . Ignore ())
. ForMember ( x => x . AssignedPermissions , opt => opt . Ignore ())
. AfterMap (( entity , basic ) =>
{
2018-01-12 10:48:36 +01:00
if ( entity . NodeObjectType == Constants . ObjectTypes . Member && basic . Icon . IsNullOrWhiteSpace ())
2017-09-12 16:22:16 +02:00
{
basic . Icon = "icon-user" ;
}
});
CreateMap < IUserGroup , UserGroupDisplay >()
. ForMember ( dest => dest . ContentStartNode , opt => opt . Ignore ())
. ForMember ( dest => dest . MediaStartNode , opt => opt . Ignore ())
. ForMember ( dest => dest . Sections , opt => opt . Ignore ())
. ForMember ( dest => dest . Notifications , opt => opt . Ignore ())
. ForMember ( dest => dest . Udi , opt => opt . Ignore ())
. ForMember ( dest => dest . Trashed , opt => opt . Ignore ())
. ForMember ( dest => dest . ParentId , opt => opt . UseValue (- 1 ))
. ForMember ( dest => dest . Path , opt => opt . MapFrom ( userGroup => "-1," + userGroup . Id ))
. ForMember ( dest => dest . AdditionalData , opt => opt . Ignore ())
. ForMember ( dest => dest . Users , opt => opt . Ignore ())
. ForMember ( dest => dest . DefaultPermissions , opt => opt . ResolveUsing ( src => userGroupDefaultPermissionsResolver . Resolve ( src )))
. ForMember ( dest => dest . AssignedPermissions , opt => opt . Ignore ())
. AfterMap (( group , display ) =>
{
MapUserGroupBasic ( sectionService , entityService , textService , group , display );
//Important! Currently we are never mapping to multiple UserGroupDisplay objects but if we start doing that
// this will cause an N+1 and we'll need to change how this works.
var users = userService . GetAllInGroup ( group . Id );
display . Users = Mapper . Map < IEnumerable < UserBasic >>( users );
//Deal with assigned permissions:
var allContentPermissions = userService . GetPermissions ( @group , true )
. ToDictionary ( x => x . EntityId , x => x );
2018-03-27 10:04:07 +02:00
IEntitySlim [] contentEntities ;
if ( allContentPermissions . Keys . Count == 0 )
{
contentEntities = Array . Empty < IEntitySlim >();
}
else
{
// a group can end up with way more than 2000 assigned permissions,
// so we need to break them into groups in order to avoid breaking
// the entity service due to too many Sql parameters.
var list = new List < IEntitySlim >();
foreach ( var idGroup in allContentPermissions . Keys . InGroupsOf ( 2000 ))
list . AddRange ( entityService . GetAll ( UmbracoObjectTypes . Document , idGroup . ToArray ()));
contentEntities = list . ToArray ();
}
2017-09-12 16:22:16 +02:00
var allAssignedPermissions = new List < AssignedContentPermissions >();
foreach ( var entity in contentEntities )
{
var contentPermissions = allContentPermissions [ entity . Id ];
var assignedContentPermissions = Mapper . Map < AssignedContentPermissions >( entity );
assignedContentPermissions . AssignedPermissions = AssignedUserGroupPermissions . ClonePermissions ( display . DefaultPermissions );
//since there is custom permissions assigned to this node for this group, we need to clear all of the default permissions
//and we'll re-check it if it's one of the explicitly assigned ones
foreach ( var permission in assignedContentPermissions . AssignedPermissions . SelectMany ( x => x . Value ))
{
permission . Checked = false ;
permission . Checked = contentPermissions . AssignedPermissions . Contains ( permission . PermissionCode , StringComparer . InvariantCulture );
}
allAssignedPermissions . Add ( assignedContentPermissions );
}
display . AssignedPermissions = allAssignedPermissions ;
});
2017-09-19 15:51:47 +02:00
//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.
2017-09-12 16:22:16 +02:00
CreateMap < IUser , UserDisplay >()
2018-03-27 10:04:07 +02:00
. ForMember ( dest => dest . Avatars , opt => opt . MapFrom ( user => user . GetUserAvatarUrls ( runtimeCache )))
2017-09-12 16:22:16 +02:00
. ForMember ( dest => dest . Username , opt => opt . MapFrom ( user => user . Username ))
. ForMember ( dest => dest . LastLoginDate , opt => opt . MapFrom ( user => user . LastLoginDate == default ( DateTime ) ? null : ( DateTime ?) user . LastLoginDate ))
. ForMember ( dest => dest . UserGroups , opt => opt . MapFrom ( user => user . Groups ))
2018-03-27 10:04:07 +02:00
. ForMember ( detail => detail . Navigation , opt => opt . MapFrom ( user => CreateUserEditorNavigation ( textService )))
2017-09-19 15:51:47 +02:00
. ForMember (
dest => dest . CalculatedStartContentIds ,
opt => opt . MapFrom ( src => GetStartNodeValues (
src . CalculateContentStartNodeIds ( entityService ),
textService , entityService , UmbracoObjectTypes . Document , "content/contentRoot" )))
. ForMember (
dest => dest . CalculatedStartMediaIds ,
opt => opt . MapFrom ( src => GetStartNodeValues (
src . CalculateMediaStartNodeIds ( entityService ),
textService , entityService , UmbracoObjectTypes . Media , "media/mediaRoot" )))
. ForMember (
dest => dest . StartContentIds ,
opt => opt . MapFrom ( src => GetStartNodeValues (
src . StartContentIds . ToArray (),
textService , entityService , UmbracoObjectTypes . Document , "content/contentRoot" )))
. ForMember (
dest => dest . StartMediaIds ,
opt => opt . MapFrom ( src => GetStartNodeValues (
src . StartMediaIds . ToArray (),
textService , entityService , UmbracoObjectTypes . Media , "media/mediaRoot" )))
2018-04-06 13:51:54 +10:00
. ForMember ( dest => dest . Culture , opt => opt . MapFrom ( user => user . GetUserCulture ( textService , globalSettings )))
2017-09-12 16:22:16 +02:00
. ForMember (
dest => dest . AvailableCultures ,
opt => opt . MapFrom ( user => textService . GetSupportedCultures (). ToDictionary ( x => x . Name , x => x . DisplayName )))
. ForMember (
dest => dest . EmailHash ,
opt => opt . MapFrom ( user => user . Email . ToLowerInvariant (). Trim (). GenerateHash ()))
. ForMember ( dest => dest . ParentId , opt => opt . UseValue (- 1 ))
. ForMember ( dest => dest . Path , opt => opt . MapFrom ( user => "-1," + user . Id ))
. ForMember ( dest => dest . Notifications , opt => opt . Ignore ())
. ForMember ( dest => dest . Udi , opt => opt . Ignore ())
. ForMember ( dest => dest . Icon , opt => opt . Ignore ())
. ForMember ( dest => dest . IsCurrentUser , opt => opt . Ignore ())
. ForMember ( dest => dest . Trashed , opt => opt . Ignore ())
. ForMember ( dest => dest . ResetPasswordValue , opt => opt . Ignore ())
. ForMember ( dest => dest . Alias , opt => opt . Ignore ())
. ForMember ( dest => dest . Trashed , opt => opt . Ignore ())
2017-09-19 15:51:47 +02:00
. ForMember ( dest => dest . AdditionalData , opt => opt . Ignore ());
2017-09-12 16:22:16 +02:00
CreateMap < IUser , UserBasic >()
//Loading in the user avatar's requires an external request if they don't have a local file avatar, this means that initial load of paging may incur a cost
//Alternatively, if this is annoying the back office UI would need to be updated to request the avatars for the list of users separately so it doesn't look
//like the load time is waiting.
. ForMember ( detail =>
detail . Avatars ,
2018-03-27 10:04:07 +02:00
opt => opt . MapFrom ( user => user . GetUserAvatarUrls ( runtimeCache )))
2017-09-12 16:22:16 +02:00
. ForMember ( dest => dest . Username , opt => opt . MapFrom ( user => user . Username ))
. ForMember ( dest => dest . UserGroups , opt => opt . MapFrom ( user => user . Groups ))
. ForMember ( dest => dest . LastLoginDate , opt => opt . MapFrom ( user => user . LastLoginDate == default ( DateTime ) ? null : ( DateTime ?) user . LastLoginDate ))
2018-04-06 13:51:54 +10:00
. ForMember ( dest => dest . Culture , opt => opt . MapFrom ( user => user . GetUserCulture ( textService , globalSettings )))
2017-09-12 16:22:16 +02:00
. ForMember (
dest => dest . EmailHash ,
opt => opt . MapFrom ( user => user . Email . ToLowerInvariant (). Trim (). ToMd5 ()))
. ForMember ( dest => dest . ParentId , opt => opt . UseValue (- 1 ))
. ForMember ( dest => dest . Path , opt => opt . MapFrom ( user => "-1," + user . Id ))
. ForMember ( dest => dest . Notifications , opt => opt . Ignore ())
. ForMember ( dest => dest . IsCurrentUser , opt => opt . Ignore ())
. ForMember ( dest => dest . Udi , opt => opt . Ignore ())
. ForMember ( dest => dest . Icon , opt => opt . Ignore ())
. ForMember ( dest => dest . Trashed , opt => opt . Ignore ())
. ForMember ( dest => dest . Alias , opt => opt . Ignore ())
. ForMember ( dest => dest . Trashed , opt => opt . Ignore ())
. ForMember ( dest => dest . AdditionalData , opt => opt . Ignore ());
2017-07-19 13:42:47 +02:00
CreateMap < IUser , UserDetail >()
2018-03-27 10:04:07 +02:00
. ForMember ( dest => dest . Avatars , opt => opt . MapFrom ( user => user . GetUserAvatarUrls ( runtimeCache )))
2017-09-12 16:22:16 +02:00
. ForMember ( dest => dest . UserId , opt => opt . MapFrom ( user => GetIntId ( user . Id )))
. ForMember ( dest => dest . StartContentIds , opt => opt . MapFrom ( user => user . CalculateContentStartNodeIds ( entityService )))
. ForMember ( dest => dest . StartMediaIds , opt => opt . MapFrom ( user => user . CalculateMediaStartNodeIds ( entityService )))
2018-04-06 13:51:54 +10:00
. ForMember ( dest => dest . Culture , opt => opt . MapFrom ( user => user . GetUserCulture ( textService , globalSettings )))
2017-07-19 13:42:47 +02:00
. ForMember (
2017-09-12 16:22:16 +02:00
dest => dest . EmailHash ,
opt => opt . MapFrom ( user => user . Email . ToLowerInvariant (). Trim (). GenerateHash ()))
. ForMember ( dest => dest . SecondsUntilTimeout , opt => opt . Ignore ())
2017-09-19 15:51:47 +02:00
. ForMember ( dest => dest . UserGroups , opt => opt . Ignore ())
2017-09-12 16:22:16 +02:00
. AfterMap (( user , detail ) =>
{
//we need to map the legacy UserType
//the best we can do here is to return the user's first user group as a IUserType object
//but we should attempt to return any group that is the built in ones first
var groups = user . Groups . ToArray ();
2017-09-19 15:51:47 +02:00
detail . UserGroups = user . Groups . Select ( x => x . Alias ). ToArray ();
2017-09-12 16:22:16 +02:00
});
2017-07-19 13:42:47 +02:00
2017-09-14 11:41:46 +02:00
CreateMap < IProfile , ContentEditing . UserProfile >()
2017-09-12 16:22:16 +02:00
. ForMember ( dest => dest . UserId , opt => opt . MapFrom ( profile => GetIntId ( profile . Id )));
2018-03-27 10:04:07 +02:00
}
2017-07-19 13:42:47 +02:00
2018-03-27 10:04:07 +02:00
private IEnumerable < EditorNavigation > CreateUserEditorNavigation ( ILocalizedTextService textService )
{
return new []
{
new EditorNavigation
{
Active = true ,
Alias = "details" ,
Icon = "icon-umb-users" ,
Name = textService . Localize ( "general/user" ),
View = "views/users/views/user/details.html"
}
};
2017-09-12 16:22:16 +02:00
}
2017-07-20 11:21:28 +02:00
2017-09-19 15:51:47 +02:00
private IEnumerable < EntityBasic > GetStartNodeValues ( int [] startNodeIds ,
ILocalizedTextService textService , IEntityService entityService , UmbracoObjectTypes objectType ,
string localizedKey )
{
if ( startNodeIds . Length <= 0 )
return Enumerable . Empty < EntityBasic >();
var startNodes = new List < EntityBasic >();
if ( startNodeIds . Contains (- 1 ))
startNodes . Add ( RootNode ( textService . Localize ( localizedKey )));
var mediaItems = entityService . GetAll ( objectType , startNodeIds );
startNodes . AddRange ( Mapper . Map < IEnumerable < IUmbracoEntity >, IEnumerable < EntityBasic >>( mediaItems ));
return startNodes ;
}
2017-09-12 16:22:16 +02:00
private void MapUserGroupBasic ( ISectionService sectionService , IEntityService entityService , ILocalizedTextService textService , dynamic group , UserGroupBasic display )
{
var allSections = sectionService . GetSections ();
display . Sections = allSections . Where ( x => Enumerable . Contains ( group . AllowedSections , x . Alias )). Select ( Mapper . Map < ContentEditing . Section >);
if ( group . StartMediaId > 0 )
{
display . MediaStartNode = Mapper . Map < EntityBasic >(
entityService . Get ( group . StartMediaId , UmbracoObjectTypes . Media ));
}
else if ( group . StartMediaId == - 1 )
{
//create the root node
display . MediaStartNode = RootNode ( textService . Localize ( "media/mediaRoot" ));
}
if ( group . StartContentId > 0 )
{
display . ContentStartNode = Mapper . Map < EntityBasic >(
entityService . Get ( group . StartContentId , UmbracoObjectTypes . Document ));
}
else if ( group . StartContentId == - 1 )
{
//create the root node
display . ContentStartNode = RootNode ( textService . Localize ( "content/contentRoot" ));
}
if ( display . Icon . IsNullOrWhiteSpace ())
{
display . Icon = "icon-users" ;
}
}
private EntityBasic RootNode ( string name )
{
return new EntityBasic
{
Name = name ,
Path = "-1" ,
Icon = "icon-folder" ,
Id = - 1 ,
Trashed = false ,
ParentId = - 1
};
2017-07-20 11:21:28 +02:00
}
2017-07-19 13:42:47 +02:00
private static int GetIntId ( object id )
{
var result = id . TryConvertTo < int >();
if ( result . Success == false )
{
throw new InvalidOperationException (
"Cannot convert the profile to a " + typeof ( UserDetail ). Name + " object since the id is not an integer" );
}
return result . Result ;
2017-07-20 11:21:28 +02:00
}
2017-07-19 13:42:47 +02:00
}
2017-07-20 11:21:28 +02:00
}