diff --git a/src/Umbraco.Core/Services/IUserIdKeyResolver.cs b/src/Umbraco.Core/Services/IUserIdKeyResolver.cs index aec8e38db3fb..01e8523fb971 100644 --- a/src/Umbraco.Core/Services/IUserIdKeyResolver.cs +++ b/src/Umbraco.Core/Services/IUserIdKeyResolver.cs @@ -1,5 +1,8 @@ -namespace Umbraco.Cms.Core.Services; +namespace Umbraco.Cms.Core.Services; +/// +/// Defines methods for resolving user keys to user IDs and vice versa without retrieving full user details. +/// public interface IUserIdKeyResolver { /// diff --git a/src/Umbraco.Infrastructure/Services/Implement/UserIdKeyResolver.cs b/src/Umbraco.Infrastructure/Services/Implement/UserIdKeyResolver.cs index d11c4a09af9b..f8b7e99b2902 100644 --- a/src/Umbraco.Infrastructure/Services/Implement/UserIdKeyResolver.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/UserIdKeyResolver.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using NPoco; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Services; @@ -9,8 +9,13 @@ namespace Umbraco.Cms.Infrastructure.Services.Implement; -// It's okay that we never clear this, since you can never change a user's key/id -// and it'll be caught by the services if it doesn't exist. +/// +/// Implements for resolving user keys to user IDs and vice versa without retrieving full user details. +/// +/// +/// It's okay that we never clear this, since you can never change a user's key/id +/// and it'll be caught by the services if it doesn't exist. +/// internal sealed class UserIdKeyResolver : IUserIdKeyResolver { private readonly IScopeProvider _scopeProvider; @@ -19,6 +24,9 @@ internal sealed class UserIdKeyResolver : IUserIdKeyResolver private readonly SemaphoreSlim _keytToIdLock = new(1, 1); private readonly SemaphoreSlim _idToKeyLock = new(1, 1); + /// + /// Initializes a new instance of the class. + /// public UserIdKeyResolver(IScopeProvider scopeProvider) => _scopeProvider = scopeProvider; /// @@ -28,6 +36,14 @@ public async Task GetAsync(Guid key) /// public async Task> TryGetAsync(Guid key) { + // The super-user Id and key is known, so we don't need a look-up here. + if (key == Constants.Security.SuperUserKey) + { +#pragma warning disable CS0618 // Type or member is obsolete + return Attempt.Succeed(Constants.Security.SuperUserId); +#pragma warning restore CS0618 // Type or member is obsolete + } + if (_keyToId.TryGetValue(key, out int id)) { return Attempt.Succeed(id); @@ -76,6 +92,14 @@ public async Task GetAsync(int id) /// public async Task> TryGetAsync(int id) { + // The super-user Id and key is known, so we don't need a look-up here. +#pragma warning disable CS0618 // Type or member is obsolete + if (id is Constants.Security.SuperUserId) +#pragma warning restore CS0618 // Type or member is obsolete + { + return Attempt.Succeed(Constants.Security.SuperUserKey); + } + if (_idToKey.TryGetValue(id, out Guid key)) { return Attempt.Succeed(key); diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/UserIdKeyResolverTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/UserIdKeyResolverTests.cs index f2ca4fd81800..2decb73ce09e 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/UserIdKeyResolverTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/UserIdKeyResolverTests.cs @@ -1,7 +1,6 @@ using NUnit.Framework; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; -using Umbraco.Cms.Core.Models.Membership; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Tests.Common.Testing; using Umbraco.Cms.Tests.Integration.Testing;