Skip to content

Commit 40f0bad

Browse files
MackinnonBuckgithub-actions
authored andcommitted
Simplifications
1 parent 21721ca commit 40f0bad

File tree

10 files changed

+218
-276
lines changed

10 files changed

+218
-276
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore;
5+
6+
internal static class IdentityUserPasskeyExtensions
7+
{
8+
extension<TKey>(IdentityUserPasskey<TKey> passkey)
9+
where TKey : IEquatable<TKey>
10+
{
11+
public void UpdateFromUserPasskeyInfo(UserPasskeyInfo passkeyInfo)
12+
{
13+
passkey.Data.Name = passkeyInfo.Name;
14+
passkey.Data.SignCount = passkeyInfo.SignCount;
15+
passkey.Data.IsBackedUp = passkeyInfo.IsBackedUp;
16+
passkey.Data.IsUserVerified = passkeyInfo.IsUserVerified;
17+
}
18+
19+
public UserPasskeyInfo ToUserPasskeyInfo()
20+
=> new(
21+
passkey.CredentialId,
22+
passkey.Data.PublicKey,
23+
passkey.Data.CreatedAt,
24+
passkey.Data.SignCount,
25+
passkey.Data.Transports,
26+
passkey.Data.IsUserVerified,
27+
passkey.Data.IsBackupEligible,
28+
passkey.Data.IsBackedUp,
29+
passkey.Data.AttestationObject,
30+
passkey.Data.ClientDataJson)
31+
{
32+
Name = passkey.Data.Name
33+
};
34+
}
35+
}

