From 9a665ccc1dd6090e264467ae8c99ecb9fe9dbb6c Mon Sep 17 00:00:00 2001 From: "David G. Moore, Jr." Date: Mon, 29 Jan 2024 19:20:41 -0500 Subject: [PATCH] Moved the communication projects; fixed the implementations of IConfigureIHostApplicationBuilder --- ....AspNetCore.Communication.Abstractions.sln | 42 ---- src/Communication/.vscode/settings.json | 6 + ...mjr.Azure.CommunicationServices.All.csproj | 21 ++ .../Dgmjr.Azure.CommunicationServices.All.sln | 70 +++++++ .../All}/LICENSE.md | 0 src/Communication/All/icon.png | Bin 0 -> 95269 bytes ...reCommunicationServicesAutoConfigurator.cs | 2 +- .../AzureCommunicationServicesOptions.cs | 0 .../Dgmjr.Azure.CommunicationServices.csproj} | 12 +- .../Dgmjr.Azure.CommunicationServices.sln | 56 ++++++ .../{ => Communcation}/Email/EmailSender.cs | 0 .../Email/EmailSenderOptions.cs | 11 +- .../Email/MailSendResult.cs | 15 +- .../{ => Communcation}/LICENSE.md | 0 .../Communcation/Sms/SmsSendResult.cs | 34 ++++ .../{ => Communcation}/Sms/SmsSender.cs | 0 .../Sms/SmsSenderOptions.cs | 3 + src/Communication/Communcation/icon.png | Bin 0 -> 95269 bytes ...CommunicationServices.Abstractions.csproj} | 0 ...ure.CommunicationServices.Abstractions.sln | 42 ++++ .../Enums/MailSendReponseCode.cs | 18 ++ .../Enums/SmsSendResponseCode.cs | 19 ++ .../IEmailSender.cs | 0 .../IMailSendResult.cs | 0 .../IMessageSendResult.cs | 4 +- .../ISmsSendResult.cs | 0 .../Communication.Abstractions/ISmsSender.cs | 0 .../Communication.Abstractions/LICENSE.md | 35 ++++ .../MailSendResponseCode.cs | 0 .../Communication.Abstractions/README.md | 0 .../SmsSendResponseCode.cs | 0 .../Communication.Abstractions/icon.png | Bin 0 -> 95269 bytes .../Dgmjr.AspNetCore.Communication.sln | 56 ------ src/Communication/Sms/SmsSendResult.cs | 37 ---- .../IConfigureIHostApplicationBuilder.cs | 4 +- .../Builder/WebApplicationBuilderFacade.cs | 40 ++++ .../Configurators/JsonFileAutoConfigurator.cs | 3 +- ...figureIApplicationHostBuilderExtensions.cs | 5 +- .../BuildIHostApplicationBuilderExtension.cs | 13 ++ .../KeyPerJsonFileConfigurationExtensions.cs | 12 +- .../Dgmjr.Configuration.Extensions.sln | 26 +-- .../icon.png | Bin .../Dgmjr.Web.DownstreamApis.csproj | 15 ++ .../Dgmjr.Web.DownstreamApis.sln | 14 ++ .../DownstreamApiOptionsConfigurator.cs | 12 ++ ...ownstreamApiServiceCollectionExtensions.cs | 26 ++- src/DownstreamApis/DownstreamApis.cs | 17 +- .../DownstreamApisAutoConfigurator.cs | 14 +- src/DownstreamApis/DownstreamApisBase.cs | 12 ++ src/DownstreamApis/IDownstreamApis.cs | 12 ++ src/DownstreamApis/JsonOptions.cs | 14 +- .../icon.png | Bin .../CorrelationIdAutoConfigurator.cs | 2 +- .../Dgmjr.Http.CorrelationId.cs | 15 ++ src/Http/Mime/Dgmjr.Mime.csproj | 4 +- src/Http/Mime/Dgmjr.Mime.sln | 26 +-- src/Http/ResponseCodes/ResponseCode.cs | 179 +++++++++--------- .../HttpServicesExtensions.AddHttpServices.cs | 4 +- .../HttpServicesOptionsAutoConfigurator.cs | 2 +- .../MicrosoftGraphAutoConfigurator.cs | 2 +- src/MicrosoftGraph/Dgmjr.Graph.csproj | 4 +- src/MicrosoftGraph/Dgmjr.Graph.props | 2 +- src/MicrosoftGraph/Dgmjr.Graph.sln | 26 +-- .../Extensions/LoggingExtensions.cs | 68 ++++--- ...crosoftGraphServiceCollectionExtensions.cs | 22 ++- .../Options/MicrosoftGraphOptions.cs | 4 +- .../Services/ApplicationService.cs | 10 +- .../Services/DirectoryObjectsService.cs | 39 +++- src/MicrosoftGraph/Services/MsGraphService.cs | 4 +- src/MicrosoftGraph/Services/UsersService.cs | 2 +- src/MicrosoftGraph/Telemetry/Activities.cs | 21 +- src/Middleware/RequestLogging/icon.png | Bin 0 -> 26997 bytes src/Mvc/Dgmjr.AspNetCore.Mvc.csproj | 2 +- src/Mvc/Dgmjr.AspNetCore.Mvc.sln | 78 ++++---- .../IHostApplicationBuilderMvcExtensions.cs | 4 +- src/Mvc/MvcAutoConfigurator.cs | 2 +- src/Mvc/MvcOptions.cs | 119 ++++++++++++ src/Razor/Models/PageModelOfT.cs | 12 +- src/Swagger/AddSwaggerGen.cs | 4 +- src/Swagger/Dgmjr.AspNetCore.Swagger.csproj | 4 +- src/Swagger/Dgmjr.AspNetCore.Swagger.sln | 78 ++++---- src/Swagger/SwaggerAutoConfigurator.cs | 2 +- .../SwaggerExtensions/AddExamplesExtension.cs | 4 +- .../AddSwaggerMetadataExtension.cs | 20 +- .../AddXmlCommentsToSwaggerExtensions.cs | 2 +- .../DescribeEnumsAsStrings.cs | 4 +- .../SwaggerExtensions/DescribeFileUploads.cs | 4 +- .../DescribeSchemasViaAttributes.cs | 4 +- .../DescribeTypesForAllOutputFormatters.cs | 4 +- .../SwaggerConflictingActionsResolver.cs | 4 +- src/TagHelpers/Bootstrap/Code/TypeName.cs | 125 ++++++++++++ .../TagHelperConstants.AttributeNames.cs | 97 ++++++++++ .../TagHelperConstants.CssClasses.cs} | 141 +------------- .../Constants/TagHelperConstants.TagNames.cs | 53 ++++++ .../TagHelperConstants.TagPrefixes.cs | 12 ++ .../Constants/TagHelperConstants.cs | 3 + .../Dgmjr.AspNetCore.TagHelpers.csproj | 1 + .../Dgmjr.AspNetCore.TagHelpers.sln | 26 +-- src/TagHelpers/Resources/HighlightCode.js | 0 src/TagHelpers/Resources/code.css | 37 ++++ 100 files changed, 1374 insertions(+), 630 deletions(-) delete mode 100644 src/Communication.Abstractions/Dgmjr.AspNetCore.Communication.Abstractions.sln create mode 100644 src/Communication/.vscode/settings.json create mode 100644 src/Communication/All/Dgmjr.Azure.CommunicationServices.All.csproj create mode 100644 src/Communication/All/Dgmjr.Azure.CommunicationServices.All.sln rename src/{Communication.Abstractions => Communication/All}/LICENSE.md (100%) create mode 100644 src/Communication/All/icon.png rename src/Communication/{ => Communcation}/AzureCommunicationServicesAutoConfigurator.cs (96%) rename src/Communication/{ => Communcation}/AzureCommunicationServicesOptions.cs (100%) rename src/Communication/{Dgmjr.AspNetCore.Communication.csproj => Communcation/Dgmjr.Azure.CommunicationServices.csproj} (86%) create mode 100644 src/Communication/Communcation/Dgmjr.Azure.CommunicationServices.sln rename src/Communication/{ => Communcation}/Email/EmailSender.cs (100%) rename src/Communication/{ => Communcation}/Email/EmailSenderOptions.cs (88%) rename src/Communication/{ => Communcation}/Email/MailSendResult.cs (59%) rename src/Communication/{ => Communcation}/LICENSE.md (100%) create mode 100644 src/Communication/Communcation/Sms/SmsSendResult.cs rename src/Communication/{ => Communcation}/Sms/SmsSender.cs (100%) rename src/Communication/{ => Communcation}/Sms/SmsSenderOptions.cs (91%) create mode 100644 src/Communication/Communcation/icon.png rename src/{Communication.Abstractions/Dgmjr.AspNetCore.Communication.Abstractions.csproj => Communication/Communication.Abstractions/Dgmjr.Azure.CommunicationServices.Abstractions.csproj} (100%) create mode 100644 src/Communication/Communication.Abstractions/Dgmjr.Azure.CommunicationServices.Abstractions.sln rename src/{ => Communication}/Communication.Abstractions/Enums/MailSendReponseCode.cs (58%) rename src/{ => Communication}/Communication.Abstractions/Enums/SmsSendResponseCode.cs (62%) rename src/{ => Communication}/Communication.Abstractions/IEmailSender.cs (100%) rename src/{ => Communication}/Communication.Abstractions/IMailSendResult.cs (100%) rename src/{ => Communication}/Communication.Abstractions/IMessageSendResult.cs (73%) rename src/{ => Communication}/Communication.Abstractions/ISmsSendResult.cs (100%) rename src/{ => Communication}/Communication.Abstractions/ISmsSender.cs (100%) create mode 100644 src/Communication/Communication.Abstractions/LICENSE.md rename src/{ => Communication}/Communication.Abstractions/MailSendResponseCode.cs (100%) rename src/{ => Communication}/Communication.Abstractions/README.md (100%) rename src/{ => Communication}/Communication.Abstractions/SmsSendResponseCode.cs (100%) create mode 100644 src/Communication/Communication.Abstractions/icon.png delete mode 100644 src/Communication/Dgmjr.AspNetCore.Communication.sln delete mode 100644 src/Communication/Sms/SmsSendResult.cs create mode 100644 src/Configuration/Builder/WebApplicationBuilderFacade.cs create mode 100644 src/Configuration/DependencyInjection/BuildIHostApplicationBuilderExtension.cs rename src/{Communication.Abstractions => Controllers.Abstractions}/icon.png (100%) rename src/{Communication => Hosting.Extensions}/icon.png (100%) create mode 100644 src/Http/CorrelationIdAutoConfigurator/Dgmjr.Http.CorrelationId.cs create mode 100644 src/Middleware/RequestLogging/icon.png create mode 100644 src/TagHelpers/Bootstrap/Code/TypeName.cs create mode 100644 src/TagHelpers/Constants/TagHelperConstants.AttributeNames.cs rename src/TagHelpers/{TagHelperConstants.cs => Constants/TagHelperConstants.CssClasses.cs} (70%) create mode 100644 src/TagHelpers/Constants/TagHelperConstants.TagNames.cs create mode 100644 src/TagHelpers/Constants/TagHelperConstants.TagPrefixes.cs create mode 100644 src/TagHelpers/Constants/TagHelperConstants.cs create mode 100644 src/TagHelpers/Resources/HighlightCode.js create mode 100644 src/TagHelpers/Resources/code.css diff --git a/src/Communication.Abstractions/Dgmjr.AspNetCore.Communication.Abstractions.sln b/src/Communication.Abstractions/Dgmjr.AspNetCore.Communication.Abstractions.sln deleted file mode 100644 index 04d4675c..00000000 --- a/src/Communication.Abstractions/Dgmjr.AspNetCore.Communication.Abstractions.sln +++ /dev/null @@ -1,42 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B283EBC2-E01F-412D-9339-FD56EF114549}" - ProjectSection(SolutionItems) = preProject - ..\..\Directory.Build.props = ..\..\Directory.Build.props - ..\..\..\..\Directory.Build.targets = ..\..\..\..\Directory.Build.targets - ..\..\..\..\global.json = ..\..\..\..\global.json - ..\..\..\..\Packages\Versions.Local.props = ..\..\..\..\Packages\Versions.Local.props - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.AspNetCore.Communication.Abstractions", "Dgmjr.AspNetCore.Communication.Abstractions.csproj", "{3B567DE2-8008-43B6-B04C-20586C7F30CF}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Local|Any CPU = Local|Any CPU - Debug|Any CPU = Debug|Any CPU - Testing|Any CPU = Testing|Any CPU - Staging|Any CPU = Staging|Any CPU - Production|Any CPU = Production|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {3B567DE2-8008-43B6-B04C-20586C7F30CF}.Local|Any CPU.ActiveCfg = Local|Any CPU - {3B567DE2-8008-43B6-B04C-20586C7F30CF}.Local|Any CPU.Build.0 = Local|Any CPU - {3B567DE2-8008-43B6-B04C-20586C7F30CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3B567DE2-8008-43B6-B04C-20586C7F30CF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3B567DE2-8008-43B6-B04C-20586C7F30CF}.Testing|Any CPU.ActiveCfg = Testing|Any CPU - {3B567DE2-8008-43B6-B04C-20586C7F30CF}.Testing|Any CPU.Build.0 = Testing|Any CPU - {3B567DE2-8008-43B6-B04C-20586C7F30CF}.Staging|Any CPU.ActiveCfg = Staging|Any CPU - {3B567DE2-8008-43B6-B04C-20586C7F30CF}.Staging|Any CPU.Build.0 = Staging|Any CPU - {3B567DE2-8008-43B6-B04C-20586C7F30CF}.Production|Any CPU.ActiveCfg = Local|Any CPU - {3B567DE2-8008-43B6-B04C-20586C7F30CF}.Production|Any CPU.Build.0 = Local|Any CPU - {3B567DE2-8008-43B6-B04C-20586C7F30CF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3B567DE2-8008-43B6-B04C-20586C7F30CF}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {F12DE833-DBD0-4D15-B0CC-14B581964C28} - EndGlobalSection -EndGlobal diff --git a/src/Communication/.vscode/settings.json b/src/Communication/.vscode/settings.json new file mode 100644 index 00000000..9d904b84 --- /dev/null +++ b/src/Communication/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "sonarlint.connectedMode.project": { + "connectionId": "dgmjr-io", + "projectKey": "dgmjr-io_Dgmjr.Communication" + } +} \ No newline at end of file diff --git a/src/Communication/All/Dgmjr.Azure.CommunicationServices.All.csproj b/src/Communication/All/Dgmjr.Azure.CommunicationServices.All.csproj new file mode 100644 index 00000000..84b8b932 --- /dev/null +++ b/src/Communication/All/Dgmjr.Azure.CommunicationServices.All.csproj @@ -0,0 +1,21 @@ + + + + + $(TargetedDotNetFrameworks) + + + + + + diff --git a/src/Communication/All/Dgmjr.Azure.CommunicationServices.All.sln b/src/Communication/All/Dgmjr.Azure.CommunicationServices.All.sln new file mode 100644 index 00000000..b7b7eab6 --- /dev/null +++ b/src/Communication/All/Dgmjr.Azure.CommunicationServices.All.sln @@ -0,0 +1,70 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B283EBC2-E01F-412D-9339-FD56EF114549}" + ProjectSection(SolutionItems) = preProject + ..\..\..\Directory.Build.props = ..\..\..\Directory.Build.props + ..\..\..\..\..\Directory.Build.targets = ..\..\..\..\..\Directory.Build.targets + ..\..\..\..\..\global.json = ..\..\..\..\..\global.json + ..\..\..\..\..\Packages\Versions.Local.props = ..\..\..\..\..\Packages\Versions.Local.props + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Azure.CommunicationServices", "..\Communcation\Dgmjr.Azure.CommunicationServices.csproj", "{3D36177C-5640-4BA3-86FD-7E73A849EC55}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Azure.CommunicationServices.Abstractions", "..\Communication.Abstractions\Dgmjr.Azure.CommunicationServices.Abstractions.csproj", "{8C663B7A-804D-457E-ADCB-5AAF9390387F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Azure.CommunicationServices.All", "Dgmjr.Azure.CommunicationServices.All.csproj", "{F8812B66-F966-497B-9777-752226D538FC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Local|Any CPU = Local|Any CPU + Debug|Any CPU = Debug|Any CPU + Testing|Any CPU = Testing|Any CPU + Staging|Any CPU = Staging|Any CPU + Production|Any CPU = Production|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Local|Any CPU.ActiveCfg = Local|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Local|Any CPU.Build.0 = Local|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Testing|Any CPU.Build.0 = Testing|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Staging|Any CPU.Build.0 = Staging|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Production|Any CPU.ActiveCfg = Local|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Production|Any CPU.Build.0 = Local|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Release|Any CPU.Build.0 = Release|Any CPU + {8C663B7A-804D-457E-ADCB-5AAF9390387F}.Local|Any CPU.ActiveCfg = Local|Any CPU + {8C663B7A-804D-457E-ADCB-5AAF9390387F}.Local|Any CPU.Build.0 = Local|Any CPU + {8C663B7A-804D-457E-ADCB-5AAF9390387F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8C663B7A-804D-457E-ADCB-5AAF9390387F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C663B7A-804D-457E-ADCB-5AAF9390387F}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {8C663B7A-804D-457E-ADCB-5AAF9390387F}.Testing|Any CPU.Build.0 = Testing|Any CPU + {8C663B7A-804D-457E-ADCB-5AAF9390387F}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {8C663B7A-804D-457E-ADCB-5AAF9390387F}.Staging|Any CPU.Build.0 = Staging|Any CPU + {8C663B7A-804D-457E-ADCB-5AAF9390387F}.Production|Any CPU.ActiveCfg = Local|Any CPU + {8C663B7A-804D-457E-ADCB-5AAF9390387F}.Production|Any CPU.Build.0 = Local|Any CPU + {8C663B7A-804D-457E-ADCB-5AAF9390387F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8C663B7A-804D-457E-ADCB-5AAF9390387F}.Release|Any CPU.Build.0 = Release|Any CPU + {F8812B66-F966-497B-9777-752226D538FC}.Local|Any CPU.ActiveCfg = Local|Any CPU + {F8812B66-F966-497B-9777-752226D538FC}.Local|Any CPU.Build.0 = Local|Any CPU + {F8812B66-F966-497B-9777-752226D538FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8812B66-F966-497B-9777-752226D538FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8812B66-F966-497B-9777-752226D538FC}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {F8812B66-F966-497B-9777-752226D538FC}.Testing|Any CPU.Build.0 = Testing|Any CPU + {F8812B66-F966-497B-9777-752226D538FC}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {F8812B66-F966-497B-9777-752226D538FC}.Staging|Any CPU.Build.0 = Staging|Any CPU + {F8812B66-F966-497B-9777-752226D538FC}.Production|Any CPU.ActiveCfg = Local|Any CPU + {F8812B66-F966-497B-9777-752226D538FC}.Production|Any CPU.Build.0 = Local|Any CPU + {F8812B66-F966-497B-9777-752226D538FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8812B66-F966-497B-9777-752226D538FC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BA9DF526-DE32-44E2-A6AB-12A4E855F480} + EndGlobalSection +EndGlobal diff --git a/src/Communication.Abstractions/LICENSE.md b/src/Communication/All/LICENSE.md similarity index 100% rename from src/Communication.Abstractions/LICENSE.md rename to src/Communication/All/LICENSE.md diff --git a/src/Communication/All/icon.png b/src/Communication/All/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..df642aaf558a656b4c9d63f434503f97b0bc8a15 GIT binary patch literal 95269 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 aWBSZuF?6Enbpt^A-M?pk7q931&;J9|Boti$ literal 0 HcmV?d00001 diff --git a/src/Communication/AzureCommunicationServicesAutoConfigurator.cs b/src/Communication/Communcation/AzureCommunicationServicesAutoConfigurator.cs similarity index 96% rename from src/Communication/AzureCommunicationServicesAutoConfigurator.cs rename to src/Communication/Communcation/AzureCommunicationServicesAutoConfigurator.cs index 3de996e6..88e54e11 100644 --- a/src/Communication/AzureCommunicationServicesAutoConfigurator.cs +++ b/src/Communication/Communcation/AzureCommunicationServicesAutoConfigurator.cs @@ -48,7 +48,7 @@ public void Configure(IApplicationBuilder builder) } } - public void Configure(IHostApplicationBuilder builder) + public void Configure(WebApplicationBuilder builder) { var optionsSection = builder.Configuration.GetSection( AzureCommunicationServicesOptionsBase.ConfigurationSectionName diff --git a/src/Communication/AzureCommunicationServicesOptions.cs b/src/Communication/Communcation/AzureCommunicationServicesOptions.cs similarity index 100% rename from src/Communication/AzureCommunicationServicesOptions.cs rename to src/Communication/Communcation/AzureCommunicationServicesOptions.cs diff --git a/src/Communication/Dgmjr.AspNetCore.Communication.csproj b/src/Communication/Communcation/Dgmjr.Azure.CommunicationServices.csproj similarity index 86% rename from src/Communication/Dgmjr.AspNetCore.Communication.csproj rename to src/Communication/Communcation/Dgmjr.Azure.CommunicationServices.csproj index 73cbf1a5..9d37bc79 100644 --- a/src/Communication/Dgmjr.AspNetCore.Communication.csproj +++ b/src/Communication/Communcation/Dgmjr.Azure.CommunicationServices.csproj @@ -16,6 +16,7 @@ comms true $(TargetedDotNetFrameworks) + 3d36177c-5640-4ba3-86fd-7e73a849ec55 @@ -24,16 +25,19 @@ - - - + - + + + + + + diff --git a/src/Communication/Communcation/Dgmjr.Azure.CommunicationServices.sln b/src/Communication/Communcation/Dgmjr.Azure.CommunicationServices.sln new file mode 100644 index 00000000..b96e1774 --- /dev/null +++ b/src/Communication/Communcation/Dgmjr.Azure.CommunicationServices.sln @@ -0,0 +1,56 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B283EBC2-E01F-412D-9339-FD56EF114549}" + ProjectSection(SolutionItems) = preProject + ..\..\..\Directory.Build.props = ..\..\..\Directory.Build.props + ..\..\..\..\..\Directory.Build.targets = ..\..\..\..\..\Directory.Build.targets + ..\..\..\..\..\global.json = ..\..\..\..\..\global.json + ..\..\..\..\..\Packages\Versions.Local.props = ..\..\..\..\..\Packages\Versions.Local.props + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Azure.CommunicationServices.Abstractions", "..\Communication.Abstractions\Dgmjr.Azure.CommunicationServices.Abstractions.csproj", "{0A4E64AB-8215-49F8-A5E9-64DA4BF48C87}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Azure.CommunicationServices", "Dgmjr.Azure.CommunicationServices.csproj", "{3D36177C-5640-4BA3-86FD-7E73A849EC55}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Local|Any CPU = Local|Any CPU + Debug|Any CPU = Debug|Any CPU + Testing|Any CPU = Testing|Any CPU + Staging|Any CPU = Staging|Any CPU + Production|Any CPU = Production|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0A4E64AB-8215-49F8-A5E9-64DA4BF48C87}.Local|Any CPU.ActiveCfg = Local|Any CPU + {0A4E64AB-8215-49F8-A5E9-64DA4BF48C87}.Local|Any CPU.Build.0 = Local|Any CPU + {0A4E64AB-8215-49F8-A5E9-64DA4BF48C87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0A4E64AB-8215-49F8-A5E9-64DA4BF48C87}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0A4E64AB-8215-49F8-A5E9-64DA4BF48C87}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {0A4E64AB-8215-49F8-A5E9-64DA4BF48C87}.Testing|Any CPU.Build.0 = Testing|Any CPU + {0A4E64AB-8215-49F8-A5E9-64DA4BF48C87}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {0A4E64AB-8215-49F8-A5E9-64DA4BF48C87}.Staging|Any CPU.Build.0 = Staging|Any CPU + {0A4E64AB-8215-49F8-A5E9-64DA4BF48C87}.Production|Any CPU.ActiveCfg = Local|Any CPU + {0A4E64AB-8215-49F8-A5E9-64DA4BF48C87}.Production|Any CPU.Build.0 = Local|Any CPU + {0A4E64AB-8215-49F8-A5E9-64DA4BF48C87}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0A4E64AB-8215-49F8-A5E9-64DA4BF48C87}.Release|Any CPU.Build.0 = Release|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Local|Any CPU.ActiveCfg = Local|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Local|Any CPU.Build.0 = Local|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Testing|Any CPU.Build.0 = Testing|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Staging|Any CPU.Build.0 = Staging|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Production|Any CPU.ActiveCfg = Local|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Production|Any CPU.Build.0 = Local|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D36177C-5640-4BA3-86FD-7E73A849EC55}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {991D96AC-24E8-4358-9F0C-99BE9D5C3BE5} + EndGlobalSection +EndGlobal diff --git a/src/Communication/Email/EmailSender.cs b/src/Communication/Communcation/Email/EmailSender.cs similarity index 100% rename from src/Communication/Email/EmailSender.cs rename to src/Communication/Communcation/Email/EmailSender.cs diff --git a/src/Communication/Email/EmailSenderOptions.cs b/src/Communication/Communcation/Email/EmailSenderOptions.cs similarity index 88% rename from src/Communication/Email/EmailSenderOptions.cs rename to src/Communication/Communcation/Email/EmailSenderOptions.cs index 018258d7..736a93d5 100644 --- a/src/Communication/Email/EmailSenderOptions.cs +++ b/src/Communication/Communcation/Email/EmailSenderOptions.cs @@ -22,7 +22,8 @@ public record class EmailSenderOptions : AzureCommunicationServicesOptions options) : base(options) { @@ -51,11 +50,9 @@ public EmailSenderOptions(AzureCommunicationServicesOptions option SecurityFrom = options.SecurityFrom; } - [SetsRequiredMembers] public EmailSenderOptions(string connectionString, EmailAddress? defaultFrom = null) : this(Parse(connectionString) with { DefaultFrom = defaultFrom ?? EmailAddress.Empty }) { } - [SetsRequiredMembers] public EmailSenderOptions(string endpoint, string accessKey, EmailAddress? defaultFrom = null) { DefaultFrom = defaultFrom ?? EmailAddress.Empty; @@ -63,7 +60,9 @@ public EmailSenderOptions(string endpoint, string accessKey, EmailAddress? defau AccessKey = accessKey; } - [SetsRequiredMembers] public EmailSenderOptions() : this(EmptyValue) { } + + public IDictionary Addresses { get; set; } = + new Dictionary(); } diff --git a/src/Communication/Email/MailSendResult.cs b/src/Communication/Communcation/Email/MailSendResult.cs similarity index 59% rename from src/Communication/Email/MailSendResult.cs rename to src/Communication/Communcation/Email/MailSendResult.cs index 6e1d8020..749937c5 100644 --- a/src/Communication/Email/MailSendResult.cs +++ b/src/Communication/Communcation/Email/MailSendResult.cs @@ -1,18 +1,19 @@ namespace Dgmjr.AspNetCore.Communication.Email; +using System.Runtime.CompilerServices; + /// /// Represents the result of sending an email. /// -public readonly record struct MailSendResult : IMailSendResult +public readonly record struct MailSendResult(Azure.Communication.Email.EmailSendResult result) + : IMailSendResult { /// /// Gets or sets the response code of the email send result. /// - public Abstractions.IMailSendResponseCode Status - { - get => MailSendResponseCode.FromId(StatusCode)!; - init => StatusCode = ((IIdentifiable)value).Id; - } + public Abstractions.IMailSendResponseCode Status => MailSendResponseCode.Parse(StatusName); + + public string StatusName => result.Status.ToString(); /// /// Gets a value indicating whether the email send operation was successful. @@ -24,5 +25,5 @@ public Abstractions.IMailSendResponseCode Status /// /// Gets or sets the status code of the email send result. /// - public int StatusCode { get; init; } + public int StatusCode => ((IIdentifiable)Status).Id; } diff --git a/src/Communication/LICENSE.md b/src/Communication/Communcation/LICENSE.md similarity index 100% rename from src/Communication/LICENSE.md rename to src/Communication/Communcation/LICENSE.md diff --git a/src/Communication/Communcation/Sms/SmsSendResult.cs b/src/Communication/Communcation/Sms/SmsSendResult.cs new file mode 100644 index 00000000..026b8e4c --- /dev/null +++ b/src/Communication/Communcation/Sms/SmsSendResult.cs @@ -0,0 +1,34 @@ +namespace Dgmjr.AspNetCore.Communication.Sms; + +/// +/// Represents the result of sending an SMS message. +/// +public readonly record struct SmsSendResult(Azure.Communication.Sms.SmsSendResult result) + : ISmsSendResult +{ + // public SmsSendResult + // { + // StatusCode = result.HttpStatusCode; + // ErrorMessage = result.ErrorMessage; + // To = (PhoneNumber)result.To; + // } + + public string? ErrorMessage => result.ErrorMessage; + public PhoneNumber To => (PhoneNumber)result.To; + + /// + /// Gets the status code of the message send result. + /// + public int StatusCode => result.HttpStatusCode; + + /// + /// Gets a value indicating whether the SMS message was sent successfully. + /// + public bool IsSuccess => + StatusCode is SmsSendResponseCode.Success.Id or SmsSendResponseCode.Accepted.Id; + + /// + /// Gets or sets the response code of the SMS send result. + /// + public Abstractions.ISmsSendResponseCode Status => SmsSendResponseCode.FromId(StatusCode); +} diff --git a/src/Communication/Sms/SmsSender.cs b/src/Communication/Communcation/Sms/SmsSender.cs similarity index 100% rename from src/Communication/Sms/SmsSender.cs rename to src/Communication/Communcation/Sms/SmsSender.cs diff --git a/src/Communication/Sms/SmsSenderOptions.cs b/src/Communication/Communcation/Sms/SmsSenderOptions.cs similarity index 91% rename from src/Communication/Sms/SmsSenderOptions.cs rename to src/Communication/Communcation/Sms/SmsSenderOptions.cs index 43969970..0c6593ba 100644 --- a/src/Communication/Sms/SmsSenderOptions.cs +++ b/src/Communication/Communcation/Sms/SmsSenderOptions.cs @@ -62,4 +62,7 @@ public SmsSenderOptions(string connectionString, PhoneNumber? fromPhoneNumber) { DefaultFrom = fromPhoneNumber.HasValue ? fromPhoneNumber.Value : PhoneNumber.Empty; } + + public IDictionary Numbers { get; set; } = + new Dictionary(); } diff --git a/src/Communication/Communcation/icon.png b/src/Communication/Communcation/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..df642aaf558a656b4c9d63f434503f97b0bc8a15 GIT binary patch literal 95269 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 aWBSZuF?6Enbpt^A-M?pk7q931&;J9|Boti$ literal 0 HcmV?d00001 diff --git a/src/Communication.Abstractions/Dgmjr.AspNetCore.Communication.Abstractions.csproj b/src/Communication/Communication.Abstractions/Dgmjr.Azure.CommunicationServices.Abstractions.csproj similarity index 100% rename from src/Communication.Abstractions/Dgmjr.AspNetCore.Communication.Abstractions.csproj rename to src/Communication/Communication.Abstractions/Dgmjr.Azure.CommunicationServices.Abstractions.csproj diff --git a/src/Communication/Communication.Abstractions/Dgmjr.Azure.CommunicationServices.Abstractions.sln b/src/Communication/Communication.Abstractions/Dgmjr.Azure.CommunicationServices.Abstractions.sln new file mode 100644 index 00000000..e97b9fd3 --- /dev/null +++ b/src/Communication/Communication.Abstractions/Dgmjr.Azure.CommunicationServices.Abstractions.sln @@ -0,0 +1,42 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B283EBC2-E01F-412D-9339-FD56EF114549}" + ProjectSection(SolutionItems) = preProject + ..\..\..\Directory.Build.props = ..\..\..\Directory.Build.props + ..\..\..\..\..\Directory.Build.targets = ..\..\..\..\..\Directory.Build.targets + ..\..\..\..\..\global.json = ..\..\..\..\..\global.json + ..\..\..\..\..\Packages\Versions.Local.props = ..\..\..\..\..\Packages\Versions.Local.props + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Azure.CommunicationServices.Abstractions", "Dgmjr.Azure.CommunicationServices.Abstractions.csproj", "{26882AB4-6533-4957-9F15-7B966FDEA4BC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Local|Any CPU = Local|Any CPU + Debug|Any CPU = Debug|Any CPU + Testing|Any CPU = Testing|Any CPU + Staging|Any CPU = Staging|Any CPU + Production|Any CPU = Production|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {26882AB4-6533-4957-9F15-7B966FDEA4BC}.Local|Any CPU.ActiveCfg = Local|Any CPU + {26882AB4-6533-4957-9F15-7B966FDEA4BC}.Local|Any CPU.Build.0 = Local|Any CPU + {26882AB4-6533-4957-9F15-7B966FDEA4BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {26882AB4-6533-4957-9F15-7B966FDEA4BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {26882AB4-6533-4957-9F15-7B966FDEA4BC}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {26882AB4-6533-4957-9F15-7B966FDEA4BC}.Testing|Any CPU.Build.0 = Testing|Any CPU + {26882AB4-6533-4957-9F15-7B966FDEA4BC}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {26882AB4-6533-4957-9F15-7B966FDEA4BC}.Staging|Any CPU.Build.0 = Staging|Any CPU + {26882AB4-6533-4957-9F15-7B966FDEA4BC}.Production|Any CPU.ActiveCfg = Local|Any CPU + {26882AB4-6533-4957-9F15-7B966FDEA4BC}.Production|Any CPU.Build.0 = Local|Any CPU + {26882AB4-6533-4957-9F15-7B966FDEA4BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {26882AB4-6533-4957-9F15-7B966FDEA4BC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7BD0ECFE-3F2C-4425-AEB8-E2AA398925B1} + EndGlobalSection +EndGlobal diff --git a/src/Communication.Abstractions/Enums/MailSendReponseCode.cs b/src/Communication/Communication.Abstractions/Enums/MailSendReponseCode.cs similarity index 58% rename from src/Communication.Abstractions/Enums/MailSendReponseCode.cs rename to src/Communication/Communication.Abstractions/Enums/MailSendReponseCode.cs index 25533e38..3bf56a05 100644 --- a/src/Communication.Abstractions/Enums/MailSendReponseCode.cs +++ b/src/Communication/Communication.Abstractions/Enums/MailSendReponseCode.cs @@ -13,9 +13,27 @@ namespace Dgmjr.AspNetCore.Communication.Email.Enums; [GenerateEnumerationRecordStruct("MailSendResponseCode", "Dgmjr.AspNetCore.Communication.Email")] public enum MailSendResponseCode { + [Display( + Name = "Succeeded", + Description = "The request was successful and the message has been queued for delivery." + )] Succeeded = 200, + + [Display( + Name = "Accepted", + Description = "The request was successful and the message has been accepted to be queued for delivery." + )] NotStarted = 201, + + [Display( + Name = "Running", + Description = "The request is running and the message is being sent" + )] Running = 202, + + [Display(Name = "Cancelled", Description = "The request has been cancelled.")] Canceled = 406, + + [Display(Name = "Failed", Description = "The request failed.")] Failed = 500 } diff --git a/src/Communication.Abstractions/Enums/SmsSendResponseCode.cs b/src/Communication/Communication.Abstractions/Enums/SmsSendResponseCode.cs similarity index 62% rename from src/Communication.Abstractions/Enums/SmsSendResponseCode.cs rename to src/Communication/Communication.Abstractions/Enums/SmsSendResponseCode.cs index 446ce9b6..0cf8afce 100644 --- a/src/Communication.Abstractions/Enums/SmsSendResponseCode.cs +++ b/src/Communication/Communication.Abstractions/Enums/SmsSendResponseCode.cs @@ -19,35 +19,54 @@ public enum SmsSendResponseCode /// /// The request was successful and the message has been queued for delivery. /// + [Display( + Name = "Success", + Description = "The request was successful and the message has been queued for delivery." + )] Success = 200, /// /// The request was successful and the message has been accepted to be queued for delivery. /// + [Display( + Name = "Accepted", + Description = "The request was successful and the message has been accepted to be queued for delivery." + )] Accepted = 250, /// /// There was a problem with the request, such as invalid parameters or authentication failure. /// + [Display( + Name = "Bad Request", + Description = "There was a problem with the request, such as invalid parameters or authentication failure." + )] BadRequest = 400, /// /// Authentication failure. The request requires authentication and the provided credentials were incorrect. /// + [Display( + Name = "Unauthorized", + Description = "Authentication failure. The request requires authentication and the provided credentials were incorrect." + )] Unauthorized = 401, /// /// Access to the requested resource is forbidden. /// + [Display(Name = "Forbidden", Description = "Access to the requested resource is forbidden.")] Forbidden = 403, /// /// The requested resource could not be found. /// + [Display(Name = "Not Found", Description = "The requested resource could not be found.")] NotFound = 404, /// /// An internal server error occurred. /// + [Display(Name = "Internal Server Error", Description = "An internal server error occurred.")] InternalServerError = 500 } diff --git a/src/Communication.Abstractions/IEmailSender.cs b/src/Communication/Communication.Abstractions/IEmailSender.cs similarity index 100% rename from src/Communication.Abstractions/IEmailSender.cs rename to src/Communication/Communication.Abstractions/IEmailSender.cs diff --git a/src/Communication.Abstractions/IMailSendResult.cs b/src/Communication/Communication.Abstractions/IMailSendResult.cs similarity index 100% rename from src/Communication.Abstractions/IMailSendResult.cs rename to src/Communication/Communication.Abstractions/IMailSendResult.cs diff --git a/src/Communication.Abstractions/IMessageSendResult.cs b/src/Communication/Communication.Abstractions/IMessageSendResult.cs similarity index 73% rename from src/Communication.Abstractions/IMessageSendResult.cs rename to src/Communication/Communication.Abstractions/IMessageSendResult.cs index 2987fb72..42f7f679 100644 --- a/src/Communication.Abstractions/IMessageSendResult.cs +++ b/src/Communication/Communication.Abstractions/IMessageSendResult.cs @@ -3,11 +3,11 @@ namespace Dgmjr.AspNetCore.Communication; public interface IMessageSendResult { bool IsSuccess { get; } - int StatusCode { get; init; } + int StatusCode { get; } } public interface IMessageSendResult : IMessageSendResult where TStatus : IIdentifiable { - TStatus Status { get; init; } + TStatus Status { get; } } diff --git a/src/Communication.Abstractions/ISmsSendResult.cs b/src/Communication/Communication.Abstractions/ISmsSendResult.cs similarity index 100% rename from src/Communication.Abstractions/ISmsSendResult.cs rename to src/Communication/Communication.Abstractions/ISmsSendResult.cs diff --git a/src/Communication.Abstractions/ISmsSender.cs b/src/Communication/Communication.Abstractions/ISmsSender.cs similarity index 100% rename from src/Communication.Abstractions/ISmsSender.cs rename to src/Communication/Communication.Abstractions/ISmsSender.cs diff --git a/src/Communication/Communication.Abstractions/LICENSE.md b/src/Communication/Communication.Abstractions/LICENSE.md new file mode 100644 index 00000000..4f592f86 --- /dev/null +++ b/src/Communication/Communication.Abstractions/LICENSE.md @@ -0,0 +1,35 @@ +--- +date: 2023-07-13T05:44:46:00-05:00Z +description: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files, yadda, yadda, yadda... +keywords: +- IP +- copyright +- license +- mit +permissions: +- commercial-use +- modifications +- distribution +- private-use +conditions: +- include-copyright +limitations: +- liability +- warranty +lastmod: 2024-01-0T00:39:00.0000+05:00Z +license: MIT +slug: mit-license +title: MIT License +type: license +--- + +# MIT License + +## Copyright © 2022-2024 [David G. Moore, Jr.](mailto:david@dgmjr.io "Send Dr. Moore") ([@dgmjr](https://github.com/dgmjr "Contact Dr. Moore on GitHub")), All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/src/Communication.Abstractions/MailSendResponseCode.cs b/src/Communication/Communication.Abstractions/MailSendResponseCode.cs similarity index 100% rename from src/Communication.Abstractions/MailSendResponseCode.cs rename to src/Communication/Communication.Abstractions/MailSendResponseCode.cs diff --git a/src/Communication.Abstractions/README.md b/src/Communication/Communication.Abstractions/README.md similarity index 100% rename from src/Communication.Abstractions/README.md rename to src/Communication/Communication.Abstractions/README.md diff --git a/src/Communication.Abstractions/SmsSendResponseCode.cs b/src/Communication/Communication.Abstractions/SmsSendResponseCode.cs similarity index 100% rename from src/Communication.Abstractions/SmsSendResponseCode.cs rename to src/Communication/Communication.Abstractions/SmsSendResponseCode.cs diff --git a/src/Communication/Communication.Abstractions/icon.png b/src/Communication/Communication.Abstractions/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..df642aaf558a656b4c9d63f434503f97b0bc8a15 GIT binary patch literal 95269 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 aWBSZuF?6Enbpt^A-M?pk7q931&;J9|Boti$ literal 0 HcmV?d00001 diff --git a/src/Communication/Dgmjr.AspNetCore.Communication.sln b/src/Communication/Dgmjr.AspNetCore.Communication.sln deleted file mode 100644 index 7bacf8b5..00000000 --- a/src/Communication/Dgmjr.AspNetCore.Communication.sln +++ /dev/null @@ -1,56 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B283EBC2-E01F-412D-9339-FD56EF114549}" - ProjectSection(SolutionItems) = preProject - ..\..\Directory.Build.props = ..\..\Directory.Build.props - ..\..\..\..\Directory.Build.targets = ..\..\..\..\Directory.Build.targets - ..\..\..\..\global.json = ..\..\..\..\global.json - ..\..\..\..\Packages\Versions.Local.props = ..\..\..\..\Packages\Versions.Local.props - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.AspNetCore.Communication.Abstractions", "..\Communication.Abstractions\Dgmjr.AspNetCore.Communication.Abstractions.csproj", "{A21EC7BB-E229-4D5F-98BE-194738D8505B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.AspNetCore.Communication", "Dgmjr.AspNetCore.Communication.csproj", "{A6082934-C897-4FE1-85CA-AFBDB3EDE272}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Local|Any CPU = Local|Any CPU - Debug|Any CPU = Debug|Any CPU - Testing|Any CPU = Testing|Any CPU - Staging|Any CPU = Staging|Any CPU - Production|Any CPU = Production|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A21EC7BB-E229-4D5F-98BE-194738D8505B}.Local|Any CPU.ActiveCfg = Local|Any CPU - {A21EC7BB-E229-4D5F-98BE-194738D8505B}.Local|Any CPU.Build.0 = Local|Any CPU - {A21EC7BB-E229-4D5F-98BE-194738D8505B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A21EC7BB-E229-4D5F-98BE-194738D8505B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A21EC7BB-E229-4D5F-98BE-194738D8505B}.Testing|Any CPU.ActiveCfg = Testing|Any CPU - {A21EC7BB-E229-4D5F-98BE-194738D8505B}.Testing|Any CPU.Build.0 = Testing|Any CPU - {A21EC7BB-E229-4D5F-98BE-194738D8505B}.Staging|Any CPU.ActiveCfg = Staging|Any CPU - {A21EC7BB-E229-4D5F-98BE-194738D8505B}.Staging|Any CPU.Build.0 = Staging|Any CPU - {A21EC7BB-E229-4D5F-98BE-194738D8505B}.Production|Any CPU.ActiveCfg = Local|Any CPU - {A21EC7BB-E229-4D5F-98BE-194738D8505B}.Production|Any CPU.Build.0 = Local|Any CPU - {A21EC7BB-E229-4D5F-98BE-194738D8505B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A21EC7BB-E229-4D5F-98BE-194738D8505B}.Release|Any CPU.Build.0 = Release|Any CPU - {A6082934-C897-4FE1-85CA-AFBDB3EDE272}.Local|Any CPU.ActiveCfg = Local|Any CPU - {A6082934-C897-4FE1-85CA-AFBDB3EDE272}.Local|Any CPU.Build.0 = Local|Any CPU - {A6082934-C897-4FE1-85CA-AFBDB3EDE272}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A6082934-C897-4FE1-85CA-AFBDB3EDE272}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A6082934-C897-4FE1-85CA-AFBDB3EDE272}.Testing|Any CPU.ActiveCfg = Testing|Any CPU - {A6082934-C897-4FE1-85CA-AFBDB3EDE272}.Testing|Any CPU.Build.0 = Testing|Any CPU - {A6082934-C897-4FE1-85CA-AFBDB3EDE272}.Staging|Any CPU.ActiveCfg = Staging|Any CPU - {A6082934-C897-4FE1-85CA-AFBDB3EDE272}.Staging|Any CPU.Build.0 = Staging|Any CPU - {A6082934-C897-4FE1-85CA-AFBDB3EDE272}.Production|Any CPU.ActiveCfg = Local|Any CPU - {A6082934-C897-4FE1-85CA-AFBDB3EDE272}.Production|Any CPU.Build.0 = Local|Any CPU - {A6082934-C897-4FE1-85CA-AFBDB3EDE272}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A6082934-C897-4FE1-85CA-AFBDB3EDE272}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {209DE4E2-342E-4E9E-BC55-C75D87CD1B08} - EndGlobalSection -EndGlobal diff --git a/src/Communication/Sms/SmsSendResult.cs b/src/Communication/Sms/SmsSendResult.cs deleted file mode 100644 index 85fd33a6..00000000 --- a/src/Communication/Sms/SmsSendResult.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace Dgmjr.AspNetCore.Communication.Sms; - -/// -/// Represents the result of sending an SMS message. -/// -public readonly record struct SmsSendResult : ISmsSendResult -{ - public SmsSendResult(Azure.Communication.Sms.SmsSendResult result) - { - StatusCode = result.HttpStatusCode; - ErrorMessage = result.ErrorMessage; - To = (PhoneNumber)result.To; - } - - public string? ErrorMessage { get; init; } - public PhoneNumber To { get; init; } - - /// - /// Gets the status code of the message send result. - /// - public int StatusCode { get; init; } - - /// - /// Gets a value indicating whether the SMS message was sent successfully. - /// - public bool IsSuccess => - StatusCode is SmsSendResponseCode.Success.Id or SmsSendResponseCode.Accepted.Id; - - /// - /// Gets or sets the response code of the SMS send result. - /// - public Abstractions.ISmsSendResponseCode Status - { - get => SmsSendResponseCode.FromId(StatusCode); - init => StatusCode = ((IIdentifiable)value).Id; - } -} diff --git a/src/Configuration/Abstractions/IConfigureIHostApplicationBuilder.cs b/src/Configuration/Abstractions/IConfigureIHostApplicationBuilder.cs index c1bbc85b..fcea03da 100644 --- a/src/Configuration/Abstractions/IConfigureIHostApplicationBuilder.cs +++ b/src/Configuration/Abstractions/IConfigureIHostApplicationBuilder.cs @@ -1,7 +1,9 @@ namespace Dgmjr.Configuration.Extensions; + +using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Hosting; public interface IConfigureIHostApplicationBuilder : IConfigureStuffInOrder { - void Configure(IHostApplicationBuilder builder); + void Configure(WebApplicationBuilder builder); } diff --git a/src/Configuration/Builder/WebApplicationBuilderFacade.cs b/src/Configuration/Builder/WebApplicationBuilderFacade.cs new file mode 100644 index 00000000..280e0fdf --- /dev/null +++ b/src/Configuration/Builder/WebApplicationBuilderFacade.cs @@ -0,0 +1,40 @@ +namespace Dgmjr.Configuration.Extensions.Builder; + +using System; +using System.Collections.Generic; + +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.Metrics; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +internal class WebApplicationBuilderFacade(WebApplicationBuilder wrappedBuilder) + : IHostApplicationBuilder +{ + public IDictionary Properties { get; set; } + + public IConfigurationManager Configuration => wrappedBuilder.Configuration; + + public IHostEnvironment Environment => wrappedBuilder.Environment; + + public ILoggingBuilder Logging => wrappedBuilder.Logging; + + public IMetricsBuilder Metrics { get; set; } + + public IServiceCollection Services => wrappedBuilder.Services; + + public void ConfigureContainer( + IServiceProviderFactory factory, + Action? configure = null + ) + where TContainerBuilder : notnull + { + wrappedBuilder.Host.ConfigureContainer( + (ctx, builder) => configure(builder) + ); + } + + public IApplicationBuilder Build() => wrappedBuilder.Build(); +} diff --git a/src/Configuration/Configurators/JsonFileAutoConfigurator.cs b/src/Configuration/Configurators/JsonFileAutoConfigurator.cs index 3f91a022..a037d86f 100644 --- a/src/Configuration/Configurators/JsonFileAutoConfigurator.cs +++ b/src/Configuration/Configurators/JsonFileAutoConfigurator.cs @@ -1,3 +1,4 @@ +using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -7,7 +8,7 @@ public class JsonFileAutoConfigurator : IConfigureIHostApplicationBuilder { public ConfigurationOrder Order => ConfigurationOrder.VeryEarly; - public void Configure(IHostApplicationBuilder builder) + public void Configure(WebApplicationBuilder builder) { builder.Configuration.AddKeyPerJsonFile( Path.Join(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Configuration") diff --git a/src/Configuration/DependencyInjection/AutoConfigureIApplicationHostBuilderExtensions.cs b/src/Configuration/DependencyInjection/AutoConfigureIApplicationHostBuilderExtensions.cs index 897838e8..3d5fd17f 100644 --- a/src/Configuration/DependencyInjection/AutoConfigureIApplicationHostBuilderExtensions.cs +++ b/src/Configuration/DependencyInjection/AutoConfigureIApplicationHostBuilderExtensions.cs @@ -2,6 +2,7 @@ namespace Microsoft.Extensions.DependencyInjection; using Dgmjr.Configuration.Extensions; +using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; @@ -10,9 +11,7 @@ namespace Microsoft.Extensions.DependencyInjection; public static class AutoConfigureIApplicationHostBuilderExtensions { - public static IHostApplicationBuilder AutoConfigure( - this IHostApplicationBuilder builder - ) + public static WebApplicationBuilder AutoConfigure(this WebApplicationBuilder builder) { builder.Configuration.AddKeyPerJsonFile( Path.Join(Path.GetDirectoryName(typeof(TProgram).Assembly.Location), "./Configuration/") diff --git a/src/Configuration/DependencyInjection/BuildIHostApplicationBuilderExtension.cs b/src/Configuration/DependencyInjection/BuildIHostApplicationBuilderExtension.cs new file mode 100644 index 00000000..f1a927bb --- /dev/null +++ b/src/Configuration/DependencyInjection/BuildIHostApplicationBuilderExtension.cs @@ -0,0 +1,13 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Hosting; + +namespace Microsoft.Extensions.DependencyInjection; + +public static class BuildIHostApplicationBuilderExtension +{ + // public static IApplicationBuilder Build(this IHostApplicationBuilder builder) + // { + // IHostApplicationBuilder builder2 = WebApplication.CreateBuilder(["hello", "world"]); + // var app = (builder as WebApplicationBuilder).Build(); + // } +} diff --git a/src/Configuration/DependencyInjection/KeyPerJsonFileConfigurationExtensions.cs b/src/Configuration/DependencyInjection/KeyPerJsonFileConfigurationExtensions.cs index 830b61d2..c3341566 100644 --- a/src/Configuration/DependencyInjection/KeyPerJsonFileConfigurationExtensions.cs +++ b/src/Configuration/DependencyInjection/KeyPerJsonFileConfigurationExtensions.cs @@ -43,11 +43,13 @@ public static IConfigurationManager AddKeyPerJsonFile( $"Regenerated {AppSettings_Json} with {json.CountLines()} lines and {json.Length} bytes{env.NewLine}{json}" ); - config.AddJsonFile( - Path.Join(directory.FullName, "../" + AppSettings_Json), - false, - reloadOnChange - ); + config + .AddJsonFile( + Path.Join(directory.FullName, "../" + AppSettings_Json), + false, + reloadOnChange + ) + .AddSubstitution(); if (reloadOnChange) { ChangeToken.OnChange( diff --git a/src/Configuration/Dgmjr.Configuration.Extensions.sln b/src/Configuration/Dgmjr.Configuration.Extensions.sln index 1404e75d..1ce76b73 100644 --- a/src/Configuration/Dgmjr.Configuration.Extensions.sln +++ b/src/Configuration/Dgmjr.Configuration.Extensions.sln @@ -8,7 +8,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\..\..\..\Packages\Versions.Local.props = ..\..\..\..\Packages\Versions.Local.props EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Configuration.Extensions", "Dgmjr.Configuration.Extensions.csproj", "{7731DAB8-2AD9-4208-9FAE-50FB445AF0D1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Configuration.Extensions", "Dgmjr.Configuration.Extensions.csproj", "{FED7B3A9-134C-4C0A-B0D4-63932D688AEC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -20,18 +20,18 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7731DAB8-2AD9-4208-9FAE-50FB445AF0D1}.Local|Any CPU.ActiveCfg = Local|Any CPU - {7731DAB8-2AD9-4208-9FAE-50FB445AF0D1}.Local|Any CPU.Build.0 = Local|Any CPU - {7731DAB8-2AD9-4208-9FAE-50FB445AF0D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7731DAB8-2AD9-4208-9FAE-50FB445AF0D1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7731DAB8-2AD9-4208-9FAE-50FB445AF0D1}.Testing|Any CPU.ActiveCfg = Testing|Any CPU - {7731DAB8-2AD9-4208-9FAE-50FB445AF0D1}.Testing|Any CPU.Build.0 = Testing|Any CPU - {7731DAB8-2AD9-4208-9FAE-50FB445AF0D1}.Staging|Any CPU.ActiveCfg = Staging|Any CPU - {7731DAB8-2AD9-4208-9FAE-50FB445AF0D1}.Staging|Any CPU.Build.0 = Staging|Any CPU - {7731DAB8-2AD9-4208-9FAE-50FB445AF0D1}.Production|Any CPU.ActiveCfg = Local|Any CPU - {7731DAB8-2AD9-4208-9FAE-50FB445AF0D1}.Production|Any CPU.Build.0 = Local|Any CPU - {7731DAB8-2AD9-4208-9FAE-50FB445AF0D1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7731DAB8-2AD9-4208-9FAE-50FB445AF0D1}.Release|Any CPU.Build.0 = Release|Any CPU + {FED7B3A9-134C-4C0A-B0D4-63932D688AEC}.Local|Any CPU.ActiveCfg = Local|Any CPU + {FED7B3A9-134C-4C0A-B0D4-63932D688AEC}.Local|Any CPU.Build.0 = Local|Any CPU + {FED7B3A9-134C-4C0A-B0D4-63932D688AEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FED7B3A9-134C-4C0A-B0D4-63932D688AEC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FED7B3A9-134C-4C0A-B0D4-63932D688AEC}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {FED7B3A9-134C-4C0A-B0D4-63932D688AEC}.Testing|Any CPU.Build.0 = Testing|Any CPU + {FED7B3A9-134C-4C0A-B0D4-63932D688AEC}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {FED7B3A9-134C-4C0A-B0D4-63932D688AEC}.Staging|Any CPU.Build.0 = Staging|Any CPU + {FED7B3A9-134C-4C0A-B0D4-63932D688AEC}.Production|Any CPU.ActiveCfg = Local|Any CPU + {FED7B3A9-134C-4C0A-B0D4-63932D688AEC}.Production|Any CPU.Build.0 = Local|Any CPU + {FED7B3A9-134C-4C0A-B0D4-63932D688AEC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FED7B3A9-134C-4C0A-B0D4-63932D688AEC}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Communication.Abstractions/icon.png b/src/Controllers.Abstractions/icon.png similarity index 100% rename from src/Communication.Abstractions/icon.png rename to src/Controllers.Abstractions/icon.png diff --git a/src/DownstreamApis/Dgmjr.Web.DownstreamApis.csproj b/src/DownstreamApis/Dgmjr.Web.DownstreamApis.csproj index dee055cb..7ca2ec25 100644 --- a/src/DownstreamApis/Dgmjr.Web.DownstreamApis.csproj +++ b/src/DownstreamApis/Dgmjr.Web.DownstreamApis.csproj @@ -1,3 +1,15 @@ + + 0eb63fc8-4d68-471c-bf25-ff7fbe57a33f @@ -15,6 +27,9 @@ + + + diff --git a/src/DownstreamApis/Dgmjr.Web.DownstreamApis.sln b/src/DownstreamApis/Dgmjr.Web.DownstreamApis.sln index 43e49a13..25059298 100644 --- a/src/DownstreamApis/Dgmjr.Web.DownstreamApis.sln +++ b/src/DownstreamApis/Dgmjr.Web.DownstreamApis.sln @@ -8,6 +8,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\..\..\..\Packages\Versions.Local.props = ..\..\..\..\Packages\Versions.Local.props EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Mime", "..\Http\Mime\Dgmjr.Mime.csproj", "{6F24CF7B-856B-4A33-BF3C-783A45117FFA}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Web.DownstreamApis", "Dgmjr.Web.DownstreamApis.csproj", "{0EB63FC8-4D68-471C-BF25-FF7FBE57A33F}" EndProject Global @@ -20,6 +22,18 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6F24CF7B-856B-4A33-BF3C-783A45117FFA}.Local|Any CPU.ActiveCfg = Local|Any CPU + {6F24CF7B-856B-4A33-BF3C-783A45117FFA}.Local|Any CPU.Build.0 = Local|Any CPU + {6F24CF7B-856B-4A33-BF3C-783A45117FFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6F24CF7B-856B-4A33-BF3C-783A45117FFA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6F24CF7B-856B-4A33-BF3C-783A45117FFA}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {6F24CF7B-856B-4A33-BF3C-783A45117FFA}.Testing|Any CPU.Build.0 = Testing|Any CPU + {6F24CF7B-856B-4A33-BF3C-783A45117FFA}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {6F24CF7B-856B-4A33-BF3C-783A45117FFA}.Staging|Any CPU.Build.0 = Staging|Any CPU + {6F24CF7B-856B-4A33-BF3C-783A45117FFA}.Production|Any CPU.ActiveCfg = Local|Any CPU + {6F24CF7B-856B-4A33-BF3C-783A45117FFA}.Production|Any CPU.Build.0 = Local|Any CPU + {6F24CF7B-856B-4A33-BF3C-783A45117FFA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6F24CF7B-856B-4A33-BF3C-783A45117FFA}.Release|Any CPU.Build.0 = Release|Any CPU {0EB63FC8-4D68-471C-BF25-FF7FBE57A33F}.Local|Any CPU.ActiveCfg = Local|Any CPU {0EB63FC8-4D68-471C-BF25-FF7FBE57A33F}.Local|Any CPU.Build.0 = Local|Any CPU {0EB63FC8-4D68-471C-BF25-FF7FBE57A33F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU diff --git a/src/DownstreamApis/DownstreamApiOptionsConfigurator.cs b/src/DownstreamApis/DownstreamApiOptionsConfigurator.cs index 4b4d916b..2d2e8210 100644 --- a/src/DownstreamApis/DownstreamApiOptionsConfigurator.cs +++ b/src/DownstreamApis/DownstreamApiOptionsConfigurator.cs @@ -1,3 +1,15 @@ +/* + * DownstreamApiOptionsConfigurator.cs + * + * Created: 2023-06-27T00:06:27-05:00 + * Modified: 2024-15-28T14:15:43-05:00 + * + * Author: David G. Moore, Jr. + * + * Copyright © 2024 David G. Moore, Jr., All Rights Reserved + * License: MIT (https://opensource.org/licenses/MIT) + */ + namespace Dgmjr.Web.DownstreamApis; using Application = Dgmjr.Mime.Application; diff --git a/src/DownstreamApis/DownstreamApiServiceCollectionExtensions.cs b/src/DownstreamApis/DownstreamApiServiceCollectionExtensions.cs index 3606b750..9cf82086 100644 --- a/src/DownstreamApis/DownstreamApiServiceCollectionExtensions.cs +++ b/src/DownstreamApis/DownstreamApiServiceCollectionExtensions.cs @@ -1,4 +1,17 @@ +/* + * DownstreamApiServiceCollectionExtensions.cs + * + * Created: 2023-17-31T14:17:16-05:00 + * Modified: 2024-16-28T14:16:16-05:00 + * + * Author: David G. Moore, Jr. + * + * Copyright © 2024 David G. Moore, Jr., All Rights Reserved + * License: MIT (https://opensource.org/licenses/MIT) + */ + namespace Microsoft.Extensions.DependencyInjection; + using Microsoft.Extensions.Configuration; public static class DownstreamApiServiceCollectionExtensions @@ -32,21 +45,14 @@ IConfiguration configuration >(); return services; } + public static IServiceCollection ConfigureDownstreamApi( this IServiceCollection services, Action configureOptions - ) - => services.ConfigureDownstreamApi( - nameof(DownstreamApis), - configureOptions - ); + ) => services.ConfigureDownstreamApi(nameof(DownstreamApis), configureOptions); public static IServiceCollection ConfigureDownstreamApi( this IServiceCollection services, IConfiguration configuration - ) - => services.ConfigureDownstreamApi( - nameof(DownstreamApis), - configuration - ); + ) => services.ConfigureDownstreamApi(nameof(DownstreamApis), configuration); } diff --git a/src/DownstreamApis/DownstreamApis.cs b/src/DownstreamApis/DownstreamApis.cs index 36b02b5a..0d6ff40b 100644 --- a/src/DownstreamApis/DownstreamApis.cs +++ b/src/DownstreamApis/DownstreamApis.cs @@ -1,13 +1,22 @@ +/* + * DownstreamApis.cs + * + * Created: 2023-06-27T00:06:27-05:00 + * Modified: 2024-15-28T14:15:49-05:00 + * + * Author: David G. Moore, Jr. + * + * Copyright © 2024 David G. Moore, Jr., All Rights Reserved + * License: MIT (https://opensource.org/licenses/MIT) + */ + namespace Dgmjr.Web.DownstreamApis; using System.Collections; -public record class DownstreamApis : DownstreamApisBase, IDownstreamApis +public class DownstreamApis : Dictionary, IDownstreamApis { public const string MicrosoftGraphOptions = "MicrosoftGraph"; MicrosoftGraphOptions IDownstreamApis.MicrosoftGraph { get; set; } - - public IDictionary DownstreamApiOptions { get; set; } = - new Dictionary(); } diff --git a/src/DownstreamApis/DownstreamApisAutoConfigurator.cs b/src/DownstreamApis/DownstreamApisAutoConfigurator.cs index e52915ce..93d8c44e 100644 --- a/src/DownstreamApis/DownstreamApisAutoConfigurator.cs +++ b/src/DownstreamApis/DownstreamApisAutoConfigurator.cs @@ -1,3 +1,15 @@ +/* + * DownstreamApisAutoConfigurator.cs + * + * Created: 2024-10-20T10:10:10-05:00 + * Modified: 2024-15-28T14:15:56-05:00 + * + * Author: David G. Moore, Jr. + * + * Copyright © 2024 David G. Moore, Jr., All Rights Reserved + * License: MIT (https://opensource.org/licenses/MIT) + */ + using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Hosting; @@ -9,7 +21,7 @@ public class DownstreamApisAutoConfigurator { public ConfigurationOrder Order => ConfigurationOrder.AnyTime; - public void Configure(IHostApplicationBuilder builder) { } + public void Configure(WebApplicationBuilder builder) { } public void Configure(IApplicationBuilder app) { } } diff --git a/src/DownstreamApis/DownstreamApisBase.cs b/src/DownstreamApis/DownstreamApisBase.cs index 244fc1c6..69a24853 100644 --- a/src/DownstreamApis/DownstreamApisBase.cs +++ b/src/DownstreamApis/DownstreamApisBase.cs @@ -1,3 +1,15 @@ +/* + * DownstreamApisBase.cs + * + * Created: 2023-06-27T00:06:27-05:00 + * Modified: 2024-16-28T14:16:10-05:00 + * + * Author: David G. Moore, Jr. + * + * Copyright © 2024 David G. Moore, Jr., All Rights Reserved + * License: MIT (https://opensource.org/licenses/MIT) + */ + namespace Dgmjr.Web.DownstreamApis; public abstract record class DownstreamApisBase diff --git a/src/DownstreamApis/IDownstreamApis.cs b/src/DownstreamApis/IDownstreamApis.cs index 5e0e55c9..96cf99ea 100644 --- a/src/DownstreamApis/IDownstreamApis.cs +++ b/src/DownstreamApis/IDownstreamApis.cs @@ -1,3 +1,15 @@ +/* + * IDownstreamApis.cs + * + * Created: 2023-06-27T00:06:27-05:00 + * Modified: 2024-16-28T14:16:22-05:00 + * + * Author: David G. Moore, Jr. + * + * Copyright © 2024 David G. Moore, Jr., All Rights Reserved + * License: MIT (https://opensource.org/licenses/MIT) + */ + namespace Dgmjr.Web.DownstreamApis; /// diff --git a/src/DownstreamApis/JsonOptions.cs b/src/DownstreamApis/JsonOptions.cs index 2d8d3e56..3a6e098a 100644 --- a/src/DownstreamApis/JsonOptions.cs +++ b/src/DownstreamApis/JsonOptions.cs @@ -1,6 +1,18 @@ -namespace Microsoft.AspNetCore.Mvc; +/* + * JsonOptions.cs + * + * Created: 2023-06-27T00:06:27-05:00 + * Modified: 2024-15-28T14:15:18-05:00 + * + * Author: David G. Moore, Jr. + * + * Copyright © 2024 David G. Moore, Jr., All Rights Reserved + * License: MIT (https://opensource.org/licenses/MIT) + */ #if !NET5_0_OR_GREATER +namespace Microsoft.AspNetCore.Mvc; + public class JsonOptions { /// diff --git a/src/Communication/icon.png b/src/Hosting.Extensions/icon.png similarity index 100% rename from src/Communication/icon.png rename to src/Hosting.Extensions/icon.png diff --git a/src/Http/CorrelationIdAutoConfigurator/CorrelationIdAutoConfigurator.cs b/src/Http/CorrelationIdAutoConfigurator/CorrelationIdAutoConfigurator.cs index 360f39b8..23368246 100644 --- a/src/Http/CorrelationIdAutoConfigurator/CorrelationIdAutoConfigurator.cs +++ b/src/Http/CorrelationIdAutoConfigurator/CorrelationIdAutoConfigurator.cs @@ -13,7 +13,7 @@ public class CorrelationIdAutoConfigurator { public ConfigurationOrder Order => ConfigurationOrder.VeryEarly; - public void Configure(IHostApplicationBuilder builder) + public void Configure(WebApplicationBuilder builder) { builder.Services.AddDefaultCorrelationId( options => builder.Configuration.GetSection(nameof(CorrelationId)).Bind(options) diff --git a/src/Http/CorrelationIdAutoConfigurator/Dgmjr.Http.CorrelationId.cs b/src/Http/CorrelationIdAutoConfigurator/Dgmjr.Http.CorrelationId.cs new file mode 100644 index 00000000..689e4919 --- /dev/null +++ b/src/Http/CorrelationIdAutoConfigurator/Dgmjr.Http.CorrelationId.cs @@ -0,0 +1,15 @@ +/* + * Dgmjr.Http.CorrelationId.cs + * + * Created: 2024-36-29T08:36:42-05:00 + * Modified: 2024-36-29T08:36:42-05:00 + * + * Author: David G. Moore, Jr. + * + * Copyright © 2024 David G. Moore, Jr., All Rights Reserved + * License: MIT (https://opensource.org/licenses/MIT) + */ + +namespace Dgmjr.Http.CorrelationId; + +public class Foo { } diff --git a/src/Http/Mime/Dgmjr.Mime.csproj b/src/Http/Mime/Dgmjr.Mime.csproj index 12200945..ff87e447 100644 --- a/src/Http/Mime/Dgmjr.Mime.csproj +++ b/src/Http/Mime/Dgmjr.Mime.csproj @@ -12,10 +12,10 @@ - netstandard2.0 + Provides a set of constants for the most common media types. Fills in the gaps left by the class. true - constants diff --git a/src/Http/Mime/Dgmjr.Mime.sln b/src/Http/Mime/Dgmjr.Mime.sln index 91859dfc..0b073285 100644 --- a/src/Http/Mime/Dgmjr.Mime.sln +++ b/src/Http/Mime/Dgmjr.Mime.sln @@ -8,7 +8,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\..\..\..\..\Packages\Versions.Local.props = ..\..\..\..\..\Packages\Versions.Local.props EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Mime", "Dgmjr.Mime.csproj", "{03655B61-669E-42F1-913F-C1D7BD387EEE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Mime", "Dgmjr.Mime.csproj", "{E1FF50FB-0ECD-4683-AAA1-9B6E3BD89745}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -20,18 +20,18 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {03655B61-669E-42F1-913F-C1D7BD387EEE}.Local|Any CPU.ActiveCfg = Local|Any CPU - {03655B61-669E-42F1-913F-C1D7BD387EEE}.Local|Any CPU.Build.0 = Local|Any CPU - {03655B61-669E-42F1-913F-C1D7BD387EEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {03655B61-669E-42F1-913F-C1D7BD387EEE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {03655B61-669E-42F1-913F-C1D7BD387EEE}.Testing|Any CPU.ActiveCfg = Testing|Any CPU - {03655B61-669E-42F1-913F-C1D7BD387EEE}.Testing|Any CPU.Build.0 = Testing|Any CPU - {03655B61-669E-42F1-913F-C1D7BD387EEE}.Staging|Any CPU.ActiveCfg = Staging|Any CPU - {03655B61-669E-42F1-913F-C1D7BD387EEE}.Staging|Any CPU.Build.0 = Staging|Any CPU - {03655B61-669E-42F1-913F-C1D7BD387EEE}.Production|Any CPU.ActiveCfg = Local|Any CPU - {03655B61-669E-42F1-913F-C1D7BD387EEE}.Production|Any CPU.Build.0 = Local|Any CPU - {03655B61-669E-42F1-913F-C1D7BD387EEE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {03655B61-669E-42F1-913F-C1D7BD387EEE}.Release|Any CPU.Build.0 = Release|Any CPU + {E1FF50FB-0ECD-4683-AAA1-9B6E3BD89745}.Local|Any CPU.ActiveCfg = Local|Any CPU + {E1FF50FB-0ECD-4683-AAA1-9B6E3BD89745}.Local|Any CPU.Build.0 = Local|Any CPU + {E1FF50FB-0ECD-4683-AAA1-9B6E3BD89745}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E1FF50FB-0ECD-4683-AAA1-9B6E3BD89745}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E1FF50FB-0ECD-4683-AAA1-9B6E3BD89745}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {E1FF50FB-0ECD-4683-AAA1-9B6E3BD89745}.Testing|Any CPU.Build.0 = Testing|Any CPU + {E1FF50FB-0ECD-4683-AAA1-9B6E3BD89745}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {E1FF50FB-0ECD-4683-AAA1-9B6E3BD89745}.Staging|Any CPU.Build.0 = Staging|Any CPU + {E1FF50FB-0ECD-4683-AAA1-9B6E3BD89745}.Production|Any CPU.ActiveCfg = Local|Any CPU + {E1FF50FB-0ECD-4683-AAA1-9B6E3BD89745}.Production|Any CPU.Build.0 = Local|Any CPU + {E1FF50FB-0ECD-4683-AAA1-9B6E3BD89745}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E1FF50FB-0ECD-4683-AAA1-9B6E3BD89745}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Http/ResponseCodes/ResponseCode.cs b/src/Http/ResponseCodes/ResponseCode.cs index 084abc39..7db3f69b 100644 --- a/src/Http/ResponseCodes/ResponseCode.cs +++ b/src/Http/ResponseCodes/ResponseCode.cs @@ -59,25 +59,25 @@ public enum StatusCode : ushort OK = 200, ///// The request has succeeded and a new resource has been created as a result. This is typically the response sent after a PUT request. - /// I created the thing for you. + /// Here. I created the thing for you. Are you fucking happy?! /// 201 /// [Display( Name = "Created", // Description = "The request has succeeded and a new resource has been created as a result. This is typically the response sent after a PUT request." - Description = "I created the thing for you." + Description = "Here. I created the thing for you. Are you fucking happy?!" )] [Uri($"{UriBase}201")] Created = 201, ///// The request has been received but not yet acted upon. It is non-committal, meaning that there is no way in HTTP to later send an asynchronous response indicating the outcome of processing the request. It is intended for cases where another process or server handles the request, or for batch processing. - /// I got it and you can go do other stuff while I work on it for you. + /// I got it, I'm taking care of it, and you can go do other stuff while I work on it for you; don't wait for me. /// 202 /// [Display( Name = "Accepted", // Description = "The request has been received but not yet acted upon. It is non-committal, meaning that there is no way in HTTP to later send an asynchronous response indicating the outcome of processing the request. It is intended for cases where another process or server handles the request, or for batch processing." - Description = "I got it and you can go do other stuff while I work on it for you." + Description = "I got it, I'm taking care of it, and you can go do other stuff while I work on it for you; don't wait for me." )] [Uri($"{UriBase}202")] Accepted = 202, @@ -93,13 +93,15 @@ public enum StatusCode : ushort [Uri($"{UriBase}203")] NonAuthoritativeInformation = 203, - /// The server successfully processed the request and is not returning any content. + //// / The server successfully processed the request and is not returning any content. + /// I got it and I took care of it but I don't have anything else to say about it. /// 204 /// [Display( Name = "No Content", ShortName = "NoContent", - Description = "The server successfully processed the request and is not returning any content." + // Description = "The server successfully processed the request and is not returning any content." + Description = "I got it and I took care of it but I don't have anything else to say about it." )] [Uri($"{UriBase}204")] NoContent = 204, @@ -148,6 +150,16 @@ public enum StatusCode : ushort [Uri($"{UriBase}208")] AlreadyReported = 208, + /// Used by Apache servers. A catch-all error condition allowing the passage of message bodies through the server when the ProxyErrorOverride setting is enabled. It is displayed in this situation instead of a 4xx or 5xx error message. + /// 218 + /// + [Display( + Name = "This Is Fine", + Description = "Used by Apache servers. A catch-all error condition allowing the passage of message bodies through the server when the ProxyErrorOverride setting is enabled. It is displayed in this situation instead of a 4xx or 5xx error message." + )] + [Uri($"{UriBase}218")] + ThisIsFine = 218, + /// The server has fulfilled a request for the resource, and the response is a representation of the result of one or more instance-manipulations applied to the current instance. /// 226 /// @@ -168,22 +180,26 @@ public enum StatusCode : ushort [Uri($"{UriBase}300")] MultipleChoices = 300, - /// The URL of the requested resource has been changed permanently. This and all future requests should be directed to the given URI. + ///// The URL of the requested resource has been changed permanently. This and all future requests should be directed to the given URI. + /// The shit you're looking for ain't here any more. Look over here instead. /// 301 /// [Display( Name = "Moved Permanently", - Description = "The URL of the requested resource has been changed permanently. This and all future requests should be directed to the given URI." + // Description = "The URL of the requested resource has been changed permanently. This and all future requests should be directed to the given URI." + Description = "The shit you're looking for ain't here any more. Look over here instead." )] [Uri($"{UriBase}301")] MovedPermanently = 301, - /// Tells the client to look at (browse to) another URL. The HTTP/1.0 specification required the client to perform a temporary redirect with the same method (the original describing phrase was "Moved Temporarily"),[9] but popular browsers implemented 302 redirects by changing the method to GET. Therefore, HTTP/1.1 added status codes 303 and 307 to distinguish between the two behaviors. + ///// Tells the client to look at (browse to) another URL. The HTTP/1.0 specification required the client to perform a temporary redirect with the same method (the original describing phrase was "Moved Temporarily"),[9] but popular browsers implemented 302 redirects by changing the method to GET. Therefore, HTTP/1.1 added status codes 303 and 307 to distinguish between the two behaviors. + /// The shit you're looking for has been moved, but it might move back so don't remember this redirection. Just do it this once and keep asking me whenever you want the shit that you asked for. /// 302 /// [Display( Name = "Found", - Description = "Tells the client to look at (browse to) another URL. The HTTP/1.0 specification required the client to perform a temporary redirect with the same method (the original describing phrase was \\\"Moved Temporarily\\\"), but popular browsers implemented 302 redirects by changing the method to GET. Therefore, HTTP/1.1 added status codes 303 and 307 to distinguish between the two behaviors." + // Description = "Tells the client to look at (browse to) another URL. The HTTP/1.0 specification required the client to perform a temporary redirect with the same method (the original describing phrase was \\\"Moved Temporarily\\\"), but popular browsers implemented 302 redirects by changing the method to GET. Therefore, HTTP/1.1 added status codes 303 and 307 to distinguish between the two behaviors." + Description = "The shit you're looking for has been moved, but it might move back so don't remember this redirection. Just do it this once and keep asking me whenever you want the shit that you asked for." )] [Uri($"{UriBase}302")] Found = 302, @@ -198,12 +214,14 @@ public enum StatusCode : ushort [Uri($"{UriBase}303")] SeeOther = 303, - /// Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-None-Match. In such case, there is no need to retransmit the resource since the client still has a previously-downloaded copy. + ///// Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-None-Match. In such case, there is no need to retransmit the resource since the client still has a previously-downloaded copy. + /// Nothing's new; you can use the copy that you already have. /// 304 /// [Display( Name = "Not Modified", - Description = "Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-None-Match. In such case, there is no need to retransmit the resource since the client still has a previously-downloaded copy." + // Description = "Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-None-Match. In such case, there is no need to retransmit the resource since the client still has a previously-downloaded copy." + Description = "Nothing's new; you can use the copy that you already have." )] [Uri($"{UriBase}304")] NotModified = 304, @@ -248,12 +266,13 @@ public enum StatusCode : ushort [Uri($"{UriBase}308")] PermanentRedirect = 308, - /// The server cannot or will not process the request due to an apparent client error (e.g., malformed request syntax, size too large, invalid request message framing, or deceptive request routing). + /// You dumb fuck! /// 400 /// [Display( Name = "Bad Request", - Description = "The server cannot or will not process the request due to an apparent client error (e.g., malformed request syntax, size too large, invalid request message framing, or deceptive request routing)." + // Description = "The server cannot or will not process the request due to an apparent client error (e.g., malformed request syntax, size too large, invalid request message framing, or deceptive request routing)." + Description = "You dumb fuck!" )] [Uri($"{UriBase}400")] BadRequest = 400, @@ -438,6 +457,26 @@ public enum StatusCode : ushort [Uri($"{UriBase}418")] ImATeapot = 418, + /// Used by the Laravel Framework when a CSRF Token is missing or expired. + /// 419 + /// + [Display( + Name = "Page Expired", + Description = "Used by the Laravel Framework when a CSRF Token is missing or expired." + )] + [Uri($"{UriBase}419")] + PageExpired = 419, + + /// Returned by version 1 of the Twitter Search and Trends API when the client is being rate limited; versions 1.1 and later use the 429 Too Many Requests response code instead. The phrase "Enhance your calm" comes from the 1993 movie Demolition Man, and its association with this number is likely a reference to cannabis. + /// 420 + /// + [Display( + Name = "Enhance Your Calm", + Description = "Returned by version 1 of the Twitter Search and Trends API when the client is being rate limited; versions 1.1 and later use the 429 Too Many Requests response code instead. The phrase \\\"Enhance your calm\\\" comes from the 1993 movie Demolition Man, and its association with this number is likely a reference to cannabis." + )] + [Uri($"{UriBase}420")] + EnhanceYourCalm = 420, + /// The request was directed at a server that is not able to produce a response (for example because of connection reuse). /// 421 /// @@ -515,6 +554,16 @@ public enum StatusCode : ushort [Uri($"{UriBase}431")] RequestHeaderFieldsTooLarge = 431, + /// Used in Exchange ActiveSync if there either is a more efficient server to use or the server cannot access the users' mailbox.[citation needed] + /// 449 + /// + [Display( + Name = "Retry With", + Description = "Used in Exchange ActiveSync if there either is a more efficient server to use or the server cannot access the users' mailbox." + )] + [Uri($"{UriBase}449")] + RetryWith = 449, + /// A server operator has received a legal demand to deny access to a resource or to a set of resources that includes the requested resource.[60] The code 451 was chosen as a reference to the novel Fahrenheit 451 (see the Acknowledgements in the RFC). /// 451 /// @@ -525,6 +574,36 @@ public enum StatusCode : ushort [Uri($"{UriBase}451")] UnavailableForLegalReasons = 451, + /// A Microsoft extension. The request should be retried after performing the appropriate action. + /// 451 + /// + [Display( + Name = "Redirect", + Description = "A Microsoft extension. The request should be retried after performing the appropriate action." + )] + [Uri($"{UriBase}451")] + Redirect = 451, + + /// Returned by ArcGIS for Server. A code of 498 indicates an expired or otherwise invalid token. + /// 498 + /// + [Display( + Name = "Invalid Token", + Description = "Returned by ArcGIS for Server. A code of 498 indicates an expired or otherwise invalid token." + )] + [Uri($"{UriBase}498")] + InvalidToken = 498, + + /// Returned by ArcGIS for Server. A code of 499 indicates that a token is required (if no token was submitted). + /// 499 + /// + [Display( + Name = "Token Required", + Description = "Returned by ArcGIS for Server. A code of 499 indicates that a token is required (if no token was submitted)." + )] + [Uri($"{UriBase}499")] + TokenRequired = 499, + /// A generic error message, given when an unexpected condition was encountered and no more specific message is suitable. /// 500 /// @@ -734,75 +813,5 @@ public enum StatusCode : ushort Description = "This status code is not specified in any RFCs, but is used by CloudFlare's reverse proxies to signal an \\\"unknown connection issue between CloudFlare and the origin web server\\\" to a client in front of the proxy." )] [Uri($"{UriBase}530")] - SiteIsFrozen = 530, - - /// Used by Apache servers. A catch-all error condition allowing the passage of message bodies through the server when the ProxyErrorOverride setting is enabled. It is displayed in this situation instead of a 4xx or 5xx error message. - /// 218 - /// - [Display( - Name = "This Is Fine", - Description = "Used by Apache servers. A catch-all error condition allowing the passage of message bodies through the server when the ProxyErrorOverride setting is enabled. It is displayed in this situation instead of a 4xx or 5xx error message." - )] - [Uri($"{UriBase}218")] - ThisIsFine = 218, - - /// Used by the Laravel Framework when a CSRF Token is missing or expired. - /// 419 - /// - [Display( - Name = "Page Expired", - Description = "Used by the Laravel Framework when a CSRF Token is missing or expired." - )] - [Uri($"{UriBase}419")] - PageExpired = 419, - - /// Returned by version 1 of the Twitter Search and Trends API when the client is being rate limited; versions 1.1 and later use the 429 Too Many Requests response code instead. The phrase "Enhance your calm" comes from the 1993 movie Demolition Man, and its association with this number is likely a reference to cannabis. - /// 420 - /// - [Display( - Name = "Enhance Your Calm", - Description = "Returned by version 1 of the Twitter Search and Trends API when the client is being rate limited; versions 1.1 and later use the 429 Too Many Requests response code instead. The phrase \\\"Enhance your calm\\\" comes from the 1993 movie Demolition Man, and its association with this number is likely a reference to cannabis." - )] - [Uri($"{UriBase}420")] - EnhanceYourCalm = 420, - - /// Returned by ArcGIS for Server. A code of 498 indicates an expired or otherwise invalid token. - /// 498 - /// - [Display( - Name = "Invalid Token", - Description = "Returned by ArcGIS for Server. A code of 498 indicates an expired or otherwise invalid token." - )] - [Uri($"{UriBase}498")] - InvalidToken = 498, - - /// Returned by ArcGIS for Server. A code of 499 indicates that a token is required (if no token was submitted). - /// 499 - /// - [Display( - Name = "Token Required", - Description = "Returned by ArcGIS for Server. A code of 499 indicates that a token is required (if no token was submitted)." - )] - [Uri($"{UriBase}499")] - TokenRequired = 499, - - /// Used in Exchange ActiveSync if there either is a more efficient server to use or the server cannot access the users' mailbox.[citation needed] - /// 449 - /// - [Display( - Name = "Retry With", - Description = "Used in Exchange ActiveSync if there either is a more efficient server to use or the server cannot access the users' mailbox." - )] - [Uri($"{UriBase}449")] - RetryWith = 449, - - /// A Microsoft extension. The request should be retried after performing the appropriate action. - /// 451 - /// - [Display( - Name = "Redirect", - Description = "A Microsoft extension. The request should be retried after performing the appropriate action." - )] - [Uri($"{UriBase}451")] - Redirect = 451 + SiteIsFrozen = 530 } diff --git a/src/Http/Services/HttpServicesExtensions.AddHttpServices.cs b/src/Http/Services/HttpServicesExtensions.AddHttpServices.cs index 4979fa2b..dbe1b6cd 100644 --- a/src/Http/Services/HttpServicesExtensions.AddHttpServices.cs +++ b/src/Http/Services/HttpServicesExtensions.AddHttpServices.cs @@ -25,8 +25,8 @@ public static partial class HttpServicesExtensions public const string Kestrel = nameof(Kestrel); public const string ExceptionHandling = nameof(ExceptionHandling); - public static IHostApplicationBuilder AddHttpServices( - this IHostApplicationBuilder builder, + public static WebApplicationBuilder AddHttpServices( + this WebApplicationBuilder builder, string configurationSectionKey = Http ) { diff --git a/src/Http/Services/HttpServicesOptionsAutoConfigurator.cs b/src/Http/Services/HttpServicesOptionsAutoConfigurator.cs index 398b4152..1cbe81c4 100644 --- a/src/Http/Services/HttpServicesOptionsAutoConfigurator.cs +++ b/src/Http/Services/HttpServicesOptionsAutoConfigurator.cs @@ -10,7 +10,7 @@ public class HttpServicesOptionsAutoConfigurator { public ConfigurationOrder Order => ConfigurationOrder.AnyTime; - public void Configure(IHostApplicationBuilder builder) + public void Configure(WebApplicationBuilder builder) { builder.AddHttpServices(); } diff --git a/src/MicrosoftGraph/Configuration/MicrosoftGraphAutoConfigurator.cs b/src/MicrosoftGraph/Configuration/MicrosoftGraphAutoConfigurator.cs index 5dac62aa..2b7916fe 100644 --- a/src/MicrosoftGraph/Configuration/MicrosoftGraphAutoConfigurator.cs +++ b/src/MicrosoftGraph/Configuration/MicrosoftGraphAutoConfigurator.cs @@ -4,7 +4,7 @@ public class MicrosoftGraphAutoConfigurator : IConfigureIHostApplicationBuilder { public ConfigurationOrder Order => ConfigurationOrder.AnyTime; - public void Configure(IHostApplicationBuilder builder) + public void Configure(WebApplicationBuilder builder) { builder.Services.AddMicrosoftGraph(builder.Configuration); } diff --git a/src/MicrosoftGraph/Dgmjr.Graph.csproj b/src/MicrosoftGraph/Dgmjr.Graph.csproj index 178196dd..b19f76f1 100644 --- a/src/MicrosoftGraph/Dgmjr.Graph.csproj +++ b/src/MicrosoftGraph/Dgmjr.Graph.csproj @@ -7,7 +7,7 @@ - + @@ -32,7 +32,7 @@ - + diff --git a/src/MicrosoftGraph/Dgmjr.Graph.props b/src/MicrosoftGraph/Dgmjr.Graph.props index 444162ac..e67d6714 100644 --- a/src/MicrosoftGraph/Dgmjr.Graph.props +++ b/src/MicrosoftGraph/Dgmjr.Graph.props @@ -4,7 +4,7 @@ - + diff --git a/src/MicrosoftGraph/Dgmjr.Graph.sln b/src/MicrosoftGraph/Dgmjr.Graph.sln index 4d8b5f91..39551486 100644 --- a/src/MicrosoftGraph/Dgmjr.Graph.sln +++ b/src/MicrosoftGraph/Dgmjr.Graph.sln @@ -10,7 +10,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Web.DownstreamApis", "..\DownstreamApis\Dgmjr.Web.DownstreamApis.csproj", "{0EB63FC8-4D68-471C-BF25-FF7FBE57A33F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Graph", "Dgmjr.Graph.csproj", "{137D8567-6811-417D-B62F-B0980EB5C5D7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Graph", "Dgmjr.Graph.csproj", "{0F27DFD4-7490-4E35-BA32-7D2B44EC3C13}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -34,18 +34,18 @@ Global {0EB63FC8-4D68-471C-BF25-FF7FBE57A33F}.Production|Any CPU.Build.0 = Local|Any CPU {0EB63FC8-4D68-471C-BF25-FF7FBE57A33F}.Release|Any CPU.ActiveCfg = Release|Any CPU {0EB63FC8-4D68-471C-BF25-FF7FBE57A33F}.Release|Any CPU.Build.0 = Release|Any CPU - {137D8567-6811-417D-B62F-B0980EB5C5D7}.Local|Any CPU.ActiveCfg = Local|Any CPU - {137D8567-6811-417D-B62F-B0980EB5C5D7}.Local|Any CPU.Build.0 = Local|Any CPU - {137D8567-6811-417D-B62F-B0980EB5C5D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {137D8567-6811-417D-B62F-B0980EB5C5D7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {137D8567-6811-417D-B62F-B0980EB5C5D7}.Testing|Any CPU.ActiveCfg = Testing|Any CPU - {137D8567-6811-417D-B62F-B0980EB5C5D7}.Testing|Any CPU.Build.0 = Testing|Any CPU - {137D8567-6811-417D-B62F-B0980EB5C5D7}.Staging|Any CPU.ActiveCfg = Staging|Any CPU - {137D8567-6811-417D-B62F-B0980EB5C5D7}.Staging|Any CPU.Build.0 = Staging|Any CPU - {137D8567-6811-417D-B62F-B0980EB5C5D7}.Production|Any CPU.ActiveCfg = Local|Any CPU - {137D8567-6811-417D-B62F-B0980EB5C5D7}.Production|Any CPU.Build.0 = Local|Any CPU - {137D8567-6811-417D-B62F-B0980EB5C5D7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {137D8567-6811-417D-B62F-B0980EB5C5D7}.Release|Any CPU.Build.0 = Release|Any CPU + {0F27DFD4-7490-4E35-BA32-7D2B44EC3C13}.Local|Any CPU.ActiveCfg = Local|Any CPU + {0F27DFD4-7490-4E35-BA32-7D2B44EC3C13}.Local|Any CPU.Build.0 = Local|Any CPU + {0F27DFD4-7490-4E35-BA32-7D2B44EC3C13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0F27DFD4-7490-4E35-BA32-7D2B44EC3C13}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F27DFD4-7490-4E35-BA32-7D2B44EC3C13}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {0F27DFD4-7490-4E35-BA32-7D2B44EC3C13}.Testing|Any CPU.Build.0 = Testing|Any CPU + {0F27DFD4-7490-4E35-BA32-7D2B44EC3C13}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {0F27DFD4-7490-4E35-BA32-7D2B44EC3C13}.Staging|Any CPU.Build.0 = Staging|Any CPU + {0F27DFD4-7490-4E35-BA32-7D2B44EC3C13}.Production|Any CPU.ActiveCfg = Local|Any CPU + {0F27DFD4-7490-4E35-BA32-7D2B44EC3C13}.Production|Any CPU.Build.0 = Local|Any CPU + {0F27DFD4-7490-4E35-BA32-7D2B44EC3C13}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0F27DFD4-7490-4E35-BA32-7D2B44EC3C13}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/MicrosoftGraph/Extensions/LoggingExtensions.cs b/src/MicrosoftGraph/Extensions/LoggingExtensions.cs index b4997606..050e9f9c 100644 --- a/src/MicrosoftGraph/Extensions/LoggingExtensions.cs +++ b/src/MicrosoftGraph/Extensions/LoggingExtensions.cs @@ -1,24 +1,48 @@ -// namespace Dgmjr.Graph; +using System.Security.Claims; -// internal static partial class LoggingExtensions -// { -// [LoggerMessage( -// EventId = 1, -// Level = LogLevel.Information, -// Message = "{Method} {Path}", -// EventName = nameof(PageVisited) -// )] -// public static partial void PageVisited( -// this ILogger logger, -// System.Net.Http.HttpMethod method, -// string path -// ); +namespace Dgmjr.Graph; -// [LoggerMessage( -// EventId = 1, -// Level = LogLevel.Information, -// Message = "{Method} {Path}", -// EventName = nameof(PageVisited) -// )] -// public static partial void PageVisited(this ILogger logger, string method, string path); -// } +internal static partial class LoggingExtensions +{ + [LoggerMessage( + EventId = 1, + Level = LogLevel.Information, + Message = "Beginning supplementary token acquisition and creation for user {User}", + EventName = nameof(BeginningSupplementaryTokenAcquisitionAndCreation) + )] + public static partial void BeginningSupplementaryTokenAcquisitionAndCreation( + this ILogger logger, + ClaimsPrincipal user + ); + + [LoggerMessage( + EventId = 2, + Level = LogLevel.Information, + Message = "Supplementary token acquisition and creation for user {User} completed", + EventName = nameof(SupplementaryTokenAcquisitionAndCreationComplete) + )] + public static partial void SupplementaryTokenAcquisitionAndCreationComplete( + this ILogger logger, + ClaimsPrincipal user + ); + + // [LoggerMessage( + // EventId = 1, + // Level = LogLevel.Information, + // Message = "{Method} {Path}", + // EventName = nameof(PageVisited) + // )] + // public static partial void PageVisited( + // this ILogger logger, + // System.Net.Http.HttpMethod method, + // string path + // ); + + // [LoggerMessage( + // EventId = 1, + // Level = LogLevel.Information, + // Message = "{Method} {Path}", + // EventName = nameof(PageVisited) + // )] + // public static partial void PageVisited(this ILogger logger, string method, string path); +} diff --git a/src/MicrosoftGraph/Extensions/MicrosoftGraphServiceCollectionExtensions.cs b/src/MicrosoftGraph/Extensions/MicrosoftGraphServiceCollectionExtensions.cs index 924d189d..f804222a 100644 --- a/src/MicrosoftGraph/Extensions/MicrosoftGraphServiceCollectionExtensions.cs +++ b/src/MicrosoftGraph/Extensions/MicrosoftGraphServiceCollectionExtensions.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Authentication.OpenIdConnect; using Dgmjr.Graph.TokenProviders; using IAuthenticationProvider = Microsoft.Graph.IAuthenticationProvider; +using Microsoft.ApplicationInsights; namespace Microsoft.Extensions.DependencyInjection; @@ -15,15 +16,15 @@ IConfiguration config ) { var configSection = config.GetSection(DownstreamApis_MicrosoftGraph); - var options = configSection.Get(); + var options = configSection.Get(); services .AddMicrosoftGraph(options => config.Bind(options)) .AddMicrosoftIdentityConsentHandler() .ConfigureDownstreamApi(MicrosoftGraph, configSection); services.AddScoped(); - services.Configure(configSection); + services.Configure(configSection); services.AddScoped(); - services.Configure(options => + services.ConfigureAll(options => { options.Events.OnTokenValidated = OnTokenValidated; }); @@ -45,9 +46,19 @@ IConfiguration config private static async Task OnTokenValidated(TokenValidatedContext context) { - var services = context.HttpContext.RequestServices; + using var scope = context.HttpContext.RequestServices.CreateScope(); + using var activity = Dgmjr.Graph.Telemetry.Activities.TokenAcquisitionActivitySource.StartActivity( + nameof(OnTokenValidated), + ActivityKind.Client + ); + var logger = scope.ServiceProvider.GetRequiredService>(); + logger.BeginningSupplementaryTokenAcquisitionAndCreation(context.Principal); + activity.AddTag("UserObjectId", context.Principal.GetObjectId()); + activity.AddTag("UserTenantId", context.Principal.GetTenantId()); + + var services = scope.ServiceProvider; var tokenAcquisition = services.GetRequiredService(); - var graphClientOptions = services.GetRequiredService>().Value; + var graphClientOptions = services.GetRequiredService>().Value; var graphClient = new GraphServiceClient( new BaseBearerTokenAuthenticationProvider( @@ -71,5 +82,6 @@ private static async Task OnTokenValidated(TokenValidatedContext context) claims.Add(new(ClaimTypes.Role, theAppRole.Value)); } } + logger.SupplementaryTokenAcquisitionAndCreationComplete(context.Principal); } } diff --git a/src/MicrosoftGraph/Options/MicrosoftGraphOptions.cs b/src/MicrosoftGraph/Options/MicrosoftGraphOptions.cs index a555f367..37309f0f 100644 --- a/src/MicrosoftGraph/Options/MicrosoftGraphOptions.cs +++ b/src/MicrosoftGraph/Options/MicrosoftGraphOptions.cs @@ -1,9 +1,9 @@ namespace Dgmjr.Graph.Options; -public class MicrosoftB2CGraphOptions : Microsoft.Identity.Web.MicrosoftGraphOptions +public class AzureAdB2CGraphOptions : Microsoft.Identity.Web.MicrosoftGraphOptions { /// MicrosoftGraphOptions - public const string AppSettingsKey = nameof(MicrosoftB2CGraphOptions); + public const string AppSettingsKey = nameof(AzureAdB2CGraphOptions); /// The of the Azure AD B2C extensions application public guid AzureAdB2CExtensionsApplicationId { get; set; } diff --git a/src/MicrosoftGraph/Services/ApplicationService.cs b/src/MicrosoftGraph/Services/ApplicationService.cs index a2437f38..12a04179 100644 --- a/src/MicrosoftGraph/Services/ApplicationService.cs +++ b/src/MicrosoftGraph/Services/ApplicationService.cs @@ -1,5 +1,9 @@ namespace Dgmjr.Graph.Services; -public class ApplicationService(GraphServiceClient graph, ILogger logger, IOptionsMonitor options, IOptionsMonitor msidOptions, IDistributedCache cache) : MsGraphService(graph, logger, options, msidOptions, cache), IApplicationService -{ -} +public class ApplicationService( + GraphServiceClient graph, + ILogger logger, + IOptionsMonitor options, + IOptionsMonitor msidOptions, + IDistributedCache cache +) : MsGraphService(graph, logger, options, msidOptions, cache), IApplicationService { } diff --git a/src/MicrosoftGraph/Services/DirectoryObjectsService.cs b/src/MicrosoftGraph/Services/DirectoryObjectsService.cs index f58ad8a8..cc86fb1c 100644 --- a/src/MicrosoftGraph/Services/DirectoryObjectsService.cs +++ b/src/MicrosoftGraph/Services/DirectoryObjectsService.cs @@ -1,18 +1,37 @@ namespace Dgmjr.Graph.Services; -public class DirectoryObjectsService(GraphServiceClient graph, ILogger logger, IOptionsMonitor options, IOptionsMonitor msidOptions, IDistributedCache cache) : MsGraphService(graph, logger, options, msidOptions, cache), IDirectoryObjectsService +public class DirectoryObjectsService( + GraphServiceClient graph, + ILogger logger, + IOptionsMonitor options, + IOptionsMonitor msidOptions, + IDistributedCache cache +) : MsGraphService(graph, logger, options, msidOptions, cache), IDirectoryObjectsService { - public async Task GetAsync(string id, CancellationToken cancellationToken = default) + public async Task GetAsync( + string id, + CancellationToken cancellationToken = default + ) { return await Graph.DirectoryObjects[id].Request().GetAsync(cancellationToken); } - public async Task GetAsync(string id, string property, CancellationToken cancellationToken = default) + public async Task GetAsync( + string id, + string property, + CancellationToken cancellationToken = default + ) { - return await Graph.DirectoryObjects[id].Request().Select(property).GetAsync(cancellationToken); + return await Graph.DirectoryObjects[id] + .Request() + .Select(property) + .GetAsync(cancellationToken); } - public async Task CreateAsync(DirectoryObject directoryObject, CancellationToken cancellationToken = default) + public async Task CreateAsync( + DirectoryObject directoryObject, + CancellationToken cancellationToken = default + ) { return await Graph.DirectoryObjects.Request().AddAsync(directoryObject, cancellationToken); } @@ -22,8 +41,14 @@ public async Task DeleteAsync(string id, CancellationToken cancellationToken = d await Graph.DirectoryObjects[id].Request().DeleteAsync(cancellationToken); } - public async Task UpdateAsync(string id, DirectoryObject directoryObject, CancellationToken cancellationToken = default) + public async Task UpdateAsync( + string id, + DirectoryObject directoryObject, + CancellationToken cancellationToken = default + ) { - return await Graph.DirectoryObjects[id].Request().UpdateAsync(directoryObject, cancellationToken); + return await Graph.DirectoryObjects[id] + .Request() + .UpdateAsync(directoryObject, cancellationToken); } } diff --git a/src/MicrosoftGraph/Services/MsGraphService.cs b/src/MicrosoftGraph/Services/MsGraphService.cs index a42ea2e0..3c00e56d 100644 --- a/src/MicrosoftGraph/Services/MsGraphService.cs +++ b/src/MicrosoftGraph/Services/MsGraphService.cs @@ -22,12 +22,12 @@ public interface IMsGraphService : IHaveAGraphClient Task GetExtensionsApplicationAsync(); } -public class MsGraphService(GraphServiceClient graph, ILogger logger, IOptionsMonitor options, IOptionsMonitor msidOptions, IDistributedCache cache) : IMsGraphService +public class MsGraphService(GraphServiceClient graph, ILogger logger, IOptionsMonitor options, IOptionsMonitor msidOptions, IDistributedCache cache) : IMsGraphService { private static readonly duration CacheDuration = duration.FromDays(1000); private static readonly DateTimeOffset CacheExpiration = DateTimeOffset.UtcNow.Add(CacheDuration); public ILogger Logger => logger; - private MicrosoftB2CGraphOptions Options => options.CurrentValue; + private AzureAdB2CGraphOptions Options => options.CurrentValue; private MicrosoftIdentityOptions MsidOptions => msidOptions.CurrentValue; public guid ExtensionsAppClientId => Options.AzureAdB2CExtensionsApplicationId; public guid ClientId => new(MsidOptions.ClientId); diff --git a/src/MicrosoftGraph/Services/UsersService.cs b/src/MicrosoftGraph/Services/UsersService.cs index de3739ca..1090f5f2 100644 --- a/src/MicrosoftGraph/Services/UsersService.cs +++ b/src/MicrosoftGraph/Services/UsersService.cs @@ -1,6 +1,6 @@ namespace Dgmjr.Graph.Services; -public class UsersService(GraphServiceClient graph, ILogger logger, IOptionsMonitor options, IOptionsMonitor msidOptions, IDistributedCache cache) : MsGraphService(graph, logger, options, msidOptions, cache), IUsersService +public class UsersService(GraphServiceClient graph, ILogger logger, IOptionsMonitor options, IOptionsMonitor msidOptions, IDistributedCache cache) : MsGraphService(graph, logger, options, msidOptions, cache), IUsersService { public async Task GetMeAsync(CancellationToken cancellationToken = default) { diff --git a/src/MicrosoftGraph/Telemetry/Activities.cs b/src/MicrosoftGraph/Telemetry/Activities.cs index 0d68b163..d7d19513 100644 --- a/src/MicrosoftGraph/Telemetry/Activities.cs +++ b/src/MicrosoftGraph/Telemetry/Activities.cs @@ -16,6 +16,8 @@ public static class Activities { private static readonly Version AssemblyVersion = typeof(Activities).Assembly.GetName().Version; + public static readonly ActivitySource ActivitySource = new(TraceNames.Basic, ServiceVersion); + /// /// Base ActivitySource /// @@ -46,6 +48,12 @@ public static class Activities public static readonly ActivitySource ValidationActivitySource = new(TraceNames.Validation, ServiceVersion); + /// + /// Detailed validation ActivitySource + /// + public static readonly ActivitySource TokenAcquisitionActivitySource = + new(TraceNames.TokenAcquisition, ServiceVersion); + /// /// Service version /// @@ -63,22 +71,27 @@ public static class TraceNames /// /// Service name for store traces /// - public const string Store = Basic + ".Stores"; + public const string Store = Basic + "." + nameof(Store) + "s"; /// /// Service name for caching traces /// - public const string Cache = Basic + ".Cache"; + public const string Cache = Basic + "." + nameof(Cache); /// /// Service name for caching traces /// - public const string Services = Basic + ".Services"; + public const string Services = Basic + "." + nameof(Services); /// /// Service name for detailed validation traces /// - public const string Validation = Basic + ".Validation"; + public const string Validation = Basic + nameof(Validation); + + /// + /// Service name for detailed token acquisition traces + /// + public const string TokenAcquisition = Basic + "." + nameof(TokenAcquisition); public static readonly string ServiceVersion = Activities.ServiceVersion; } diff --git a/src/Middleware/RequestLogging/icon.png b/src/Middleware/RequestLogging/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..db07a039193d57c5147e651a7ab732121bfd20ba GIT binary patch literal 26997 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 CAey28 literal 0 HcmV?d00001 diff --git a/src/Mvc/Dgmjr.AspNetCore.Mvc.csproj b/src/Mvc/Dgmjr.AspNetCore.Mvc.csproj index 1be89698..845a91f3 100644 --- a/src/Mvc/Dgmjr.AspNetCore.Mvc.csproj +++ b/src/Mvc/Dgmjr.AspNetCore.Mvc.csproj @@ -25,7 +25,7 @@ - + diff --git a/src/Mvc/Dgmjr.AspNetCore.Mvc.sln b/src/Mvc/Dgmjr.AspNetCore.Mvc.sln index 6ebbbbb5..783bd627 100644 --- a/src/Mvc/Dgmjr.AspNetCore.Mvc.sln +++ b/src/Mvc/Dgmjr.AspNetCore.Mvc.sln @@ -8,11 +8,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\..\..\..\Packages\Versions.Local.props = ..\..\..\..\Packages\Versions.Local.props EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Mime", "..\Http\Mime\Dgmjr.Mime.csproj", "{0F9518CF-E1E7-4697-BF2D-1C3FE4D285ED}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Mime", "..\Http\Mime\Dgmjr.Mime.csproj", "{FD4A80E2-D49C-4E08-B0A0-A4F99CEE64D6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Http.StatusCodes", "..\Http\ResponseCodes\Dgmjr.Http.StatusCodes.csproj", "{255F91DE-EF50-457A-8688-C526FD2BF0F4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Http.StatusCodes", "..\Http\ResponseCodes\Dgmjr.Http.StatusCodes.csproj", "{86A9240C-CB92-4EC7-9C82-ACC429BAD774}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.AspNetCore.Mvc", "Dgmjr.AspNetCore.Mvc.csproj", "{8494B973-A402-4F9B-8262-72DA92DA74D7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.AspNetCore.Mvc", "Dgmjr.AspNetCore.Mvc.csproj", "{75CCEE17-7ED6-4DAD-85E8-971722052B7F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -24,42 +24,42 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0F9518CF-E1E7-4697-BF2D-1C3FE4D285ED}.Local|Any CPU.ActiveCfg = Local|Any CPU - {0F9518CF-E1E7-4697-BF2D-1C3FE4D285ED}.Local|Any CPU.Build.0 = Local|Any CPU - {0F9518CF-E1E7-4697-BF2D-1C3FE4D285ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0F9518CF-E1E7-4697-BF2D-1C3FE4D285ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0F9518CF-E1E7-4697-BF2D-1C3FE4D285ED}.Testing|Any CPU.ActiveCfg = Testing|Any CPU - {0F9518CF-E1E7-4697-BF2D-1C3FE4D285ED}.Testing|Any CPU.Build.0 = Testing|Any CPU - {0F9518CF-E1E7-4697-BF2D-1C3FE4D285ED}.Staging|Any CPU.ActiveCfg = Staging|Any CPU - {0F9518CF-E1E7-4697-BF2D-1C3FE4D285ED}.Staging|Any CPU.Build.0 = Staging|Any CPU - {0F9518CF-E1E7-4697-BF2D-1C3FE4D285ED}.Production|Any CPU.ActiveCfg = Local|Any CPU - {0F9518CF-E1E7-4697-BF2D-1C3FE4D285ED}.Production|Any CPU.Build.0 = Local|Any CPU - {0F9518CF-E1E7-4697-BF2D-1C3FE4D285ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0F9518CF-E1E7-4697-BF2D-1C3FE4D285ED}.Release|Any CPU.Build.0 = Release|Any CPU - {255F91DE-EF50-457A-8688-C526FD2BF0F4}.Local|Any CPU.ActiveCfg = Local|Any CPU - {255F91DE-EF50-457A-8688-C526FD2BF0F4}.Local|Any CPU.Build.0 = Local|Any CPU - {255F91DE-EF50-457A-8688-C526FD2BF0F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {255F91DE-EF50-457A-8688-C526FD2BF0F4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {255F91DE-EF50-457A-8688-C526FD2BF0F4}.Testing|Any CPU.ActiveCfg = Testing|Any CPU - {255F91DE-EF50-457A-8688-C526FD2BF0F4}.Testing|Any CPU.Build.0 = Testing|Any CPU - {255F91DE-EF50-457A-8688-C526FD2BF0F4}.Staging|Any CPU.ActiveCfg = Staging|Any CPU - {255F91DE-EF50-457A-8688-C526FD2BF0F4}.Staging|Any CPU.Build.0 = Staging|Any CPU - {255F91DE-EF50-457A-8688-C526FD2BF0F4}.Production|Any CPU.ActiveCfg = Local|Any CPU - {255F91DE-EF50-457A-8688-C526FD2BF0F4}.Production|Any CPU.Build.0 = Local|Any CPU - {255F91DE-EF50-457A-8688-C526FD2BF0F4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {255F91DE-EF50-457A-8688-C526FD2BF0F4}.Release|Any CPU.Build.0 = Release|Any CPU - {8494B973-A402-4F9B-8262-72DA92DA74D7}.Local|Any CPU.ActiveCfg = Local|Any CPU - {8494B973-A402-4F9B-8262-72DA92DA74D7}.Local|Any CPU.Build.0 = Local|Any CPU - {8494B973-A402-4F9B-8262-72DA92DA74D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8494B973-A402-4F9B-8262-72DA92DA74D7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8494B973-A402-4F9B-8262-72DA92DA74D7}.Testing|Any CPU.ActiveCfg = Testing|Any CPU - {8494B973-A402-4F9B-8262-72DA92DA74D7}.Testing|Any CPU.Build.0 = Testing|Any CPU - {8494B973-A402-4F9B-8262-72DA92DA74D7}.Staging|Any CPU.ActiveCfg = Staging|Any CPU - {8494B973-A402-4F9B-8262-72DA92DA74D7}.Staging|Any CPU.Build.0 = Staging|Any CPU - {8494B973-A402-4F9B-8262-72DA92DA74D7}.Production|Any CPU.ActiveCfg = Local|Any CPU - {8494B973-A402-4F9B-8262-72DA92DA74D7}.Production|Any CPU.Build.0 = Local|Any CPU - {8494B973-A402-4F9B-8262-72DA92DA74D7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8494B973-A402-4F9B-8262-72DA92DA74D7}.Release|Any CPU.Build.0 = Release|Any CPU + {FD4A80E2-D49C-4E08-B0A0-A4F99CEE64D6}.Local|Any CPU.ActiveCfg = Local|Any CPU + {FD4A80E2-D49C-4E08-B0A0-A4F99CEE64D6}.Local|Any CPU.Build.0 = Local|Any CPU + {FD4A80E2-D49C-4E08-B0A0-A4F99CEE64D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FD4A80E2-D49C-4E08-B0A0-A4F99CEE64D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FD4A80E2-D49C-4E08-B0A0-A4F99CEE64D6}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {FD4A80E2-D49C-4E08-B0A0-A4F99CEE64D6}.Testing|Any CPU.Build.0 = Testing|Any CPU + {FD4A80E2-D49C-4E08-B0A0-A4F99CEE64D6}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {FD4A80E2-D49C-4E08-B0A0-A4F99CEE64D6}.Staging|Any CPU.Build.0 = Staging|Any CPU + {FD4A80E2-D49C-4E08-B0A0-A4F99CEE64D6}.Production|Any CPU.ActiveCfg = Local|Any CPU + {FD4A80E2-D49C-4E08-B0A0-A4F99CEE64D6}.Production|Any CPU.Build.0 = Local|Any CPU + {FD4A80E2-D49C-4E08-B0A0-A4F99CEE64D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FD4A80E2-D49C-4E08-B0A0-A4F99CEE64D6}.Release|Any CPU.Build.0 = Release|Any CPU + {86A9240C-CB92-4EC7-9C82-ACC429BAD774}.Local|Any CPU.ActiveCfg = Local|Any CPU + {86A9240C-CB92-4EC7-9C82-ACC429BAD774}.Local|Any CPU.Build.0 = Local|Any CPU + {86A9240C-CB92-4EC7-9C82-ACC429BAD774}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86A9240C-CB92-4EC7-9C82-ACC429BAD774}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86A9240C-CB92-4EC7-9C82-ACC429BAD774}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {86A9240C-CB92-4EC7-9C82-ACC429BAD774}.Testing|Any CPU.Build.0 = Testing|Any CPU + {86A9240C-CB92-4EC7-9C82-ACC429BAD774}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {86A9240C-CB92-4EC7-9C82-ACC429BAD774}.Staging|Any CPU.Build.0 = Staging|Any CPU + {86A9240C-CB92-4EC7-9C82-ACC429BAD774}.Production|Any CPU.ActiveCfg = Local|Any CPU + {86A9240C-CB92-4EC7-9C82-ACC429BAD774}.Production|Any CPU.Build.0 = Local|Any CPU + {86A9240C-CB92-4EC7-9C82-ACC429BAD774}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86A9240C-CB92-4EC7-9C82-ACC429BAD774}.Release|Any CPU.Build.0 = Release|Any CPU + {75CCEE17-7ED6-4DAD-85E8-971722052B7F}.Local|Any CPU.ActiveCfg = Local|Any CPU + {75CCEE17-7ED6-4DAD-85E8-971722052B7F}.Local|Any CPU.Build.0 = Local|Any CPU + {75CCEE17-7ED6-4DAD-85E8-971722052B7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75CCEE17-7ED6-4DAD-85E8-971722052B7F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75CCEE17-7ED6-4DAD-85E8-971722052B7F}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {75CCEE17-7ED6-4DAD-85E8-971722052B7F}.Testing|Any CPU.Build.0 = Testing|Any CPU + {75CCEE17-7ED6-4DAD-85E8-971722052B7F}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {75CCEE17-7ED6-4DAD-85E8-971722052B7F}.Staging|Any CPU.Build.0 = Staging|Any CPU + {75CCEE17-7ED6-4DAD-85E8-971722052B7F}.Production|Any CPU.ActiveCfg = Local|Any CPU + {75CCEE17-7ED6-4DAD-85E8-971722052B7F}.Production|Any CPU.Build.0 = Local|Any CPU + {75CCEE17-7ED6-4DAD-85E8-971722052B7F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75CCEE17-7ED6-4DAD-85E8-971722052B7F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Mvc/IHostApplicationBuilderMvcExtensions.cs b/src/Mvc/IHostApplicationBuilderMvcExtensions.cs index 30d53519..5539b8e5 100644 --- a/src/Mvc/IHostApplicationBuilderMvcExtensions.cs +++ b/src/Mvc/IHostApplicationBuilderMvcExtensions.cs @@ -15,8 +15,8 @@ public static class IHostApplicationBuilderMvcExtensions private const string Mvc = nameof(Mvc); private const string JsonSerializer = nameof(JsonSerializer); - public static IHostApplicationBuilder AddMvc( - this IHostApplicationBuilder builder, + public static WebApplicationBuilder AddMvc( + this WebApplicationBuilder builder, string configurationSectionKey = Mvc ) { diff --git a/src/Mvc/MvcAutoConfigurator.cs b/src/Mvc/MvcAutoConfigurator.cs index 7613542a..01a2f0ed 100644 --- a/src/Mvc/MvcAutoConfigurator.cs +++ b/src/Mvc/MvcAutoConfigurator.cs @@ -10,7 +10,7 @@ public class MvcAutoConfigurator : IConfigureIHostApplicationBuilder, IConfigure private const string JsonSerializer = nameof(JsonSerializer); public ConfigurationOrder Order => ConfigurationOrder.AnyTime; - public void Configure(IHostApplicationBuilder builder) + public void Configure(WebApplicationBuilder builder) { builder.AddMvc(); } diff --git a/src/Mvc/MvcOptions.cs b/src/Mvc/MvcOptions.cs index af10fc8d..916fd53e 100644 --- a/src/Mvc/MvcOptions.cs +++ b/src/Mvc/MvcOptions.cs @@ -1,14 +1,133 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ApplicationModels; + namespace Dgmjr.AspNetCore.Mvc; public class MvcOptions : Microsoft.AspNetCore.Mvc.MvcOptions { + /// if you want to add controllers with views, otherwise public bool AddControllersWithViews { get; set; } = false; + + /// if you want to add controllers with views, otherwise public bool AddRazorPages { get; set; } = false; + + /// if you want to add controllers with views, otherwise public bool AddControllersAsServices { get; set; } = false; + + /// if you want to add the Microsoft Identity UI, otherwise public bool AddMicrosoftIdentityUI { get; set; } = false; + + /// if you want to add JSON serializer options, otherwise public bool AddJsonOptions { get; set; } = false; + + /// if you want to add XML serializer formatters, otherwise public bool AddXmlSerializerFormatters { get; set; } = false; + + /// if you want to add XML data contract serializer formatters, otherwise public bool AddXmlDataContractSerializerFormatters { get; set; } = false; + + /// if you want to add the DGMJR MVC conventions, otherwise public bool AddMvcConventions { get; set; } = false; + + /// if you want to add controllers, otherwise public bool AddControllers { get; set; } = false; + + /// + public new bool AllowEmptyInputInBodyModelBinding + { + get => base.AllowEmptyInputInBodyModelBinding; + set => base.AllowEmptyInputInBodyModelBinding = value; + } + + /// + public new bool EnableActionInvokers + { + get => base.EnableActionInvokers; + set => base.EnableActionInvokers = value; + } + + /// + public new bool EnableEndpointRouting + { + get => base.EnableEndpointRouting; + set => base.EnableEndpointRouting = value; + } + + /// + public new bool RespectBrowserAcceptHeader + { + get => base.RespectBrowserAcceptHeader; + set => base.RespectBrowserAcceptHeader = value; + } + + /// + public new bool RequireHttpsPermanent + { + get => base.RequireHttpsPermanent; + set => base.RequireHttpsPermanent = value; + } + + /// + public new bool SuppressAsyncSuffixInActionNames + { + get => base.SuppressAsyncSuffixInActionNames; + set => base.SuppressAsyncSuffixInActionNames = value; + } + + /// + public new bool SuppressInputFormatterBuffering + { + get => base.SuppressInputFormatterBuffering; + set => base.SuppressInputFormatterBuffering = value; + } + + /// + public new bool SuppressOutputFormatterBuffering + { + get => base.SuppressOutputFormatterBuffering; + set => base.SuppressOutputFormatterBuffering = value; + } + + /// + public new bool ValidateComplexTypesIfChildValidationFails + { + get => base.ValidateComplexTypesIfChildValidationFails; + set => base.ValidateComplexTypesIfChildValidationFails = value; + } + + /// + public new bool SuppressImplicitRequiredAttributeForNonNullableReferenceTypes + { + get => base.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes; + set => base.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = value; + } + + /// + public new bool ReturnHttpNotAcceptable + { + get => base.ReturnHttpNotAcceptable; + set => base.ReturnHttpNotAcceptable = value; + } + + /// + public new IDictionary CacheProfiles + { + get => base.CacheProfiles; + set + { + base.CacheProfiles.Clear(); + ForEach(value.ToArray(), cp => base.CacheProfiles.Add(cp)); + } + } + + /// + public new IList Conventions + { + get => base.Conventions; + set + { + base.Conventions.Clear(); + ForEach(value.ToArray(), c => base.Conventions.Add(c)); + } + } } diff --git a/src/Razor/Models/PageModelOfT.cs b/src/Razor/Models/PageModelOfT.cs index 650baf82..f7eabe84 100644 --- a/src/Razor/Models/PageModelOfT.cs +++ b/src/Razor/Models/PageModelOfT.cs @@ -17,24 +17,24 @@ namespace Dgmjr.AspNetCore.Razor; public class PageModel(object? model = default) : PageModelBase { - public object? ViewModel { get; set; } = model; + public virtual object? ViewModel { get; set; } = model; - public string? Title + public virtual string? Title { get => ViewData[nameof(Title)]?.ToString(); set => ViewData[nameof(Title)] = value; } - public string? Description + public virtual string? Description { get => ViewData[nameof(Description)]?.ToString(); set => ViewData[nameof(Description)] = value; } - public string[]? Keywords + public virtual string[]? Keywords { get => ViewData[nameof(Keywords)] as string[]; set => ViewData[nameof(Keywords)] = value; } - public string? Author + public virtual string? Author { get => ViewData[nameof(Author)]?.ToString(); set => ViewData[nameof(Author)] = value; @@ -43,7 +43,7 @@ public string? Author public class PageModel(T? model) : PageModel(model) { - public new T? ViewModel + public new virtual T? ViewModel { get => (T?)base.ViewModel; set => base.ViewModel = value; diff --git a/src/Swagger/AddSwaggerGen.cs b/src/Swagger/AddSwaggerGen.cs index 59b66c8a..6e251eca 100644 --- a/src/Swagger/AddSwaggerGen.cs +++ b/src/Swagger/AddSwaggerGen.cs @@ -24,8 +24,8 @@ public static partial class SwaggerExtensions const string SwaggerUI = nameof(SwaggerUI); - public static IHostApplicationBuilder AddSwaggerGen( - this IHostApplicationBuilder builder, + public static WebApplicationBuilder AddSwaggerGen( + this WebApplicationBuilder builder, string configurationSectionKey = Swagger, Action? configure = default ) diff --git a/src/Swagger/Dgmjr.AspNetCore.Swagger.csproj b/src/Swagger/Dgmjr.AspNetCore.Swagger.csproj index 2414b90b..652f0d03 100644 --- a/src/Swagger/Dgmjr.AspNetCore.Swagger.csproj +++ b/src/Swagger/Dgmjr.AspNetCore.Swagger.csproj @@ -21,8 +21,8 @@ - - + + diff --git a/src/Swagger/Dgmjr.AspNetCore.Swagger.sln b/src/Swagger/Dgmjr.AspNetCore.Swagger.sln index dec190ea..a02074b3 100644 --- a/src/Swagger/Dgmjr.AspNetCore.Swagger.sln +++ b/src/Swagger/Dgmjr.AspNetCore.Swagger.sln @@ -8,11 +8,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\..\..\..\Packages\Versions.Local.props = ..\..\..\..\Packages\Versions.Local.props EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Mime", "..\Http\Mime\Dgmjr.Mime.csproj", "{AD32CC21-23B7-4198-8A07-239412C29348}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Mime", "..\Http\Mime\Dgmjr.Mime.csproj", "{70B3D056-4633-4C33-8075-79D7F8ABB14A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Payloads", "..\Payloads\Dgmjr.Payloads.csproj", "{DCF860FE-897B-438B-85B1-1231EB06DAEE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Payloads", "..\Payloads\Dgmjr.Payloads.csproj", "{6AFA022E-28E4-4AC2-9981-1B293E6CA8E9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.AspNetCore.Swagger", "Dgmjr.AspNetCore.Swagger.csproj", "{E41934B4-7402-4951-A008-644AC0761AF1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.AspNetCore.Swagger", "Dgmjr.AspNetCore.Swagger.csproj", "{F272F784-F56E-487A-9BFF-14AEECD9EAD8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -24,42 +24,42 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AD32CC21-23B7-4198-8A07-239412C29348}.Local|Any CPU.ActiveCfg = Local|Any CPU - {AD32CC21-23B7-4198-8A07-239412C29348}.Local|Any CPU.Build.0 = Local|Any CPU - {AD32CC21-23B7-4198-8A07-239412C29348}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AD32CC21-23B7-4198-8A07-239412C29348}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AD32CC21-23B7-4198-8A07-239412C29348}.Testing|Any CPU.ActiveCfg = Testing|Any CPU - {AD32CC21-23B7-4198-8A07-239412C29348}.Testing|Any CPU.Build.0 = Testing|Any CPU - {AD32CC21-23B7-4198-8A07-239412C29348}.Staging|Any CPU.ActiveCfg = Staging|Any CPU - {AD32CC21-23B7-4198-8A07-239412C29348}.Staging|Any CPU.Build.0 = Staging|Any CPU - {AD32CC21-23B7-4198-8A07-239412C29348}.Production|Any CPU.ActiveCfg = Local|Any CPU - {AD32CC21-23B7-4198-8A07-239412C29348}.Production|Any CPU.Build.0 = Local|Any CPU - {AD32CC21-23B7-4198-8A07-239412C29348}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AD32CC21-23B7-4198-8A07-239412C29348}.Release|Any CPU.Build.0 = Release|Any CPU - {DCF860FE-897B-438B-85B1-1231EB06DAEE}.Local|Any CPU.ActiveCfg = Local|Any CPU - {DCF860FE-897B-438B-85B1-1231EB06DAEE}.Local|Any CPU.Build.0 = Local|Any CPU - {DCF860FE-897B-438B-85B1-1231EB06DAEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DCF860FE-897B-438B-85B1-1231EB06DAEE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DCF860FE-897B-438B-85B1-1231EB06DAEE}.Testing|Any CPU.ActiveCfg = Testing|Any CPU - {DCF860FE-897B-438B-85B1-1231EB06DAEE}.Testing|Any CPU.Build.0 = Testing|Any CPU - {DCF860FE-897B-438B-85B1-1231EB06DAEE}.Staging|Any CPU.ActiveCfg = Staging|Any CPU - {DCF860FE-897B-438B-85B1-1231EB06DAEE}.Staging|Any CPU.Build.0 = Staging|Any CPU - {DCF860FE-897B-438B-85B1-1231EB06DAEE}.Production|Any CPU.ActiveCfg = Local|Any CPU - {DCF860FE-897B-438B-85B1-1231EB06DAEE}.Production|Any CPU.Build.0 = Local|Any CPU - {DCF860FE-897B-438B-85B1-1231EB06DAEE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DCF860FE-897B-438B-85B1-1231EB06DAEE}.Release|Any CPU.Build.0 = Release|Any CPU - {E41934B4-7402-4951-A008-644AC0761AF1}.Local|Any CPU.ActiveCfg = Local|Any CPU - {E41934B4-7402-4951-A008-644AC0761AF1}.Local|Any CPU.Build.0 = Local|Any CPU - {E41934B4-7402-4951-A008-644AC0761AF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E41934B4-7402-4951-A008-644AC0761AF1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E41934B4-7402-4951-A008-644AC0761AF1}.Testing|Any CPU.ActiveCfg = Testing|Any CPU - {E41934B4-7402-4951-A008-644AC0761AF1}.Testing|Any CPU.Build.0 = Testing|Any CPU - {E41934B4-7402-4951-A008-644AC0761AF1}.Staging|Any CPU.ActiveCfg = Staging|Any CPU - {E41934B4-7402-4951-A008-644AC0761AF1}.Staging|Any CPU.Build.0 = Staging|Any CPU - {E41934B4-7402-4951-A008-644AC0761AF1}.Production|Any CPU.ActiveCfg = Local|Any CPU - {E41934B4-7402-4951-A008-644AC0761AF1}.Production|Any CPU.Build.0 = Local|Any CPU - {E41934B4-7402-4951-A008-644AC0761AF1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E41934B4-7402-4951-A008-644AC0761AF1}.Release|Any CPU.Build.0 = Release|Any CPU + {70B3D056-4633-4C33-8075-79D7F8ABB14A}.Local|Any CPU.ActiveCfg = Local|Any CPU + {70B3D056-4633-4C33-8075-79D7F8ABB14A}.Local|Any CPU.Build.0 = Local|Any CPU + {70B3D056-4633-4C33-8075-79D7F8ABB14A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70B3D056-4633-4C33-8075-79D7F8ABB14A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70B3D056-4633-4C33-8075-79D7F8ABB14A}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {70B3D056-4633-4C33-8075-79D7F8ABB14A}.Testing|Any CPU.Build.0 = Testing|Any CPU + {70B3D056-4633-4C33-8075-79D7F8ABB14A}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {70B3D056-4633-4C33-8075-79D7F8ABB14A}.Staging|Any CPU.Build.0 = Staging|Any CPU + {70B3D056-4633-4C33-8075-79D7F8ABB14A}.Production|Any CPU.ActiveCfg = Local|Any CPU + {70B3D056-4633-4C33-8075-79D7F8ABB14A}.Production|Any CPU.Build.0 = Local|Any CPU + {70B3D056-4633-4C33-8075-79D7F8ABB14A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70B3D056-4633-4C33-8075-79D7F8ABB14A}.Release|Any CPU.Build.0 = Release|Any CPU + {6AFA022E-28E4-4AC2-9981-1B293E6CA8E9}.Local|Any CPU.ActiveCfg = Local|Any CPU + {6AFA022E-28E4-4AC2-9981-1B293E6CA8E9}.Local|Any CPU.Build.0 = Local|Any CPU + {6AFA022E-28E4-4AC2-9981-1B293E6CA8E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6AFA022E-28E4-4AC2-9981-1B293E6CA8E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6AFA022E-28E4-4AC2-9981-1B293E6CA8E9}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {6AFA022E-28E4-4AC2-9981-1B293E6CA8E9}.Testing|Any CPU.Build.0 = Testing|Any CPU + {6AFA022E-28E4-4AC2-9981-1B293E6CA8E9}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {6AFA022E-28E4-4AC2-9981-1B293E6CA8E9}.Staging|Any CPU.Build.0 = Staging|Any CPU + {6AFA022E-28E4-4AC2-9981-1B293E6CA8E9}.Production|Any CPU.ActiveCfg = Local|Any CPU + {6AFA022E-28E4-4AC2-9981-1B293E6CA8E9}.Production|Any CPU.Build.0 = Local|Any CPU + {6AFA022E-28E4-4AC2-9981-1B293E6CA8E9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6AFA022E-28E4-4AC2-9981-1B293E6CA8E9}.Release|Any CPU.Build.0 = Release|Any CPU + {F272F784-F56E-487A-9BFF-14AEECD9EAD8}.Local|Any CPU.ActiveCfg = Local|Any CPU + {F272F784-F56E-487A-9BFF-14AEECD9EAD8}.Local|Any CPU.Build.0 = Local|Any CPU + {F272F784-F56E-487A-9BFF-14AEECD9EAD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F272F784-F56E-487A-9BFF-14AEECD9EAD8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F272F784-F56E-487A-9BFF-14AEECD9EAD8}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {F272F784-F56E-487A-9BFF-14AEECD9EAD8}.Testing|Any CPU.Build.0 = Testing|Any CPU + {F272F784-F56E-487A-9BFF-14AEECD9EAD8}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {F272F784-F56E-487A-9BFF-14AEECD9EAD8}.Staging|Any CPU.Build.0 = Staging|Any CPU + {F272F784-F56E-487A-9BFF-14AEECD9EAD8}.Production|Any CPU.ActiveCfg = Local|Any CPU + {F272F784-F56E-487A-9BFF-14AEECD9EAD8}.Production|Any CPU.Build.0 = Local|Any CPU + {F272F784-F56E-487A-9BFF-14AEECD9EAD8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F272F784-F56E-487A-9BFF-14AEECD9EAD8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Swagger/SwaggerAutoConfigurator.cs b/src/Swagger/SwaggerAutoConfigurator.cs index 6caddff6..477398b0 100644 --- a/src/Swagger/SwaggerAutoConfigurator.cs +++ b/src/Swagger/SwaggerAutoConfigurator.cs @@ -8,7 +8,7 @@ public class SwaggerAutoConfigurator { public ConfigurationOrder Order => ConfigurationOrder.AnyTime; - public void Configure(IHostApplicationBuilder builder) + public void Configure(WebApplicationBuilder builder) { builder.AddSwaggerGen(); } diff --git a/src/Swagger/SwaggerExtensions/AddExamplesExtension.cs b/src/Swagger/SwaggerExtensions/AddExamplesExtension.cs index 23287fec..50b6da80 100644 --- a/src/Swagger/SwaggerExtensions/AddExamplesExtension.cs +++ b/src/Swagger/SwaggerExtensions/AddExamplesExtension.cs @@ -17,8 +17,8 @@ namespace Microsoft.Extensions.DependencyInjection; internal static partial class InternalSwaggerExtensions { - public static IHostApplicationBuilder AddSwaggerExamples( - this IHostApplicationBuilder builder, + public static WebApplicationBuilder AddSwaggerExamples( + this WebApplicationBuilder builder, params Assembly[]? assemblies ) { diff --git a/src/Swagger/SwaggerExtensions/AddSwaggerMetadataExtension.cs b/src/Swagger/SwaggerExtensions/AddSwaggerMetadataExtension.cs index 4293111e..d24bbe56 100644 --- a/src/Swagger/SwaggerExtensions/AddSwaggerMetadataExtension.cs +++ b/src/Swagger/SwaggerExtensions/AddSwaggerMetadataExtension.cs @@ -31,8 +31,8 @@ namespace Microsoft.Extensions.DependencyInjection; internal static partial class InternalSwaggerExtensions { - public static IHostApplicationBuilder AddSwaggerMetadata( - this IHostApplicationBuilder builder, + public static WebApplicationBuilder AddSwaggerMetadata( + this WebApplicationBuilder builder, Type tThisAssemblyProject, string version = "v1", OpenApiInfo? openApiInfo = default @@ -55,8 +55,8 @@ public static IHostApplicationBuilder AddSwaggerMetadata( return builder; } - public static IHostApplicationBuilder AddApiKeyToSwaggerSecurity( - this IHostApplicationBuilder builder + public static WebApplicationBuilder AddApiKeyToSwaggerSecurity( + this WebApplicationBuilder builder ) { builder.Services.ConfigureSwaggerGen(c => @@ -77,8 +77,8 @@ this IHostApplicationBuilder builder return builder; } - public static IHostApplicationBuilder DescribeBasicApiAuthentication( - this IHostApplicationBuilder builder + public static WebApplicationBuilder DescribeBasicApiAuthentication( + this WebApplicationBuilder builder ) { builder.Services.ConfigureSwaggerGen(c => @@ -114,8 +114,8 @@ this IHostApplicationBuilder builder return builder; } - public static IHostApplicationBuilder AddSwaggerHeaderOperationFilter( - this IHostApplicationBuilder builder + public static WebApplicationBuilder AddSwaggerHeaderOperationFilter( + this WebApplicationBuilder builder ) { builder.Services.ConfigureSwaggerGen( @@ -129,8 +129,8 @@ this IHostApplicationBuilder builder return builder; } - public static IHostApplicationBuilder DescribeDataTypesToSwagger( - this IHostApplicationBuilder builder + public static WebApplicationBuilder DescribeDataTypesToSwagger( + this WebApplicationBuilder builder ) { builder.Services.Describe(); diff --git a/src/Swagger/SwaggerExtensions/AddXmlCommentsToSwaggerExtensions.cs b/src/Swagger/SwaggerExtensions/AddXmlCommentsToSwaggerExtensions.cs index 1af0e979..b0f934e3 100644 --- a/src/Swagger/SwaggerExtensions/AddXmlCommentsToSwaggerExtensions.cs +++ b/src/Swagger/SwaggerExtensions/AddXmlCommentsToSwaggerExtensions.cs @@ -33,7 +33,7 @@ public static bool IsParsable(string xmlDoc) return false; } - public static IHostApplicationBuilder AddXmlCommentsToSwagger(this IHostApplicationBuilder builder) + public static WebApplicationBuilder AddXmlCommentsToSwagger(this WebApplicationBuilder builder) { var binRoot = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var xmlDocs = Directory diff --git a/src/Swagger/SwaggerExtensions/DescribeEnumsAsStrings.cs b/src/Swagger/SwaggerExtensions/DescribeEnumsAsStrings.cs index cbbb9d1a..9119aa5e 100644 --- a/src/Swagger/SwaggerExtensions/DescribeEnumsAsStrings.cs +++ b/src/Swagger/SwaggerExtensions/DescribeEnumsAsStrings.cs @@ -1,8 +1,10 @@ namespace Microsoft.Extensions.DependencyInjection; +using Microsoft.AspNetCore.Builder; + internal static partial class InternalSwaggerExtensions { - public static IHostApplicationBuilder DescribeEnumsAsStrings(this IHostApplicationBuilder builder) + public static WebApplicationBuilder DescribeEnumsAsStrings(this WebApplicationBuilder builder) { builder.Services.ConfigureSwaggerGen(c => c.SchemaFilter()); return builder; diff --git a/src/Swagger/SwaggerExtensions/DescribeFileUploads.cs b/src/Swagger/SwaggerExtensions/DescribeFileUploads.cs index 80ed757d..f0493727 100644 --- a/src/Swagger/SwaggerExtensions/DescribeFileUploads.cs +++ b/src/Swagger/SwaggerExtensions/DescribeFileUploads.cs @@ -22,9 +22,7 @@ namespace Microsoft.Extensions.DependencyInjection; internal static partial class InternalSwaggerExtensions { - public static IHostApplicationBuilder DescribeFileUploads( - this IHostApplicationBuilder builder - ) + public static WebApplicationBuilder DescribeFileUploads(this WebApplicationBuilder builder) { builder.Services.ConfigureSwaggerGen( options => options.OperationFilter() diff --git a/src/Swagger/SwaggerExtensions/DescribeSchemasViaAttributes.cs b/src/Swagger/SwaggerExtensions/DescribeSchemasViaAttributes.cs index c703bffe..4d0bec1a 100644 --- a/src/Swagger/SwaggerExtensions/DescribeSchemasViaAttributes.cs +++ b/src/Swagger/SwaggerExtensions/DescribeSchemasViaAttributes.cs @@ -16,8 +16,8 @@ namespace Microsoft.Extensions.DependencyInjection; internal static partial class InternalSwaggerExtensions { - public static IHostApplicationBuilder DescribeSchemasViaAttributes( - this IHostApplicationBuilder builder + public static WebApplicationBuilder DescribeSchemasViaAttributes( + this WebApplicationBuilder builder ) { builder.Services.DescribeSchemasViaAttributes(); diff --git a/src/Swagger/SwaggerExtensions/DescribeTypesForAllOutputFormatters.cs b/src/Swagger/SwaggerExtensions/DescribeTypesForAllOutputFormatters.cs index 26a8ba04..36510036 100644 --- a/src/Swagger/SwaggerExtensions/DescribeTypesForAllOutputFormatters.cs +++ b/src/Swagger/SwaggerExtensions/DescribeTypesForAllOutputFormatters.cs @@ -28,8 +28,8 @@ this IServiceCollection services return services; } - public static IHostApplicationBuilder DescribeTypesForAllOutputFormatters( - this IHostApplicationBuilder builder + public static WebApplicationBuilder DescribeTypesForAllOutputFormatters( + this WebApplicationBuilder builder ) { builder.Services.ConfigureSwaggerGen( diff --git a/src/Swagger/SwaggerExtensions/SwaggerConflictingActionsResolver.cs b/src/Swagger/SwaggerExtensions/SwaggerConflictingActionsResolver.cs index 105a20ff..b430c738 100644 --- a/src/Swagger/SwaggerExtensions/SwaggerConflictingActionsResolver.cs +++ b/src/Swagger/SwaggerExtensions/SwaggerConflictingActionsResolver.cs @@ -16,8 +16,8 @@ namespace Microsoft.Extensions.DependencyInjection; internal static partial class InternalSwaggerExtensions { - public static IHostApplicationBuilder AddSwaggerConflictingActionsResolver( - this IHostApplicationBuilder builder + public static WebApplicationBuilder AddSwaggerConflictingActionsResolver( + this WebApplicationBuilder builder ) { builder.Services.ConfigureSwaggerGen( diff --git a/src/TagHelpers/Bootstrap/Code/TypeName.cs b/src/TagHelpers/Bootstrap/Code/TypeName.cs new file mode 100644 index 00000000..eddfb995 --- /dev/null +++ b/src/TagHelpers/Bootstrap/Code/TypeName.cs @@ -0,0 +1,125 @@ +/* + * TypeName.cs + * + * Created: 2024-22-27T05:22:04-05:00 + * Modified: 2024-22-27T05:22:04-05:00 + * + * Author: David G. Moore, Jr. + * + * Copyright © 2024 David G. Moore, Jr., All Rights Reserved + * License: MIT (https://opensource.org/licenses/MIT) + */ + +using System.Threading.Tasks; + +namespace Dgmjr.AspNetCore.TagHelpers.Bootstrap.Code; + +[HtmlTargetElement("code", Attributes = "class-name")] +[HtmlTargetElement("class-name", ParentTag = "code")] +[HtmlTargetElement("class", ParentTag = "code")] +public class ClassName : TagHelper +{ + public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) + { + output.AddCssClass("type"); + return base.ProcessAsync(context, output); + } +} + +[HtmlTargetElement("code", Attributes = "const")] +[HtmlTargetElement("const", ParentTag = "code")] +public class Constant : TagHelper +{ + public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) + { + output.AddCssClass("constant"); + return base.ProcessAsync(context, output); + } +} + +[HtmlTargetElement("code", Attributes = "keyword")] +[HtmlTargetElement("keyword", ParentTag = "code")] +public class Keyword : TagHelper +{ + public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) + { + output.AddCssClass("keyword"); + return base.ProcessAsync(context, output); + } +} + +[HtmlTargetElement("code", Attributes = "var")] +[HtmlTargetElement("var", ParentTag = "code")] +public class Variable : TagHelper +{ + public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) + { + output.AddCssClass("variable"); + return base.ProcessAsync(context, output); + } +} + +[HtmlTargetElement("code", Attributes = "number")] +[HtmlTargetElement("number", ParentTag = "code")] +[HtmlTargetElement("numeric", ParentTag = "code")] +[HtmlTargetElement("numeric-literal", ParentTag = "code")] +public class NumberLiteral : TagHelper +{ + public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) + { + output.AddCssClass("number"); + return base.ProcessAsync(context, output); + } +} + +[HtmlTargetElement("code", Attributes = "primitive")] +[HtmlTargetElement("primitive", ParentTag = "code")] +public class Primitive : TagHelper +{ + public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) + { + output.AddCssClass("primitive"); + return base.ProcessAsync(context, output); + /* this is a comment */ + } +} + +[HtmlTargetElement("code", Attributes = "string")] +[HtmlTargetElement("string", ParentTag = "code")] +[HtmlTargetElement("string-literal", ParentTag = "code")] +public class StringLiteral : TagHelper +{ + public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) + { + output.AddCssClass("string"); + return base.ProcessAsync(context, output); + } +} + +[HtmlTargetElement("code", Attributes = "method")] +[HtmlTargetElement("code", Attributes = "function")] +[HtmlTargetElement("code", Attributes = "property")] +[HtmlTargetElement("code", Attributes = "prop")] +[HtmlTargetElement("method", ParentTag = "code")] +[HtmlTargetElement("function", ParentTag = "code")] +[HtmlTargetElement("property", ParentTag = "code")] +[HtmlTargetElement("prop", ParentTag = "code")] +public class MethodOrProperty : TagHelper +{ + public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) + { + output.AddCssClass("method"); + return base.ProcessAsync(context, output); + } +} + +[HtmlTargetElement("code", Attributes = "namespace")] +[HtmlTargetElement("namespace", ParentTag = "code")] +public class Namespace : TagHelper +{ + public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) + { + output.AddCssClass("namespace"); + return base.ProcessAsync(context, output); + } +} diff --git a/src/TagHelpers/Constants/TagHelperConstants.AttributeNames.cs b/src/TagHelpers/Constants/TagHelperConstants.AttributeNames.cs new file mode 100644 index 00000000..7a6642c9 --- /dev/null +++ b/src/TagHelpers/Constants/TagHelperConstants.AttributeNames.cs @@ -0,0 +1,97 @@ +namespace Dgmjr.AspNetCore.TagHelpers; + +public static partial class TagHelperConstants +{ + public static class AttributeNames + { + public const string Action = TagPrefixes.Asp + "action"; + public const string Alt = "alt"; + public const string Area = TagPrefixes.Asp + "area"; + public const string AriaControls = "aria-controls"; + public const string AriaExpanded = "aria-expanded"; + public const string AriaLabel = "aria-label"; + public const string AspIf = TagPrefixes.Asp + "if"; + public const string Class = "class"; + public const string BsLabelPosition = TagPrefixes.Bootstrap + "label-position"; + public const string BorderColor = TagPrefixes.Bootstrap + "border-color"; + public const string BackgroundColor = TagPrefixes.Bootstrap + "bg-color"; + public const string Color = TagPrefixes.Bootstrap + "color"; + public const string Controller = TagPrefixes.Asp + "controller"; + public const string DataDismiss = TagPrefixes.Data + "dismiss"; + public const string DataParent = TagPrefixes.Data + "parent"; + public const string DataRide = TagPrefixes.Data + "ride"; + public const string DataSlide = TagPrefixes.Data + "slide"; + public const string DataSlideTo = TagPrefixes.Data + "slide-to"; + public const string DataBsTarget = TagPrefixes.Data + "bs-target"; + public const string DataTarget = TagPrefixes.Data + "target"; + public const string DataTargetCarousel = TagPrefixes.Data + "target-carousel"; + public const string DataTargetCollapse = TagPrefixes.Data + "target-collapse"; + public const string DataTargetDismiss = TagPrefixes.Data + "target-dismiss"; + public const string DataTargetModal = TagPrefixes.Data + "target-modal"; + public const string DataTargetModalBackdrop = TagPrefixes.Data + "target-modal-backdrop"; + public const string DataTargetModalBackdropDismiss = + TagPrefixes.Data + "target-modal-backdrop-dismiss"; + public const string DataTargetModalBackdropStatic = + TagPrefixes.Data + "target-modal-backdrop-static"; + public const string DataTargetModalBackdropToggle = + TagPrefixes.Data + "target-modal-backdrop-toggle"; + public const string DataTargetModalDismiss = TagPrefixes.Data + "target-modal-dismiss"; + public const string DataTargetModalKeyboard = TagPrefixes.Data + "target-modal-keyboard"; + public const string DataTargetModalRemote = TagPrefixes.Data + "target-modal-remote"; + public const string DataTargetModalScroll = TagPrefixes.Data + "target-modal-scroll"; + public const string DataTargetModalShow = TagPrefixes.Data + "target-modal-show"; + public const string DataTargetModalStatic = TagPrefixes.Data + "target-modal-static"; + public const string DataTargetModalToggle = TagPrefixes.Data + "target-modal-toggle"; + public const string DataTargetParent = TagPrefixes.Data + "target-parent"; + public const string DataTargetPopover = TagPrefixes.Data + "target-popover"; + public const string DataTargetRide = TagPrefixes.Data + "target-ride"; + public const string DataTargetSlide = TagPrefixes.Data + "target-slide"; + public const string DataTargetSlideTo = TagPrefixes.Data + "target-slide-to"; + public const string DataTargetTab = TagPrefixes.Data + "target-tab"; + public const string DataTargetToggle = TagPrefixes.Data + "target-toggle"; + public const string DataTargetTooltip = TagPrefixes.Data + "target-tooltip"; + public const string DataBsToggle = TagPrefixes.Data + "bs-toggle"; + public const string DataToggle = TagPrefixes.Data + "toggle"; + public const string Disabled = "disabled"; + public const string For = "for"; + public const string Header = "header"; + public const string HeaderBorderColor = "header-border-color"; + public const string HeaderColor = "header-color"; + public const string HeadingType = "heading-type"; + public const string Height = "height"; + public const string Href = "href"; + public const string Id = "id"; + public const string IsExpanded = "expanded"; + public const string Label = "label"; + public const string MarginBottom = "margin-bottom"; + public const string Name = "name"; + public const string Placeholder = "placeholder"; + public const string TextBefore = "text-before"; + public const string TextAfter = "text-after"; + public const string Position = "position"; + public const string Readonly = "readonly"; + public const string Required = "required"; + public const string Role = "role"; + public const string Rows = "rows"; + public const string Size = "size"; + public const string Src = "src"; + public const string SrcSet = "srcset"; + public const string SrcSetMedia = "media"; + public const string SrcSetSizes = "sizes"; + public const string SrcSetType = "type"; + public const string SrcSetTypeApplication = "application"; + public const string SrcSetTypeAudio = "audio"; + public const string SrcSetTypeFont = "font"; + public const string SrcSetTypeImage = "image"; + public const string SrcSetTypeJson = "json"; + public const string SrcSetTypeText = "text"; + public const string SrcSetTypeVideo = "video"; + public const string SrcSetTypeXhtml = "xhtml"; + public const string SrcSetTypeXml = "xml"; + public const string Target = "target"; + public const string Title = "title"; + public const string Type = "type"; + public const string Value = "value"; + public const string Variant = "variant"; + } +} diff --git a/src/TagHelpers/TagHelperConstants.cs b/src/TagHelpers/Constants/TagHelperConstants.CssClasses.cs similarity index 70% rename from src/TagHelpers/TagHelperConstants.cs rename to src/TagHelpers/Constants/TagHelperConstants.CssClasses.cs index 3e166e18..e617f27d 100644 --- a/src/TagHelpers/TagHelperConstants.cs +++ b/src/TagHelpers/Constants/TagHelperConstants.CssClasses.cs @@ -1,146 +1,7 @@ namespace Dgmjr.AspNetCore.TagHelpers; -public static class TagHelperConstants +public static partial class TagHelperConstants { - public static class TagNames - { - public const string Accordion = "accordion"; - public const string AccordionItem = "accordion-item"; - public const string Alert = "alert"; - public const string Anchor = "a"; - public const string Any = "*"; - public const string Btn = "btn"; - public const string Button = "button"; - public const string Contact = "contact"; - public const string Container = "container"; - public const string ClientSideValidationScript = "client-side-validation-script"; - public const string Div = "div"; - public const string Divider = "hr"; - public const string DropdownItem = "dropdown-item"; - public const string Email = "email"; - public const string Expanded = "expanded"; - public const string Footer = "footer"; - public const string Form = "form"; - public const string Img = "img"; - public const string Input = "input"; - public const string Li = "li"; - public const string Nav = "nav"; - public const string Navbar = "navbar"; - public const string NavbarLink = "navbar-link"; - public const string NavbarNav = "navbar-nav"; - public const string NavbarNavRight = "navbar-nav-right"; - public const string NavbarText = "navbar-text"; - public const string NavDropdown = "nav-dropdown"; - public const string NavDropdownItem = "nav-dropdown-item"; - public const string NavDropdownLink = "nav-dropdown-link"; - public const string NavForm = "nav-form"; - public const string NavItem = "nav-item"; - public const string NavLink = "nav-link"; - public const string NavText = "nav-text"; - public const string PageHeader = "page-header"; - public const string Panel = "panel"; - public const string PanelBody = "panel-body"; - public const string PanelFooter = "panel-footer"; - public const string PanelHeading = "panel-heading"; - public const string PanelTitle = "panel-title"; - public const string Paragraph = "p"; - public const string Select = "select"; - public const string Span = "span"; - public const string Table = "table"; - public const string TextArea = "textarea"; - public const string Ul = "ul"; - } - - public static class AttributeNames - { - public const string Action = "asp-action"; - public const string Alt = "alt"; - public const string Area = "asp-area"; - public const string AriaControls = "aria-controls"; - public const string AriaExpanded = "aria-expanded"; - public const string AriaLabel = "aria-label"; - public const string AspIf = "asp-if"; - public const string Class = "class"; - public const string BsLabelPosition = "bs-label-position"; - public const string BorderColor = "bs-border-color"; - public const string BackgroundColor = "bs-bg-color"; - public const string Color = "bs-color"; - public const string Controller = "asp-controller"; - public const string DataDismiss = "data-dismiss"; - public const string DataParent = "data-parent"; - public const string DataRide = "data-ride"; - public const string DataSlide = "data-slide"; - public const string DataSlideTo = "data-slide-to"; - public const string DataBsTarget = "data-bs-target"; - public const string DataTarget = "data-target"; - public const string DataTargetCarousel = "data-target-carousel"; - public const string DataTargetCollapse = "data-target-collapse"; - public const string DataTargetDismiss = "data-target-dismiss"; - public const string DataTargetModal = "data-target-modal"; - public const string DataTargetModalBackdrop = "data-target-modal-backdrop"; - public const string DataTargetModalBackdropDismiss = "data-target-modal-backdrop-dismiss"; - public const string DataTargetModalBackdropStatic = "data-target-modal-backdrop-static"; - public const string DataTargetModalBackdropToggle = "data-target-modal-backdrop-toggle"; - public const string DataTargetModalDismiss = "data-target-modal-dismiss"; - public const string DataTargetModalKeyboard = "data-target-modal-keyboard"; - public const string DataTargetModalRemote = "data-target-modal-remote"; - public const string DataTargetModalScroll = "data-target-modal-scroll"; - public const string DataTargetModalShow = "data-target-modal-show"; - public const string DataTargetModalStatic = "data-target-modal-static"; - public const string DataTargetModalToggle = "data-target-modal-toggle"; - public const string DataTargetParent = "data-target-parent"; - public const string DataTargetPopover = "data-target-popover"; - public const string DataTargetRide = "data-target-ride"; - public const string DataTargetSlide = "data-target-slide"; - public const string DataTargetSlideTo = "data-target-slide-to"; - public const string DataTargetTab = "data-target-tab"; - public const string DataTargetToggle = "data-target-toggle"; - public const string DataTargetTooltip = "data-target-tooltip"; - public const string DataBsToggle = "data-bs-toggle"; - public const string DataToggle = "data-toggle"; - public const string Disabled = "disabled"; - public const string For = "for"; - public const string Header = "header"; - public const string HeaderBorderColor = "header-border-color"; - public const string HeaderColor = "header-color"; - public const string HeadingType = "heading-type"; - public const string Height = "height"; - public const string Href = "href"; - public const string Id = "id"; - public const string IsExpanded = "expanded"; - public const string Label = "label"; - public const string MarginBottom = "margin-bottom"; - public const string Name = "name"; - public const string Placeholder = "placeholder"; - public const string TextBefore = "text-before"; - public const string TextAfter = "text-after"; - public const string Position = "position"; - public const string Readonly = "readonly"; - public const string Required = "required"; - public const string Role = "role"; - public const string Rows = "rows"; - public const string Size = "size"; - public const string Src = "src"; - public const string SrcSet = "srcset"; - public const string SrcSetMedia = "media"; - public const string SrcSetSizes = "sizes"; - public const string SrcSetType = "type"; - public const string SrcSetTypeApplication = "application"; - public const string SrcSetTypeAudio = "audio"; - public const string SrcSetTypeFont = "font"; - public const string SrcSetTypeImage = "image"; - public const string SrcSetTypeJson = "json"; - public const string SrcSetTypeText = "text"; - public const string SrcSetTypeVideo = "video"; - public const string SrcSetTypeXhtml = "xhtml"; - public const string SrcSetTypeXml = "xml"; - public const string Target = "target"; - public const string Title = "title"; - public const string Type = "type"; - public const string Value = "value"; - public const string Variant = "variant"; - } - public static class CssClasses { public const string Accordion = "accordion"; diff --git a/src/TagHelpers/Constants/TagHelperConstants.TagNames.cs b/src/TagHelpers/Constants/TagHelperConstants.TagNames.cs new file mode 100644 index 00000000..fbd725f2 --- /dev/null +++ b/src/TagHelpers/Constants/TagHelperConstants.TagNames.cs @@ -0,0 +1,53 @@ +namespace Dgmjr.AspNetCore.TagHelpers; + +public static partial class TagHelperConstants +{ + public static class TagNames + { + public const string Accordion = "accordion"; + public const string AccordionItem = "accordion-item"; + public const string Alert = "alert"; + public const string Anchor = "a"; + public const string Any = "*"; + public const string Btn = "btn"; + public const string Button = "button"; + public const string Contact = "contact"; + public const string Container = "container"; + public const string ClientSideValidationScript = "client-side-validation-script"; + public const string Div = "div"; + public const string Divider = "hr"; + public const string DropdownItem = "dropdown-item"; + public const string Email = "email"; + public const string Expanded = "expanded"; + public const string Footer = "footer"; + public const string Form = "form"; + public const string Img = "img"; + public const string Input = "input"; + public const string Li = "li"; + public const string Nav = "nav"; + public const string Navbar = "navbar"; + public const string NavbarLink = "navbar-link"; + public const string NavbarNav = "navbar-nav"; + public const string NavbarNavRight = "navbar-nav-right"; + public const string NavbarText = "navbar-text"; + public const string NavDropdown = "nav-dropdown"; + public const string NavDropdownItem = "nav-dropdown-item"; + public const string NavDropdownLink = "nav-dropdown-link"; + public const string NavForm = "nav-form"; + public const string NavItem = "nav-item"; + public const string NavLink = "nav-link"; + public const string NavText = "nav-text"; + public const string PageHeader = "page-header"; + public const string Panel = "panel"; + public const string PanelBody = "panel-body"; + public const string PanelFooter = "panel-footer"; + public const string PanelHeading = "panel-heading"; + public const string PanelTitle = "panel-title"; + public const string Paragraph = "p"; + public const string Select = "select"; + public const string Span = "span"; + public const string Table = "table"; + public const string TextArea = "textarea"; + public const string Ul = "ul"; + } +} diff --git a/src/TagHelpers/Constants/TagHelperConstants.TagPrefixes.cs b/src/TagHelpers/Constants/TagHelperConstants.TagPrefixes.cs new file mode 100644 index 00000000..421a0e4a --- /dev/null +++ b/src/TagHelpers/Constants/TagHelperConstants.TagPrefixes.cs @@ -0,0 +1,12 @@ +namespace Dgmjr.AspNetCore.TagHelpers; + +public static partial class TagHelperConstants +{ + public static class TagPrefixes + { + public const string Aria = "aria-"; + public const string Asp = "asp-"; + public const string Bootstrap = "bs-"; + public const string Data = "data-"; + } +} diff --git a/src/TagHelpers/Constants/TagHelperConstants.cs b/src/TagHelpers/Constants/TagHelperConstants.cs new file mode 100644 index 00000000..03a4fd05 --- /dev/null +++ b/src/TagHelpers/Constants/TagHelperConstants.cs @@ -0,0 +1,3 @@ +namespace Dgmjr.AspNetCore.TagHelpers; + +public static partial class TagHelperConstants { } diff --git a/src/TagHelpers/Dgmjr.AspNetCore.TagHelpers.csproj b/src/TagHelpers/Dgmjr.AspNetCore.TagHelpers.csproj index e9fc6a75..519bacfc 100644 --- a/src/TagHelpers/Dgmjr.AspNetCore.TagHelpers.csproj +++ b/src/TagHelpers/Dgmjr.AspNetCore.TagHelpers.csproj @@ -63,6 +63,7 @@ + diff --git a/src/TagHelpers/Dgmjr.AspNetCore.TagHelpers.sln b/src/TagHelpers/Dgmjr.AspNetCore.TagHelpers.sln index 98527124..6c0ee817 100644 --- a/src/TagHelpers/Dgmjr.AspNetCore.TagHelpers.sln +++ b/src/TagHelpers/Dgmjr.AspNetCore.TagHelpers.sln @@ -10,7 +10,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.Abstractions", "..\..\..\Types\Abstractions\Dgmjr.Abstractions.csproj", "{A2F9676F-D2B3-436D-99A7-68FF47AC8741}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.AspNetCore.TagHelpers", "Dgmjr.AspNetCore.TagHelpers.csproj", "{C5A6C7E0-B36A-472D-865A-BD32170F17CE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dgmjr.AspNetCore.TagHelpers", "Dgmjr.AspNetCore.TagHelpers.csproj", "{E6715DDF-3BD8-4D0E-BFB9-5137D37B750C}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -34,18 +34,18 @@ Global {A2F9676F-D2B3-436D-99A7-68FF47AC8741}.Production|Any CPU.Build.0 = Local|Any CPU {A2F9676F-D2B3-436D-99A7-68FF47AC8741}.Release|Any CPU.ActiveCfg = Release|Any CPU {A2F9676F-D2B3-436D-99A7-68FF47AC8741}.Release|Any CPU.Build.0 = Release|Any CPU - {C5A6C7E0-B36A-472D-865A-BD32170F17CE}.Local|Any CPU.ActiveCfg = Local|Any CPU - {C5A6C7E0-B36A-472D-865A-BD32170F17CE}.Local|Any CPU.Build.0 = Local|Any CPU - {C5A6C7E0-B36A-472D-865A-BD32170F17CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C5A6C7E0-B36A-472D-865A-BD32170F17CE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C5A6C7E0-B36A-472D-865A-BD32170F17CE}.Testing|Any CPU.ActiveCfg = Testing|Any CPU - {C5A6C7E0-B36A-472D-865A-BD32170F17CE}.Testing|Any CPU.Build.0 = Testing|Any CPU - {C5A6C7E0-B36A-472D-865A-BD32170F17CE}.Staging|Any CPU.ActiveCfg = Staging|Any CPU - {C5A6C7E0-B36A-472D-865A-BD32170F17CE}.Staging|Any CPU.Build.0 = Staging|Any CPU - {C5A6C7E0-B36A-472D-865A-BD32170F17CE}.Production|Any CPU.ActiveCfg = Local|Any CPU - {C5A6C7E0-B36A-472D-865A-BD32170F17CE}.Production|Any CPU.Build.0 = Local|Any CPU - {C5A6C7E0-B36A-472D-865A-BD32170F17CE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C5A6C7E0-B36A-472D-865A-BD32170F17CE}.Release|Any CPU.Build.0 = Release|Any CPU + {E6715DDF-3BD8-4D0E-BFB9-5137D37B750C}.Local|Any CPU.ActiveCfg = Local|Any CPU + {E6715DDF-3BD8-4D0E-BFB9-5137D37B750C}.Local|Any CPU.Build.0 = Local|Any CPU + {E6715DDF-3BD8-4D0E-BFB9-5137D37B750C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6715DDF-3BD8-4D0E-BFB9-5137D37B750C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6715DDF-3BD8-4D0E-BFB9-5137D37B750C}.Testing|Any CPU.ActiveCfg = Testing|Any CPU + {E6715DDF-3BD8-4D0E-BFB9-5137D37B750C}.Testing|Any CPU.Build.0 = Testing|Any CPU + {E6715DDF-3BD8-4D0E-BFB9-5137D37B750C}.Staging|Any CPU.ActiveCfg = Staging|Any CPU + {E6715DDF-3BD8-4D0E-BFB9-5137D37B750C}.Staging|Any CPU.Build.0 = Staging|Any CPU + {E6715DDF-3BD8-4D0E-BFB9-5137D37B750C}.Production|Any CPU.ActiveCfg = Local|Any CPU + {E6715DDF-3BD8-4D0E-BFB9-5137D37B750C}.Production|Any CPU.Build.0 = Local|Any CPU + {E6715DDF-3BD8-4D0E-BFB9-5137D37B750C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6715DDF-3BD8-4D0E-BFB9-5137D37B750C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/TagHelpers/Resources/HighlightCode.js b/src/TagHelpers/Resources/HighlightCode.js new file mode 100644 index 00000000..e69de29b diff --git a/src/TagHelpers/Resources/code.css b/src/TagHelpers/Resources/code.css new file mode 100644 index 00000000..a3fb39bb --- /dev/null +++ b/src/TagHelpers/Resources/code.css @@ -0,0 +1,37 @@ +.keyword { + color: light-dark(#0077aa, #3b5f7c); + font-weight: bold; +} + +.primitive { + color: light-dark(#0077aa, #3b5f7c); +} + +.method { + color: light-dark(rgb(50, 40, 20), rgb(77, 77, 60)); +} + +.type { + color: light-dark(#0077aa, #4fc7af); +} + +.constant { + color: light-dark(#0077aa, #579cd6); +} + +.comment { + color: light-dark(#999988, #557846); + font-style: italic; +} + +.string { + color: light-dark(#22aa22, #936b5a); +} + +.number { + color: light-dark(#aa2222, #880000); +} + +code { + color: light-dark(#000000, #ffffff); +}