Skip to content

Commit 9c757fd

Browse files
authored
Merge 9117f30 into a2fb679
2 parents a2fb679 + 9117f30 commit 9c757fd

File tree

54 files changed

+205
-191
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+205
-191
lines changed

Diff for: .config/dotnet-tools.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
"isRoot": true,
44
"tools": {
55
"jetbrains.resharper.globaltools": {
6-
"version": "2021.3.0",
6+
"version": "2021.3.4",
77
"commands": [
88
"jb"
99
]
1010
},
1111
"regitlint": {
12-
"version": "6.0.6",
12+
"version": "6.0.8",
1313
"commands": [
1414
"regitlint"
1515
]
@@ -21,10 +21,10 @@
2121
]
2222
},
2323
"dotnet-reportgenerator-globaltool": {
24-
"version": "5.0.0",
24+
"version": "5.1.4",
2525
"commands": [
2626
"reportgenerator"
2727
]
2828
}
2929
}
30-
}
30+
}

Diff for: CodingGuidelines.ruleset

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@
1414
<Rule Id="AV1555" Action="Warning" />
1515
<Rule Id="AV1564" Action="Info" />
1616
<Rule Id="AV1568" Action="Warning" />
17+
<Rule Id="AV1580" Action="None" />
1718
<Rule Id="AV1706" Action="Warning" />
1819
<Rule Id="AV1710" Action="Info" />
1920
<Rule Id="AV1711" Action="Info" />
2021
<Rule Id="AV1738" Action="Warning" />
2122
<Rule Id="AV1739" Action="Warning" />
2223
<Rule Id="AV1745" Action="Warning" />
2324
<Rule Id="AV1755" Action="Warning" />
24-
<Rule Id="AV2210" Action="None" />
25+
<Rule Id="AV2210" Action="Warning" />
2526
<Rule Id="AV2220" Action="Warning" />
2627
<Rule Id="AV2230" Action="Info" />
2728
<Rule Id="AV2305" Action="None" />

Diff for: Directory.Build.props

+10-6
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
<PropertyGroup>
33
<TargetFrameworkName>net6.0</TargetFrameworkName>
44
<AspNetVersion>6.0.*</AspNetVersion>
5-
<JsonApiDotNetCoreVersion>5.0.0-pre1</JsonApiDotNetCoreVersion>
6-
<MongoDBDriverVersion>2.14.*</MongoDBDriverVersion>
7-
<JsonApiDotNetCoreMongoDbVersionPrefix>5.0.0</JsonApiDotNetCoreMongoDbVersionPrefix>
5+
<JsonApiDotNetCoreVersion>5.0.1</JsonApiDotNetCoreVersion>
6+
<MongoDBDriverVersion>2.15.0</MongoDBDriverVersion>
7+
<JsonApiDotNetCoreMongoDbVersionPrefix>5.0.1</JsonApiDotNetCoreMongoDbVersionPrefix>
88
<CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)CodingGuidelines.ruleset</CodeAnalysisRuleSet>
99
<WarningLevel>9999</WarningLevel>
1010
<Nullable>enable</Nullable>
@@ -15,7 +15,7 @@
1515

1616
<ItemGroup>
1717
<PackageReference Include="JetBrains.Annotations" Version="2021.3.0" PrivateAssets="All" />
18-
<PackageReference Include="CSharpGuidelinesAnalyzer" Version="3.7.1" PrivateAssets="All" />
18+
<PackageReference Include="CSharpGuidelinesAnalyzer" Version="3.8.0" PrivateAssets="All" />
1919
<AdditionalFiles Include="$(MSBuildThisFileDirectory)CSharpGuidelinesAnalyzer.config" Visible="False" />
2020
</ItemGroup>
2121

@@ -25,10 +25,14 @@
2525
<GenerateDocumentationFile>true</GenerateDocumentationFile>
2626
</PropertyGroup>
2727

28+
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
29+
<NoWarn>$(NoWarn);AV2210</NoWarn>
30+
</PropertyGroup>
31+
2832
<!-- Test Project Dependencies -->
2933
<PropertyGroup>
30-
<CoverletVersion>3.1.0</CoverletVersion>
34+
<CoverletVersion>3.1.2</CoverletVersion>
3135
<MoqVersion>4.16.1</MoqVersion>
32-
<TestSdkVersion>17.0.0</TestSdkVersion>
36+
<TestSdkVersion>17.1.0</TestSdkVersion>
3337
</PropertyGroup>
3438
</Project>