src/Identity/EntityFrameworkCore/src/UserOnlyStore.cs

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -625,10 +625,7 @@ public virtual async Task AddOrUpdatePasskeyAsync(TUser user, UserPasskeyInfo pa
625625
var userPasskey = await FindUserPasskeyByIdAsync(passkey.CredentialId, cancellationToken).ConfigureAwait(false);
626626
if (userPasskey != null)
627627
{
628-
userPasskey.Data.Name = passkey.Name;
629-
userPasskey.Data.SignCount = passkey.SignCount;
630-
userPasskey.Data.IsBackedUp = passkey.IsBackedUp;
631-
userPasskey.Data.IsUserVerified = passkey.IsUserVerified;
628+
userPasskey.UpdateFromUserPasskeyInfo(passkey);
632629
UserPasskeys.Update(userPasskey);
633630
}
634631
else
@@ -655,20 +652,7 @@ public virtual async Task<IList<UserPasskeyInfo>> GetPasskeysAsync(TUser user, C
655652
var userId = user.Id;
656653
var passkeys = await UserPasskeys
657654
.Where(p => p.UserId.Equals(userId))
658-
.Select(p => new UserPasskeyInfo(
659-
p.CredentialId,
660-
p.Data.PublicKey,
661-
p.Data.CreatedAt,
662-
p.Data.SignCount,
663-
p.Data.Transports,
664-
p.Data.IsUserVerified,
665-
p.Data.IsBackupEligible,
666-
p.Data.IsBackedUp,
667-
p.Data.AttestationObject,
668-
p.Data.ClientDataJson)
669-
{
670-
Name = p.Data.Name,
671-
})
655+
.Select(p => p.ToUserPasskeyInfo())
672656
.ToListAsync(cancellationToken)
673657
.ConfigureAwait(false);
674658

@@ -711,24 +695,7 @@ public virtual async Task<IList<UserPasskeyInfo>> GetPasskeysAsync(TUser user, C
711695
ArgumentNullException.ThrowIfNull(credentialId);
712696

713697
var passkey = await FindUserPasskeyAsync(user.Id, credentialId, cancellationToken).ConfigureAwait(false);
714-
if (passkey != null)
715-
{
716-
return new UserPasskeyInfo(
717-
passkey.CredentialId,
718-
passkey.Data.PublicKey,
719-
passkey.Data.CreatedAt,
720-
passkey.Data.SignCount,
721-
passkey.Data.Transports,
722-
passkey.Data.IsUserVerified,
723-
passkey.Data.IsBackupEligible,
724-
passkey.Data.IsBackedUp,
725-
passkey.Data.AttestationObject,
726-
passkey.Data.ClientDataJson)
727-
{
728-
Name = passkey.Data.Name,
729-
};
730-
}
731-
return null;
698+
return passkey?.ToUserPasskeyInfo();
732699
}
733700

734701
/// <summary>

src/Identity/EntityFrameworkCore/src/UserStore.cs

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -770,10 +770,7 @@ public virtual async Task AddOrUpdatePasskeyAsync(TUser user, UserPasskeyInfo pa
770770
var userPasskey = await FindUserPasskeyByIdAsync(passkey.CredentialId, cancellationToken).ConfigureAwait(false);
771771
if (userPasskey != null)
772772
{
773-
userPasskey.Data.Name = passkey.Name;
774-
userPasskey.Data.SignCount = passkey.SignCount;
775-
userPasskey.Data.IsBackedUp = passkey.IsBackedUp;
776-
userPasskey.Data.IsUserVerified = passkey.IsUserVerified;
773+
userPasskey.UpdateFromUserPasskeyInfo(passkey);
777774
UserPasskeys.Update(userPasskey);
778775
}
779776
else
@@ -800,20 +797,7 @@ public virtual async Task<IList<UserPasskeyInfo>> GetPasskeysAsync(TUser user, C
800797
var userId = user.Id;
801798
var passkeys = await UserPasskeys
802799
.Where(p => p.UserId.Equals(userId))
803-
.Select(p => new UserPasskeyInfo(
804-
p.CredentialId,
805-
p.Data.PublicKey,
806-
p.Data.CreatedAt,
807-
p.Data.SignCount,
808-
p.Data.Transports,
809-
p.Data.IsUserVerified,
810-
p.Data.IsBackupEligible,
811-
p.Data.IsBackedUp,
812-
p.Data.AttestationObject,
813-
p.Data.ClientDataJson)
814-
{
815-
Name = p.Data.Name
816-
})
800+
.Select(p => p.ToUserPasskeyInfo())
817801
.ToListAsync(cancellationToken)
818802
.ConfigureAwait(false);
819803

@@ -856,24 +840,7 @@ public virtual async Task<IList<UserPasskeyInfo>> GetPasskeysAsync(TUser user, C
856840
ArgumentNullException.ThrowIfNull(credentialId);
857841

858842
var passkey = await FindUserPasskeyAsync(user.Id, credentialId, cancellationToken).ConfigureAwait(false);
859-
if (passkey != null)
860-
{
861-
return new UserPasskeyInfo(
862-
passkey.CredentialId,
863-
passkey.Data.PublicKey,
864-
passkey.Data.CreatedAt,
865-
passkey.Data.SignCount,
866-
passkey.Data.Transports,
867-
passkey.Data.IsUserVerified,
868-
passkey.Data.IsBackupEligible,
869-
passkey.Data.IsBackedUp,
870-
passkey.Data.AttestationObject,
871-
passkey.Data.ClientDataJson)
872-
{
873-
Name = passkey.Data.Name
874-
};
875-
}
876-
return null;
843+
return passkey?.ToUserPasskeyInfo();
877844
}
878845

879846
/// <summary>

src/Identity/EntityFrameworkCore/test/EF.InMemory.Test/InMemoryContext.cs

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,31 @@
33

44
using System.Data.Common;
55
using Microsoft.EntityFrameworkCore;
6+
using Microsoft.Extensions.DependencyInjection;
67

78
namespace Microsoft.AspNetCore.Identity.EntityFrameworkCore.InMemory.Test;
89

910
public class InMemoryContext :
1011
InMemoryContext<IdentityUser, IdentityRole, string>
1112
{
12-
private InMemoryContext(DbConnection connection) : base(connection)
13+
private InMemoryContext(DbConnection connection, IServiceProvider serviceProvider) : base(connection, serviceProvider)
1314
{ }
1415

15-
public static new InMemoryContext Create(DbConnection connection)
16-
=> Initialize(new InMemoryContext(connection));
16+
public static new InMemoryContext Create(DbConnection connection, IServiceCollection services = null)
17+
{
18+
services = ConfigureDbServices(services);
19+
return Initialize(new InMemoryContext(connection, services.BuildServiceProvider()));
20+
}
21+
22+
public static IServiceCollection ConfigureDbServices(IServiceCollection services = null)
23+
{
24+
services ??= new ServiceCollection();
25+
services.Configure<IdentityOptions>(options =>
26+
{
27+
options.Stores.SchemaVersion = IdentitySchemaVersions.Version3;
28+
});
29+
return services;
30+
}
1731

1832
public static TContext Initialize<TContext>(TContext context) where TContext : DbContext
1933
{
@@ -28,17 +42,25 @@ public class InMemoryContext<TUser> :
2842
where TUser : IdentityUser
2943
{
3044
private readonly DbConnection _connection;
45+
private readonly IServiceProvider _serviceProvider;
3146

32-
private InMemoryContext(DbConnection connection)
47+
private InMemoryContext(DbConnection connection, IServiceProvider serviceProvider)
3348
{
3449
_connection = connection;
50+
_serviceProvider = serviceProvider;
3551
}
3652

37-
public static InMemoryContext<TUser> Create(DbConnection connection)
38-
=> InMemoryContext.Initialize(new InMemoryContext<TUser>(connection));
53+
public static InMemoryContext<TUser> Create(DbConnection connection, IServiceCollection services = null)
54+
{
55+
services = InMemoryContext.ConfigureDbServices(services);
56+
return InMemoryContext.Initialize(new InMemoryContext<TUser>(connection, services.BuildServiceProvider()));
57+
}
3958

4059
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
41-
=> optionsBuilder.UseSqlite(_connection);
60+
{
61+
optionsBuilder.UseSqlite(_connection);
62+
optionsBuilder.UseApplicationServiceProvider(_serviceProvider);
63+
}
4264
}
4365

4466
public class InMemoryContext<TUser, TRole, TKey> : IdentityDbContext<TUser, TRole, TKey>
@@ -47,17 +69,25 @@ public class InMemoryContext<TUser, TRole, TKey> : IdentityDbContext<TUser, TRol
4769
where TKey : IEquatable<TKey>
4870
{
4971
private readonly DbConnection _connection;
72+
private readonly IServiceProvider _serviceProvider;
5073

51-
protected InMemoryContext(DbConnection connection)
74+
protected InMemoryContext(DbConnection connection, IServiceProvider serviceProvider)
5275
{
5376
_connection = connection;
77+
_serviceProvider = serviceProvider;
5478
}
5579

56-
public static InMemoryContext<TUser, TRole, TKey> Create(DbConnection connection)
57-
=> InMemoryContext.Initialize(new InMemoryContext<TUser, TRole, TKey>(connection));
80+
public static InMemoryContext<TUser, TRole, TKey> Create(DbConnection connection, IServiceCollection services = null)
81+
{
82+
services = InMemoryContext.ConfigureDbServices(services);
83+
return InMemoryContext.Initialize(new InMemoryContext<TUser, TRole, TKey>(connection, services.BuildServiceProvider()));
84+
}
5885

5986
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
60-
=> optionsBuilder.UseSqlite(_connection);
87+
{
88+
optionsBuilder.UseSqlite(_connection);
89+
optionsBuilder.UseApplicationServiceProvider(_serviceProvider);
90+
}
6191
}
6292

6393
public abstract class InMemoryContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken> :

src/Identity/EntityFrameworkCore/test/EF.InMemory.Test/InMemoryStoreWithGenericsTest.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ public InMemoryEFUserStoreTestWithGenerics(InMemoryDatabaseFixture fixture)
2424

2525
var services = new ServiceCollection();
2626
services.AddHttpContextAccessor();
27+
services.Configure<IdentityOptions>(options =>
28+
{
29+
options.Stores.SchemaVersion = IdentitySchemaVersions.Version3;
30+
});
2731
services.AddDbContext<InMemoryContextWithGenerics>(
2832
options => options
2933
.UseSqlite(_fixture.Connection)

src/Identity/EntityFrameworkCore/test/EF.Test/DbUtil.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ public static IServiceCollection ConfigureDbServices<TContext>(
3030
.UseSqlite(connection);
3131
});
3232

33+
services.Configure<IdentityOptions>(options =>
34+
{
35+
options.Stores.SchemaVersion = IdentitySchemaVersions.Version3;
36+
});
37+
3338
return services;
3439
}
3540

src/Identity/EntityFrameworkCore/test/EF.Test/UserStoreTest.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,7 @@ public void CanCreateUserUsingEF()
4040

4141
private IdentityDbContext CreateContext()
4242
{
43-
var services = new ServiceCollection();
44-
services.Configure<IdentityOptions>(options =>
45-
{
46-
options.Stores.SchemaVersion = IdentitySchemaVersions.Version3;
47-
});
48-
var db = DbUtil.Create<IdentityDbContext>(_fixture.Connection, services);
43+
var db = DbUtil.Create<IdentityDbContext>(_fixture.Connection);
4944
db.Database.EnsureCreated();
5045
return db;
5146
}

src/Identity/EntityFrameworkCore/test/EF.Test/UserStoreWithGenericsTest.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,7 @@ public UserStoreWithGenericsTest(ScratchDatabaseFixture fixture)
2121

2222
private ContextWithGenerics CreateContext()
2323
{
24-
var services = new ServiceCollection();
25-
services.Configure<IdentityOptions>(options =>
26-
{
27-
options.Stores.SchemaVersion = IdentitySchemaVersions.Version3;
28-
});
29-
var db = DbUtil.Create<ContextWithGenerics>(_fixture.Connection, services);
24+
var db = DbUtil.Create<ContextWithGenerics>(_fixture.Connection);
3025
db.Database.EnsureCreated();
3126
return db;
3227
}

0 commit comments

Comments
 (0)