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