Skip to content

Commit c3565e7

Browse files
committed
Hopefully final tweaks to URL Generation logic
1 parent 7320777 commit c3565e7

File tree

2 files changed

+43
-24
lines changed

2 files changed

+43
-24
lines changed

GoLive.Generator.ApiClientGenerator.Tests.WebApi/GeneratedApiClient.cs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,9 @@ public InheritingTwoClient (HttpClient client)
135135
}
136136
public string GetPagedApiTest_Url (int Page = 1, string Filter = null, int PageSize = 20, QueryString queryString = default)
137137
{
138+
queryString = queryString.Add("Page", Page.ToString());
138139
queryString = queryString.Add("Filter", Filter.ToString());
140+
queryString = queryString.Add("PageSize", PageSize.ToString());
139141
return $"/InheritingTwo/InheritingTwo/{Page}/{PageSize}/{queryString}";
140142
}
141143

@@ -146,6 +148,7 @@ public string GetPagedApiTest_Url (int Page = 1, string Filter = null, int Pag
146148
}
147149
public string GetApiTest2_Url (int Page = 1, QueryString queryString = default)
148150
{
151+
queryString = queryString.Add("Page", Page.ToString());
149152
return $"/ThisIsTestTwo/{Page}/{queryString}";
150153
}
151154

@@ -212,7 +215,7 @@ public string GetUser_Url (int Id , QueryString queryString = default)
212215
return new Response<int>(result.StatusCode, result.Headers, (result.Content?.ReadFromJsonAsync<int>(cancellationToken: _token) ?? Task.FromResult<int>(default)));
213216
}
214217
}
215-
public string GetUser_Url (string user , QueryString queryString = default)
218+
public string GetUser_Url (QueryString queryString = default)
216219
{
217220
return $"/InheritingTwo/{queryString}";
218221
}
@@ -241,7 +244,7 @@ public string GetUser_Url (string user , QueryString queryString = default)
241244
return new Response<string>(result.StatusCode, result.Headers, (result.Content?.ReadFromJsonAsync<string>(cancellationToken: _token) ?? Task.FromResult<string?>(default)));
242245
}
243246
}
244-
public string GetUser2_Url (string Id , string Id2 , GoLive.Generator.ApiClientGenerator.Tests.WebApi.Controllers.UserController.ComplexObjectExample example , QueryString queryString = default)
247+
public string GetUser2_Url (string Id , string Id2 , QueryString queryString = default)
245248
{
246249
queryString = queryString.Add("Id", Id.ToString());
247250
queryString = queryString.Add("Id2", Id2.ToString());
@@ -373,7 +376,7 @@ public string GetUser_Url (int Id , QueryString queryString = default)
373376
return new Response<int>(result.StatusCode, result.Headers, (result.Content?.ReadFromJsonAsync<int>(cancellationToken: _token) ?? Task.FromResult<int>(default)));
374377
}
375378
}
376-
public string GetUser_Url (string user , QueryString queryString = default)
379+
public string GetUser_Url (QueryString queryString = default)
377380
{
378381
return $"/InheritingUser2/{queryString}";
379382
}
@@ -402,7 +405,7 @@ public string GetUser_Url (string user , QueryString queryString = default)
402405
return new Response<string>(result.StatusCode, result.Headers, (result.Content?.ReadFromJsonAsync<string>(cancellationToken: _token) ?? Task.FromResult<string?>(default)));
403406
}
404407
}
405-
public string GetUser2_Url (string Id , string Id2 , GoLive.Generator.ApiClientGenerator.Tests.WebApi.Controllers.UserController.ComplexObjectExample example , QueryString queryString = default)
408+
public string GetUser2_Url (string Id , string Id2 , QueryString queryString = default)
406409
{
407410
queryString = queryString.Add("Id", Id.ToString());
408411
queryString = queryString.Add("Id2", Id2.ToString());
@@ -478,6 +481,7 @@ public NonApiClient (HttpClient client)
478481
}
479482
public string TestModelBinderDifferentNameUnderId_Url (System.String Id , QueryString queryString = default)
480483
{
484+
queryString = queryString.Add("Id", Id.ToString());
481485
return $"/api/NonApi/TestModelBinderDifferentNameUnderId/{Id}/{queryString}";
482486
}
483487

