From 0fcdbd10d02fcbfc4226bcdd49f692743e8e3eca Mon Sep 17 00:00:00 2001 From: Tudor Stanciu Date: Tue, 28 Feb 2023 18:40:51 +0200 Subject: [PATCH] Tuitio.Wrapper nuget package changes --- .../DependencyInjectionExtension.cs | 2 +- src/Tuitio.Wrapper/README.md | 38 ++++++++++++++++++ src/Tuitio.Wrapper/ReleaseNotes.txt | 3 ++ src/Tuitio.Wrapper/Tuitio.Wrapper.csproj | 19 +++++++-- src/Tuitio.Wrapper/logo.png | Bin 0 -> 12713 bytes 5 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 src/Tuitio.Wrapper/README.md create mode 100644 src/Tuitio.Wrapper/ReleaseNotes.txt create mode 100644 src/Tuitio.Wrapper/logo.png diff --git a/src/Tuitio.Wrapper/DependencyInjectionExtension.cs b/src/Tuitio.Wrapper/DependencyInjectionExtension.cs index 7d0400c..49c7757 100644 --- a/src/Tuitio.Wrapper/DependencyInjectionExtension.cs +++ b/src/Tuitio.Wrapper/DependencyInjectionExtension.cs @@ -8,7 +8,7 @@ namespace Tuitio.Wrapper { public static class DependencyInjectionExtension { - public static void UseIdentityServices(this IServiceCollection services, string baseAddress) + public static void UseTuitioServices(this IServiceCollection services, string baseAddress) { services.AddSingleton(new ServiceConfiguration(baseAddress)); services.AddHttpClient(); diff --git a/src/Tuitio.Wrapper/README.md b/src/Tuitio.Wrapper/README.md new file mode 100644 index 0000000..05e7625 --- /dev/null +++ b/src/Tuitio.Wrapper/README.md @@ -0,0 +1,38 @@ +# Tuitio.Wrapper + +[Tuitio](https://lab.code-rove.com/gitea/tudor.stanciu/tuitio) is a simple identity server implementation focused strictly on the needs of my home lab. + +***Tuitio.Wrapper*** is a NuGet package that facilitates integration with a Tuitio instance in a .NET environment by registering a service called IIdentityService in the application's service collection. +It contains two methods, "Authenticate" and "Authorize", which are responsible for calling the appropriate methods from the API controller, ```/identity/authenticate``` or ```/identity/authorize```. These methods provide a simple and convenient way for developers to handle authentication and authorization when communicating with the API controller. +Once the package is installed, all the developer has to do is call the ```UseTuitioServices``` method the application startup. After this step, IIdentityService can be injected into any class in the application. + + +## Package repository +Tuitio.Wrapper can be installed from my self hosted NuGet feed: https://lab.code-rove.com/public-nuget-server/ + +## Installation + +### Visual Studio + +#### NuGet.config file +```xml=! + + + + + + + + +``` + +Configure the above file in the Visual Studio solution or set the new NuGet feed in NuGet Package Manager. After one of this steps, Tuitio.Wrapper can be installed using NuGet Package Manager. + + +### CLI + +```bash=! +dotnet add package Tuitio.Wrapper --source https://lab.code-rove.com/public-nuget-server/v3/index.json +``` + +Run the above command in a console open in a .NET project directory. \ No newline at end of file diff --git a/src/Tuitio.Wrapper/ReleaseNotes.txt b/src/Tuitio.Wrapper/ReleaseNotes.txt new file mode 100644 index 0000000..c33c26d --- /dev/null +++ b/src/Tuitio.Wrapper/ReleaseNotes.txt @@ -0,0 +1,3 @@ +2.0.0 release [2023-01-31 02:17] +◾ Tuitio rebranding +◾ Initial release of Tuitio's API wrapper \ No newline at end of file diff --git a/src/Tuitio.Wrapper/Tuitio.Wrapper.csproj b/src/Tuitio.Wrapper/Tuitio.Wrapper.csproj index 64453d9..3d3526f 100644 --- a/src/Tuitio.Wrapper/Tuitio.Wrapper.csproj +++ b/src/Tuitio.Wrapper/Tuitio.Wrapper.csproj @@ -2,13 +2,18 @@ net6.0 - Tuitio wrapper - Tuitio wrapper + Tuitio.Wrapper facilitates integration with a Tuitio instance in a .NET environment by registering a service called IIdentityService in the application’s service collection. It contains two methods that provide a simple and convenient way for developers to handle authentication and authorization when communicating with the Tuitio’s API controller. https://lab.code-rove.com/gitea/tudor.stanciu/tuitio - Git https://lab.code-rove.com/gitea/tudor.stanciu/tuitio - Tuitio wrapper + Git + $([System.IO.File]::ReadAllText("$(MSBuildProjectDirectory)/ReleaseNotes.txt")) 2.0.0 + logo.png + README.md + Toodle HomeLab + Toodle Tuitio + Tuitio HomeLab CodeRove + MIT @@ -21,4 +26,10 @@ + + + PreserveNewest + + + diff --git a/src/Tuitio.Wrapper/logo.png b/src/Tuitio.Wrapper/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5b05cdcbc21e7a805ca7209e3155ca8bc63cf20b GIT binary patch literal 12713 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�+^p21CIGmM(a`O`VFn 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 literal 0 HcmV?d00001