Diff for: src/JsonApiDotNetCore.MongoDb/Configuration/ServiceCollectionExtensions.cs

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
using JsonApiDotNetCore.Queries.Internal;
77
using Microsoft.Extensions.DependencyInjection;
88

9+
#pragma warning disable AV1130 // Return type in method signature should be an interface to an unchangeable collection
10+
911
namespace JsonApiDotNetCore.MongoDb.Configuration;
1012

1113
public static class ServiceCollectionExtensions

Diff for: src/JsonApiDotNetCore.MongoDb/Repositories/MongoModel.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public MongoModel(IResourceGraph resourceGraph)
1313

1414
foreach (ResourceType resourceType in resourceGraph.GetResourceTypes())
1515
{
16-
RuntimeEntityType entityType = AddEntityType(resourceType.ClrType.Name, resourceType.ClrType);
16+
RuntimeEntityType entityType = AddEntityType(resourceType.ClrType.FullName!, resourceType.ClrType);
1717
SetEntityProperties(entityType, resourceType);
1818
}
1919
}

Diff for: src/JsonApiDotNetCore.MongoDb/Repositories/MongoQueryExpressionValidator.cs

+20-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using JsonApiDotNetCore.Configuration;
12
using JsonApiDotNetCore.MongoDb.Errors;
23
using JsonApiDotNetCore.Queries;
34
using JsonApiDotNetCore.Queries.Expressions;
@@ -12,9 +13,8 @@ public void Validate(QueryLayer layer)
1213
ArgumentGuard.NotNull(layer, nameof(layer));
1314

1415
bool hasIncludes = layer.Include?.Elements.Any() == true;
15-
bool hasSparseRelationshipSets = layer.Projection?.Any(pair => pair.Key is RelationshipAttribute) == true;
1616

17-
if (hasIncludes || hasSparseRelationshipSets)
17+
if (hasIncludes || HasSparseRelationshipSets(layer.Selection))
1818
{
1919
throw new UnsupportedRelationshipException();
2020
}
@@ -24,6 +24,24 @@ public void Validate(QueryLayer layer)
2424
ValidateExpression(layer.Pagination);
2525
}
2626