@@ -488,6 +492,7 @@ public string TestModelBinderDifferentNameUnderId_Url (System.String Id , QueryS
488492
}
489493
public string TestModelBinderDifferentNameUnderId3_Url (System.String Id , QueryString queryString = default)
490494
{
495+
queryString = queryString.Add("Id", Id.ToString());
491496
return $"/api/NonApi/TestModelBinderDifferentNameUnderId3/{Id}/{queryString}";
492497
}
493498
}
@@ -564,7 +569,7 @@ public string GetUser_Url (int Id , QueryString queryString = default)
564569
return new Response<int>(result.StatusCode, result.Headers, (result.Content?.ReadFromJsonAsync<int>(cancellationToken: _token) ?? Task.FromResult<int>(default)));
565570
}
566571
}
567-
public string GetUser_Url (string user , QueryString queryString = default)
572+
public string GetUser_Url (QueryString queryString = default)
568573
{
569574
return $"/User/{queryString}";
570575
}
@@ -593,7 +598,7 @@ public string GetUser_Url (string user , QueryString queryString = default)
593598
return new Response<string>(result.StatusCode, result.Headers, (result.Content?.ReadFromJsonAsync<string>(cancellationToken: _token) ?? Task.FromResult<string?>(default)));
594599
}
595600
}
596-
public string GetUser2_Url (string Id , string Id2 , GoLive.Generator.ApiClientGenerator.Tests.WebApi.Controllers.UserController.ComplexObjectExample example , QueryString queryString = default)
601+
public string GetUser2_Url (string Id , string Id2 , QueryString queryString = default)
597602
{
598603
queryString = queryString.Add("Id", Id.ToString());
599604
queryString = queryString.Add("Id2", Id2.ToString());
@@ -730,7 +735,7 @@ public string TestModelBinderDifferentName_Url (System.String OtherName , QueryS
730735
using var result = await _client.PostAsJsonAsync($"/WeatherForecast/{queryString}", option, cancellationToken: _token);
731736
return new Response(result.StatusCode, result.Headers);
732737
}
733-
public string TestRemapTypeWithAnotherType_Url (System.TimeSpan option , QueryString queryString = default)
738+
public string TestRemapTypeWithAnotherType_Url (QueryString queryString = default)
734739
{
735740
return $"/WeatherForecast/{queryString}";
736741
}
@@ -740,7 +745,7 @@ public string TestRemapTypeWithAnotherType_Url (System.TimeSpan option , QuerySt
740745
using var result = await _client.PostAsJsonAsync($"/WeatherForecast/{queryString}", option, cancellationToken: _token);
741746
return new Response(result.StatusCode, result.Headers);
742747
}
743-
public string TestRemapTypeWithAnotherType2_Url (System.String option , QueryString queryString = default)
748+
public string TestRemapTypeWithAnotherType2_Url (QueryString queryString = default)
744749
{
745750
return $"/WeatherForecast/{queryString}";
746751
}
@@ -776,6 +781,8 @@ public string Get_Url (QueryString queryString = default)
776781
}
777782
public string UrlWithParametersFromRoute_Url (string Input1 , string Input2 , QueryString queryString = default)
778783
{
784+
queryString = queryString.Add("Input1", Input1.ToString());
785+
queryString = queryString.Add("Input2", Input2.ToString());
779786
return $"/WeatherForecast/UrlWithParametersFromRoute/{Input1}/{Input2}/{queryString}";
780787
}
781788

