Skip to content

Commit 263541c

Browse files
committed
fix: remove duplicate data source parameters from openapi metadata
1 parent 0e37561 commit 263541c

File tree

4 files changed

+31
-11
lines changed

4 files changed

+31
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
- Fix error in .NET 9 thrown by vite development middleware if the HTTPS cert directory doesn't exist.
66
- Fix `ViewModel.$load` and `ListViewModel.$load` not properly working with `.useResponseCaching()`.
77
- Entities that own multiple one-to-one relationships should no longer throw errors when generating.
8+
- Don't duplicate data source parameters in OpenAPI parameter collections.
89

910
# 5.3.1
1011

src/IntelliTect.Coalesce.Swashbuckle.Tests/OpenApiDocumentTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,5 +73,19 @@ public async Task EndpointsWithObjectParameters_IncludeActionParameterNamePrefix
7373
Assert.Single(properties, p => p.Key == "complexModelId");
7474
Assert.Single(properties, p => p.Key.Equals("model.complexModelId", StringComparison.InvariantCultureIgnoreCase));
7575
}
76+
77+
[Fact]
78+
public async Task DataSourceWithInheritance_DoesNotDuplicateSharedParameters()
79+
{
80+
var doc = await Fixture.GetDocumentAsync();
81+
82+
var parameters = doc
83+
.Paths["/api/Person/list"]
84+
.Operations[Microsoft.OpenApi.Models.OperationType.Get]
85+
.Parameters;
86+
87+
var param = Assert.Single(parameters, p => p.Name == "dataSource.IntArray");
88+
Assert.Equal("Used by data sources ParameterTestsSource, ParameterTestsSourceSubclass.", param.Description);
89+
}
7690
}
7791
}

src/IntelliTect.Coalesce.Tests/TargetClasses/TestDbContext/Person.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,4 +298,9 @@ public class ParameterTestsSource(CrudContext<AppDbContext> context) : StandardD
298298
[Coalesce]
299299
public byte[] Bytes { get; set; }
300300
}
301+
302+
[Coalesce]
303+
public class ParameterTestsSourceSubclass(CrudContext<AppDbContext> context) : ParameterTestsSource(context)
304+
{
305+
}
301306
}

src/IntelliTect.Coalesce/Api/OpenApi/CoalesceApiDescriptionProvider.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -87,19 +87,19 @@ private void ProcessStandardParameters(ApiDescription operation, MethodViewModel
8787

8888
var dataSources = declaredFor.ClassViewModel!.ClientDataSources(reflectionRepository);
8989

90-
foreach (var dataSource in dataSources)
90+
foreach (var group in dataSources.SelectMany(ds => ds.DataSourceParameters).GroupBy(ds => ds.Name))
9191
{
92-
foreach (var dsParam in dataSource.DataSourceParameters)
92+
var dsParam = group.First();
93+
var dataSource = dsParam.Parent;
94+
95+
operation.ParameterDescriptions.Add(new ApiParameterDescription()
9396
{
94-
operation.ParameterDescriptions.Add(new ApiParameterDescription()
95-
{
96-
Source = BindingSource.Query,
97-
Name = $"{paramVm.Name}.{dsParam.Name}",
98-
IsRequired = false,
99-
Type = dsParam.Type.TypeInfo,
100-
ModelMetadata = operation.ParameterDescriptions.First().ModelMetadata.GetMetadataForProperty(dataSource.Type.TypeInfo, dsParam.Name)
101-
});
102-
}
97+
Source = BindingSource.Query,
98+
Name = $"{paramVm.Name}.{dsParam.Name}",
99+
IsRequired = false,
100+
Type = dsParam.Type.TypeInfo,
101+
ModelMetadata = operation.ParameterDescriptions.First().ModelMetadata.GetMetadataForProperty(dataSource.Type.TypeInfo, dsParam.Name)
102+
});
103103
}
104104
}
105105
}

0 commit comments

Comments
 (0)