Skip to content

Commit 45b5070

Browse files
authored
[OIDC] Add repository for federated credential DB entities (EF wrapper) (#10268)
1 parent d84cb2c commit 45b5070

3 files changed

Lines changed: 248 additions & 0 deletions

File tree

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System.Threading.Tasks;
5+
using System.Linq;
6+
using System.Data;
7+
using System.Collections.Generic;
8+
using System.Data.Entity;
9+
using NuGet.Services.Entities;
10+
11+
#nullable enable
12+
13+
namespace NuGetGallery.Services.Authentication
14+
{
15+
public interface IFederatedCredentialRepository
16+
{
17+
Task AddPolicyAsync(FederatedCredentialPolicy policy, bool saveChanges);
18+
Task SaveFederatedCredentialAsync(FederatedCredential federatedCredential, bool saveChanges);
19+
IReadOnlyList<FederatedCredentialPolicy> GetPoliciesCreatedByUser(int userKey);
20+
FederatedCredentialPolicy? GetPolicyByKey(int policyKey);
21+
Task DeletePolicyAsync(FederatedCredentialPolicy policy, bool saveChanges);
22+
}
23+
24+
public class FederatedCredentialRepository : IFederatedCredentialRepository
25+
{
26+
private readonly IEntityRepository<FederatedCredentialPolicy> _policyRepository;
27+
private readonly IEntityRepository<FederatedCredential> _federatedCredentialRepository;
28+
29+
public FederatedCredentialRepository(
30+
IEntityRepository<FederatedCredentialPolicy> policyRepository,
31+
IEntityRepository<FederatedCredential> federatedCredentialRepository)
32+
{
33+
_policyRepository = policyRepository;
34+
_federatedCredentialRepository = federatedCredentialRepository;
35+
}
36+
37+
public IReadOnlyList<FederatedCredentialPolicy> GetPoliciesCreatedByUser(int userKey)
38+
{
39+
return _policyRepository
40+
.GetAll()
41+
.Where(p => p.CreatedByUserKey == userKey)
42+
.ToList();
43+
}
44+
45+
public FederatedCredentialPolicy? GetPolicyByKey(int policyKey)
46+
{
47+
return _policyRepository
48+
.GetAll()
49+
.Where(p => p.Key == policyKey)
50+
.Include(p => p.CreatedBy)
51+
.FirstOrDefault();
52+
}
53+
54+
public async Task SaveFederatedCredentialAsync(FederatedCredential federatedCredential, bool saveChanges)
55+
{
56+
_federatedCredentialRepository.InsertOnCommit(federatedCredential);
57+
58+
if (saveChanges)
59+
{
60+
await _federatedCredentialRepository.CommitChangesAsync();
61+
}
62+
}
63+
64+
public async Task AddPolicyAsync(FederatedCredentialPolicy policy, bool saveChanges)
65+
{
66+
_policyRepository.InsertOnCommit(policy);
67+
68+
if (saveChanges)
69+
{
70+
await _policyRepository.CommitChangesAsync();
71+
}
72+
}
73+
74+
public async Task DeletePolicyAsync(FederatedCredentialPolicy policy, bool saveChanges)
75+
{
76+
_policyRepository.DeleteOnCommit(policy);
77+
78+
if (saveChanges)
79+
{
80+
await _policyRepository.CommitChangesAsync();
81+
}
82+
}
83+
}
84+
}

src/NuGetGallery/App_Start/DefaultDependenciesModule.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,11 @@ protected override void Load(ContainerBuilder builder)
549549

550550
private static void ConfigureFederatedCredentials(ContainerBuilder builder, ConfigurationService configuration)
551551
{
552+
builder
553+
.RegisterType<FederatedCredentialRepository>()
554+
.As<IFederatedCredentialRepository>()
555+
.InstancePerLifetimeScope();
556+
552557
builder
553558
.Register(c => configuration.FederatedCredential)
554559
.As<IFederatedCredentialConfiguration>();
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Threading.Tasks;
7+
using Moq;
8+
using NuGet.Services.Entities;
9+
using Xunit;
10+
11+
#nullable enable
12+
13+
namespace NuGetGallery.Services.Authentication
14+
{
15+
public class FederatedCredentialRepositoryFacts
16+
{
17+
public class TheGetPoliciesCreatedByUserMethod : FederatedCredentialRepositoryFacts
18+
{
19+
[Fact]
20+
public void FiltersByUserKey()
21+
{
22+
// Act
23+
var policies = Target.GetPoliciesCreatedByUser(userKey: 4);
24+
25+
// Assert
26+
Assert.Equal(2, policies.Count);
27+
Assert.Equal(1, policies[0].Key);
28+
Assert.Equal(2, policies[1].Key);
29+
}
30+
}
31+
32+
public class TheGetPolicyByKeyMethod : FederatedCredentialRepositoryFacts
33+
{
34+
[Fact]
35+
public void ReturnsPolicyByKey()
36+
{
37+
// Act
38+
var policy = Target.GetPolicyByKey(2);
39+
40+
// Assert
41+
Assert.Equal(2, policy!.Key);
42+
}
43+
44+
[Fact]
45+
public void ReturnsNullIfDoesNotExist()
46+
{
47+
// Act
48+
var policy = Target.GetPolicyByKey(23);
49+
50+
// Assert
51+
Assert.Null(policy);
52+
}
53+
}
54+
55+
public class TheSaveFederatedCredentialAsyncMethod : FederatedCredentialRepositoryFacts
56+
{
57+
[Fact]
58+
public async Task InsertsCredential()
59+
{
60+
// Arrange
61+
var credential = new FederatedCredential();
62+
63+
// Act
64+
await Target.SaveFederatedCredentialAsync(credential, saveChanges: false);
65+
66+
// Assert
67+
CredentialRepository.Verify(x => x.InsertOnCommit(credential), Times.Once);
68+
CredentialRepository.Verify(x => x.CommitChangesAsync(), Times.Never);
69+
}
70+
71+
[Fact]
72+
public async Task CommitsChangesIfRequested()
73+
{
74+
// Arrange
75+
var credential = new FederatedCredential();
76+
77+
// Act
78+
await Target.SaveFederatedCredentialAsync(credential, saveChanges: true);
79+
80+
// Assert
81+
CredentialRepository.Verify(x => x.InsertOnCommit(credential), Times.Once);
82+
CredentialRepository.Verify(x => x.CommitChangesAsync(), Times.Once);
83+
}
84+
}
85+
86+
public class TheAddPolicyAsyncMethod : FederatedCredentialRepositoryFacts
87+
{
88+
[Fact]
89+
public async Task InsertsPolicy()
90+
{
91+
// Act
92+
await Target.AddPolicyAsync(Policies[0], saveChanges: false);
93+
94+
// Assert
95+
PolicyRepository.Verify(x => x.InsertOnCommit(Policies[0]), Times.Once);
96+
PolicyRepository.Verify(x => x.CommitChangesAsync(), Times.Never);
97+
}
98+
99+
[Fact]
100+
public async Task CommitsChangesIfRequested()
101+
{
102+
// Act
103+
await Target.AddPolicyAsync(Policies[0], saveChanges: true);
104+
105+
// Assert
106+
PolicyRepository.Verify(x => x.InsertOnCommit(Policies[0]), Times.Once);
107+
PolicyRepository.Verify(x => x.CommitChangesAsync(), Times.Once);
108+
}
109+
}
110+
111+
public class TheDeletePolicyAsyncMethod : FederatedCredentialRepositoryFacts
112+
{
113+
[Fact]
114+
public async Task DeletesPolicy()
115+
{
116+
// Act
117+
await Target.DeletePolicyAsync(Policies[0], saveChanges: false);
118+
119+
// Assert
120+
PolicyRepository.Verify(x => x.DeleteOnCommit(Policies[0]), Times.Once);
121+
PolicyRepository.Verify(x => x.CommitChangesAsync(), Times.Never);
122+
}
123+
124+
[Fact]
125+
public async Task CommitsChangesIfRequested()
126+
{
127+
// Act
128+
await Target.DeletePolicyAsync(Policies[0], saveChanges: true);
129+
130+
// Assert
131+
PolicyRepository.Verify(x => x.DeleteOnCommit(Policies[0]), Times.Once);
132+
PolicyRepository.Verify(x => x.CommitChangesAsync(), Times.Once);
133+
}
134+
}
135+
136+
public FederatedCredentialRepositoryFacts()
137+
{
138+
CredentialRepository = new Mock<IEntityRepository<FederatedCredential>>();
139+
PolicyRepository = new Mock<IEntityRepository<FederatedCredentialPolicy>>();
140+
141+
Policies = new List<FederatedCredentialPolicy>
142+
{
143+
new() { Key = 1, CreatedByUserKey = 4 },
144+
new() { Key = 2, CreatedByUserKey = 4 },
145+
new() { Key = 3, CreatedByUserKey = 5 },
146+
};
147+
PolicyRepository.Setup(x => x.GetAll()).Returns(() => Policies.AsQueryable());
148+
149+
Target = new FederatedCredentialRepository(
150+
PolicyRepository.Object,
151+
CredentialRepository.Object);
152+
}
153+
154+
public Mock<IEntityRepository<FederatedCredential>> CredentialRepository { get; }
155+
public Mock<IEntityRepository<FederatedCredentialPolicy>> PolicyRepository { get; }
156+
public List<FederatedCredentialPolicy> Policies { get; }
157+
public FederatedCredentialRepository Target { get; }
158+
}
159+
}

0 commit comments

Comments
 (0)