@@ -790,6 +797,8 @@ public string UrlWithParametersFromRoute_Url (string Input1 , string Input2 , Qu
790797
}
791798
public string UrlWithParametersFromRoute2_Url (string Input1 , string Input2 , string Input3 , QueryString queryString = default)
792799
{
800+
queryString = queryString.Add("Input1", Input1.ToString());
801+
queryString = queryString.Add("Input2", Input2.ToString());
793802
queryString = queryString.Add("Input3", Input3.ToString());
794803
return $"/WeatherForecast/UrlWithParametersFromRoute2/{Input1}/{Input2}/{queryString}";
795804
}
@@ -913,6 +922,7 @@ public YetAnotherClient (HttpClient client)
913922
}
914923
public string YetAnotherTest_Url (string Id , QueryString queryString = default)
915924
{
925+
queryString = queryString.Add("Id", Id.ToString());
916926
return $"/api/YetAnother/YetAnotherTest/{Id}/{queryString}";
917927
}
918928

GoLive.Generator.ApiClientGenerator/ApiClientGenerator.cs

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Globalization;
66
using System.IO;
77
using System.Linq;
8+
using System.Net.Http;
89
using System.Text.Json;
910
using System.Text.RegularExpressions;
1011
using GoLive.Generator.ApiClientGenerator.Routing;
@@ -18,6 +19,7 @@ namespace GoLive.Generator.ApiClientGenerator;
1819
public class ApiClientGenerator : IIncrementalGenerator
1920
{
2021
private const string TASK_FQ = "global::System.Threading.Tasks.Task";
22+
private const string IFormFile_Q = "Microsoft.AspNetCore.Http.IFormFile";
2123

2224
public void Initialize(IncrementalGeneratorInitializationContext context)
2325
{
@@ -326,20 +328,21 @@ private static void SetUpSingleApi(RouteGeneratorSettings config, ControllerRout
326328
}
327329

328330
var parameterList = string.Join(", ", action.Mapping.Select(m => $"{m.Parameter.FullTypeName} {m.Key} {GetDefaultValue(m.Parameter)}"));
329-
bool containsFileUpload = action.Mapping.Any(f => f.Parameter.FullTypeName == "Microsoft.AspNetCore.Http.IFormFile");
331+
332+
bool containsFileUpload = action.Mapping.Any(f => f.Parameter.FullTypeName == IFormFile_Q);
330333

331334
if (containsFileUpload)
332335
{
333336
parameterList = string.Join(", ",
334337
action.Mapping.Select(m =>
335-
m.Parameter.FullTypeName == "Microsoft.AspNetCore.Http.IFormFile"
338+
m.Parameter.FullTypeName == IFormFile_Q
336339
? $"System.Net.Http.MultipartFormDataContent{(m.Parameter.Nullable ? "?" : "")} multiPartContent"
337340
: $"{m.Parameter.FullTypeName} {m.Key} {GetDefaultValue(m.Parameter)}"));
338341

339342

340343
}
341344

342-
var mappingsWithoutFile = action.Mapping.Where(f => f.Parameter.FullTypeName != "Microsoft.AspNetCore.Http.IFormFile").ToList();
345+
var mappingsWithoutFile = action.Mapping.Where(f => f.Parameter.FullTypeName != IFormFile_Q).ToList();
343346

344347
string useCustomFormatter = config.CustomDiscriminator;
345348

@@ -377,7 +380,7 @@ private static void SetUpSingleApi(RouteGeneratorSettings config, ControllerRout
377380

378381

379382
foreach (var (key, parameter) in action.Mapping
380-
.Where(m => !string.Equals(m.Parameter.FullTypeName, "Microsoft.AspNetCore.Http.IFormFile", StringComparison.InvariantCultureIgnoreCase))
383+
.Where(m => !string.Equals(m.Parameter.FullTypeName, IFormFile_Q, StringComparison.InvariantCultureIgnoreCase))
381384
.Where(m =>
382385
urlTemplate.Segments.Any(s => string.Equals(s.Parameter, m.Key, StringComparison.InvariantCultureIgnoreCase)
383386
/*||
@@ -594,20 +597,26 @@ private static void SetUpSingleApi(RouteGeneratorSettings config, ControllerRout
594597
if (config.OutputUrls)
595598
{
596599
List<string> secondParamList = new();
597-
if (action.Mapping.Any(f => urlTemplate.Segments.Any(r => string.Equals(r.Parameter, f.Key, StringComparison.InvariantCultureIgnoreCase) && r.Restriction == URLTemplateSegmentKnownRestrictions.Optional)))
600+
601+
var methodParameterMappings = action.Mapping
602+
.Where(f => f.Parameter.FullTypeName != IFormFile_Q)
603+
.Where(e => action.Method == HttpMethod.Get || (action.Method != HttpMethod.Get && !action.Body.Any(b => string.Equals(b.Key, e.Key, StringComparison.InvariantCultureIgnoreCase))))
604+
// .Where(f => urlTemplate.Segments.Any(r => string.Equals(r.Parameter, f.Key, StringComparison.InvariantCultureIgnoreCase)))
605+
.ToList();
606+
607+
if (methodParameterMappings.Any())
598608
{
599-
secondParamList.AddRange(action.Mapping.Where(f => urlTemplate.Segments.Any(r => string.Equals(r.Parameter, f.Key, StringComparison.InvariantCultureIgnoreCase) && r.Restriction == URLTemplateSegmentKnownRestrictions.Optional)).Select(parameterMapping => $"{parameterMapping.Parameter.FullTypeName} {parameterMapping.Key} {GetDefaultValue(parameterMapping.Parameter)}"));
609+
secondParamList.AddRange(methodParameterMappings.Select(parameterMapping => $"{parameterMapping.Parameter.FullTypeName} {parameterMapping.Key} {GetDefaultValue(parameterMapping.Parameter)}"));
600610
}
601611

602-
var queryStringParameters = action.Mapping
603-
.Where(f => f.Parameter.FullTypeName != "Microsoft.AspNetCore.Http.IFormFile")
604-
.Where(m => !urlTemplate.Segments.Any(s => string.Equals(s.Parameter, m.Key, StringComparison.InvariantCultureIgnoreCase)))
605-
.Where(e => !action.Body.Any(b => string.Equals(b.Key, e.Key, StringComparison.InvariantCultureIgnoreCase)))
606-
.ToList();
607-
608-
if (mappingsWithoutFile.Any())
612+
/*foreach (var (key, parameter) in methodParameterMappings)
613+
{
614+
source.AppendLine($"// {key} {parameter.FullTypeName}");
615+
}*/
616+
617+
if (methodParameterMappings.Any())
609618
{
610-
string parameterListWithoutFile = string.Join(", ", mappingsWithoutFile.Select(m => $"{m.Parameter.FullTypeName} {m.Key} {GetDefaultValue(m.Parameter)}"));
619+
string parameterListWithoutFile = string.Join(", ", methodParameterMappings.Select(m => $"{m.Parameter.FullTypeName} {m.Key} {GetDefaultValue(m.Parameter)}"));
611620
source.AppendLine($"public string {config.OutputUrlsPrefix}{action.Name}{config.OutputUrlsPostfix} ({string.Join(",", parameterListWithoutFile)}, QueryString queryString = default)");
612621
}
613622
else
@@ -616,9 +625,9 @@ private static void SetUpSingleApi(RouteGeneratorSettings config, ControllerRout
616625
}
617626
source.AppendOpenCurlyBracketLine();
618627

619-
if (queryStringParameters != null && queryStringParameters.Any())
628+
if (methodParameterMappings != null && methodParameterMappings.Any())
620629
{
621-
foreach (var parameterMapping in queryStringParameters)
630+
foreach (var parameterMapping in methodParameterMappings)
622631
{
623632
source.AppendLine($"queryString = queryString.Add(\"{parameterMapping.Key}\", {parameterMapping.Key}.ToString());");
624633
}

0 commit comments

Comments
 (0)