27+
private static bool HasSparseRelationshipSets(FieldSelection? selection)
28+
{
29+
if (selection is { IsEmpty: false })
30+
{
31+
foreach (ResourceType resourceType in selection.GetResourceTypes())
32+
{
33+
FieldSelectors selectors = selection.GetOrCreateSelectors(resourceType);
34+
35+
if (selectors.Any(pair => pair.Key is RelationshipAttribute))
36+
{
37+
return true;
38+
}
39+
}
40+
}
41+
42+
return false;
43+
}
44+
2745
private void ValidateExpression(QueryExpression? expression)
2846
{
2947
if (expression != null)

Diff for: src/JsonApiDotNetCore.MongoDb/Repositories/MongoRepository.cs

+10-5
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,9 @@ public virtual Task<int> CountAsync(FilterExpression? topFilter, CancellationTok
8282
return query.CountAsync(cancellationToken);
8383
}
8484

85+
#pragma warning disable AV1130 // Return type in method signature should be an interface to an unchangeable collection
8586
protected virtual IMongoQueryable<TResource> ApplyQueryLayer(QueryLayer queryLayer)
87+
#pragma warning restore AV1130 // Return type in method signature should be an interface to an unchangeable collection
8688
{
8789
ArgumentGuard.NotNull(queryLayer, nameof(queryLayer));
8890

@@ -120,7 +122,9 @@ protected virtual IMongoQueryable<TResource> ApplyQueryLayer(QueryLayer queryLay
120122
return (IMongoQueryable<TResource>)source.Provider.CreateQuery<TResource>(expression);
121123
}
122124

125+
#pragma warning disable AV1130 // Return type in method signature should be an interface to an unchangeable collection
123126
protected virtual IQueryable<TResource> GetAll()
127+
#pragma warning restore AV1130 // Return type in method signature should be an interface to an unchangeable collection
124128
{
125129
return _mongoDataAccess.ActiveSession != null ? Collection.AsQueryable(_mongoDataAccess.ActiveSession) : Collection.AsQueryable();
126130
}
@@ -150,9 +154,9 @@ private void AssertNoRelationshipsInSparseFieldSets()
150154
}
151155

152156
/// <inheritdoc />
153-
public virtual Task<TResource> GetForCreateAsync(TId id, CancellationToken cancellationToken)
157+
public virtual Task<TResource> GetForCreateAsync(Type resourceClrType, TId id, CancellationToken cancellationToken)
154158
{
155-
var resource = _resourceFactory.CreateInstance<TResource>();
159+
var resource = (TResource)_resourceFactory.CreateInstance(resourceClrType);
156160
resource.Id = id;
157161

158162
return Task.FromResult(resource);
@@ -228,9 +232,9 @@ await SaveChangesAsync(async () =>
228232
}
229233

230234
/// <inheritdoc />
231-
public virtual async Task DeleteAsync(TId id, CancellationToken cancellationToken)
235+
public virtual async Task DeleteAsync(TResource? resourceFromDatabase, TId id, CancellationToken cancellationToken)
232236
{
233-
var placeholderResource = _resourceFactory.CreateInstance<TResource>();
237+
TResource placeholderResource = resourceFromDatabase ?? _resourceFactory.CreateInstance<TResource>();
234238
placeholderResource.Id = id;
235239

236240
await _resourceDefinitionAccessor.OnWritingAsync(placeholderResource, WriteOperationKind.DeleteResource, cancellationToken);
@@ -263,7 +267,8 @@ public virtual Task SetRelationshipAsync(TResource leftResource, object? rightVa
263267
}
264268

265269
/// <inheritdoc />
266-
public virtual Task AddToToManyRelationshipAsync(TId leftId, ISet<IIdentifiable> rightResourceIds, CancellationToken cancellationToken)
270+
public virtual Task AddToToManyRelationshipAsync(TResource? leftResource, TId leftId, ISet<IIdentifiable> rightResourceIds,
271+
CancellationToken cancellationToken)
267272
{
268273
throw new UnsupportedRelationshipException();
269274
}

Diff for: test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceTests.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public async Task Can_create_resource()
5656
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
5757

5858
// Assert
59-
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
59+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
6060

6161
responseDocument.Results.ShouldHaveCount(1);
6262

@@ -119,7 +119,7 @@ public async Task Can_create_resources()
119119
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
120120

121121
// Assert
122-
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
122+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
123123

124124
responseDocument.Results.ShouldHaveCount(elementCount);
125125

@@ -192,7 +192,7 @@ public async Task Can_create_resource_without_attributes_or_relationships()
192192
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
193193

194194
// Assert
195-
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
195+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
196196

197197
responseDocument.Results.ShouldHaveCount(1);
198198

@@ -248,7 +248,7 @@ public async Task Cannot_create_resource_with_client_generated_ID()
248248
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
249249

250250
// Assert
251-
httpResponse.Should().HaveStatusCode(HttpStatusCode.Forbidden);
251+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.Forbidden);
252252

253253
responseDocument.Errors.ShouldHaveCount(1);
254254

Diff for: test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public async Task Can_create_resource_with_client_generated_string_ID_having_sid
5555
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
5656

5757
// Assert
58-
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
58+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
5959

6060
string isoCode = $"{newLanguage.IsoCode}{ContainerTypeToHideFromAutoDiscovery.ImplicitlyChangingTextLanguageDefinition.Suffix}";
6161

@@ -110,7 +110,7 @@ public async Task Can_create_resource_with_client_generated_string_ID_having_no_
110110
(HttpResponseMessage httpResponse, string responseDocument) = await _testContext.ExecutePostAtomicAsync<string>(route, requestBody);
111111

112112
// Assert
113-
httpResponse.Should().HaveStatusCode(HttpStatusCode.NoContent);
113+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.NoContent);
114114

115115
responseDocument.Should().BeEmpty();
116116

@@ -163,7 +163,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
163163
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
164164

165165
// Assert
166-
httpResponse.Should().HaveStatusCode(HttpStatusCode.Conflict);
166+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.Conflict);
167167

