diff --git a/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeFiles/Blazor/Server/CallWebApi.razor b/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeFiles/Blazor/Server/CallWebApi.razor
new file mode 100644
index 0000000000..b53277db93
--- /dev/null
+++ b/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeFiles/Blazor/Server/CallWebApi.razor
@@ -0,0 +1,48 @@
+@page "/callwebapi"
+
+@using Microsoft.Identity.Web
+
+@inject IDownstreamWebApi downstreamAPI
+@inject MicrosoftIdentityConsentAndConditionalAccessHandler ConsentHandler
+
+
Call an API
+
+This component demonstrates fetching data from a Web API.
+
+@if (apiResult == null)
+{
+ Loading...
+}
+else
+{
+ API Result
+ @apiResult
+}
+
+@code {
+ private HttpResponseMessage response;
+ private string apiResult;
+
+ protected override async Task OnInitializedAsync()
+ {
+ try
+ {
+ response = await downstreamAPI.CallWebApiForUserAsync(
+ "DownstreamApi",
+ options => options.RelativePath = "");
+
+ if (response.StatusCode == System.Net.HttpStatusCode.OK)
+ {
+ apiResult = await response.Content.ReadAsStringAsync();
+ }
+ else
+ {
+ apiResult = "Failed to call the web API";
+ }
+ }
+ catch (Exception ex)
+ {
+ ConsentHandler.HandleException(ex);
+ }
+ }
+}
diff --git a/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeModifierConfigs/cm_dotnet_blazorserver.json b/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeModifierConfigs/cm_dotnet_blazorserver.json
index 30828ed1d0..9af02dacca 100644
--- a/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeModifierConfigs/cm_dotnet_blazorserver.json
+++ b/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeModifierConfigs/cm_dotnet_blazorserver.json
@@ -3,6 +3,7 @@
"Files": [
{
"FileName": "Program.cs",
+ "Options": [ "MinimalApp" ],
"Methods": {
"Global": {
"CodeChanges": [
@@ -153,6 +154,13 @@
"Options": [
"MicrosoftGraph"
]
+ },
+ {
+ "Block": "\r\n \r\n \r\n \r\n Call Web API\r\n \r\n
\r\n \r\n",
+ "ReplaceSnippet": "\r\n \r\n \r\n",
+ "Options": [
+ "DownstreamApi"
+ ]
}
]
},
@@ -162,6 +170,13 @@
"Options": [
"MicrosoftGraph"
]
+ },
+ {
+ "FileName": "CallWebApi.razor",
+ "AddFilePath": "Pages/CallWebApi.razor",
+ "Options": [
+ "DownstreamApi"
+ ]
}
]
}
diff --git a/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeModifierConfigs/cm_dotnet_webapi.json b/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeModifierConfigs/cm_dotnet_webapi.json
index a41180045b..aca197f5f2 100644
--- a/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeModifierConfigs/cm_dotnet_webapi.json
+++ b/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeModifierConfigs/cm_dotnet_webapi.json
@@ -3,6 +3,7 @@
"Files": [
{
"FileName": "Startup.cs",
+ "Options": [ "NonMinimalApp" ],
"Methods": {
"Configure": {
"Parameters": [ "IApplicationBuilder", "IWebHostEnvironment" ],
@@ -36,6 +37,7 @@
},
{
"FileName": "Program.cs",
+ "Options": [ "MinimalApp" ],
"Methods": {
"Global": {
"CodeChanges": [
diff --git a/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeModifierConfigs/cm_dotnet_webapp.json b/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeModifierConfigs/cm_dotnet_webapp.json
index a043d19875..0a2987d228 100644
--- a/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeModifierConfigs/cm_dotnet_webapp.json
+++ b/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/CodeModifierConfigs/cm_dotnet_webapp.json
@@ -3,6 +3,7 @@
"Files": [
{
"FileName": "Startup.cs",
+ "Options": [ "NonMinimalApp" ],
"Methods": {
"Configure": {
"Parameters": [ "IApplicationBuilder", "IWebHostEnvironment" ],
@@ -70,6 +71,7 @@
},
{
"FileName": "Program.cs",
+ "Options": [ "MinimalApp" ],
"Methods": {
"Global": {
"CodeChanges": [
diff --git a/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/ProjectModifier.cs b/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/ProjectModifier.cs
index c95bc1c12f..0416e15e6a 100644
--- a/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/ProjectModifier.cs
+++ b/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/CodeReaderWriter/ProjectModifier.cs
@@ -167,7 +167,7 @@ internal async Task ModifyRazorFile(string fileName, CodeFile file, CodeAnalysis
var razorChanges = file?.RazorChanges.Where(cc => ProjectModifierHelper.FilterOptions(cc.Options, toolOptions));
var editedDocument = await ProjectModifierHelper.ModifyDocumentText(document, razorChanges);
- await ProjectModifierHelper.UpdateDocument(document, editedDocument, _consoleLogger);
+ await ProjectModifierHelper.UpdateDocument(editedDocument, _consoleLogger);
}
internal async Task ModifyCshtmlFile(string fileName, CodeFile cshtmlFile, CodeAnalysis.Project project, CodeChangeOptions options)
@@ -188,7 +188,7 @@ internal async Task ModifyCshtmlFile(string fileName, CodeFile cshtmlFile, CodeA
var filteredCodeFiles = globalMethod.CodeChanges.Where(cc => ProjectModifierHelper.FilterOptions(cc.Options, options));
var editedDocument = await ProjectModifierHelper.ModifyDocumentText(fileDoc, filteredCodeFiles);
//replace the document
- await ProjectModifierHelper.UpdateDocument(fileDoc, editedDocument, _consoleLogger);
+ await ProjectModifierHelper.UpdateDocument(editedDocument, _consoleLogger);
}
}
}
diff --git a/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/Properties/Resources.Designer.cs b/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/Properties/Resources.Designer.cs
index e3aa7e61b1..f4455befe8 100644
--- a/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/Properties/Resources.Designer.cs
+++ b/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/Properties/Resources.Designer.cs
@@ -60,6 +60,16 @@ internal Resources() {
}
}
+ ///
+ /// Looks up a localized resource of type System.Byte[].
+ ///
+ internal static byte[] add_CallWebApi_razor {
+ get {
+ object obj = ResourceManager.GetObject("add_CallWebApi_razor", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
///
/// Looks up a localized resource of type System.Byte[].
///
diff --git a/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/Properties/Resources.resx b/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/Properties/Resources.resx
index d54cca5b78..1d42e80fef 100644
--- a/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/Properties/Resources.resx
+++ b/src/MSIdentityScaffolding/Microsoft.DotNet.MSIdentity/Properties/Resources.resx
@@ -124,6 +124,9 @@
Adding package {0} . . .
+
+ ..\CodeReaderWriter\CodeFiles\Blazor\Server\CallWebApi.razor;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
..\CodeReaderWriter\CodeFiles\Blazor\Server\ShowProfile.razor;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
diff --git a/src/Shared/Microsoft.DotNet.Scaffolding.Shared/CodeModifier/CodeChange/CodeChangeHelper.cs b/src/Shared/Microsoft.DotNet.Scaffolding.Shared/CodeModifier/CodeChange/CodeChangeHelper.cs
index 1b2f961b6b..3810a8c0fd 100644
--- a/src/Shared/Microsoft.DotNet.Scaffolding.Shared/CodeModifier/CodeChange/CodeChangeHelper.cs
+++ b/src/Shared/Microsoft.DotNet.Scaffolding.Shared/CodeModifier/CodeChange/CodeChangeHelper.cs
@@ -15,6 +15,7 @@ public class CodeChangeOptionStrings
public const string DownstreamApi = nameof(DownstreamApi);
public const string Skip = nameof(Skip);
public const string NonMinimalApp = nameof(NonMinimalApp);
+ public const string MinimalApp = nameof(MinimalApp);
}
public class CodeChangeOptions
diff --git a/src/Shared/Microsoft.DotNet.Scaffolding.Shared/Project/ProjectModifierHelper.cs b/src/Shared/Microsoft.DotNet.Scaffolding.Shared/Project/ProjectModifierHelper.cs
index 8d2c92b1e9..df7629e76c 100644
--- a/src/Shared/Microsoft.DotNet.Scaffolding.Shared/Project/ProjectModifierHelper.cs
+++ b/src/Shared/Microsoft.DotNet.Scaffolding.Shared/Project/ProjectModifierHelper.cs
@@ -38,6 +38,7 @@ internal static async Task IsMinimalApp(IModelTypesLocator modelTypesLocat
return startupType == null;
}
+ // Returns true when there is no Startup.cs or equivalent
internal static async Task IsMinimalApp(CodeAnalysis.Project project)
{
if (project != null)
@@ -110,6 +111,7 @@ node is MemberAccessExpressionSyntax maes &&
}
}
}
+
return string.Empty;
}
@@ -343,6 +345,11 @@ internal static bool FilterOptions(string[] options, CodeChangeOptions codeChang
{
return false;
}
+ // for example, program.cs is only modified when codeChangeOptions.IsMinimalApp is true
+ if (options.Contains(CodeChangeOptionStrings.MinimalApp) && !codeChangeOptions.IsMinimalApp)
+ {
+ return false;
+ }
//if its a minimal app and options have a "NonMinimalApp", don't add the CodeBlock
if (options.Contains(CodeChangeOptionStrings.NonMinimalApp) && codeChangeOptions.IsMinimalApp)
{
@@ -375,6 +382,7 @@ internal static bool FilterOptions(string[] options, CodeChangeOptions codeChang
return true;
}
}
+
return false;
}
@@ -420,15 +428,17 @@ internal static async Task ModifyDocumentText(Document fileDoc, IEnume
return null; // TODO generate README
}
- var sourceTextToAdd = SourceText.From(sourceFileString);
- return fileDoc.WithText(sourceTextToAdd);
+ var updatedSourceText = SourceText.From(sourceFileString);
+ return fileDoc.WithText(updatedSourceText);
}
- internal static async Task UpdateDocument(Document fileDoc, Document editedDocument, IConsoleLogger consoleLogger)
+ internal static async Task UpdateDocument(Document document, IConsoleLogger consoleLogger)
{
- var classFileTxt = await editedDocument.GetTextAsync();
- File.WriteAllText(fileDoc.Name, classFileTxt.ToString());
- consoleLogger.LogMessage($"Modified {fileDoc.Name}.\n");
+ var classFileTxt = await document.GetTextAsync();
+
+ // Note: Here, document.Name is the full filepath
+ File.WriteAllText(document.Name, classFileTxt.ToString());
+ consoleLogger.LogMessage($"Modified {document.Name}.\n");
}
// Filter out CodeBlocks that are invalid using FilterOptions