Compare commits
206 Commits
feat/clien
...
feat/Infra
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb9449d701 | ||
|
|
72f735272f | ||
|
|
304f5b7b4c | ||
|
|
0238310290 | ||
|
|
3ac0501231 | ||
|
|
db8a560805 | ||
|
|
e67361bfe1 | ||
|
|
91594e80bf | ||
|
|
8d98159ba8 | ||
|
|
f1f5b9e16d | ||
|
|
3955dede16 | ||
|
|
65e834784a | ||
|
|
3c1bbc1151 | ||
|
|
5465fe5b49 | ||
|
|
85787e7054 | ||
|
|
c955220310 | ||
|
|
7d2098092a | ||
|
|
e3b9d2971b | ||
|
|
3a604ede88 | ||
|
|
476c86ff0a | ||
|
|
9376fcff86 | ||
|
|
06df97597e | ||
|
|
266d03e0a1 | ||
|
|
e752c6f6ab | ||
|
|
561a751de4 | ||
|
|
35050d65a8 | ||
|
|
cf9041980d | ||
|
|
cf2ee73ca1 | ||
|
|
52f6dc161e | ||
|
|
7670898e24 | ||
|
|
f5b202c325 | ||
|
|
fffbdf752f | ||
|
|
6916e169b1 | ||
|
|
0c529b199b | ||
|
|
5427a9722d | ||
|
|
bccfae59cd | ||
|
|
4c55ecb427 | ||
|
|
a7e4291e42 | ||
|
|
352b59dfdf | ||
|
|
1b793e2b75 | ||
|
|
72603f836c | ||
|
|
162da9a16c | ||
|
|
c0524cbca2 | ||
|
|
51c1f408d7 | ||
|
|
a034ecdb1b | ||
|
|
f4a9c5c57a | ||
|
|
e15f32ae56 | ||
|
|
44d4bb9c23 | ||
|
|
a0c5144c28 | ||
|
|
dda9b40bd3 | ||
|
|
de89185b43 | ||
|
|
a94c7249e4 | ||
|
|
3f8145e6dc | ||
|
|
f3f65415e1 | ||
|
|
192a93d153 | ||
|
|
9ec9bcd474 | ||
|
|
7dd8271f4a | ||
|
|
b8de148c52 | ||
|
|
0523308083 | ||
|
|
875692b578 | ||
|
|
973a5f1023 | ||
|
|
8498dc0456 | ||
|
|
6a12ad77ec | ||
|
|
144fe86987 | ||
|
|
528a346883 | ||
|
|
a7fb97de4a | ||
|
|
c3dbc1ec54 | ||
|
|
a86989479f | ||
|
|
53427282c5 | ||
|
|
90c85814b0 | ||
|
|
92a7b959ab | ||
|
|
63ab47a288 | ||
|
|
725b186db6 | ||
|
|
ad8d15314f | ||
|
|
f1efbae6a4 | ||
|
|
051567aa0a | ||
|
|
287871ddc6 | ||
|
|
a0ad8d732d | ||
|
|
3ad08e2a86 | ||
|
|
b90a52412c | ||
|
|
39091ff5cf | ||
|
|
22040cf1e7 | ||
|
|
af4b7d5438 | ||
|
|
211064d44e | ||
|
|
66e3c771dd | ||
|
|
97c4f7bf8f | ||
|
|
5981ba7a8d | ||
|
|
21e164ceb7 | ||
|
|
1875bf46fa | ||
|
|
7f9459f6cf | ||
|
|
079f0c69c7 | ||
|
|
d98b3f2867 | ||
|
|
3761c13dba | ||
|
|
8acbbaeb2e | ||
|
|
60e1ec78b3 | ||
|
|
e623575fe8 | ||
|
|
60ae8de550 | ||
|
|
87ad45f42a | ||
|
|
2557525f06 | ||
|
|
7a938f0379 | ||
|
|
9f0facc487 | ||
|
|
608d266d1c | ||
|
|
34e14fd2f5 | ||
|
|
dc45cf2c08 | ||
|
|
09a31b5a3d | ||
|
|
b5cecac745 | ||
|
|
0f4b5430a3 | ||
|
|
7f2d2dadfa | ||
|
|
ac0b6f739b | ||
|
|
d9d61368e3 | ||
|
|
e8c98115b6 | ||
|
|
09dae1b1ac | ||
|
|
9aafc9e467 | ||
|
|
4ce738957d | ||
|
|
5e1bf16b6d | ||
|
|
4f96d271f3 | ||
|
|
14485af448 | ||
|
|
c27e21a702 | ||
|
|
4874079b69 | ||
|
|
15e909064f | ||
|
|
d17c5ca6cd | ||
|
|
592b949f57 | ||
|
|
8850ac4ac9 | ||
|
|
8ccf6f31ae | ||
|
|
9875d023e3 | ||
|
|
62afba7c23 | ||
|
|
1d4882cfbc | ||
|
|
275b9ec858 | ||
|
|
2cf0eb3977 | ||
|
|
4ab5393deb | ||
|
|
a2dc59d5ef | ||
|
|
ed041bf7cb | ||
|
|
c70327e7f4 | ||
|
|
0a3ce89c0d | ||
|
|
389d64c25d | ||
|
|
a3931414e3 | ||
|
|
0dd897625a | ||
|
|
351a6732cf | ||
|
|
5a1808c6a6 | ||
|
|
50c42e9cdd | ||
|
|
ec126be2aa | ||
|
|
9953bbd2ef | ||
|
|
dbecfa92f4 | ||
|
|
e007f15bce | ||
|
|
79dffef528 | ||
|
|
af478e974c | ||
|
|
435c91955c | ||
|
|
4142d2d948 | ||
|
|
06260e0edb | ||
|
|
2d675a16ad | ||
|
|
5469b20e4f | ||
|
|
6f5b4efefb | ||
|
|
b6b12c7702 | ||
|
|
ce716d2bab | ||
|
|
bf672d8b8c | ||
|
|
ed29c9f990 | ||
|
|
66ed34b664 | ||
|
|
d7b4c382cd | ||
|
|
4f6ca3524a | ||
|
|
bd1ae4246d | ||
|
|
d92475c230 | ||
|
|
15705cccc4 | ||
|
|
a8403087f6 | ||
|
|
0235c83075 | ||
|
|
63aeba982f | ||
|
|
514495fc8d | ||
|
|
9752fb14ec | ||
|
|
b3629661a1 | ||
|
|
f38bad8531 | ||
|
|
154478c318 | ||
|
|
155eb563d1 | ||
|
|
4aacc3f650 | ||
|
|
f40c86ed63 | ||
|
|
b32f0df125 | ||
|
|
324a5bdb1e | ||
|
|
e0a6787a87 | ||
|
|
c6a4038eab | ||
|
|
58c8520c08 | ||
|
|
eced1a5afc | ||
|
|
7da93c6719 | ||
|
|
6a92466490 | ||
|
|
5d9d756b91 | ||
|
|
f14aaa75e1 | ||
|
|
249f5a0ae5 | ||
|
|
30177cf0c7 | ||
|
|
68ef0a7537 | ||
|
|
fe2ee78d14 | ||
|
|
53e6f37a09 | ||
|
|
7ec85b4e30 | ||
|
|
a9ebc406f3 | ||
|
|
d013d3edfa | ||
|
|
f267fe955b | ||
|
|
644283cf8f | ||
|
|
82aa8d1143 | ||
|
|
7459f05748 | ||
|
|
36f75d003a | ||
|
|
76ce64691a | ||
|
|
7c03282066 | ||
|
|
7ae95b729f | ||
|
|
9ee8a51664 | ||
|
|
b1d1a898b8 | ||
|
|
4ed3e79565 | ||
|
|
8d9de4502e | ||
|
|
7dd91c73c4 | ||
|
|
65c64a3f9a | ||
|
|
1d600aa453 |
56
.gitignore
vendored
56
.gitignore
vendored
@@ -1,7 +1,8 @@
|
|||||||
|
# ---> VisualStudio
|
||||||
## Ignore Visual Studio temporary files, build results, and
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
## files generated by popular Visual Studio add-ons.
|
## files generated by popular Visual Studio add-ons.
|
||||||
##
|
##
|
||||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
|
||||||
|
|
||||||
# User-specific files
|
# User-specific files
|
||||||
*.rsuser
|
*.rsuser
|
||||||
@@ -29,7 +30,6 @@ x86/
|
|||||||
bld/
|
bld/
|
||||||
[Bb]in/
|
[Bb]in/
|
||||||
[Oo]bj/
|
[Oo]bj/
|
||||||
[Oo]ut/
|
|
||||||
[Ll]og/
|
[Ll]og/
|
||||||
[Ll]ogs/
|
[Ll]ogs/
|
||||||
|
|
||||||
@@ -91,6 +91,7 @@ StyleCopReport.xml
|
|||||||
*.tmp_proj
|
*.tmp_proj
|
||||||
*_wpftmp.csproj
|
*_wpftmp.csproj
|
||||||
*.log
|
*.log
|
||||||
|
*.tlog
|
||||||
*.vspscc
|
*.vspscc
|
||||||
*.vssscc
|
*.vssscc
|
||||||
.builds
|
.builds
|
||||||
@@ -294,6 +295,17 @@ node_modules/
|
|||||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||||
*.vbw
|
*.vbw
|
||||||
|
|
||||||
|
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
|
||||||
|
*.vbp
|
||||||
|
|
||||||
|
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
|
||||||
|
*.dsw
|
||||||
|
*.dsp
|
||||||
|
|
||||||
|
# Visual Studio 6 technical files
|
||||||
|
*.ncb
|
||||||
|
*.aps
|
||||||
|
|
||||||
# Visual Studio LightSwitch build output
|
# Visual Studio LightSwitch build output
|
||||||
**/*.HTMLClient/GeneratedArtifacts
|
**/*.HTMLClient/GeneratedArtifacts
|
||||||
**/*.DesktopClient/GeneratedArtifacts
|
**/*.DesktopClient/GeneratedArtifacts
|
||||||
@@ -350,6 +362,9 @@ ASALocalRun/
|
|||||||
# Local History for Visual Studio
|
# Local History for Visual Studio
|
||||||
.localhistory/
|
.localhistory/
|
||||||
|
|
||||||
|
# Visual Studio History (VSHistory) files
|
||||||
|
.vshistory/
|
||||||
|
|
||||||
# BeatPulse healthcheck temp database
|
# BeatPulse healthcheck temp database
|
||||||
healthchecksdb
|
healthchecksdb
|
||||||
|
|
||||||
@@ -361,6 +376,42 @@ MigrationBackup/
|
|||||||
|
|
||||||
# Fody - auto-generated XML schema
|
# Fody - auto-generated XML schema
|
||||||
FodyWeavers.xsd
|
FodyWeavers.xsd
|
||||||
|
|
||||||
|
# VS Code files for those working on multiple tools
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
*.code-workspace
|
||||||
|
|
||||||
|
# Local History for Visual Studio Code
|
||||||
|
.history/
|
||||||
|
|
||||||
|
# Windows Installer files from build outputs
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# JetBrains Rider
|
||||||
|
*.sln.iml
|
||||||
|
|
||||||
|
# ---> VisualStudioCode
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
!.vscode/*.code-snippets
|
||||||
|
|
||||||
|
# Local History for Visual Studio Code
|
||||||
|
.history/
|
||||||
|
|
||||||
|
# Built Visual Studio Code Extensions
|
||||||
|
*.vsix
|
||||||
|
|
||||||
/.vs/DigitalData.Core/DesignTimeBuild/.dtbcache.v2
|
/.vs/DigitalData.Core/DesignTimeBuild/.dtbcache.v2
|
||||||
/.vs/DigitalData.Core/v17/.suo
|
/.vs/DigitalData.Core/v17/.suo
|
||||||
/.vs/ProjectEvaluation/digitaldata.core.metadata.v6.1
|
/.vs/ProjectEvaluation/digitaldata.core.metadata.v6.1
|
||||||
@@ -410,3 +461,4 @@ FodyWeavers.xsd
|
|||||||
/DigitalData.Core.ConsoleApp/FooHttpOptions.cs
|
/DigitalData.Core.ConsoleApp/FooHttpOptions.cs
|
||||||
/DigitalData.Core.Tests/obj/
|
/DigitalData.Core.Tests/obj/
|
||||||
/DigitalData.Core.Terminal
|
/DigitalData.Core.Terminal
|
||||||
|
/DigitalData.Core.Tests.API
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ namespace DigitalData.Core.API
|
|||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("api/[controller]")]
|
[Route("api/[controller]")]
|
||||||
public class BasicCRUDControllerBase<TCRUDService, TDto, TEntity, TId> : CRUDControllerBase<TCRUDService, TDto, TDto, TDto, TEntity, TId>
|
public class BasicCRUDControllerBase<TCRUDService, TDto, TEntity, TId> : CRUDControllerBase<TCRUDService, TDto, TDto, TDto, TEntity, TId>
|
||||||
where TCRUDService : ICRUDService<TDto, TDto, TDto, TEntity, TId>
|
where TCRUDService : ICRUDService<TDto, TDto, TEntity, TId>
|
||||||
where TDto : class, IUnique<TId>
|
where TDto : class, IUnique<TId>
|
||||||
where TEntity : class, IUnique<TId>
|
where TEntity : class, IUnique<TId>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,13 +11,12 @@ namespace DigitalData.Core.API
|
|||||||
/// <typeparam name="TCRUDService">The derived CRUD service type implementing ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>.</typeparam>
|
/// <typeparam name="TCRUDService">The derived CRUD service type implementing ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>.</typeparam>
|
||||||
/// <typeparam name="TCreateDto">The Data Transfer Object type for create operations.</typeparam>
|
/// <typeparam name="TCreateDto">The Data Transfer Object type for create operations.</typeparam>
|
||||||
/// <typeparam name="TReadDto">The Data Transfer Object type for read operations.</typeparam>
|
/// <typeparam name="TReadDto">The Data Transfer Object type for read operations.</typeparam>
|
||||||
/// <typeparam name="TUpdateDto">The Data Transfer Object type for update operations.</typeparam>
|
|
||||||
/// <typeparam name="TEntity">The entity type CRUD operations will be performed on.</typeparam>
|
/// <typeparam name="TEntity">The entity type CRUD operations will be performed on.</typeparam>
|
||||||
/// <typeparam name="TId">The type of the entity's identifier.</typeparam>
|
/// <typeparam name="TId">The type of the entity's identifier.</typeparam>
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("api/[controller]")]
|
[Route("api/[controller]")]
|
||||||
public class CRUDControllerBase<TCRUDService, TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : ControllerBase
|
public class CRUDControllerBase<TCRUDService, TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : ControllerBase
|
||||||
where TCRUDService : ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>
|
where TCRUDService : ICRUDService<TCreateDto, TReadDto, TEntity, TId>
|
||||||
where TCreateDto : class
|
where TCreateDto : class
|
||||||
where TReadDto : class
|
where TReadDto : class
|
||||||
where TUpdateDto : class, IUnique<TId>
|
where TUpdateDto : class, IUnique<TId>
|
||||||
|
|||||||
@@ -12,13 +12,12 @@ namespace DigitalData.Core.API
|
|||||||
/// <typeparam name="TCRUDService">The derived CRUD service type implementing ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>.</typeparam>
|
/// <typeparam name="TCRUDService">The derived CRUD service type implementing ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>.</typeparam>
|
||||||
/// <typeparam name="TCreateDto">The Data Transfer Object type for create operations.</typeparam>
|
/// <typeparam name="TCreateDto">The Data Transfer Object type for create operations.</typeparam>
|
||||||
/// <typeparam name="TReadDto">The Data Transfer Object type for read operations.</typeparam>
|
/// <typeparam name="TReadDto">The Data Transfer Object type for read operations.</typeparam>
|
||||||
/// <typeparam name="TUpdateDto">The Data Transfer Object type for update operations.</typeparam>
|
|
||||||
/// <typeparam name="TEntity">The entity type CRUD operations will be performed on.</typeparam>
|
/// <typeparam name="TEntity">The entity type CRUD operations will be performed on.</typeparam>
|
||||||
/// <typeparam name="TId">The type of the entity's identifier.</typeparam>
|
/// <typeparam name="TId">The type of the entity's identifier.</typeparam>
|
||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("api/[controller]")]
|
[Route("api/[controller]")]
|
||||||
public class CRUDControllerBaseWithErrorHandling<TCRUDService, TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : ControllerBase
|
public class CRUDControllerBaseWithErrorHandling<TCRUDService, TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : ControllerBase
|
||||||
where TCRUDService : ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>
|
where TCRUDService : ICRUDService<TCreateDto, TReadDto, TEntity, TId>
|
||||||
where TCreateDto : class
|
where TCreateDto : class
|
||||||
where TReadDto : class
|
where TReadDto : class
|
||||||
where TUpdateDto : class, IUnique<TId>
|
where TUpdateDto : class, IUnique<TId>
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ namespace DigitalData.Core.API
|
|||||||
/// <param name="index">The key in the ViewData dictionary where the value will be stored.</param>
|
/// <param name="index">The key in the ViewData dictionary where the value will be stored.</param>
|
||||||
/// <param name="value">The value to be stored in the ViewData dictionary.</param>
|
/// <param name="value">The value to be stored in the ViewData dictionary.</param>
|
||||||
/// <returns>The same ViewResult object with updated ViewData, allowing for additional chained operations.</returns>
|
/// <returns>The same ViewResult object with updated ViewData, allowing for additional chained operations.</returns>
|
||||||
public static ViewResult WithData(this ViewResult viewResult, string index, object value)
|
public static ViewResult WithData(this ViewResult viewResult, string index, object? value)
|
||||||
{
|
{
|
||||||
viewResult.ViewData[index] = value;
|
viewResult.ViewData[index] = value;
|
||||||
return viewResult;
|
return viewResult;
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
|
<TargetFrameworks>net7.0;net8.0;net9.0</TargetFrameworks>
|
||||||
<IsPackable>true</IsPackable>
|
<IsPackable>true</IsPackable>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<OutputType>Library</OutputType>
|
<OutputType>Library</OutputType>
|
||||||
<Description>This package provides a comprehensive set of API controllers and related utilities for the DigitalData.Core library. It includes generic CRUD controllers, localization extensions, middleware for security policies, and application model conventions.</Description>
|
<Description>This package provides a comprehensive set of API controllers and related utilities for the DigitalData.Core library. It includes generic CRUD controllers, localization extensions, middleware for security policies, and application model conventions.</Description>
|
||||||
<PackageId>DigitalData.Core.API</PackageId>
|
<PackageId>DigitalData.Core.API</PackageId>
|
||||||
<Version>2.0.0.0</Version>
|
<Version>2.1.1</Version>
|
||||||
<Authors>Digital Data GmbH</Authors>
|
<Authors>Digital Data GmbH</Authors>
|
||||||
<Company>Digital Data GmbH</Company>
|
<Company>Digital Data GmbH</Company>
|
||||||
<Product>DigitalData.Core.API</Product>
|
<Product>DigitalData.Core.API</Product>
|
||||||
@@ -16,6 +16,8 @@
|
|||||||
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
|
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
|
||||||
<PackageTags>digital data core api</PackageTags>
|
<PackageTags>digital data core api</PackageTags>
|
||||||
<PackageIcon>core_icon.png</PackageIcon>
|
<PackageIcon>core_icon.png</PackageIcon>
|
||||||
|
<AssemblyVersion>2.1.1</AssemblyVersion>
|
||||||
|
<FileVersion>2.1.1</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
namespace DigitalData.Core.Abstractions.Security.Common;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a unique security context that identifies an issuer and an audience.
|
||||||
|
/// </summary>
|
||||||
|
public interface IUniqueSecurityContext
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the issuer identifier for this security context.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// The issuer typically represents the entity that issues a token or a cryptographic key.
|
||||||
|
/// </remarks>
|
||||||
|
string Issuer { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the audience identifier for this security context.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// The audience typically represents the intended recipient or target of a token or cryptographic operation.
|
||||||
|
/// </remarks>
|
||||||
|
string Audience { get; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<PackageId>DigitalData.Core.Abstractions.Security</PackageId>
|
||||||
|
<Version>1.0.1</Version>
|
||||||
|
<AssemblyVersion>1.0.1</AssemblyVersion>
|
||||||
|
<FileVersion>1.0.1</FileVersion>
|
||||||
|
<Authors>Digital Data GmbH</Authors>
|
||||||
|
<Company>Digital Data GmbH</Company>
|
||||||
|
<Product>Digital Data GmbH</Product>
|
||||||
|
<Copyright>Copyright 2025</Copyright>
|
||||||
|
<PackageProjectUrl>http://git.dd:3000/AppStd/WebCoreModules.git</PackageProjectUrl>
|
||||||
|
<PackageIcon>core_icon.png</PackageIcon>
|
||||||
|
<Description>This package defines the foundational abstractions for implementing security functionalities within the DigitalData.Core ecosystem. It provides interfaces and base classes for encryption, decryption, and secure authentication mechanisms. Designed to ensure flexibility and consistency, it enables seamless integration with various security implementations, such as RSA-based encryption and JWT handling.</Description>
|
||||||
|
<PackageTags>digital data core security abstractions</PackageTags>
|
||||||
|
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\..\nuget-package-icons\core_icon.png">
|
||||||
|
<Pack>True</Pack>
|
||||||
|
<PackagePath>\</PackagePath>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.7.1" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
using DigitalData.Core.Abstractions.Security.Common;
|
||||||
|
using DigitalData.Core.Abstractions.Security.Key;
|
||||||
|
using DigitalData.Core.Abstractions.Security.Services;
|
||||||
|
using Microsoft.IdentityModel.Tokens;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace DigitalData.Core.Abstractions.Security.Extensions;
|
||||||
|
|
||||||
|
public static class SecurityExtensions
|
||||||
|
{
|
||||||
|
#region Unique Security Context
|
||||||
|
public static IEnumerable<TUniqueSecurityContext> GetByIssuer<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, string issuer) where TUniqueSecurityContext : IUniqueSecurityContext
|
||||||
|
=> contextes.Where(c => c.Issuer == issuer);
|
||||||
|
|
||||||
|
public static IEnumerable<TUniqueSecurityContext> GetByAudience<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, string audience) where TUniqueSecurityContext : IUniqueSecurityContext
|
||||||
|
=> contextes.Where(c => c.Audience == audience);
|
||||||
|
|
||||||
|
public static TUniqueSecurityContext Get<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, string issuer, string audience) where TUniqueSecurityContext : IUniqueSecurityContext
|
||||||
|
=> contextes.Where(c => c.Issuer == issuer && c.Audience == audience).SingleOrDefault()
|
||||||
|
?? throw new InvalidOperationException($"Exactly one {typeof(TUniqueSecurityContext).Name} must exist with Issuer: '{issuer}' and Audience: '{audience}'.");
|
||||||
|
|
||||||
|
public static bool TryGet<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, string issuer, string audience, out TUniqueSecurityContext context) where TUniqueSecurityContext : IUniqueSecurityContext
|
||||||
|
{
|
||||||
|
#pragma warning disable CS8601 // Possible null reference assignment.
|
||||||
|
context = contextes.SingleOrDefault(c => c.Issuer == issuer && c.Audience == audience);
|
||||||
|
#pragma warning restore CS8601 // Possible null reference assignment.
|
||||||
|
return context is not null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TUniqueSecurityContext Match<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, IUniqueSecurityContext lookupContext) where TUniqueSecurityContext : IUniqueSecurityContext
|
||||||
|
=> contextes.Get(lookupContext.Issuer, lookupContext.Audience);
|
||||||
|
|
||||||
|
public static bool TryMatch<TUniqueSecurityContext>(this IEnumerable<TUniqueSecurityContext> contextes, IUniqueSecurityContext lookupContext, out TUniqueSecurityContext context) where TUniqueSecurityContext : IUniqueSecurityContext
|
||||||
|
=> contextes.TryGet(lookupContext.Issuer, lookupContext.Audience, out context);
|
||||||
|
#endregion Unique Security Context
|
||||||
|
|
||||||
|
#region De/serilization
|
||||||
|
internal static byte[] Base64ToByte(this string base64String) => Convert.FromBase64String(base64String);
|
||||||
|
|
||||||
|
internal static string BytesToString(this byte[] bytes) => Encoding.UTF8.GetString(bytes);
|
||||||
|
|
||||||
|
internal static string ToBase64String(this byte[] bytes) => Convert.ToBase64String(bytes);
|
||||||
|
|
||||||
|
internal static byte[] ToBytes(this string str) => Encoding.UTF8.GetBytes(str);
|
||||||
|
|
||||||
|
public static string Decrypt(this IAsymmetricDecryptor decryptor, string data) => decryptor
|
||||||
|
.Decrypt(data.Base64ToByte()).BytesToString();
|
||||||
|
#endregion De/serilization
|
||||||
|
|
||||||
|
#region Asymmetric Encryptor
|
||||||
|
public static string Encrypt(this IAsymmetricEncryptor encryptor, string data) => encryptor.Encrypt(data.ToBytes()).ToBase64String();
|
||||||
|
#endregion Asymmetric Encryptor
|
||||||
|
|
||||||
|
#region Jwt Signature Handler
|
||||||
|
public static string WriteToken<TPrincipal>(this IJwtSignatureHandler<TPrincipal> handler, SecurityTokenDescriptor descriptor)
|
||||||
|
=> handler.WriteToken(handler.CreateToken(descriptor));
|
||||||
|
|
||||||
|
public static string WriteToken<TPrincipal>(this IJwtSignatureHandler<TPrincipal> handler, TPrincipal subject, IAsymmetricTokenDescriptor descriptor)
|
||||||
|
=> handler.WriteToken(handler.CreateToken(subject: subject, descriptor: descriptor));
|
||||||
|
|
||||||
|
public static string WriteToken<TPrincipal>(this IJwtSignatureHandler<TPrincipal> handler, TPrincipal subject, string issuer, string audience)
|
||||||
|
=> handler.WriteToken(handler.CreateToken(subject: subject, issuer: issuer, audience: audience));
|
||||||
|
#endregion Jwt Signature Handler
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
namespace DigitalData.Core.Abstractions.Security.Key;
|
||||||
|
|
||||||
|
public interface IAsymmetricDecryptor : IAsymmetricPrivateKey
|
||||||
|
{
|
||||||
|
byte[] Decrypt(byte[] data);
|
||||||
|
|
||||||
|
IAsymmetricEncryptor Encryptor { get; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
namespace DigitalData.Core.Abstractions.Security.Key;
|
||||||
|
|
||||||
|
public interface IAsymmetricEncryptor : IAsymmetricPublicKey
|
||||||
|
{
|
||||||
|
byte[] Encrypt(byte[] data);
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
namespace DigitalData.Core.Abstractions.Security.Key;
|
||||||
|
|
||||||
|
public interface IAsymmetricKey
|
||||||
|
{
|
||||||
|
string? Id { get; }
|
||||||
|
|
||||||
|
string Content { get; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
namespace DigitalData.Core.Abstractions.Security.Key;
|
||||||
|
|
||||||
|
public interface IAsymmetricPrivateKey : IAsymmetricKey
|
||||||
|
{
|
||||||
|
bool IsEncrypted { get; }
|
||||||
|
|
||||||
|
IAsymmetricPublicKey PublicKey { get; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
namespace DigitalData.Core.Abstractions.Security.Key;
|
||||||
|
|
||||||
|
public interface IAsymmetricPublicKey : IAsymmetricKey
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
using DigitalData.Core.Abstractions.Security.Common;
|
||||||
|
using Microsoft.IdentityModel.Tokens;
|
||||||
|
|
||||||
|
namespace DigitalData.Core.Abstractions.Security.Key;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Contains some information which used to create a security token. Designed to abstract <see cref="SecurityTokenDescriptor"/>
|
||||||
|
/// </summary>
|
||||||
|
public interface IAsymmetricTokenDescriptor : IAsymmetricPrivateKey, IUniqueSecurityContext
|
||||||
|
{
|
||||||
|
IAsymmetricTokenValidator Validator { get; }
|
||||||
|
|
||||||
|
TimeSpan Lifetime { get; init; }
|
||||||
|
|
||||||
|
#region SecurityTokenDescriptor Map
|
||||||
|
/// <summary>
|
||||||
|
/// Defines the compression algorithm that will be used to compress the JWT token payload.
|
||||||
|
/// </summary>
|
||||||
|
string CompressionAlgorithm { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the <see cref="EncryptingCredentials"/> used to create a encrypted security token.
|
||||||
|
/// </summary>
|
||||||
|
EncryptingCredentials EncryptingCredentials { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the value of the 'expiration' claim. This value should be in UTC.
|
||||||
|
/// </summary>
|
||||||
|
DateTime? Expires { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the time the security token was issued. This value should be in UTC.
|
||||||
|
/// </summary>
|
||||||
|
DateTime? IssuedAt { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the notbefore time for the security token. This value should be in UTC.
|
||||||
|
/// </summary>
|
||||||
|
DateTime? NotBefore { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the token type.
|
||||||
|
/// <remarks> If provided, this will be added as the value for the 'typ' header parameter. In the case of a JWE, this will be added to both the inner (JWS) and the outer token (JWE) header. By default, the value used is 'JWT'.
|
||||||
|
/// If <see cref="AdditionalHeaderClaims"/> also contains 'typ' header claim value, it will override the TokenType provided here.
|
||||||
|
/// This value is used only for JWT tokens and not for SAML/SAML2 tokens</remarks>
|
||||||
|
/// </summary>
|
||||||
|
string TokenType { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the <see cref="Dictionary{TKey, TValue}"/> which contains any custom header claims that need to be added to the JWT token header.
|
||||||
|
/// The 'alg', 'kid', 'x5t', 'enc', and 'zip' claims are added by default based on the <see cref="SigningCredentials"/>,
|
||||||
|
/// <see cref="EncryptingCredentials"/>, and/or <see cref="CompressionAlgorithm"/> provided and SHOULD NOT be included in this dictionary as this
|
||||||
|
/// will result in an exception being thrown.
|
||||||
|
/// <remarks> These claims are only added to the outer header (in case of a JWE).</remarks>
|
||||||
|
/// </summary>
|
||||||
|
IDictionary<string, object> AdditionalHeaderClaims { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the <see cref="Dictionary{TKey, TValue}"/> which contains any custom header claims that need to be added to the inner JWT token header.
|
||||||
|
/// The 'alg', 'kid', 'x5t', 'enc', and 'zip' claims are added by default based on the <see cref="SigningCredentials"/>,
|
||||||
|
/// <see cref="EncryptingCredentials"/>, and/or <see cref="CompressionAlgorithm"/> provided and SHOULD NOT be included in this dictionary as this
|
||||||
|
/// will result in an exception being thrown.
|
||||||
|
/// <remarks>
|
||||||
|
/// For JsonWebTokenHandler, these claims are merged with <see cref="AdditionalHeaderClaims"/> while adding to the inner JWT header.
|
||||||
|
/// </remarks>
|
||||||
|
/// </summary>
|
||||||
|
IDictionary<string, object> AdditionalInnerHeaderClaims { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the <see cref="SigningCredentials"/> used to create a security token.
|
||||||
|
/// </summary>
|
||||||
|
SigningCredentials SigningCredentials { get; }
|
||||||
|
#endregion SecurityTokenDescriptor
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
using Microsoft.IdentityModel.Tokens;
|
||||||
|
|
||||||
|
namespace DigitalData.Core.Abstractions.Security.Key;
|
||||||
|
|
||||||
|
public interface IAsymmetricTokenValidator : IAsymmetricPublicKey
|
||||||
|
{
|
||||||
|
SecurityKey SecurityKey { get; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
using System.Security.Cryptography;
|
||||||
|
using DigitalData.Core.Abstractions.Security.Key;
|
||||||
|
|
||||||
|
namespace DigitalData.Core.Abstractions.Security.Services;
|
||||||
|
|
||||||
|
public interface IAsymmetricKeyFactory
|
||||||
|
{
|
||||||
|
string CreatePrivateKeyPem(int? keySizeInBits = null, bool encrypt = false);
|
||||||
|
|
||||||
|
string CreateEncryptedPrivateKeyPem(
|
||||||
|
PbeEncryptionAlgorithm? pbeEncryptionAlgorithm = null,
|
||||||
|
HashAlgorithmName? hashAlgorithmName = null,
|
||||||
|
int? iterationCount = null,
|
||||||
|
int? keySizeInBits = null,
|
||||||
|
string? password = null);
|
||||||
|
|
||||||
|
string CreateEncryptedPrivateKeyPem(
|
||||||
|
PbeParameters pbeParameters,
|
||||||
|
int? keySizeInBits = null,
|
||||||
|
string? password = null);
|
||||||
|
|
||||||
|
IAsymmetricDecryptor CreateDecryptor(string pem, string? issuer = null, string? audience = null, bool encrypt = false, RSAEncryptionPadding? padding = null);
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
using DigitalData.Core.Abstractions.Security.Key;
|
||||||
|
|
||||||
|
namespace DigitalData.Core.Abstractions.Security.Services;
|
||||||
|
|
||||||
|
public interface IAsymmetricKeyPool : IAsymmetricKeyFactory
|
||||||
|
{
|
||||||
|
IEnumerable<IAsymmetricDecryptor> Decryptors { get; }
|
||||||
|
|
||||||
|
IAsymmetricDecryptor VaultDecryptor { get; }
|
||||||
|
|
||||||
|
IEnumerable<IAsymmetricTokenDescriptor> TokenDescriptors { get; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
using DigitalData.Core.Abstractions.Security.Key;
|
||||||
|
using Microsoft.IdentityModel.Tokens;
|
||||||
|
|
||||||
|
namespace DigitalData.Core.Abstractions.Security.Services
|
||||||
|
{
|
||||||
|
public interface IJwtSignatureHandler<TPrincipal>
|
||||||
|
{
|
||||||
|
SecurityToken CreateToken(SecurityTokenDescriptor tokenDescriptor);
|
||||||
|
|
||||||
|
SecurityToken CreateToken(TPrincipal subject, IAsymmetricTokenDescriptor descriptor);
|
||||||
|
|
||||||
|
SecurityToken CreateToken(TPrincipal subject, string issuer, string audience);
|
||||||
|
|
||||||
|
string WriteToken(SecurityToken token);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,7 +15,7 @@ namespace DigitalData.Core.Abstractions.Application
|
|||||||
/// This interface is useful for entities that do not require different DTOs for different operations,
|
/// This interface is useful for entities that do not require different DTOs for different operations,
|
||||||
/// allowing for a more concise and maintainable codebase when implementing services for such entities.
|
/// allowing for a more concise and maintainable codebase when implementing services for such entities.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public interface IBasicCRUDService<TDto, TEntity, TId> : ICRUDService<TDto, TDto, TDto, TEntity, TId>
|
public interface IBasicCRUDService<TDto, TEntity, TId> : ICRUDService<TDto, TDto, TEntity, TId>
|
||||||
where TDto : class, IUnique<TId> where TEntity : class, IUnique<TId>
|
where TDto : class, IUnique<TId> where TEntity : class, IUnique<TId>
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
namespace DigitalData.Core.Abstractions.Application
|
namespace DigitalData.Core.Abstractions.Application
|
||||||
{
|
{
|
||||||
public interface ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : IReadService<TReadDto, TEntity, TId>
|
public interface ICRUDService<TCreateDto, TReadDto, TEntity, TId> : IReadService<TReadDto, TEntity, TId>
|
||||||
where TCreateDto : class where TReadDto : class where TUpdateDto : IUnique<TId> where TEntity : class, IUnique<TId>
|
where TCreateDto : class where TReadDto : class where TEntity : class, IUnique<TId>
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Asynchronously creates a new entity based on the provided <paramref name="createDto"/> and returns the identifier of the created entity wrapped in a <see cref="DataResult{TId}"/>.
|
/// Asynchronously creates a new entity based on the provided <paramref name="createDto"/> and returns the identifier of the created entity wrapped in a <see cref="DataResult{TId}"/>.
|
||||||
@@ -20,6 +20,6 @@ namespace DigitalData.Core.Abstractions.Application
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="updateDto">The updateDTO with updated values for the entity.</param>
|
/// <param name="updateDto">The updateDTO with updated values for the entity.</param>
|
||||||
/// <returns>An Result indicating the outcome of the update operation, with an appropriate message.</returns>
|
/// <returns>An Result indicating the outcome of the update operation, with an appropriate message.</returns>
|
||||||
Task<Result> UpdateAsync(TUpdateDto updateDto);
|
Task<Result> UpdateAsync<TUpdateDto>(TUpdateDto updateDto) where TUpdateDto : IUnique<TId>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -13,14 +13,82 @@ namespace DigitalData.Core.Abstractions.Application
|
|||||||
|
|
||||||
Dictionary<string, string> CustomSearchFilters { get; }
|
Dictionary<string, string> CustomSearchFilters { get; }
|
||||||
|
|
||||||
bool ValidateCredentials(string dirEntryUsername, string dirEntryPassword);
|
/// <summary>
|
||||||
|
/// Creates the connections to the server and returns a Boolean value that specifies
|
||||||
|
/// whether the specified username and password are valid.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userName">The username that is validated on the server. See the Remarks section
|
||||||
|
/// for more information on the format of userName.</param>
|
||||||
|
/// <param name="password">The password that is validated on the server.</param>
|
||||||
|
/// <returns>True if the credentials are valid; otherwise, false.</returns>
|
||||||
|
bool ValidateCredentials(string userName, string password);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the connections to the server asynchronously and returns a Boolean value that specifies
|
||||||
|
/// whether the specified username and password are valid.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userName">The username that is validated on the server. See the Remarks section
|
||||||
|
/// for more information on the format of userName.</param>
|
||||||
|
/// <param name="password">The password that is validated on the server.</param>
|
||||||
|
/// <returns>True if the credentials are valid; otherwise, false.</returns>
|
||||||
|
Task<bool> ValidateCredentialsAsync(string userName, string password);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Finds all directory entries matching the specified filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="searchRoot">The search root.</param>
|
||||||
|
/// <param name="filter">The search filter.</param>
|
||||||
|
/// <param name="searchScope">The search scope.</param>
|
||||||
|
/// <param name="sizeLimit">The size limit.</param>
|
||||||
|
/// <param name="properties">The properties to load.</param>
|
||||||
|
/// <returns>A <see cref="DataResult{T}"/> containing the results.</returns>
|
||||||
DataResult<IEnumerable<ResultPropertyCollection>> FindAll(DirectoryEntry searchRoot, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties);
|
DataResult<IEnumerable<ResultPropertyCollection>> FindAll(DirectoryEntry searchRoot, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Finds all directory entries matching the specified filter asynchronously.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="searchRoot">The search root.</param>
|
||||||
|
/// <param name="filter">The search filter.</param>
|
||||||
|
/// <param name="searchScope">The search scope.</param>
|
||||||
|
/// <param name="sizeLimit">The size limit.</param>
|
||||||
|
/// <param name="properties">The properties to load.</param>
|
||||||
|
/// <returns>A <see cref="DataResult{T}"/> containing the results.</returns>
|
||||||
|
Task<DataResult<IEnumerable<ResultPropertyCollection>>> FindAllAsync(DirectoryEntry searchRoot, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Finds all directory entries matching the specified filter, using the user cache.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="username">The username.</param>
|
||||||
|
/// <param name="filter">The search filter.</param>
|
||||||
|
/// <param name="searchScope">The search scope.</param>
|
||||||
|
/// <param name="sizeLimit">The size limit.</param>
|
||||||
|
/// <param name="properties">The properties to load.</param>
|
||||||
|
/// <returns>A <see cref="DataResult{T}"/> containing the results.</returns>
|
||||||
DataResult<IEnumerable<ResultPropertyCollection>> FindAllByUserCache(string username, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties);
|
DataResult<IEnumerable<ResultPropertyCollection>> FindAllByUserCache(string username, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Finds all directory entries matching the specified filter asynchronously, using the user cache.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="username">The username.</param>
|
||||||
|
/// <param name="filter">The search filter.</param>
|
||||||
|
/// <param name="searchScope">The search scope.</param>
|
||||||
|
/// <param name="sizeLimit">The size limit.</param>
|
||||||
|
/// <param name="properties">The properties to load.</param>
|
||||||
|
/// <returns>A <see cref="DataResult{T}"/> containing the results.</returns>
|
||||||
|
Task<DataResult<IEnumerable<ResultPropertyCollection>>> FindAllByUserCacheAsync(string username, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sets the search root in the cache.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="username">The directory entry username.</param>
|
||||||
|
/// <param name="password">The directory entry password.</param>
|
||||||
void SetSearchRootCache(string username, string password);
|
void SetSearchRootCache(string username, string password);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the search root from the cache.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="username">The directory entry username.</param>
|
||||||
|
/// <returns>The cached <see cref="DirectoryEntry"/> if found; otherwise, null.</returns>
|
||||||
DirectoryEntry? GetSearchRootCache(string username);
|
DirectoryEntry? GetSearchRootCache(string username);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
|
<TargetFrameworks>net7.0;net8.0;net9.0</TargetFrameworks>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<!-- NuGet Package Metadata -->
|
<!-- NuGet Package Metadata -->
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
<Authors>Digital Data GmbH</Authors>
|
<Authors>Digital Data GmbH</Authors>
|
||||||
<Company>Digital Data GmbH</Company>
|
<Company>Digital Data GmbH</Company>
|
||||||
<Product>DigitalData.Core.Abstractions</Product>
|
<Product>DigitalData.Core.Abstractions</Product>
|
||||||
<Description>This package contains abstractions for the DigitalData.Core.Abstractions library, developed according to the principles of Clean Architecture. It promotes separation of concerns and enables independent core logic.</Description>
|
<Description>This package contains abstractions for the DigitalData.Core library, developed according to the principles of Clean Architecture. It promotes separation of concerns and enables independent core logic.</Description>
|
||||||
<PackageTags>digital data core abstractions clean architecture</PackageTags>
|
<PackageTags>digital data core abstractions clean architecture</PackageTags>
|
||||||
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
||||||
<Copyright>Copyright 2024</Copyright>
|
<Copyright>Copyright 2024</Copyright>
|
||||||
@@ -17,9 +17,9 @@
|
|||||||
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
|
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
|
||||||
<PackAsTool>False</PackAsTool>
|
<PackAsTool>False</PackAsTool>
|
||||||
<PackageIcon>core_icon.png</PackageIcon>
|
<PackageIcon>core_icon.png</PackageIcon>
|
||||||
<Version>2.2.1</Version>
|
<Version>3.4.3</Version>
|
||||||
<AssemblyVersion>2.2.1</AssemblyVersion>
|
<AssemblyVersion>3.4.3</AssemblyVersion>
|
||||||
<FileVersion>2.2.1</FileVersion>
|
<FileVersion>3.4.3</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
34
DigitalData.Core.Abstractions/Infrastructure/Extensions.cs
Normal file
34
DigitalData.Core.Abstractions/Infrastructure/Extensions.cs
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
using System.Linq.Expressions;
|
||||||
|
|
||||||
|
namespace DigitalData.Core.Abstractions.Infrastructure;
|
||||||
|
|
||||||
|
public static class Extensions
|
||||||
|
{
|
||||||
|
#region Create
|
||||||
|
public static Task<TEntity> CreateAsync<TEntity, TDto>(this IRepository<TEntity> repository, TDto dto, CancellationToken ct = default)
|
||||||
|
{
|
||||||
|
var entity = repository.Mapper.Map(dto);
|
||||||
|
return repository.CreateAsync(entity, ct);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Task<IEnumerable<TEntity>> CreateAsync<TEntity, TDto>(this IRepository<TEntity> repository, IEnumerable<TDto> dtos, CancellationToken ct = default)
|
||||||
|
{
|
||||||
|
var entities = dtos.Select(dto => repository.Mapper.Map(dto));
|
||||||
|
return repository.CreateAsync(entities, ct);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Read
|
||||||
|
public static async Task<TEntity?> ReadFirstOrDefaultAsync<TEntity>(this IRepository<TEntity> repository, Expression<Func<TEntity, bool>>? expression = null)
|
||||||
|
=> (await repository.ReadAllAsync(expression)).FirstOrDefault();
|
||||||
|
|
||||||
|
public static async Task<TEntity> ReadFirstAsync<TEntity>(this IRepository<TEntity> repository, Expression<Func<TEntity, bool>>? expression = null)
|
||||||
|
=> (await repository.ReadAllAsync(expression)).First();
|
||||||
|
|
||||||
|
public static async Task<TEntity?> ReadSingleOrDefaultAsync<TEntity>(this IRepository<TEntity> repository, Expression<Func<TEntity, bool>>? expression = null)
|
||||||
|
=> (await repository.ReadAllAsync(expression)).SingleOrDefault();
|
||||||
|
|
||||||
|
public static async Task<TEntity> ReadSingleAsync<TEntity>(this IRepository<TEntity> repository, Expression<Func<TEntity, bool>>? expression = null)
|
||||||
|
=> (await repository.ReadAllAsync(expression)).Single();
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
namespace DigitalData.Core.Abstractions.Infrastructure
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Defines methods for mapping between entities and Data Transfer Objects (DTOs).
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TEntity">The type of the entity to be mapped.</typeparam>
|
||||||
|
public interface IEntityMapper<TEntity>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Maps an entity to a DTO.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDto">The type of the DTO to map to.</typeparam>
|
||||||
|
/// <param name="entity">The entity to be mapped.</param>
|
||||||
|
/// <returns>The mapped DTO.</returns>
|
||||||
|
TDto Map<TDto>(TEntity entity);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Maps an entity list to a DTO list.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDto">The type of the DTO to map to.</typeparam>
|
||||||
|
/// <param name="entities">The entity list to be mapped.</param>
|
||||||
|
/// <returns>The mapped DTO list.</returns>
|
||||||
|
IEnumerable<TDto> Map<TDto>(IEnumerable<TEntity> entities);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Maps a DTO to an entity.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDto">The type of the DTO to be mapped.</typeparam>
|
||||||
|
/// <param name="dto">The DTO to be mapped.</param>
|
||||||
|
/// <returns>The mapped entity.</returns>
|
||||||
|
TEntity Map<TDto>(TDto dto);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Maps a DTO list to an entity list.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDto">The type of the DTO to be mapped.</typeparam>
|
||||||
|
/// <param name="dtos">The DTO list to be mapped.</param>
|
||||||
|
/// <returns>The mapped entity list.</returns>
|
||||||
|
IEnumerable<TEntity> Map<TDto>(IEnumerable<TDto> dtos);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Maps a DTO to an existing entity.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDto">The type of the DTO to be mapped.</typeparam>
|
||||||
|
/// <param name="dto">The DTO to be mapped.</param>
|
||||||
|
/// <param name="entity">The existing entity to be updated with the mapped values.</param>
|
||||||
|
/// <returns>The updated entity.</returns>
|
||||||
|
TEntity Map<TDto>(TDto dto, TEntity entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
24
DigitalData.Core.Abstractions/Infrastructure/IRepository.cs
Normal file
24
DigitalData.Core.Abstractions/Infrastructure/IRepository.cs
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
using System.Linq.Expressions;
|
||||||
|
|
||||||
|
namespace DigitalData.Core.Abstractions.Infrastructure;
|
||||||
|
|
||||||
|
public interface IRepository<TEntity>
|
||||||
|
{
|
||||||
|
public IEntityMapper<TEntity> Mapper { get; }
|
||||||
|
|
||||||
|
public Task<TEntity> CreateAsync(TEntity entity, CancellationToken ct = default);
|
||||||
|
|
||||||
|
public Task<IEnumerable<TEntity>> CreateAsync(IEnumerable<TEntity> entities, CancellationToken ct = default);
|
||||||
|
|
||||||
|
public Task<IEnumerable<TEntity>> ReadAllAsync(Expression<Func<TEntity, bool>>? expression = null, CancellationToken ct = default);
|
||||||
|
|
||||||
|
public Task<TEntity?> ReadOrDefaultAsync(Expression<Func<TEntity, bool>> expression, bool single = true, CancellationToken ct = default);
|
||||||
|
|
||||||
|
public Task<IEnumerable<TDto>> ReadAllAsync<TDto>(Expression<Func<TEntity, bool>>? expression = null, CancellationToken ct = default);
|
||||||
|
|
||||||
|
public Task<TDto?> ReadOrDefaultAsync<TDto>(Expression<Func<TEntity, bool>> expression, bool single = true, CancellationToken ct = default);
|
||||||
|
|
||||||
|
public Task UpdateAsync<TDto>(TDto dto, Expression<Func<TEntity, bool>> expression, CancellationToken ct = default);
|
||||||
|
|
||||||
|
public Task DeleteAsync(Expression<Func<TEntity, bool>> expression, CancellationToken ct = default);
|
||||||
|
}
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
namespace DigitalData.Core.Abstractions.Security
|
|
||||||
{
|
|
||||||
public static class CryptographerExtensions
|
|
||||||
{
|
|
||||||
public static IEnumerable<TRSACryptographer> GetByIssuer<TRSACryptographer>(this IEnumerable<TRSACryptographer> cryptographers, string issuer) where TRSACryptographer: IRSACryptographer
|
|
||||||
=> cryptographers.Where(c => c.Issuer == issuer);
|
|
||||||
|
|
||||||
public static IEnumerable<TRSACryptographer> GetByAudience<TRSACryptographer>(this IEnumerable<TRSACryptographer> cryptographers, string audience) where TRSACryptographer : IRSACryptographer
|
|
||||||
=> cryptographers.Where(c => c.Audience == audience);
|
|
||||||
|
|
||||||
public static TRSACryptographer Get<TRSACryptographer>(this IEnumerable<TRSACryptographer> cryptographers, string issuer, string audience) where TRSACryptographer : IRSACryptographer
|
|
||||||
=> cryptographers.Where(c => c.Issuer == issuer && c.Audience == audience).SingleOrDefault()
|
|
||||||
?? throw new InvalidOperationException($"No {typeof(TRSACryptographer).GetType().Name.TrimStart('I')} found with Issuer: {issuer} and Audience: {audience}.");
|
|
||||||
|
|
||||||
public static bool TryGet<TRSACryptographer>(this IEnumerable<TRSACryptographer> cryptographers, string issuer, string audience, out TRSACryptographer? cryptographer) where TRSACryptographer : IRSACryptographer
|
|
||||||
{
|
|
||||||
cryptographer = cryptographers.SingleOrDefault(c => c.Issuer == issuer && c.Audience == audience);
|
|
||||||
return cryptographer is not null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
namespace DigitalData.Core.Abstractions.Security
|
|
||||||
{
|
|
||||||
public interface IAsymCryptService<TParams> : IRSAFactory<TParams>
|
|
||||||
{
|
|
||||||
public IEnumerable<IRSADecryptor> Decryptors { get; }
|
|
||||||
|
|
||||||
public IEnumerable<IRSAEncryptor> Encryptors { get; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
using System.Security.Cryptography;
|
|
||||||
|
|
||||||
namespace DigitalData.Core.Abstractions.Security
|
|
||||||
{
|
|
||||||
public interface IRSACryptographer
|
|
||||||
{
|
|
||||||
public string Pem { get; init; }
|
|
||||||
|
|
||||||
public RSAEncryptionPadding Padding { get; init; }
|
|
||||||
|
|
||||||
public string? Directory { get; set; }
|
|
||||||
|
|
||||||
public string? FileName { get; set; }
|
|
||||||
|
|
||||||
public string Issuer { get; init; }
|
|
||||||
|
|
||||||
public string Audience { get; init; }
|
|
||||||
|
|
||||||
public void Init();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
namespace DigitalData.Core.Abstractions.Security
|
|
||||||
{
|
|
||||||
public interface IRSADecryptor : IRSACryptographer
|
|
||||||
{
|
|
||||||
public bool Encrypt { get; init; }
|
|
||||||
|
|
||||||
IRSAEncryptor Encryptor { get; }
|
|
||||||
|
|
||||||
byte[] Decrypt(byte[] data);
|
|
||||||
|
|
||||||
string Decrypt(string data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
namespace DigitalData.Core.Abstractions.Security
|
|
||||||
{
|
|
||||||
public interface IRSAEncryptor : IRSACryptographer
|
|
||||||
{
|
|
||||||
public byte[] Encrypt(byte[] data);
|
|
||||||
|
|
||||||
public string Encrypt(string data);
|
|
||||||
|
|
||||||
public bool Verify(string data, string signature) => Encrypt(data) == signature;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
using System.Security.Cryptography;
|
|
||||||
|
|
||||||
namespace DigitalData.Core.Abstractions.Security
|
|
||||||
{
|
|
||||||
public interface IRSAFactory<TParams>
|
|
||||||
{
|
|
||||||
string CreateRSAPrivateKeyPem(int? keySizeInBits = null);
|
|
||||||
|
|
||||||
string CreateEncryptedPrivateKeyPem(
|
|
||||||
int? keySizeInBits = null,
|
|
||||||
string? password = null,
|
|
||||||
PbeEncryptionAlgorithm? pbeEncryptionAlgorithm = null,
|
|
||||||
HashAlgorithmName? hashAlgorithmName = null,
|
|
||||||
int? iterationCount = null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
13
DigitalData.Core.Abstractions/ServiceResultExtensions.cs
Normal file
13
DigitalData.Core.Abstractions/ServiceResultExtensions.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
namespace DigitalData.Core.Abstractions
|
||||||
|
{
|
||||||
|
public static class ServiceResultExtensions
|
||||||
|
{
|
||||||
|
public static bool Try<T>(this T? nullableResult, out T result)
|
||||||
|
{
|
||||||
|
#pragma warning disable CS8601 // Possible null reference assignment.
|
||||||
|
result = nullableResult;
|
||||||
|
#pragma warning restore CS8601 // Possible null reference assignment.
|
||||||
|
return nullableResult is not null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,7 +19,7 @@ namespace DigitalData.Core.Application
|
|||||||
/// and a culture-specific translation service for any necessary text translations, ensuring a versatile and internationalized approach to CRUD operations.
|
/// and a culture-specific translation service for any necessary text translations, ensuring a versatile and internationalized approach to CRUD operations.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public class BasicCRUDService<TCRUDRepository, TDto, TEntity, TId> :
|
public class BasicCRUDService<TCRUDRepository, TDto, TEntity, TId> :
|
||||||
CRUDService<TCRUDRepository, TDto, TDto, TDto, TEntity, TId>, IBasicCRUDService<TDto, TEntity, TId>
|
CRUDService<TCRUDRepository, TDto, TDto, TEntity, TId>, IBasicCRUDService<TDto, TEntity, TId>
|
||||||
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TDto : class, IUnique<TId> where TEntity : class, IUnique<TId>
|
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TDto : class, IUnique<TId> where TEntity : class, IUnique<TId>
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -12,11 +12,10 @@ namespace DigitalData.Core.Application
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TCreateDto">The DTO type for create operations.</typeparam>
|
/// <typeparam name="TCreateDto">The DTO type for create operations.</typeparam>
|
||||||
/// <typeparam name="TReadDto">The DTO type for read operations.</typeparam>
|
/// <typeparam name="TReadDto">The DTO type for read operations.</typeparam>
|
||||||
/// <typeparam name="TUpdateDto">The DTO type for update operations.</typeparam>
|
|
||||||
/// <typeparam name="TEntity">The entity type.</typeparam>
|
/// <typeparam name="TEntity">The entity type.</typeparam>
|
||||||
/// <typeparam name="TId">The type of the identifier for the entity.</typeparam>
|
/// <typeparam name="TId">The type of the identifier for the entity.</typeparam>
|
||||||
public class CRUDService<TCRUDRepository, TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : ReadService<TCRUDRepository, TReadDto, TEntity, TId>, ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>
|
public class CRUDService<TCRUDRepository, TCreateDto, TReadDto, TEntity, TId> : ReadService<TCRUDRepository, TReadDto, TEntity, TId>, ICRUDService<TCreateDto, TReadDto, TEntity, TId>
|
||||||
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TCreateDto : class where TReadDto : class where TUpdateDto : IUnique<TId> where TEntity : class, IUnique<TId>
|
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TCreateDto : class where TReadDto : class where TEntity : class, IUnique<TId>
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -45,7 +44,7 @@ namespace DigitalData.Core.Application
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="updateDto">The DTO to update an entity from.</param>
|
/// <param name="updateDto">The DTO to update an entity from.</param>
|
||||||
/// <returns>A service message indicating success or failure.</returns>
|
/// <returns>A service message indicating success or failure.</returns>
|
||||||
public virtual async Task<Result> UpdateAsync(TUpdateDto updateDto)
|
public virtual async Task<Result> UpdateAsync<TUpdateDto>(TUpdateDto updateDto) where TUpdateDto : IUnique<TId>
|
||||||
{
|
{
|
||||||
var currentEntitiy = await _repository.ReadByIdAsync(updateDto.Id);
|
var currentEntitiy = await _repository.ReadByIdAsync(updateDto.Id);
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
using AutoMapper;
|
using DigitalData.Core.Abstractions.Application;
|
||||||
using DigitalData.Core.Abstractions;
|
using Microsoft.Extensions.Configuration;
|
||||||
using DigitalData.Core.Abstractions.Application;
|
|
||||||
using DigitalData.Core.Abstractions.Infrastructure;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
@@ -13,51 +11,6 @@ namespace DigitalData.Core.Application
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class DIExtensions
|
public static class DIExtensions
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// Adds a basic CRUD service for a specific DTO and entity type to the service collection.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TDto">The DTO type the service operates on.</typeparam>
|
|
||||||
/// <typeparam name="TEntity">The entity type corresponding to the DTO.</typeparam>
|
|
||||||
/// <typeparam name="TId">The type of the entity's identifier.</typeparam>
|
|
||||||
/// <typeparam name="TProfile">The AutoMapper profile type for configuring mappings between the DTO and the entity.</typeparam>
|
|
||||||
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
|
|
||||||
/// <param name="configureService">An optional action to configure additional services for the CRUD service.</param>
|
|
||||||
/// <returns>The original <see cref="IServiceCollection"/> instance, allowing further configuration.</returns>
|
|
||||||
public static IServiceCollection AddCleanBasicCRUDService<TCRUDRepository, TDto, TEntity, TId, TProfile>(this IServiceCollection services, Action<IServiceCollection>? configureService = null)
|
|
||||||
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TDto : class, IUnique<TId> where TEntity : class, IUnique<TId> where TProfile : Profile
|
|
||||||
{
|
|
||||||
services.AddScoped<IBasicCRUDService<TDto, TEntity, TId>, BasicCRUDService<TCRUDRepository, TDto, TEntity, TId>>();
|
|
||||||
configureService?.Invoke(services);
|
|
||||||
|
|
||||||
services.AddAutoMapper(typeof(TProfile).Assembly);
|
|
||||||
|
|
||||||
return services;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Adds a CRUD service for managing create, read, update, and delete operations for a specific set of DTOs and an entity type to the service collection.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TCRUDRepository">The repository type that provides CRUD operations for entities of type TEntity.</typeparam>
|
|
||||||
/// <typeparam name="TCreateDto">The DTO type used for create operations.</typeparam>
|
|
||||||
/// <typeparam name="TReadDto">The DTO type used for read operations.</typeparam>
|
|
||||||
/// <typeparam name="TUpdateDto">The DTO type used for update operations.</typeparam>
|
|
||||||
/// <typeparam name="TEntity">The entity type corresponding to the DTOs.</typeparam>
|
|
||||||
/// <typeparam name="TId">The type of the entity's identifier.</typeparam>
|
|
||||||
/// <typeparam name="TProfile">The AutoMapper profile type for configuring mappings between the DTOs and the entity.</typeparam>
|
|
||||||
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
|
|
||||||
/// <param name="configureService">An optional action to configure additional services for the CRUD service.</param>
|
|
||||||
/// <returns>The original <see cref="IServiceCollection"/> instance, allowing further configuration.</returns>
|
|
||||||
public static IServiceCollection AddCleanCRUDService<TCRUDRepository, TCreateDto, TReadDto, TUpdateDto, TEntity, TId, TProfile>(this IServiceCollection services, Action<IServiceCollection>? configureService = null)
|
|
||||||
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TCreateDto : class where TReadDto : class where TUpdateDto : class, IUnique<TId> where TEntity : class, IUnique<TId> where TProfile : Profile
|
|
||||||
{
|
|
||||||
services.AddScoped<ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>, CRUDService<TCRUDRepository, TCreateDto, TReadDto, TUpdateDto, TEntity, TId>>();
|
|
||||||
configureService?.Invoke(services);
|
|
||||||
|
|
||||||
services.AddAutoMapper(typeof(TProfile).Assembly);
|
|
||||||
|
|
||||||
return services;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds the directory search service to the <see cref="IServiceCollection"/>.
|
/// Adds the directory search service to the <see cref="IServiceCollection"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -72,12 +25,9 @@ namespace DigitalData.Core.Application
|
|||||||
/// If <paramref name="directorySearchOptions"/> is not provided, ensure to configure the options separately
|
/// If <paramref name="directorySearchOptions"/> is not provided, ensure to configure the options separately
|
||||||
/// using the <see cref="IOptions{TOptions}"/> pattern.
|
/// using the <see cref="IOptions{TOptions}"/> pattern.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public static IServiceCollection AddDirectorySearchService(this IServiceCollection service, DirectorySearchOptions? directorySearchOptions = null)
|
public static IServiceCollection AddDirectorySearchService(this IServiceCollection service, IConfigurationSection directorySearchOptions)
|
||||||
{
|
{
|
||||||
if(directorySearchOptions is not null)
|
return service.Configure<DirectorySearchOptions>(directorySearchOptions)
|
||||||
service.AddSingleton(Options.Create(directorySearchOptions));
|
|
||||||
|
|
||||||
return service
|
|
||||||
.AddMemoryCache()
|
.AddMemoryCache()
|
||||||
.AddScoped<IDirectorySearchService, DirectorySearchService>();
|
.AddScoped<IDirectorySearchService, DirectorySearchService>();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
|
<TargetFrameworks>net7.0;net8.0;net9.0</TargetFrameworks>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
||||||
@@ -14,7 +14,9 @@
|
|||||||
<PackageIcon>core_icon.png</PackageIcon>
|
<PackageIcon>core_icon.png</PackageIcon>
|
||||||
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
|
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
|
||||||
<PackageTags>digital data core application clean architecture</PackageTags>
|
<PackageTags>digital data core application clean architecture</PackageTags>
|
||||||
<Version>2.0.0.0</Version>
|
<Version>3.2.1</Version>
|
||||||
|
<AssemblyVersion>3.2.1</AssemblyVersion>
|
||||||
|
<FileVersion>3.2.1</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -25,16 +27,28 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="AutoMapper" Version="13.0.1" />
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="7.0.16" />
|
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="7.0.16" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0" />
|
||||||
<PackageReference Include="System.DirectoryServices.AccountManagement" Version="7.0.1" />
|
<PackageReference Include="System.DirectoryServices.AccountManagement" Version="7.0.1" />
|
||||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.5.1" />
|
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.5.1" />
|
||||||
<PackageReference Include="System.Security.Cryptography.Cng" Version="5.0.0" />
|
<PackageReference Include="System.Security.Cryptography.Cng" Version="5.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
|
||||||
|
<PackageReference Include="AutoMapper" Version="13.0.1" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
|
||||||
|
<PackageReference Include="AutoMapper" Version="14.0.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
|
||||||
|
<PackageReference Include="AutoMapper" Version="14.0.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\DigitalData.Core.Abstractions\DigitalData.Core.Abstractions.csproj" />
|
<ProjectReference Include="..\DigitalData.Core.Abstractions\DigitalData.Core.Abstractions.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -5,21 +5,24 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class DirectorySearchOptions
|
public class DirectorySearchOptions
|
||||||
{
|
{
|
||||||
|
//TODO: Merge with Root and rename as path
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or initializes the name of the server to be used in the directory search.
|
/// Gets or initializes the name of the server to be used in the directory search.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string? ServerName { get; init; }
|
public required string ServerName { get; init; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or initializes the root directory path for the search.
|
/// Gets or initializes the root directory path for the search.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string? Root { get; init; }
|
public required string Root { get; init; }
|
||||||
|
|
||||||
|
//TODO: Convert to timespan
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or initializes the number of days before the user cache expires.
|
/// Gets or initializes the number of days before the user cache expires.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int UserCacheExpirationDays { get; init; }
|
public double? UserCacheExpirationDays { get; init; }
|
||||||
|
|
||||||
|
//TODO: Rename as CustomSearchFilters
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or initializes the custom search filters to be applied during directory searches.
|
/// Gets or initializes the custom search filters to be applied during directory searches.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using Microsoft.Extensions.Options;
|
|||||||
|
|
||||||
namespace DigitalData.Core.Application
|
namespace DigitalData.Core.Application
|
||||||
{
|
{
|
||||||
|
//TODO: rename as DirectorySearcher
|
||||||
[SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>")]
|
[SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>")]
|
||||||
public class DirectorySearchService : IDirectorySearchService
|
public class DirectorySearchService : IDirectorySearchService
|
||||||
{
|
{
|
||||||
@@ -15,7 +16,7 @@ namespace DigitalData.Core.Application
|
|||||||
public string ServerName { get; }
|
public string ServerName { get; }
|
||||||
public string Root { get; }
|
public string Root { get; }
|
||||||
public string SearchRootPath { get; }
|
public string SearchRootPath { get; }
|
||||||
private readonly DateTimeOffset _userCacheExpiration;
|
private readonly DateTimeOffset? _userCacheExpiration;
|
||||||
public Dictionary<string, string> CustomSearchFilters { get; }
|
public Dictionary<string, string> CustomSearchFilters { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -32,33 +33,44 @@ namespace DigitalData.Core.Application
|
|||||||
|
|
||||||
var dirSearchOptions = options.Value;
|
var dirSearchOptions = options.Value;
|
||||||
|
|
||||||
ServerName = dirSearchOptions.ServerName ?? throw new InvalidOperationException("The server name for directory search is not configured. Please specify the 'DirectorySearch:ServerName' in the configuration.");
|
ServerName = dirSearchOptions.ServerName;
|
||||||
|
|
||||||
Root = dirSearchOptions.Root ?? throw new InvalidOperationException("The root for directory search is not configured. Please specify the 'DirectorySearch:Root' in the configuration.");
|
Root = dirSearchOptions.Root;
|
||||||
|
|
||||||
SearchRootPath = $"LDAP://{ServerName}/{Root}";
|
SearchRootPath = $"LDAP://{ServerName}/{Root}";
|
||||||
|
|
||||||
CustomSearchFilters = dirSearchOptions.CustomSearchFilters;
|
CustomSearchFilters = dirSearchOptions.CustomSearchFilters;
|
||||||
|
|
||||||
var dayCounts = dirSearchOptions.UserCacheExpirationDays;
|
if(dirSearchOptions.UserCacheExpirationDays is double expirationDays)
|
||||||
if (dayCounts == default)
|
_userCacheExpiration = DateTimeOffset.Now.Date.AddDays(expirationDays);
|
||||||
_userCacheExpiration = default;
|
|
||||||
else
|
|
||||||
_userCacheExpiration = DateTimeOffset.Now.Date.AddDays(dayCounts);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Validates the credentials of a directory entry.
|
/// Creates the connections to the server and returns a Boolean value that specifies
|
||||||
|
/// whether the specified username and password are valid.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dirEntryUsername">The directory entry username.</param>
|
/// <param name="userName">The username that is validated on the server. See the Remarks section
|
||||||
/// <param name="dirEntryPassword">The directory entry password.</param>
|
/// for more information on the format of userName.</param>
|
||||||
|
/// <param name="password">The password that is validated on the server.</param>
|
||||||
/// <returns>True if the credentials are valid; otherwise, false.</returns>
|
/// <returns>True if the credentials are valid; otherwise, false.</returns>
|
||||||
public bool ValidateCredentials(string dirEntryUsername, string dirEntryPassword)
|
public bool ValidateCredentials(string userName, string password)
|
||||||
{
|
{
|
||||||
using var context = new PrincipalContext(ContextType.Domain, ServerName, Root);
|
using var context = new PrincipalContext(ContextType.Domain, ServerName, Root);
|
||||||
return context.ValidateCredentials(dirEntryUsername, dirEntryPassword);
|
return context.ValidateCredentials(userName, password);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the connections to the server asynchronously and returns a Boolean value that specifies
|
||||||
|
/// whether the specified username and password are valid.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userName">The username that is validated on the server. See the Remarks section
|
||||||
|
/// for more information on the format of userName.</param>
|
||||||
|
/// <param name="password">The password that is validated on the server.</param>
|
||||||
|
/// <returns>True if the credentials are valid; otherwise, false.</returns>
|
||||||
|
public Task<bool> ValidateCredentialsAsync(string userName, string password) => Task.Run(()
|
||||||
|
=> ValidateCredentials(userName, password));
|
||||||
|
|
||||||
|
//TODO: remove unnecessary DataResult
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Finds all directory entries matching the specified filter.
|
/// Finds all directory entries matching the specified filter.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -72,7 +84,7 @@ namespace DigitalData.Core.Application
|
|||||||
{
|
{
|
||||||
List<ResultPropertyCollection> list = new();
|
List<ResultPropertyCollection> list = new();
|
||||||
|
|
||||||
var searcher = new DirectorySearcher()
|
using var searcher = new DirectorySearcher()
|
||||||
{
|
{
|
||||||
Filter = filter,
|
Filter = filter,
|
||||||
SearchScope = searchScope,
|
SearchScope = searchScope,
|
||||||
@@ -97,6 +109,18 @@ namespace DigitalData.Core.Application
|
|||||||
return Result.Success<IEnumerable<ResultPropertyCollection>>(list);
|
return Result.Success<IEnumerable<ResultPropertyCollection>>(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Finds all directory entries matching the specified filter asynchronously.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="searchRoot">The search root.</param>
|
||||||
|
/// <param name="filter">The search filter.</param>
|
||||||
|
/// <param name="searchScope">The search scope.</param>
|
||||||
|
/// <param name="sizeLimit">The size limit.</param>
|
||||||
|
/// <param name="properties">The properties to load.</param>
|
||||||
|
/// <returns>A <see cref="DataResult{T}"/> containing the results.</returns>
|
||||||
|
public Task<DataResult<IEnumerable<ResultPropertyCollection>>> FindAllAsync(DirectoryEntry searchRoot, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties) => Task.Run(()
|
||||||
|
=> FindAll(searchRoot, filter, searchScope, sizeLimit, properties));
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Finds all directory entries matching the specified filter, using the user cache.
|
/// Finds all directory entries matching the specified filter, using the user cache.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -116,28 +140,39 @@ namespace DigitalData.Core.Application
|
|||||||
return FindAll(searchRoot, filter, searchScope, sizeLimit, properties);
|
return FindAll(searchRoot, filter, searchScope, sizeLimit, properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Finds all directory entries matching the specified filter asynchronously, using the user cache.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="username">The username.</param>
|
||||||
|
/// <param name="filter">The search filter.</param>
|
||||||
|
/// <param name="searchScope">The search scope.</param>
|
||||||
|
/// <param name="sizeLimit">The size limit.</param>
|
||||||
|
/// <param name="properties">The properties to load.</param>
|
||||||
|
/// <returns>A <see cref="DataResult{T}"/> containing the results.</returns>
|
||||||
|
public Task<DataResult<IEnumerable<ResultPropertyCollection>>> FindAllByUserCacheAsync(string username, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties) => Task.Run(()
|
||||||
|
=> FindAllByUserCache(username, filter, searchScope, sizeLimit, properties));
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the search root in the cache.
|
/// Sets the search root in the cache.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dirEntryUsername">The directory entry username.</param>
|
/// <param name="username">The directory entry username.</param>
|
||||||
/// <param name="dirEntryPassword">The directory entry password.</param>
|
/// <param name="password">The directory entry password.</param>
|
||||||
public void SetSearchRootCache(string dirEntryUsername, string dirEntryPassword)
|
public void SetSearchRootCache(string username, string password)
|
||||||
{
|
{
|
||||||
if (_userCacheExpiration == default)
|
if (_userCacheExpiration is DateTimeOffset cacheExpiration)
|
||||||
_memoryCache.Set(key: dirEntryUsername, new DirectoryEntry(path: SearchRootPath, username: dirEntryUsername, password: dirEntryPassword));
|
_memoryCache.Set(key: username, new DirectoryEntry(path: SearchRootPath, username: username, password: password), absoluteExpiration: cacheExpiration);
|
||||||
else
|
else
|
||||||
_memoryCache.Set(key: dirEntryUsername, new DirectoryEntry(path: SearchRootPath, username: dirEntryUsername, password: dirEntryPassword), absoluteExpiration: _userCacheExpiration);
|
_memoryCache.Set(key: username, new DirectoryEntry(path: SearchRootPath, username: username, password: password));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the search root from the cache.
|
/// Gets the search root from the cache.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dirEntryUsername">The directory entry username.</param>
|
/// <param name="username">The directory entry username.</param>
|
||||||
/// <returns>The cached <see cref="DirectoryEntry"/> if found; otherwise, null.</returns>
|
/// <returns>The cached <see cref="DirectoryEntry"/> if found; otherwise, null.</returns>
|
||||||
public DirectoryEntry? GetSearchRootCache(string dirEntryUsername)
|
public DirectoryEntry? GetSearchRootCache(string username)
|
||||||
{
|
{
|
||||||
_memoryCache.TryGetValue(dirEntryUsername, out DirectoryEntry? root);
|
_memoryCache.TryGetValue(username, out DirectoryEntry? root);
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
// <autogenerated />
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
// <auto-generated/>
|
|
||||||
global using global::System;
|
|
||||||
global using global::System.Collections.Generic;
|
|
||||||
global using global::System.IO;
|
|
||||||
global using global::System.Linq;
|
|
||||||
global using global::System.Net.Http;
|
|
||||||
global using global::System.Threading;
|
|
||||||
global using global::System.Threading.Tasks;
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
// Runtime Version:4.0.30319.42000
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("DigitalData.Core.CleanArchitecture.Application")]
|
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
|
||||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("DigitalData.Core.CleanArchitecture.Application")]
|
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("DigitalData.Core.CleanArchitecture.Application")]
|
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
|
||||||
|
|
||||||
// Generated by the MSBuild WriteCodeFragment class.
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
29481b6f7a973f95145d0c63745be915f7b67045
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
is_global = true
|
|
||||||
build_property.TargetFramework = net7.0
|
|
||||||
build_property.TargetPlatformMinVersion =
|
|
||||||
build_property.UsingMicrosoftNETSdkWeb =
|
|
||||||
build_property.ProjectTypeGuids =
|
|
||||||
build_property.InvariantGlobalization =
|
|
||||||
build_property.PlatformNeutralAssembly =
|
|
||||||
build_property.EnforceExtendedAnalyzerRules =
|
|
||||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
|
||||||
build_property.RootNamespace = DigitalData.Core.CleanArchitecture.Application
|
|
||||||
build_property.ProjectDir = E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
// <auto-generated/>
|
|
||||||
global using global::System;
|
|
||||||
global using global::System.Collections.Generic;
|
|
||||||
global using global::System.IO;
|
|
||||||
global using global::System.Linq;
|
|
||||||
global using global::System.Net.Http;
|
|
||||||
global using global::System.Threading;
|
|
||||||
global using global::System.Threading.Tasks;
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
3adb30e8572adfa0ff48fa59bbfbff13b48112f7
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.csproj.AssemblyReference.cache
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.GeneratedMSBuildEditorConfig.editorconfig
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.AssemblyInfoInputs.cache
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.AssemblyInfo.cs
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.csproj.CoreCompileInputs.cache
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.deps.json
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.dll
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.pdb
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Exceptions.dll
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Exceptions.pdb
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.csproj.CopyComplete
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.dll
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\refint\DigitalData.Core.CleanArchitecture.Application.dll
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.pdb
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\ref\DigitalData.Core.CleanArchitecture.Application.dll
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.csproj.AssemblyReference.cache
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.GeneratedMSBuildEditorConfig.editorconfig
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.AssemblyInfoInputs.cache
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.AssemblyInfo.cs
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.csproj.CoreCompileInputs.cache
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.dll
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\refint\DigitalData.Core.CleanArchitecture.Application.dll
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.pdb
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.deps.json
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.dll
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.pdb
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Application.csproj.CopyComplete
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\ref\DigitalData.Core.CleanArchitecture.Application.dll
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Utilities.dll
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Utilities.pdb
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1,23 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
// Runtime Version:4.0.30319.42000
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("DigitalData.Core.Services")]
|
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
|
||||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("DigitalData.Core.Services")]
|
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("DigitalData.Core.Services")]
|
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
|
||||||
|
|
||||||
// Generated by the MSBuild WriteCodeFragment class.
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
eba1674d810a2e6af850ad2ebbb9a029e7f2ff0a
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
is_global = true
|
|
||||||
build_property.TargetFramework = net7.0
|
|
||||||
build_property.TargetPlatformMinVersion =
|
|
||||||
build_property.UsingMicrosoftNETSdkWeb =
|
|
||||||
build_property.ProjectTypeGuids =
|
|
||||||
build_property.InvariantGlobalization =
|
|
||||||
build_property.PlatformNeutralAssembly =
|
|
||||||
build_property.EnforceExtendedAnalyzerRules =
|
|
||||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
|
||||||
build_property.RootNamespace = DigitalData.Core.Services
|
|
||||||
build_property.ProjectDir = E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
// <auto-generated/>
|
|
||||||
global using global::System;
|
|
||||||
global using global::System.Collections.Generic;
|
|
||||||
global using global::System.IO;
|
|
||||||
global using global::System.Linq;
|
|
||||||
global using global::System.Net.Http;
|
|
||||||
global using global::System.Threading;
|
|
||||||
global using global::System.Threading.Tasks;
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,16 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
|
||||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
|
||||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
|
||||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
|
||||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\tekh\.nuget\packages\;D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages</NuGetPackageFolders>
|
|
||||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
|
||||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.9.1</NuGetToolVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<SourceRoot Include="C:\Users\tekh\.nuget\packages\" />
|
|
||||||
<SourceRoot Include="D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages\" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ImportGroup Condition=" '$(TargetFramework)' == 'net7.0' AND '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.0\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.0\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets')" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition=" '$(TargetFramework)' == 'net8.0' AND '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.0\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions\7.0.0\buildTransitive\net6.0\Microsoft.Extensions.Logging.Abstractions.targets')" />
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,229 +0,0 @@
|
|||||||
{
|
|
||||||
"format": 1,
|
|
||||||
"restore": {
|
|
||||||
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Application\\DigitalData.Core.CleanArchitecture.Application.csproj": {}
|
|
||||||
},
|
|
||||||
"projects": {
|
|
||||||
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Application\\DigitalData.Core.CleanArchitecture.Application.csproj": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"restore": {
|
|
||||||
"projectUniqueName": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Application\\DigitalData.Core.CleanArchitecture.Application.csproj",
|
|
||||||
"projectName": "DigitalData.Core.CleanArchitecture.Application",
|
|
||||||
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Application\\DigitalData.Core.CleanArchitecture.Application.csproj",
|
|
||||||
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
|
|
||||||
"outputPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.CleanArchitecture.Application\\obj\\",
|
|
||||||
"projectStyle": "PackageReference",
|
|
||||||
"fallbackFolders": [
|
|
||||||
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages",
|
|
||||||
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\Offline Packages",
|
|
||||||
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
|
|
||||||
],
|
|
||||||
"configFilePaths": [
|
|
||||||
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 19.2.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 22.1.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
|
||||||
],
|
|
||||||
"originalTargetFrameworks": [
|
|
||||||
"net7.0"
|
|
||||||
],
|
|
||||||
"sources": {
|
|
||||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 19.2\\Components\\System\\Components\\Packages": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\System\\Components\\Packages": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\System\\Components\\Packages": {},
|
|
||||||
"https://api.nuget.org/v3/index.json": {}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net7.0": {
|
|
||||||
"targetAlias": "net7.0",
|
|
||||||
"projectReferences": {
|
|
||||||
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
|
|
||||||
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj"
|
|
||||||
},
|
|
||||||
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj": {
|
|
||||||
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"warningProperties": {
|
|
||||||
"warnAsError": [
|
|
||||||
"NU1605"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net7.0": {
|
|
||||||
"targetAlias": "net7.0",
|
|
||||||
"dependencies": {
|
|
||||||
"AutoMapper": {
|
|
||||||
"target": "Package",
|
|
||||||
"version": "[13.0.1, )"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"imports": [
|
|
||||||
"net461",
|
|
||||||
"net462",
|
|
||||||
"net47",
|
|
||||||
"net471",
|
|
||||||
"net472",
|
|
||||||
"net48",
|
|
||||||
"net481"
|
|
||||||
],
|
|
||||||
"assetTargetFallback": true,
|
|
||||||
"warn": true,
|
|
||||||
"frameworkReferences": {
|
|
||||||
"Microsoft.NETCore.App": {
|
|
||||||
"privateAssets": "all"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"restore": {
|
|
||||||
"projectUniqueName": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
|
|
||||||
"projectName": "DigitalData.Core.Contracts",
|
|
||||||
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
|
|
||||||
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
|
|
||||||
"outputPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\obj\\",
|
|
||||||
"projectStyle": "PackageReference",
|
|
||||||
"fallbackFolders": [
|
|
||||||
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages",
|
|
||||||
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\Offline Packages",
|
|
||||||
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
|
|
||||||
],
|
|
||||||
"configFilePaths": [
|
|
||||||
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 19.2.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 22.1.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
|
||||||
],
|
|
||||||
"originalTargetFrameworks": [
|
|
||||||
"net7.0"
|
|
||||||
],
|
|
||||||
"sources": {
|
|
||||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 19.2\\Components\\System\\Components\\Packages": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\System\\Components\\Packages": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\System\\Components\\Packages": {},
|
|
||||||
"https://api.nuget.org/v3/index.json": {}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net7.0": {
|
|
||||||
"targetAlias": "net7.0",
|
|
||||||
"projectReferences": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"warningProperties": {
|
|
||||||
"warnAsError": [
|
|
||||||
"NU1605"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net7.0": {
|
|
||||||
"targetAlias": "net7.0",
|
|
||||||
"dependencies": {
|
|
||||||
"System.DirectoryServices": {
|
|
||||||
"target": "Package",
|
|
||||||
"version": "[7.0.1, )"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"imports": [
|
|
||||||
"net461",
|
|
||||||
"net462",
|
|
||||||
"net47",
|
|
||||||
"net471",
|
|
||||||
"net472",
|
|
||||||
"net48",
|
|
||||||
"net481"
|
|
||||||
],
|
|
||||||
"assetTargetFallback": true,
|
|
||||||
"warn": true,
|
|
||||||
"frameworkReferences": {
|
|
||||||
"Microsoft.NETCore.App": {
|
|
||||||
"privateAssets": "all"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"restore": {
|
|
||||||
"projectUniqueName": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj",
|
|
||||||
"projectName": "DigitalData.Core.Utilities",
|
|
||||||
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj",
|
|
||||||
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
|
|
||||||
"outputPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\obj\\",
|
|
||||||
"projectStyle": "PackageReference",
|
|
||||||
"fallbackFolders": [
|
|
||||||
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages",
|
|
||||||
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\Offline Packages",
|
|
||||||
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
|
|
||||||
],
|
|
||||||
"configFilePaths": [
|
|
||||||
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 19.2.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 22.1.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
|
||||||
],
|
|
||||||
"originalTargetFrameworks": [
|
|
||||||
"net7.0"
|
|
||||||
],
|
|
||||||
"sources": {
|
|
||||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 19.2\\Components\\System\\Components\\Packages": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\System\\Components\\Packages": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\System\\Components\\Packages": {},
|
|
||||||
"https://api.nuget.org/v3/index.json": {}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net7.0": {
|
|
||||||
"targetAlias": "net7.0",
|
|
||||||
"projectReferences": {
|
|
||||||
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
|
|
||||||
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"warningProperties": {
|
|
||||||
"warnAsError": [
|
|
||||||
"NU1605"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net7.0": {
|
|
||||||
"targetAlias": "net7.0",
|
|
||||||
"imports": [
|
|
||||||
"net461",
|
|
||||||
"net462",
|
|
||||||
"net47",
|
|
||||||
"net471",
|
|
||||||
"net472",
|
|
||||||
"net48",
|
|
||||||
"net481"
|
|
||||||
],
|
|
||||||
"assetTargetFallback": true,
|
|
||||||
"warn": true,
|
|
||||||
"frameworkReferences": {
|
|
||||||
"Microsoft.NETCore.App": {
|
|
||||||
"privateAssets": "all"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
|
||||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
|
||||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
|
||||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
|
||||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\tekh\.nuget\packages\;D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages;D:\ProgramFiles\DevExpress 22.1\Components\Offline Packages;C:\Program Files\dotnet\sdk\NuGetFallbackFolder</NuGetPackageFolders>
|
|
||||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
|
||||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.5.0</NuGetToolVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<SourceRoot Include="C:\Users\tekh\.nuget\packages\" />
|
|
||||||
<SourceRoot Include="D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages\" />
|
|
||||||
<SourceRoot Include="D:\ProgramFiles\DevExpress 22.1\Components\Offline Packages\" />
|
|
||||||
<SourceRoot Include="C:\Program Files\dotnet\sdk\NuGetFallbackFolder\" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />
|
|
||||||
@@ -1,229 +0,0 @@
|
|||||||
{
|
|
||||||
"format": 1,
|
|
||||||
"restore": {
|
|
||||||
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Application\\DigitalData.Core.Services.csproj": {}
|
|
||||||
},
|
|
||||||
"projects": {
|
|
||||||
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Application\\DigitalData.Core.Services.csproj": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"restore": {
|
|
||||||
"projectUniqueName": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Application\\DigitalData.Core.Services.csproj",
|
|
||||||
"projectName": "DigitalData.Core.Services",
|
|
||||||
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Application\\DigitalData.Core.Services.csproj",
|
|
||||||
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
|
|
||||||
"outputPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Application\\obj\\",
|
|
||||||
"projectStyle": "PackageReference",
|
|
||||||
"fallbackFolders": [
|
|
||||||
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages",
|
|
||||||
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\Offline Packages",
|
|
||||||
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
|
|
||||||
],
|
|
||||||
"configFilePaths": [
|
|
||||||
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 19.2.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 22.1.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
|
||||||
],
|
|
||||||
"originalTargetFrameworks": [
|
|
||||||
"net7.0"
|
|
||||||
],
|
|
||||||
"sources": {
|
|
||||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 19.2\\Components\\System\\Components\\Packages": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\System\\Components\\Packages": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\System\\Components\\Packages": {},
|
|
||||||
"https://api.nuget.org/v3/index.json": {}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net7.0": {
|
|
||||||
"targetAlias": "net7.0",
|
|
||||||
"projectReferences": {
|
|
||||||
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
|
|
||||||
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj"
|
|
||||||
},
|
|
||||||
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj": {
|
|
||||||
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"warningProperties": {
|
|
||||||
"warnAsError": [
|
|
||||||
"NU1605"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net7.0": {
|
|
||||||
"targetAlias": "net7.0",
|
|
||||||
"dependencies": {
|
|
||||||
"AutoMapper": {
|
|
||||||
"target": "Package",
|
|
||||||
"version": "[13.0.1, )"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"imports": [
|
|
||||||
"net461",
|
|
||||||
"net462",
|
|
||||||
"net47",
|
|
||||||
"net471",
|
|
||||||
"net472",
|
|
||||||
"net48",
|
|
||||||
"net481"
|
|
||||||
],
|
|
||||||
"assetTargetFallback": true,
|
|
||||||
"warn": true,
|
|
||||||
"frameworkReferences": {
|
|
||||||
"Microsoft.NETCore.App": {
|
|
||||||
"privateAssets": "all"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"restore": {
|
|
||||||
"projectUniqueName": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
|
|
||||||
"projectName": "DigitalData.Core.Contracts",
|
|
||||||
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
|
|
||||||
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
|
|
||||||
"outputPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\obj\\",
|
|
||||||
"projectStyle": "PackageReference",
|
|
||||||
"fallbackFolders": [
|
|
||||||
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages",
|
|
||||||
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\Offline Packages",
|
|
||||||
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
|
|
||||||
],
|
|
||||||
"configFilePaths": [
|
|
||||||
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 19.2.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 22.1.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
|
||||||
],
|
|
||||||
"originalTargetFrameworks": [
|
|
||||||
"net7.0"
|
|
||||||
],
|
|
||||||
"sources": {
|
|
||||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 19.2\\Components\\System\\Components\\Packages": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\System\\Components\\Packages": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\System\\Components\\Packages": {},
|
|
||||||
"https://api.nuget.org/v3/index.json": {}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net7.0": {
|
|
||||||
"targetAlias": "net7.0",
|
|
||||||
"projectReferences": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"warningProperties": {
|
|
||||||
"warnAsError": [
|
|
||||||
"NU1605"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net7.0": {
|
|
||||||
"targetAlias": "net7.0",
|
|
||||||
"dependencies": {
|
|
||||||
"System.DirectoryServices": {
|
|
||||||
"target": "Package",
|
|
||||||
"version": "[7.0.1, )"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"imports": [
|
|
||||||
"net461",
|
|
||||||
"net462",
|
|
||||||
"net47",
|
|
||||||
"net471",
|
|
||||||
"net472",
|
|
||||||
"net48",
|
|
||||||
"net481"
|
|
||||||
],
|
|
||||||
"assetTargetFallback": true,
|
|
||||||
"warn": true,
|
|
||||||
"frameworkReferences": {
|
|
||||||
"Microsoft.NETCore.App": {
|
|
||||||
"privateAssets": "all"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"restore": {
|
|
||||||
"projectUniqueName": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj",
|
|
||||||
"projectName": "DigitalData.Core.Utilities",
|
|
||||||
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\DigitalData.Core.Utilities.csproj",
|
|
||||||
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
|
|
||||||
"outputPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Utilities\\obj\\",
|
|
||||||
"projectStyle": "PackageReference",
|
|
||||||
"fallbackFolders": [
|
|
||||||
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\Offline Packages",
|
|
||||||
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\Offline Packages",
|
|
||||||
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
|
|
||||||
],
|
|
||||||
"configFilePaths": [
|
|
||||||
"C:\\Users\\tekh\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 19.2.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 21.2.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 22.1.config",
|
|
||||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
|
||||||
],
|
|
||||||
"originalTargetFrameworks": [
|
|
||||||
"net7.0"
|
|
||||||
],
|
|
||||||
"sources": {
|
|
||||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 19.2\\Components\\System\\Components\\Packages": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 21.2\\Components\\System\\Components\\Packages": {},
|
|
||||||
"D:\\ProgramFiles\\DevExpress 22.1\\Components\\System\\Components\\Packages": {},
|
|
||||||
"https://api.nuget.org/v3/index.json": {}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net7.0": {
|
|
||||||
"targetAlias": "net7.0",
|
|
||||||
"projectReferences": {
|
|
||||||
"E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
|
|
||||||
"projectPath": "E:\\TekH\\Visual Studio\\DDWeb\\DigitalData.Core\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"warningProperties": {
|
|
||||||
"warnAsError": [
|
|
||||||
"NU1605"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"frameworks": {
|
|
||||||
"net7.0": {
|
|
||||||
"targetAlias": "net7.0",
|
|
||||||
"imports": [
|
|
||||||
"net461",
|
|
||||||
"net462",
|
|
||||||
"net47",
|
|
||||||
"net471",
|
|
||||||
"net472",
|
|
||||||
"net48",
|
|
||||||
"net481"
|
|
||||||
],
|
|
||||||
"assetTargetFallback": true,
|
|
||||||
"warn": true,
|
|
||||||
"frameworkReferences": {
|
|
||||||
"Microsoft.NETCore.App": {
|
|
||||||
"privateAssets": "all"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
|
||||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
|
||||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
|
||||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
|
||||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\tekh\.nuget\packages\;D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages;D:\ProgramFiles\DevExpress 22.1\Components\Offline Packages;C:\Program Files\dotnet\sdk\NuGetFallbackFolder</NuGetPackageFolders>
|
|
||||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
|
||||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.5.0</NuGetToolVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
|
||||||
<SourceRoot Include="C:\Users\tekh\.nuget\packages\" />
|
|
||||||
<SourceRoot Include="D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages\" />
|
|
||||||
<SourceRoot Include="D:\ProgramFiles\DevExpress 22.1\Components\Offline Packages\" />
|
|
||||||
<SourceRoot Include="C:\Program Files\dotnet\sdk\NuGetFallbackFolder\" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
|
||||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
// <autogenerated />
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
is_global = true
|
|
||||||
build_property.TargetFramework = net7.0
|
|
||||||
build_property.TargetPlatformMinVersion =
|
|
||||||
build_property.UsingMicrosoftNETSdkWeb =
|
|
||||||
build_property.ProjectTypeGuids =
|
|
||||||
build_property.InvariantGlobalization =
|
|
||||||
build_property.PlatformNeutralAssembly =
|
|
||||||
build_property.EnforceExtendedAnalyzerRules =
|
|
||||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
|
||||||
build_property.RootNamespace = DigitalData.Core.Application
|
|
||||||
build_property.ProjectDir = E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\
|
|
||||||
build_property.EnableComHosting =
|
|
||||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
// <auto-generated/>
|
|
||||||
global using global::System;
|
|
||||||
global using global::System.Collections.Generic;
|
|
||||||
global using global::System.IO;
|
|
||||||
global using global::System.Linq;
|
|
||||||
global using global::System.Net.Http;
|
|
||||||
global using global::System.Threading;
|
|
||||||
global using global::System.Threading.Tasks;
|
|
||||||
@@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions;
|
|||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
|
||||||
|
//TODO: Update to use IHttpClientFactory (see also: https://learn.microsoft.com/tr-tr/dotnet/core/extensions/httpclient-factory)
|
||||||
namespace DigitalData.Core.Client
|
namespace DigitalData.Core.Client
|
||||||
{
|
{
|
||||||
public static class DIExtensions
|
public static class DIExtensions
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
|
<TargetFrameworks>net7.0;net8.0;net9.0</TargetFrameworks>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<Description>This package provides HTTP client extension methods for the DigitalData.Core library, offering simplified and asynchronous methods for fetching and handling HTTP responses. It includes utility methods for sending GET requests, reading response content as text or JSON, and deserializing JSON into dynamic or strongly-typed objects using Newtonsoft.Json. These extensions facilitate efficient and easy-to-read HTTP interactions in client applications.</Description>
|
<Description>This package provides HTTP client extension methods for the DigitalData.Core library, offering simplified and asynchronous methods for fetching and handling HTTP responses. It includes utility methods for sending GET requests, reading response content as text or JSON, and deserializing JSON into dynamic or strongly-typed objects using Newtonsoft.Json. These extensions facilitate efficient and easy-to-read HTTP interactions in client applications.</Description>
|
||||||
|
|||||||
@@ -9,28 +9,36 @@ namespace DigitalData.Core.DTO
|
|||||||
public static class DTOExtensions
|
public static class DTOExtensions
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds a single message to the result.
|
/// Adds a single message to the result, if not null.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">The type of the result.</typeparam>
|
/// <typeparam name="T">The type of the result.</typeparam>
|
||||||
/// <param name="result">The result to add the message to.</param>
|
/// <param name="result">The result to add the message to.</param>
|
||||||
/// <param name="message">The message to add.</param>
|
/// <param name="message">The message to add.</param>
|
||||||
/// <returns>The updated result.</returns>
|
/// <returns>The updated result.</returns>
|
||||||
public static T Message<T>(this T result, string message) where T : Result
|
public static T Message<T>(this T result, string? message) where T : Result
|
||||||
{
|
{
|
||||||
result.Messages.Add(message);
|
if(message is not null)
|
||||||
|
result.Messages.Add(message);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static IEnumerable<T> FilterNull<T>(this IEnumerable<T?> list)
|
||||||
|
{
|
||||||
|
foreach (var item in list)
|
||||||
|
if(item is not null)
|
||||||
|
yield return item;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds multiple messages to the result.
|
/// Adds multiple messages to the result, after removing nulls.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T">The type of the result.</typeparam>
|
/// <typeparam name="T">The type of the result.</typeparam>
|
||||||
/// <param name="result">The result to add the messages to.</param>
|
/// <param name="result">The result to add the messages to.</param>
|
||||||
/// <param name="messages">The messages to add.</param>
|
/// <param name="messages">The messages to add.</param>
|
||||||
/// <returns>The updated result.</returns>
|
/// <returns>The updated result.</returns>
|
||||||
public static T Message<T>(this T result, params string[] messages) where T : Result
|
public static T Message<T>(this T result, params string?[] messages) where T : Result
|
||||||
{
|
{
|
||||||
result.Messages.AddRange(messages);
|
result.Messages.AddRange(messages.FilterNull());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,9 +49,9 @@ namespace DigitalData.Core.DTO
|
|||||||
/// <param name="result">The result to add the messages to.</param>
|
/// <param name="result">The result to add the messages to.</param>
|
||||||
/// <param name="messages">The collection of messages to add.</param>
|
/// <param name="messages">The collection of messages to add.</param>
|
||||||
/// <returns>The updated result.</returns>
|
/// <returns>The updated result.</returns>
|
||||||
public static T Message<T>(this T result, IEnumerable<string> messages) where T : Result
|
public static T Message<T>(this T result, IEnumerable<string?> messages) where T : Result
|
||||||
{
|
{
|
||||||
result.Messages.AddRange(messages);
|
result.Messages.AddRange(messages.FilterNull());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,13 +109,13 @@ namespace DigitalData.Core.DTO
|
|||||||
/// <param name="flag">The flag associated with the notice.</param>
|
/// <param name="flag">The flag associated with the notice.</param>
|
||||||
/// <param name="messages">The messages to add to the notice.</param>
|
/// <param name="messages">The messages to add to the notice.</param>
|
||||||
/// <returns>The updated result.</returns>
|
/// <returns>The updated result.</returns>
|
||||||
public static T Notice<T>(this T result, LogLevel level, Enum flag, params string[] messages) where T : Result
|
public static T Notice<T>(this T result, LogLevel level, Enum flag, params string?[] messages) where T : Result
|
||||||
{
|
{
|
||||||
result.Notices.Add(new Notice()
|
result.Notices.Add(new Notice()
|
||||||
{
|
{
|
||||||
Flag = flag,
|
Flag = flag,
|
||||||
Level = level,
|
Level = level,
|
||||||
Messages = messages.ToList()
|
Messages = messages.FilterNull().ToList()
|
||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -126,7 +134,7 @@ namespace DigitalData.Core.DTO
|
|||||||
{
|
{
|
||||||
Flag = null,
|
Flag = null,
|
||||||
Level = level,
|
Level = level,
|
||||||
Messages = messages.ToList()
|
Messages = messages.FilterNull().ToList()
|
||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
|
<TargetFrameworks>net7.0;net8.0;net9.0</TargetFrameworks>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<Description>This package provides Data Transfer Object (DTO) implementations and related utilities. It includes generic result handling, DTO extension methods, cookie consent settings management, and AutoMapper integration for robust object mapping, all adhering to Clean Architecture principles to ensure separation of concerns and maintainability.</Description>
|
<Description>This package provides Data Transfer Object (DTO) implementations and related utilities. It includes generic result handling, DTO extension methods, cookie consent settings management, and AutoMapper integration for robust object mapping, all adhering to Clean Architecture principles to ensure separation of concerns and maintainability.</Description>
|
||||||
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
||||||
<PackageId>DigitalData.Core.DTO</PackageId>
|
<PackageId>DigitalData.Core.DTO</PackageId>
|
||||||
<Version>2.0.0.0</Version>
|
<Version>2.0.1</Version>
|
||||||
<Authors>Digital Data GmbH</Authors>
|
<Authors>Digital Data GmbH</Authors>
|
||||||
<Company>Digital Data GmbH</Company>
|
<Company>Digital Data GmbH</Company>
|
||||||
<Product>DigitalData.Core.DTO</Product>
|
<Product>DigitalData.Core.DTO</Product>
|
||||||
@@ -15,6 +15,8 @@
|
|||||||
<PackageIcon>core_icon.png</PackageIcon>
|
<PackageIcon>core_icon.png</PackageIcon>
|
||||||
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
|
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
|
||||||
<PackageTags>digital data core dto clean architecture result pattern</PackageTags>
|
<PackageTags>digital data core dto clean architecture result pattern</PackageTags>
|
||||||
|
<AssemblyVersion>2.0.1</AssemblyVersion>
|
||||||
|
<FileVersion>2.0.1</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
|
namespace DigitalData.Core.Infrastructure.AutoMapper;
|
||||||
|
|
||||||
|
public static class DependencyInjection
|
||||||
|
{
|
||||||
|
public static EntityConfigurationOptions<TEntity> UseAutoMapper<TEntity>(this EntityConfigurationOptions<TEntity> options, params Type[] typeOfDtos)
|
||||||
|
{
|
||||||
|
options.AddCustomMapper<EntityAutoMapper<TEntity>>(services =>
|
||||||
|
{
|
||||||
|
if (typeOfDtos.Length != 0)
|
||||||
|
{
|
||||||
|
services.AddAutoMapper(cnf =>
|
||||||
|
{
|
||||||
|
foreach (var typeOfDto in typeOfDtos)
|
||||||
|
{
|
||||||
|
cnf.CreateMap(typeof(TEntity), typeOfDto);
|
||||||
|
cnf.CreateMap(typeOfDto, typeof(TEntity));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>net7.0;net8.0;net9.0</TargetFrameworks>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
||||||
|
<PackageId>DigitalData.Core.Infrastructure.AutoMapper</PackageId>
|
||||||
|
<Version>1.0.2</Version>
|
||||||
|
<Authors>Digital Data GmbH</Authors>
|
||||||
|
<Company>Digital Data GmbH</Company>
|
||||||
|
<Product>DigitalData.Core.Infrastructure.AutoMapper</Product>
|
||||||
|
<Description>This package provides AutoMapper support for the DigitalData.Core.Infrastructure module. It includes mapping configurations and abstractions used for object-to-object mapping within the infrastructure layer.</Description>
|
||||||
|
<Copyright>Copyright 2024</Copyright>
|
||||||
|
<PackageIcon>core_icon.png</PackageIcon>
|
||||||
|
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
|
||||||
|
<RepositoryType>digital data core abstractions clean architecture mapping</RepositoryType>
|
||||||
|
<PackageTags>digital data core infrastructure clean architecture mapping</PackageTags>
|
||||||
|
<AssemblyVersion>1.0.2</AssemblyVersion>
|
||||||
|
<FileVersion>1.0.2</FileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\..\nuget-package-icons\core_icon.png">
|
||||||
|
<Pack>True</Pack>
|
||||||
|
<PackagePath>\</PackagePath>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\DigitalData.Core.Abstractions\DigitalData.Core.Abstractions.csproj" />
|
||||||
|
<ProjectReference Include="..\DigitalData.Core.Infrastructure\DigitalData.Core.Infrastructure.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
using AutoMapper;
|
||||||
|
using DigitalData.Core.Abstractions.Infrastructure;
|
||||||
|
|
||||||
|
namespace DigitalData.Core.Infrastructure.AutoMapper;
|
||||||
|
|
||||||
|
public class EntityAutoMapper<TEntity> : IEntityMapper<TEntity>
|
||||||
|
{
|
||||||
|
private readonly IMapper _rootMapper;
|
||||||
|
|
||||||
|
public EntityAutoMapper(IMapper rootMapper)
|
||||||
|
{
|
||||||
|
_rootMapper = rootMapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TDto Map<TDto>(TEntity entity) => _rootMapper.Map<TDto>(entity);
|
||||||
|
|
||||||
|
public IEnumerable<TDto> Map<TDto>(IEnumerable<TEntity> entities) => _rootMapper.Map<IEnumerable<TDto>>(entities);
|
||||||
|
|
||||||
|
public TEntity Map<TDto>(TDto dto) => _rootMapper.Map<TEntity>(dto);
|
||||||
|
|
||||||
|
public IEnumerable<TEntity> Map<TDto>(IEnumerable<TDto> dtos) => _rootMapper.Map<IEnumerable<TEntity>>(dtos);
|
||||||
|
|
||||||
|
public TEntity Map<TDto>(TDto dto, TEntity entity) => _rootMapper.Map(dto, entity);
|
||||||
|
}
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
using DigitalData.Core.Abstractions;
|
|
||||||
using DigitalData.Core.Abstractions.Infrastructure;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using System.DirectoryServices;
|
|
||||||
|
|
||||||
namespace DigitalData.Core.Infrastructure
|
|
||||||
{
|
|
||||||
public static class DIExtensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Adds a CRUD repository for a specific entity type to the service collection.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TEntity">The entity type for which the repository is registered.</typeparam>
|
|
||||||
/// <typeparam name="TId">The type of the entity's identifier.</typeparam>
|
|
||||||
/// <typeparam name="TDbContext">The DbContext type used by the repository.</typeparam>
|
|
||||||
/// <param name="services">The <see cref="IServiceCollection"/> to add the repository to.</param>
|
|
||||||
/// <param name="configureRepository">An optional action to configure additional services for the repository.</param>
|
|
||||||
/// <returns>The original <see cref="IServiceCollection"/> instance, allowing further configuration.</returns>
|
|
||||||
public static IServiceCollection AddCleanCRUDRepository<TEntity, TId, TDbContext, TCRUDRepository>(this IServiceCollection services, Action<IServiceCollection>? configureRepository = null)
|
|
||||||
where TCRUDRepository : CRUDRepository<TEntity, TId, TDbContext> where TEntity : class, IUnique<TId> where TDbContext : DbContext
|
|
||||||
{
|
|
||||||
services.AddScoped<ICRUDRepository<TEntity, TId>, TCRUDRepository>();
|
|
||||||
configureRepository?.Invoke(services);
|
|
||||||
return services;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
79
DigitalData.Core.Infrastructure/DbRepository.cs
Normal file
79
DigitalData.Core.Infrastructure/DbRepository.cs
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
using DigitalData.Core.Abstractions.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
|
||||||
|
namespace DigitalData.Core.Infrastructure;
|
||||||
|
|
||||||
|
public class DbRepository<TDbContext, TEntity> : IRepository<TEntity> where TDbContext : DbContext where TEntity : class
|
||||||
|
{
|
||||||
|
protected internal readonly TDbContext Context;
|
||||||
|
|
||||||
|
protected internal readonly DbSet<TEntity> Entities;
|
||||||
|
|
||||||
|
public IEntityMapper<TEntity> Mapper { get; }
|
||||||
|
|
||||||
|
public DbRepository(TDbContext context, Func<TDbContext, DbSet<TEntity>> queryFactory, IEntityMapper<TEntity> mapper)
|
||||||
|
{
|
||||||
|
Context = context;
|
||||||
|
Entities = queryFactory(context);
|
||||||
|
Mapper = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task<TEntity> CreateAsync(TEntity entity, CancellationToken ct = default)
|
||||||
|
{
|
||||||
|
Entities.Add(entity);
|
||||||
|
await Context.SaveChangesAsync(ct);
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task<IEnumerable<TEntity>> CreateAsync(IEnumerable<TEntity> entities, CancellationToken ct = default)
|
||||||
|
{
|
||||||
|
Entities.AddRange(entities);
|
||||||
|
await Context.SaveChangesAsync(ct);
|
||||||
|
return entities;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task<IEnumerable<TEntity>> ReadAllAsync(Expression<Func<TEntity, bool>>? expression = null, CancellationToken ct = default)
|
||||||
|
=> expression is null
|
||||||
|
? await Entities.AsNoTracking().ToListAsync(ct)
|
||||||
|
: await Entities.AsNoTracking().Where(expression).ToListAsync(ct);
|
||||||
|
|
||||||
|
public virtual async Task<TEntity?> ReadOrDefaultAsync(Expression<Func<TEntity, bool>> expression, bool single = true, CancellationToken ct = default)
|
||||||
|
=> single
|
||||||
|
? await Entities.AsNoTracking().Where(expression).SingleOrDefaultAsync(ct)
|
||||||
|
: await Entities.AsNoTracking().Where(expression).FirstOrDefaultAsync(ct);
|
||||||
|
|
||||||
|
public virtual async Task<IEnumerable<TDto>> ReadAllAsync<TDto>(Expression<Func<TEntity, bool>>? expression = null, CancellationToken ct = default)
|
||||||
|
=> Mapper.Map<TDto>(await ReadAllAsync(expression, ct));
|
||||||
|
|
||||||
|
public virtual async Task<TDto?> ReadOrDefaultAsync<TDto>(Expression<Func<TEntity, bool>> expression, bool single = true, CancellationToken ct = default)
|
||||||
|
{
|
||||||
|
var entity = await ReadOrDefaultAsync(expression, single, ct);
|
||||||
|
return entity is null ? default : Mapper.Map<TDto>(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task UpdateAsync<TDto>(TDto dto, Expression<Func<TEntity, bool>> expression, CancellationToken ct = default)
|
||||||
|
{
|
||||||
|
var entities = await Entities.Where(expression).ToListAsync(ct);
|
||||||
|
|
||||||
|
for (int i = entities.Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
Mapper.Map(dto, entities[i]);
|
||||||
|
Entities.Update(entities[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
await Context.SaveChangesAsync(ct);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task DeleteAsync(Expression<Func<TEntity, bool>> expression, CancellationToken ct = default)
|
||||||
|
{
|
||||||
|
var entities = await Entities.Where(expression).ToListAsync(ct);
|
||||||
|
|
||||||
|
for (int i = entities.Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
Entities.Remove(entities[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
await Context.SaveChangesAsync(ct);
|
||||||
|
}
|
||||||
|
}
|
||||||
19
DigitalData.Core.Infrastructure/DependencyInjection.cs
Normal file
19
DigitalData.Core.Infrastructure/DependencyInjection.cs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
using DigitalData.Core.Abstractions.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
|
namespace DigitalData.Core.Infrastructure;
|
||||||
|
|
||||||
|
public static class DependencyInjection
|
||||||
|
{
|
||||||
|
public static EntityConfigurationOptions<TEntity> AddDbRepository<TDbContext, TEntity>(this IServiceCollection services, Func<TDbContext, DbSet<TEntity>> queryFactory)
|
||||||
|
where TDbContext : DbContext
|
||||||
|
where TEntity : class
|
||||||
|
{
|
||||||
|
services
|
||||||
|
.AddScoped<IRepository<TEntity>, DbRepository<TDbContext, TEntity>>()
|
||||||
|
.AddSingleton(queryFactory);
|
||||||
|
|
||||||
|
return new EntityConfigurationOptions<TEntity>(services);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
|
<TargetFrameworks>net7.0;net8.0;net9.0</TargetFrameworks>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
||||||
<PackageId>DigitalData.Core.Infrastructure</PackageId>
|
<PackageId>DigitalData.Core.Infrastructure</PackageId>
|
||||||
<Version>2.0.0.0</Version>
|
<Version>2.0.4</Version>
|
||||||
<Authors>Digital Data GmbH</Authors>
|
<Authors>Digital Data GmbH</Authors>
|
||||||
<Company>Digital Data GmbH</Company>
|
<Company>Digital Data GmbH</Company>
|
||||||
<Product>DigitalData.Core.Infrastructure</Product>
|
<Product>DigitalData.Core.Infrastructure</Product>
|
||||||
@@ -16,6 +16,8 @@
|
|||||||
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
|
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
|
||||||
<RepositoryType>digital data core abstractions clean architecture</RepositoryType>
|
<RepositoryType>digital data core abstractions clean architecture</RepositoryType>
|
||||||
<PackageTags>digital data core infrastructure clean architecture</PackageTags>
|
<PackageTags>digital data core infrastructure clean architecture</PackageTags>
|
||||||
|
<AssemblyVersion>2.0.4</AssemblyVersion>
|
||||||
|
<FileVersion>2.0.4</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -25,8 +27,16 @@
|
|||||||
</None>
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.16" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.20" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.15" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.4" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
using DigitalData.Core.Abstractions.Infrastructure;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
|
namespace DigitalData.Core.Infrastructure;
|
||||||
|
|
||||||
|
public class EntityConfigurationOptions<TEntity>
|
||||||
|
{
|
||||||
|
private readonly IServiceCollection _services;
|
||||||
|
|
||||||
|
public EntityConfigurationOptions(IServiceCollection services)
|
||||||
|
{
|
||||||
|
_services = services;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EntityConfigurationOptions<TEntity> AddCustomMapper<TEntityMapper>(Action<IServiceCollection> configure, Func<IServiceProvider, TEntityMapper>? factory = null)
|
||||||
|
where TEntityMapper : class, IEntityMapper<TEntity>
|
||||||
|
{
|
||||||
|
configure(_services);
|
||||||
|
|
||||||
|
if (factory is null)
|
||||||
|
_services.AddSingleton<IEntityMapper<TEntity>, TEntityMapper>();
|
||||||
|
else
|
||||||
|
_services.AddSingleton(factory);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
// <autogenerated />
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
// Runtime Version:4.0.30319.42000
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("DigitalData.Core.CleanArchitecture.Infrastructure")]
|
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
|
||||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("DigitalData.Core.CleanArchitecture.Infrastructure")]
|
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("DigitalData.Core.CleanArchitecture.Infrastructure")]
|
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
|
||||||
|
|
||||||
// Generated by the MSBuild WriteCodeFragment class.
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
8a25aaa1f86570faf2512592288c9bf37c1a4a03
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
is_global = true
|
|
||||||
build_property.TargetFramework = net7.0
|
|
||||||
build_property.TargetPlatformMinVersion =
|
|
||||||
build_property.UsingMicrosoftNETSdkWeb =
|
|
||||||
build_property.ProjectTypeGuids =
|
|
||||||
build_property.InvariantGlobalization =
|
|
||||||
build_property.PlatformNeutralAssembly =
|
|
||||||
build_property.EnforceExtendedAnalyzerRules =
|
|
||||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
|
||||||
build_property.RootNamespace = DigitalData.Core.CleanArchitecture.Infrastructure
|
|
||||||
build_property.ProjectDir = E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
// <auto-generated/>
|
|
||||||
global using global::System;
|
|
||||||
global using global::System.Collections.Generic;
|
|
||||||
global using global::System.IO;
|
|
||||||
global using global::System.Linq;
|
|
||||||
global using global::System.Net.Http;
|
|
||||||
global using global::System.Threading;
|
|
||||||
global using global::System.Threading.Tasks;
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
1ed514e70b58acd86dd0725532107f0ffa8325ce
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.deps.json
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.dll
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.pdb
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.csproj.AssemblyReference.cache
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.GeneratedMSBuildEditorConfig.editorconfig
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.AssemblyInfoInputs.cache
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.AssemblyInfo.cs
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.csproj.CoreCompileInputs.cache
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.csproj.CopyComplete
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.dll
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\refint\DigitalData.Core.CleanArchitecture.Infrastructure.dll
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.pdb
|
|
||||||
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\ref\DigitalData.Core.CleanArchitecture.Infrastructure.dll
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.deps.json
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.dll
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.pdb
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.csproj.AssemblyReference.cache
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.GeneratedMSBuildEditorConfig.editorconfig
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.AssemblyInfoInputs.cache
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.AssemblyInfo.cs
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.csproj.CoreCompileInputs.cache
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.csproj.CopyComplete
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.dll
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\refint\DigitalData.Core.CleanArchitecture.Infrastructure.dll
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\DigitalData.Core.CleanArchitecture.Infrastructure.pdb
|
|
||||||
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Infrastructure\obj\Debug\net7.0\ref\DigitalData.Core.CleanArchitecture.Infrastructure.dll
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1,8 +0,0 @@
|
|||||||
// <auto-generated/>
|
|
||||||
global using global::System;
|
|
||||||
global using global::System.Collections.Generic;
|
|
||||||
global using global::System.IO;
|
|
||||||
global using global::System.Linq;
|
|
||||||
global using global::System.Net.Http;
|
|
||||||
global using global::System.Threading;
|
|
||||||
global using global::System.Threading.Tasks;
|
|
||||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user