168168
responseDocument.Errors.ShouldHaveCount(1);
169169

Diff for: test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithToManyRelationshipTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
7070
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
7171

7272
// Assert
73-
httpResponse.Should().HaveStatusCode(HttpStatusCode.BadRequest);
73+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.BadRequest);
7474

7575
responseDocument.Errors.ShouldHaveCount(1);
7676

Diff for: test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithToOneRelationshipTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
6767
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
6868

6969
// Assert
70-
httpResponse.Should().HaveStatusCode(HttpStatusCode.BadRequest);
70+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.BadRequest);
7171

7272
responseDocument.Errors.ShouldHaveCount(1);
7373

Diff for: test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Deleting/AtomicDeleteResourceTests.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
5151
(HttpResponseMessage httpResponse, string responseDocument) = await _testContext.ExecutePostAtomicAsync<string>(route, requestBody);
5252

5353
// Assert
54-
httpResponse.Should().HaveStatusCode(HttpStatusCode.NoContent);
54+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.NoContent);
5555

5656
responseDocument.Should().BeEmpty();
5757

@@ -104,7 +104,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
104104
(HttpResponseMessage httpResponse, string responseDocument) = await _testContext.ExecutePostAtomicAsync<string>(route, requestBody);
105105

106106
// Assert
107-
httpResponse.Should().HaveStatusCode(HttpStatusCode.NoContent);
107+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.NoContent);
108108

109109
responseDocument.Should().BeEmpty();
110110

@@ -144,7 +144,7 @@ public async Task Cannot_delete_resource_for_unknown_ID()
144144
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
145145

146146
// Assert
147-
httpResponse.Should().HaveStatusCode(HttpStatusCode.NotFound);
147+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.NotFound);
148148

149149
responseDocument.Errors.ShouldHaveCount(1);
150150

Diff for: test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/LocalIds/AtomicLocalIdTests.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public async Task Can_update_resource_using_local_ID()
6565
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
6666

6767
// Assert
68-
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
68+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
6969

7070
responseDocument.Results.ShouldHaveCount(2);
7171

@@ -133,7 +133,7 @@ public async Task Can_delete_resource_using_local_ID()
133133
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
134134

135135
// Assert
136-
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
136+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
137137

138138
responseDocument.Results.ShouldHaveCount(2);
139139

Diff for: test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Meta/AtomicResourceMetaTests.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public async Task Returns_resource_meta_in_create_resource_with_side_effects()
7171
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
7272

7373
// Assert
74-
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
74+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
7575

7676
responseDocument.Results.ShouldHaveCount(2);
7777

@@ -143,7 +143,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
143143
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
144144

145145
// Assert
146-
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
146+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
147147

148148
responseDocument.Results.ShouldHaveCount(1);
149149

Diff for: test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Mixed/MaximumOperationsPerRequestTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,6 @@ public async Task Can_process_high_number_of_operations_when_unconstrained()
5454
(HttpResponseMessage httpResponse, _) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
5555

5656
// Assert
57-
httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);
57+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
5858
}
5959
}

Diff for: test/JsonApiDotNetCoreMongoDbTests/IntegrationTests/AtomicOperations/Transactions/AtomicRollbackTests.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
6868
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
6969

7070
// Assert
71-
httpResponse.Should().HaveStatusCode(HttpStatusCode.NotFound);
71+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.NotFound);
7272

7373
responseDocument.Errors.ShouldHaveCount(1);
7474

@@ -137,7 +137,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
137137
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
138138

139139
// Assert
140-
httpResponse.Should().HaveStatusCode(HttpStatusCode.NotFound);
140+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.NotFound);
141141

142142
responseDocument.Errors.ShouldHaveCount(1);
143143

@@ -202,7 +202,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
202202
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync<Document>(route, requestBody);
203203

204204
// Assert
205-
httpResponse.Should().HaveStatusCode(HttpStatusCode.NotFound);
205+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.NotFound);
206206

207207
responseDocument.Errors.ShouldHaveCount(1);
208208

0 commit comments

Comments
 (0)