mirror of
https://github.com/MAKS-IT-COM/maksit-certs-ui.git
synced 2025-12-30 19:50:07 +01:00
(feature): MaksIT.Core lib usage
This commit is contained in:
parent
4679300a64
commit
399415c6b8
@ -1,21 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<RootNamespace>MaksIT.$(MSBuildProjectName.Replace(" ", "_"))</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="Abstractions\**" />
|
||||
<EmbeddedResource Remove="Abstractions\**" />
|
||||
<None Remove="Abstractions\**" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.9" />
|
||||
<PackageReference Include="System.Threading.RateLimiting" Version="9.0.9" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@ -1,36 +0,0 @@
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace MaksIT.Core.Extensions;
|
||||
public static class ObjectExtensions {
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="obj"></param>
|
||||
/// <returns></returns>
|
||||
public static string ToJson<T>(this T? obj) => obj.ToJson(null);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="obj"></param>
|
||||
/// <param name="converters"></param>
|
||||
/// <returns></returns>
|
||||
public static string ToJson<T>(this T? obj, List<JsonConverter>? converters) {
|
||||
if (obj == null)
|
||||
return "{}";
|
||||
|
||||
var options = new JsonSerializerOptions {
|
||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||||
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
|
||||
WriteIndented = true
|
||||
};
|
||||
|
||||
converters?.ForEach(x => options.Converters.Add(x));
|
||||
|
||||
return JsonSerializer.Serialize(obj, options);
|
||||
}
|
||||
}
|
||||
@ -1,55 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Text.Json;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.Core.Extensions;
|
||||
public static class StringExtensions {
|
||||
/// <summary>
|
||||
/// Converts JSON string to object
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="s"></param>
|
||||
/// <returns></returns>
|
||||
public static T? ToObject<T>(this string? s) => ToObjectCore<T>(s, null);
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="s"></param>
|
||||
/// <param name="converters"></param>
|
||||
/// <returns></returns>
|
||||
public static T? ToObject<T>(this string? s, List<JsonConverter> converters) => ToObjectCore<T>(s, converters);
|
||||
|
||||
private static T? ToObjectCore<T>(string? s, List<JsonConverter>? converters) {
|
||||
var options = new JsonSerializerOptions {
|
||||
PropertyNameCaseInsensitive = true
|
||||
};
|
||||
|
||||
converters?.ForEach(x => options.Converters.Add(x));
|
||||
|
||||
return s != null
|
||||
? JsonSerializer.Deserialize<T>(s, options)
|
||||
: default;
|
||||
}
|
||||
|
||||
public static Guid? ToNullabeGuid(this string? s) {
|
||||
if (Guid.TryParse(s, out var result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Guid ToGuid(this string s) {
|
||||
if (Guid.TryParse(s, out var result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
return Guid.Empty;
|
||||
}
|
||||
}
|
||||
@ -1,93 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Threading.RateLimiting;
|
||||
|
||||
public class LockManager : IDisposable {
|
||||
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
|
||||
private readonly ConcurrentDictionary<int, int> _reentrantCounts = new ConcurrentDictionary<int, int>();
|
||||
private readonly TokenBucketRateLimiter _rateLimiter = new TokenBucketRateLimiter(new TokenBucketRateLimiterOptions {
|
||||
TokenLimit = 5, // max 5 requests per second (adjust as needed)
|
||||
QueueProcessingOrder = QueueProcessingOrder.OldestFirst,
|
||||
QueueLimit = 100,
|
||||
ReplenishmentPeriod = TimeSpan.FromSeconds(1),
|
||||
TokensPerPeriod = 5,
|
||||
AutoReplenishment = true
|
||||
});
|
||||
|
||||
public async Task<T> ExecuteWithLockAsync<T>(Func<Task<T>> action) {
|
||||
var lease = await _rateLimiter.AcquireAsync(1);
|
||||
if (!lease.IsAcquired) throw new InvalidOperationException("Rate limit exceeded");
|
||||
|
||||
var threadId = Thread.CurrentThread.ManagedThreadId;
|
||||
if (!_reentrantCounts.ContainsKey(threadId)) _reentrantCounts[threadId] = 0;
|
||||
if (_reentrantCounts[threadId] == 0) await _semaphore.WaitAsync();
|
||||
_reentrantCounts[threadId]++;
|
||||
try {
|
||||
return await action();
|
||||
}
|
||||
finally {
|
||||
_reentrantCounts[threadId]--;
|
||||
if (_reentrantCounts[threadId] == 0) _semaphore.Release();
|
||||
lease.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task ExecuteWithLockAsync(Func<Task> action) {
|
||||
var lease = await _rateLimiter.AcquireAsync(1);
|
||||
if (!lease.IsAcquired) throw new InvalidOperationException("Rate limit exceeded");
|
||||
|
||||
var threadId = Thread.CurrentThread.ManagedThreadId;
|
||||
if (!_reentrantCounts.ContainsKey(threadId)) _reentrantCounts[threadId] = 0;
|
||||
if (_reentrantCounts[threadId] == 0) await _semaphore.WaitAsync();
|
||||
_reentrantCounts[threadId]++;
|
||||
try {
|
||||
await action();
|
||||
}
|
||||
finally {
|
||||
_reentrantCounts[threadId]--;
|
||||
if (_reentrantCounts[threadId] == 0) _semaphore.Release();
|
||||
lease.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<T> ExecuteWithLockAsync<T>(Func<T> action) {
|
||||
var lease = await _rateLimiter.AcquireAsync(1);
|
||||
if (!lease.IsAcquired) throw new InvalidOperationException("Rate limit exceeded");
|
||||
|
||||
var threadId = Thread.CurrentThread.ManagedThreadId;
|
||||
if (!_reentrantCounts.ContainsKey(threadId)) _reentrantCounts[threadId] = 0;
|
||||
if (_reentrantCounts[threadId] == 0) await _semaphore.WaitAsync();
|
||||
_reentrantCounts[threadId]++;
|
||||
try {
|
||||
return await Task.Run(action);
|
||||
}
|
||||
finally {
|
||||
_reentrantCounts[threadId]--;
|
||||
if (_reentrantCounts[threadId] == 0) _semaphore.Release();
|
||||
lease.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task ExecuteWithLockAsync(Action action) {
|
||||
var lease = await _rateLimiter.AcquireAsync(1);
|
||||
if (!lease.IsAcquired) throw new InvalidOperationException("Rate limit exceeded");
|
||||
|
||||
var threadId = Thread.CurrentThread.ManagedThreadId;
|
||||
if (!_reentrantCounts.ContainsKey(threadId)) _reentrantCounts[threadId] = 0;
|
||||
if (_reentrantCounts[threadId] == 0) await _semaphore.WaitAsync();
|
||||
_reentrantCounts[threadId]++;
|
||||
try {
|
||||
await Task.Run(action);
|
||||
}
|
||||
finally {
|
||||
_reentrantCounts[threadId]--;
|
||||
if (_reentrantCounts[threadId] == 0) _semaphore.Release();
|
||||
lease.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose() {
|
||||
_semaphore.Dispose();
|
||||
_rateLimiter.Dispose();
|
||||
}
|
||||
}
|
||||
@ -1,24 +0,0 @@
|
||||
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.Core.Logger;
|
||||
|
||||
public class MyCustomLogger : ILogger {
|
||||
public IDisposable? BeginScope<TState>(TState state) where TState : notnull {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool IsEnabled(LogLevel logLevel) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,19 +0,0 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MaksIT.Core.Logger;
|
||||
|
||||
public class MyCustomLoggerProvider : ILoggerProvider {
|
||||
public ILogger CreateLogger(string categoryName) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void Dispose() {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
@ -1,8 +0,0 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
|
||||
namespace MaksIT.Core.Logger;
|
||||
|
||||
public static class MyCustomLoggerExtensions {
|
||||
|
||||
}
|
||||
@ -1,13 +0,0 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace MaksIT.Core;
|
||||
public static class OperatingSystem {
|
||||
public static bool IsWindows() =>
|
||||
RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
|
||||
|
||||
public static bool IsMacOS() =>
|
||||
RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
|
||||
|
||||
public static bool IsLinux() =>
|
||||
RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
|
||||
}
|
||||
@ -5,8 +5,6 @@ VisualStudioVersion = 17.6.33815.320
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LetsEncrypt", "LetsEncrypt\LetsEncrypt.csproj", "{7DE431E5-889C-434E-AD02-9F89D7A0ED27}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core", "Core\Core.csproj", "{27A58A5F-B52A-44F2-9639-84C6F02EA75D}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{3374FDB1-C95E-4103-8E14-5BBF0BDC4E9D}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LetsEncryptServer", "LetsEncryptServer\LetsEncryptServer.csproj", "{B5F39E04-C2E3-49BF-82C2-9DEBAA949E3D}"
|
||||
@ -29,10 +27,6 @@ Global
|
||||
{7DE431E5-889C-434E-AD02-9F89D7A0ED27}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{7DE431E5-889C-434E-AD02-9F89D7A0ED27}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{7DE431E5-889C-434E-AD02-9F89D7A0ED27}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{27A58A5F-B52A-44F2-9639-84C6F02EA75D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{27A58A5F-B52A-44F2-9639-84C6F02EA75D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{27A58A5F-B52A-44F2-9639-84C6F02EA75D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{27A58A5F-B52A-44F2-9639-84C6F02EA75D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B5F39E04-C2E3-49BF-82C2-9DEBAA949E3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B5F39E04-C2E3-49BF-82C2-9DEBAA949E3D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B5F39E04-C2E3-49BF-82C2-9DEBAA949E3D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
|
||||
@ -8,16 +8,13 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="MaksIT.Results" Version="1.0.6" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="9.0.9" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.9" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.9" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.9" />
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.9" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Core\Core.csproj" />
|
||||
<PackageReference Include="MaksIT.Core" Version="1.5.1" />
|
||||
<PackageReference Include="MaksIT.Results" Version="1.0.9" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="9.0.10" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.10" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.10" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.10" />
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.10" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@ -9,8 +9,8 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="MaksIT.Results" Version="1.0.6" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.9" />
|
||||
<PackageReference Include="MaksIT.Results" Version="1.0.9" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.10" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.22.1" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.6" />
|
||||
</ItemGroup>
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
|
||||
using MaksIT.Core.Extensions;
|
||||
using MaksIT.Core.Threading;
|
||||
using MaksIT.LetsEncrypt.Entities;
|
||||
using MaksIT.Results;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.DataProtection.Extensions" Version="9.0.9" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.DataProtection.Extensions" Version="9.0.10" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.22.1" />
|
||||
<PackageReference Include="Yarp.ReverseProxy" Version="2.3.0" />
|
||||
</ItemGroup>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user