206 Commits

Author SHA1 Message Date
Developer 02
fb9449d701 chore: upradge versions 2025-04-22 23:05:04 +02:00
Developer 02
72f735272f feat(Repository): Add and implement ReadOrDefaultAsync method.
- add read method can map for each
2025-04-22 23:04:11 +02:00
Developer 02
304f5b7b4c chore: unnötiges Projektverzeichnis entfernt 2025-04-22 20:47:47 +02:00
Developer 02
0238310290 chore(Abstractions.Security): Hochgestuft auf 1.0.1 2025-04-22 20:46:09 +02:00
Developer 02
3ac0501231 chore: covert from debug to release to publish package 2025-04-22 18:11:34 +02:00
Developer 02
db8a560805 chore(Infrastructure.AutoMapper): Konfiguration für das Packen 2025-04-22 18:07:40 +02:00
Developer 02
e67361bfe1 chore(DigitalData.Core.Infrastructure): Hochgestuft auf 2.0.2 2025-04-22 18:00:29 +02:00
Developer 02
91594e80bf refactor(EntityConfigurationOptions): aktualisiert, um IServiceCollection mit Callback zu konfigurieren 2025-04-22 17:58:49 +02:00
Developer 02
8d98159ba8 fix: Korrektur der Update- und Löschlogik in DbRepository zur Vermeidung von Laufzeitproblemen 2025-04-22 17:33:55 +02:00
Developer 02
f1f5b9e16d refactor(DbRepositoryTests): Update AddDbRepository configuration 2025-04-22 16:32:17 +02:00
Developer 02
3955dede16 feat(EntityConfigurationOptions): Erstellt, um Entitäten wie Mapper konfigurieren zu können 2025-04-22 16:21:57 +02:00
Developer 02
65e834784a feat(EntityAutoMapper): Erstellt mit der Konfiguration der Dependency Injection. 2025-04-22 15:15:52 +02:00
Developer 02
3c1bbc1151 feat(Repository): CreateAsync-Methoden für DTO wurden in Erweiterungsmethoden konvertiert 2025-04-22 11:21:21 +02:00
Developer 02
5465fe5b49 feat(IEntityMapper): Erstellt, um Mapper zu abstrahieren.
- Integriert in IRepository und Repository
2025-04-22 11:10:55 +02:00
Developer 02
85787e7054 feat(DbRepositoryTests): ReadAsync_ShouldReturnUpdated und ReadAsync_ShouldNotReturnDeleted Tests 2025-04-22 10:09:47 +02:00
Developer 02
c955220310 feat (Mapping): Porfile hinzufügen 2025-04-22 09:53:20 +02:00
Developer 02
7d2098092a Refactor user DTOs and update faker method
- Aktualisiert `CreateUserDtoFaker` um `UserCreateDto` anstelle von `UserDto` zu generieren.
- Die Klasse `UserDto` wurde entfernt, da sie nicht mehr benötigt wird.
- Hinzufügen von `UserCreateDto` für die Erstellung von Benutzern, Erweiterung von `UserBase`.
- Einführung von `UserReadDto` zum Lesen von Benutzerdaten, ebenfalls eine Erweiterung von `UserBase`.
2025-04-17 17:39:48 +02:00
Developer 02
e3b9d2971b Refactor User and UserDto to inherit from UserBase
- Aktualisierte `User` und `UserDto` Klassen um von einer neuen `UserBase` Klasse zu erben.
- Verschieben der Eigenschaften `Vorname`, `Email` und `Alter` zu `UserBase`.
- Implementierung der überschriebenen Methoden `GetHashCode` und `Equals` sowohl in `User` als auch in `UserDto`, um die Eigenschaften der Basisklasse zu nutzen.
2025-04-17 17:36:07 +02:00
Developer 02
3a604ede88 Refactor user creation and retrieval in tests
Updated `DbRepositoryTests` to await `CreateAsync` directly for user creation. Changed assertion to compare the created user with the user retrieved from the repository, enhancing test accuracy.
2025-04-17 16:43:15 +02:00
Developer 02
476c86ff0a feat: Verbesserung von IRepository mit neuen asynchronen Methoden und Erweiterungen
Aktualisiert IRepository<TEntity> um UpdateAsync<TDto>, DeleteAsync<TDto> und eine neue Überladung von ReadAsync. Die frühere ReadAsync-Überladung für Core.Tests.Mock.User wurde entfernt.

Einführung einer neuen Extensions-Klasse mit Methoden für ReadFirstOrDefaultAsync, ReadFirstAsync, ReadSingleOrDefaultAsync und ReadSingleAsync unter Nutzung der aktualisierten ReadAsync-Methode.
2025-04-17 16:24:52 +02:00
Developer 02
9376fcff86 Enhance IRepository and update DbRepositoryTests
- Added ReadAsync method to IRepository for user retrieval.
- Introduced _userRepo field in DbRepositoryTests for better clarity.
- Modified Setup method to initialize _userRepo from the service provider.
- Updated CreateAsync_ShouldNotThrow to use _userRepo.
- Added ReadAsync_ShouldReturnCreated test for user retrieval validation.
2025-04-17 16:00:59 +02:00
Developer 02
06df97597e Refactor user creation tests in DbRepositoryTests
Die Testmethode `CreateAsync_ShouldPersistUser` wurde entfernt und `CreateAsync_ShouldNotThrow` mit Testfällen für die Erstellung einzelner und mehrerer Benutzer hinzugefügt. Die neue Methode prüft, dass `CreateAsync` keine Ausnahmen auslöst, während Benutzerdaten mit einem Faker erzeugt werden.
2025-04-17 15:48:06 +02:00
Developer 02
266d03e0a1 Add user creation test to DbRepositoryTests
This commit introduces a new test method `CreateAsync_ShouldPersistUser` in `DbRepositoryTests.cs`. The method tests the asynchronous creation of a user in the repository using the `Faker` library to generate user data. It asserts that no exceptions are thrown during the creation process. Additionally, the using directives have been updated to include `DigitalData.Core.Abstractions.Infrastructure`.
2025-04-17 15:31:37 +02:00
Developer 02
e752c6f6ab Add AutoMapper setup to DbRepositoryTests
This commit introduces a using directive for `System.Reflection` in `DbRepositoryTests.cs` to support reflection features. The `Setup` method is updated to include `AddAutoMapper`, ensuring AutoMapper services are registered for dependency injection in the test environment.
2025-04-17 15:17:57 +02:00
Developer 02
561a751de4 Update dependency injection and repository tests
Modified `AddDbRepository` method to allow broader entity types and registered `queryFactory` as a singleton. Added necessary using directives in `DbRepositoryTests.cs` and updated the `Setup` method to configure an in-memory database for testing with `MockDbContext` and `User` entity.
2025-04-17 15:05:23 +02:00
Developer 02
35050d65a8 Refactor Fake class and enhance MockDbContext
Updated the `Fake` class to introduce flexible methods for generating fake `User` and `UserDto` objects with optional parameters. Removed the static `UserFaker` instance and related properties.

Added a new `DbSet<User>` property to `MockDbContext` for improved management of `User` entities.
2025-04-17 14:47:37 +02:00
Developer 02
cf9041980d feat(Mock): Hinzufügen von gefälschten Daten und Benutzermodellen zum Testen
Aktualisiert `DigitalData.Core.Tests.csproj`, um `Bogus` zur Erzeugung gefälschter Daten einzuschließen. Fake.cs„ für die Erstellung von gefälschten “User"-Objekten hinzugefügt. MockDbContext" für das Testen von Datenbank-Interaktionen eingeführt. Definierte `User` und `UserDto` Klassen für die Benutzerdarstellung und Datenübertragung.
2025-04-17 14:34:00 +02:00
Developer 02
cf2ee73ca1 Update target frameworks to include .NET 9.0
Expanded the project's target frameworks to support .NET 9.0, in addition to .NET 7.0 and .NET 8.0.
2025-04-17 13:55:06 +02:00
Developer 02
52f6dc161e Add EF Core package references and DbRepositoryTests
Updated `DigitalData.Core.Tests.csproj` to include conditional
package references for Entity Framework Core and its InMemory
provider for net7.0, net8.0, and net9.0.

Added `DbRepositoryTests` class with setup and teardown
methods for managing the lifecycle of a host instance.
2025-04-17 13:54:25 +02:00
Developer 02
7670898e24 Hinzufügen der Projekte "src" und "tests" zur Projektmappe
Der Projektmappendatei `DigitalData.Core.sln` wurden zwei neue Projekte mit den Namen "src" und "tests" hinzugefügt. Das Projekt „src“ hat einen eindeutigen Bezeichner `{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}`, und das Projekt „tests“ hat den Bezeichner `{EDF84A84-1E01-484E-B073-383F7139C891}`. Darüber hinaus wurden in den Lösungseigenschaften mehrere verschachtelte Projektbeziehungen eingerichtet, die diese neuen Projekte mit den bestehenden Projekten verknüpfen.
2025-04-17 13:32:15 +02:00
Developer 02
f5b202c325 Enhance IRepository and DbRepository with DTO support
Updated IRepository<TEntity> to include new generic methods for creating and reading entities from DTOs. Modified UpdateAsync to accept DTOs instead of generic types. Implemented corresponding methods in DbRepository<TDbContext, TEntity> for mapping DTOs to entities during creation and updating processes.
2025-04-17 13:30:35 +02:00
Developer 02
fffbdf752f Revert "Add mapping methods to IRepository and DbRepository"
This reverts commit 6916e169b1.
2025-04-17 13:15:22 +02:00
Developer 02
6916e169b1 Add mapping methods to IRepository and DbRepository
Updated the `IRepository<TEntity>` interface to include two new mapping methods: `Map<TSource>(TSource source)` and `Map<TDto>(TEntity source)`.

Implemented these methods in the `DbRepository<TDbContext, TEntity>` class, utilizing a `Mapper` for conversions between source types and entity types, as well as between entity types and DTOs.
2025-04-17 13:01:51 +02:00
Developer 02
0c529b199b Bump version numbers and enhance repository interfaces
- Incremented version numbers in project files for updates.
- Marked `ICRUDRepository` as obsolete; use `IRepository` instead.
- Improved parameter names and signatures in `IRepository`.
- Changed access modifiers in `DbRepository` for broader access.
- Updated `CreateAsync` and `UpdateAsync` methods for async operations.
- Implemented `ReadAsync` and `DeleteAsync` methods in `DbRepository`.
- Minor whitespace change in `.csproj` files.
- Retained package description in `DigitalData.Core.Infrastructure.csproj`.
2025-04-17 12:53:40 +02:00
Developer 02
5427a9722d Update package references and modify DbRepository access
- Added conditional package references for AutoMapper in
  `DigitalData.Core.Application.csproj` to support
  different target framework versions.

- Changed `DbRepository` class access modifier from
  `public` to `internal` to encapsulate implementation
  details within the current assembly.
2025-04-16 13:56:53 +02:00
Developer 02
bccfae59cd Update EntityFrameworkCore references for multiple frameworks
The project file `DigitalData.Core.Infrastructure.csproj` has been modified to include conditional `PackageReference` entries for different target frameworks. The previous reference to `Microsoft.EntityFrameworkCore` version `7.0.16` has been replaced with:
- version `7.0.20` for `net7.0`
- version `8.0.15` for `net8.0`
- version `9.0.4` for `net9.0`

This change ensures the project uses the appropriate version of Entity Framework Core based on the target framework.
2025-04-16 13:51:04 +02:00
Developer 02
4c55ecb427 Refactor DbRepository methods for clarity and extensibility
Updated methods in the `DbRepository` class to be virtual, allowing for overriding in derived classes. Renamed parameters from `dto` to `entity` and `dtos` to `entities` for improved clarity. All methods still throw `NotImplementedException` as implementations are pending.
2025-04-16 09:42:55 +02:00
Developer 02
a7e4291e42 Enhance DbRepository with AutoMapper integration
Added AutoMapper support by introducing an IMapper field.
Changed Context and Entities fields to readonly for better
encapsulation. Updated constructor to accept an IMapper
parameter, improving object mapping capabilities.
2025-04-16 09:39:14 +02:00
Developer 02
352b59dfdf Refactor IRepository to simplify CreateAsync methods
Updated IRepository<TEntity> to remove generic type parameters
from CreateAsync methods, now directly accepting TEntity.
Corresponding changes made in DbRepository to align method
signatures. Implementations still throw NotImplementedException.
2025-04-16 09:38:07 +02:00
Developer 02
1b793e2b75 Add CancellationToken support to IRepository methods
Updated the IRepository<TEntity> interface to include an optional CancellationToken parameter in the asynchronous methods: CreateAsync, ReadAsync, UpdateAsync, and DeleteAsync. Modified the DbRepository<TDbContext, TEntity> class to align with these changes, ensuring method signatures are consistent with the interface.
2025-04-16 09:17:38 +02:00
Developer 02
72603f836c Refactor repository pattern and dependency injection
This commit introduces a new `DbRepository` class implementing the `IRepository<TEntity>` interface, providing asynchronous methods for CRUD operations. The previous CRUD repository registration in `DIExtensions.cs` has been removed, indicating a shift in repository management. A new static class `DependencyInjection` has been added to facilitate the registration of `DbRepository` with the service collection, enhancing modularity and flexibility in database interactions.
2025-04-16 09:12:06 +02:00
Developer 02
162da9a16c Ablehnung von ICRUDRepository; Einführung der IRepository-Schnittstelle
Die `ICRUDRepository`-Schnittstelle wurde als veraltet markiert, was bedeutet, dass sie zugunsten der neuen `IRepository`-Schnittstelle abgelehnt wird. Die „IRepository“-Schnittstelle bietet eine verbesserte Abstraktion und Flexibilität, die Methoden zum Erstellen, Lesen, Aktualisieren und Löschen von Entitäten mit Unterstützung für asynchrone Operationen umfasst.
2025-04-15 18:40:50 +02:00
Developer 02
c0524cbca2 Update target frameworks to include .NET 9.0
Updated multiple project files to support .NET 9.0 alongside .NET 7.0 and .NET 8.0. Affected files include:
- DigitalData.Core.API.csproj
- DigitalData.Core.Abstractions.csproj
- DigitalData.Core.Application.csproj
- DigitalData.Core.Client.csproj
- DigitalData.Core.DTO.csproj
- DigitalData.Core.Infrastructure.csproj

This change enables the use of new features and improvements in .NET 9.0.
2025-04-15 16:19:23 +02:00
Developer 02
51c1f408d7 fix: Konflikte lösen 2025-03-25 12:45:27 +01:00
Developer 02
a034ecdb1b chore: Nuget-Pakete werden je nach Rahmenwerk bedingt konfiguriert. 2025-03-25 12:43:18 +01:00
Developer 02
f4a9c5c57a fix: project dir 2025-03-25 10:30:09 +01:00
Developer 02
e15f32ae56 feat(PemFileInitalizer): Hinzufügen von Informationsprotokollen. 2025-03-17 10:55:38 +01:00
Developer 02
44d4bb9c23 feat(DIExtensions): To-Do hinzugefügt. 2025-03-17 09:30:56 +01:00
Developer 02
a0c5144c28 feat(DIExtensions): Added AddRSAPool method to configure via direct RSAParams instance. 2025-03-17 09:14:23 +01:00
Developer 02
dda9b40bd3 fix(Sicherheit): Unter den Ordner „Security “ verschieben 2025-03-14 14:38:33 +01:00
Developer 02
de89185b43 chore(DigitalData.Core.Security): Aktualisiert auf Version 1.1.0 2025-03-14 14:34:09 +01:00
Developer 02
a94c7249e4 chore(DigitalData.Core.Security): Aktualisiert auf Version 1.1.0 2025-03-14 14:11:37 +01:00
Developer 02
3f8145e6dc chore(DigitalData.Core.Abstractions): Aktualisiert auf Version 3.4.0 2025-03-14 14:08:54 +01:00
Developer 02
f3f65415e1 feat(project): Hinzufügen von Paketmetadaten für NuGet-Veröffentlichung
- Hinzufügen der erforderlichen Metadaten zur Projektdatei für die Erstellung eines NuGet-Pakets, einschließlich PackageId, Versionsdetails, Autorenschaft, Urheberrecht, Beschreibung und Repository-Informationen. Außerdem wurde eine Icon-Referenz für eine verbesserte Paketdarstellung hinzugefügt.
2025-03-14 14:02:08 +01:00
Developer 02
192a93d153 refactor(DigitalData.Core.Security.RSAKey.Base): Ordnerverzeichnisse und Namespaces geordnet 2025-03-14 12:32:40 +01:00
Developer 02
9ec9bcd474 chore(DigitalData.Core.Abstractions.Security): DigitalData.Core.Abstractions/Security zu einem eigenen Projekt gemacht 2025-03-14 12:04:38 +01:00
Developer 02
7dd8271f4a feat(RSAParams): Merged CryptoFactoryParams and RSAFactoryParams 2025-03-14 11:14:18 +01:00
Developer 02
b8de148c52 refactor: Umbenennung von CryptoFactory in RSAPool und ICryptoFactory in IAsymmetricKeyPool 2025-03-14 10:47:28 +01:00
Developer 02
0523308083 feat(RSAKey): Unterverzeichnisse auth, base und crypto erstellt und zugehörige RSA-Klassen verschoben 2025-03-14 10:22:52 +01:00
Developer 02
875692b578 chore: move CryptoFactory, JwtSignatureHandler and RSAFactory under Services 2025-03-14 10:15:50 +01:00
Developer 02
973a5f1023 refactor(Instance): removed.
- Moved statc RSAFactory instance to RSAFactory
2025-03-14 10:08:33 +01:00
Developer 02
8498dc0456 refactor(RSAFactory): params-Abhängigkeit durch Ersetzen von params.Defaults entfernt 2025-03-14 09:37:24 +01:00
Developer 02
6a12ad77ec refactor(PemFileInitalizer): Die Methode ExecuteAsync wurde vereinfacht.
- Die Logger-Inject-Funktion wurde obligatorisch gemacht.
 - Der try catch-Blog wurde so konfiguriert, dass die Ausnahme in jedem Fall protokolliert wird.
2025-03-14 09:11:04 +01:00
Developer 02
144fe86987 refactor(CryptoFactoryParams): PemFileInitalizer erstellt, um das Lesen und Aktualisieren von Pem-Dateien zu ermöglichen.
- Minimierung der di-Erweiterungsmethoden.
 - AfterCreate-Methode entfernt
2025-03-13 17:10:22 +01:00
Developer 02
528a346883 feat(ServiceResultExtensions): Erstellt, um die Serviceergebnisse zu verwalten.
- Aufgerüstet auf 3.3.0
2025-01-23 11:29:57 +01:00
Developer 02
a7fb97de4a chore(DTO9: Hochgestuft auf 2.0.1 2025-01-20 14:09:09 +01:00
Developer 02
c3dbc1ec54 refactor(DTOExtensions): Nachrichten nullbar gemacht und aktualisiert, um Null-Nachrichten zu filtern, um den Localizer nullbar machen zu können und so die Localizer-Abhängigkeit zu vermeiden. 2025-01-20 13:53:01 +01:00
Developer 02
a86989479f refactor(Application): hochgestuft auf 3.2 2025-01-20 10:18:13 +01:00
Developer 02
53427282c5 refactor(Abstraktionen): hochgestuft auf 3.2 2025-01-20 10:17:10 +01:00
Developer 02
90c85814b0 refactor(DirectorySearchService): Methoden asynchron gemacht 2025-01-17 11:24:30 +01:00
Developer 02
92a7b959ab chore: unnötige Dateien entfernt und git ignore aktualisiert. 2025-01-16 22:38:05 +01:00
Developer 02
63ab47a288 refactor(DirectorySearchOptions): Machen Sie ServerName und Root erforderlich und UserCacheExpirationDays nullable double. 2025-01-16 22:28:36 +01:00
Developer 02
725b186db6 refactor(DIExtensions): AddDirectorySearchService-Methode entfernt und AddDirectorySearchService aktualisiert, um über Konfigurationseinstellungen konfiguriert werden zu können. 2025-01-15 17:22:14 +01:00
Developer 02
ad8d15314f chore(Security): Description fixed 2025-01-14 20:20:25 +01:00
Developer 02
f1efbae6a4 feat(Sicherheit): Paketdefinition hinzugefügt. 2025-01-14 20:14:59 +01:00
Developer 02
051567aa0a refactor(Abstraktionen): hochgestuft auf 3.1 2025-01-14 19:51:58 +01:00
Developer 02
287871ddc6 refactor(TokenDescriptor): ApiRoute-Eigenschaft entfernt 2025-01-14 19:45:44 +01:00
Developer 02
a0ad8d732d refactor(RSATokenDescriptor): Lifetime-Eigenschaft hinzugefügt 2025-01-14 17:04:54 +01:00
Developer 02
3ad08e2a86 feat(AsymmetricTokenValidator): SecurityKey-Eigenschaft hinzugefügt. 2025-01-13 09:52:52 +01:00
Developer 02
b90a52412c feat(IAsymmetricTokenDescriptor): Methode Validator.get mit Lazy Loading hinzugefügt. 2025-01-10 23:32:53 +01:00
Developer 02
39091ff5cf refactor(IAsymmetricKey): Id nullbar gemacht.
- Benennung der perm-Datei aktualisiert.
2025-01-10 15:47:02 +01:00
Developer 02
22040cf1e7 fix(CryptoFactoryParams): Die Zuweisung des Standard-Depotnamens wurde unter das Ereignis afterCreate verschoben. 2025-01-09 23:59:58 +01:00
Developer 02
af4b7d5438 fix(CryptoFactoryParams): Aktualisiert, um den ersten Decryptor zu verwenden, um die Standard-Depot-ID zu setzen. 2025-01-09 23:39:42 +01:00
Developer 02
211064d44e refactor(RSATokenDescriptor): Standard-Id mit Issuer und Audience hinzugefügt.
- Issuer und Audience erforderlich gemacht.
2025-01-09 23:25:17 +01:00
Developer 02
66e3c771dd refactor(IAsymmetricKey): Die Implementierung von IUniqueSecurityContext wurde entfernt und stattdessen die Eigenschaft Id hinzugefügt.
- Aktualisierte verwandte Implementierungen.
2025-01-09 22:57:04 +01:00
Developer 02
97c4f7bf8f refactor(CryptographParams): umbenannt in CryptoFactoryParams 2025-01-09 22:33:56 +01:00
Developer 02
5981ba7a8d refactor(Abstractions.Security): Unnötige public Schlüsselwörter in Schnittstellen entfernt. 2025-01-09 22:27:33 +01:00
Developer 02
21e164ceb7 refactor(IAsymmetricKey): Unnötige Initor-Methoden entfernt. 2025-01-09 22:15:45 +01:00
Developer 02
1875bf46fa feat(DIExtensions): Umbenennung der AddCryptograph-Methoden in AddCryptoFactory 2025-01-09 20:38:15 +01:00
Developer 02
7f9459f6cf feat(SecurityExtensions): Erforderliche WriteToken-Methoden über Erweiterungen anstelle der Schnittstellenimplementierung hinzugefügt 2025-01-09 20:30:38 +01:00
Developer 02
079f0c69c7 fix(Kryptograph): Umbenannt in Krypto-Fabrik. 2025-01-09 20:10:45 +01:00
Developer 02
d98b3f2867 fix(JwtSignatureHandler): Aktualisierte Methoden, um IAsymmetricTokenDescriptor verwenden zu können 2025-01-09 19:54:05 +01:00
Developer 02
3761c13dba refactor(ICryptograph): Eigenschaft „TokenDescriptors“ hinzugefügt. 2025-01-09 19:34:29 +01:00
Developer 02
8acbbaeb2e refactor(IAsymmetricTokenDescriptor): Erforderliche Proportionen für SecurityTokenDescriptor-Zuordnung hinzugefügt. 2025-01-09 19:16:56 +01:00
Developer 02
60e1ec78b3 refactor(Kryptograph): Entfernte Verschlüsselungen. 2025-01-09 18:52:59 +01:00
Developer 02
e623575fe8 refactor(Kryptograph): Aktualisiert, um TokenDescriptors aus CryptographParams hinzuzufügen. 2025-01-09 18:33:51 +01:00
Developer 02
60ae8de550 refactor(CryptographParams): Aktualisierung, um TokenDeskriptoren mit Decryptoren zu initialisieren 2025-01-09 18:28:20 +01:00
Developer 02
87ad45f42a refactor(RSATokenDescriptor): Die Klasse RSA Token Descriptor wurde erstellt und die Funktionen wurden dorthin verschoben, um eine einfache und saubere Konfiguration zu ermöglichen. 2025-01-09 17:59:13 +01:00
Developer 02
2557525f06 refactor(PrivateKeyTokenDescriptor): superwarning zur Deaktivierung der Warnung vor Null 2025-01-09 11:08:06 +01:00
Developer 02
7a938f0379 refactor(Privatekey): Die Klasse encryptor wurde erstellt und die Verschlüsselungsfunktionen wurden zur einfachen und sauberen Konfiguration dorthin verschoben. 2025-01-08 20:03:25 +01:00
Developer 02
9f0facc487 refactor(Privatekey): Die Klasse decryptor wurde erstellt und die Verschlüsselungsfunktionen für eine einfache und saubere Konfiguration dorthin verschoben. 2025-01-08 18:45:36 +01:00
Developer 02
608d266d1c refactor(IAsymmetricKey): Umwandlung von RsaSecurityKey in SecurityKey zur besseren Abstraktion.
- RSAEncryptionPadding entfernen
 - Pem als Inhalt Content
2025-01-07 16:53:05 +01:00
Developer 02
34e14fd2f5 refactor(RSATokenDescriptor): In die Abstraktionsschicht verschoben und in PrivateKeyTokenDescriptor umbenannt 2025-01-07 16:34:19 +01:00
Developer 02
dc45cf2c08 refactor(JwtSignatureHandler): Aktualisiert, um RSAPrivateKey anstelle des Deskriptors zu verwenden 2025-01-07 13:55:30 +01:00
Developer 02
09a31b5a3d refactor(TokenDescription): Nach RSAKey verschoben, um unter RSAPrivateKey definiert werden zu können 2025-01-07 13:22:45 +01:00
Developer 02
b5cecac745 refactor(DIExtensions): Umbenennung der Methode AddAsymCryptHandler in AddCryptograph 2025-01-07 12:19:42 +01:00
Developer 02
0f4b5430a3 refactor(AsymCryptParams): Umbenennen in CryptographParams. 2025-01-07 12:12:50 +01:00
Developer 02
7f2d2dadfa refactor(DigitalData.Core.Security): Umbenennung des Unternamensraums von Cryptographer in RSAKey 2025-01-07 12:09:34 +01:00
Developer 02
ac0b6f739b refactor(AsymCryptHandler): Renamed to Cryptograph 2025-01-07 12:03:01 +01:00
Developer 02
d9d61368e3 refactor(IAsymCryptHandler): Umbenannt in ICryptograph 2025-01-07 12:01:39 +01:00
Developer 02
e8c98115b6 refactor(IRSAFactory): umbenannt in IAsymmetricKey 2025-01-07 11:48:27 +01:00
Developer 02
09dae1b1ac refactor(IRSAEncryptor): umbenannt in RSAPublicKey 2025-01-07 11:39:12 +01:00
Developer 02
9aafc9e467 refactor(IRSAEncryptor): umbenannt in IAsymmetricPublicKey 2025-01-07 11:33:53 +01:00
Developer 02
4ce738957d refactor(RSADecryptor): umbenennen in RSAPrivateKey 2025-01-07 11:20:24 +01:00
Developer 02
5e1bf16b6d refactor(IRSADecryptor): Umbenennung in IAsymmetricPrivateKey 2025-01-07 11:16:12 +01:00
Developer 02
4f96d271f3 refactor(IRSACryptographer): Umbenennung in IAsymmetricKey 2025-01-07 11:03:14 +01:00
Developer 02
14485af448 fix(DIExtensions): Umbenennung der Methode AddAsymCryptService in AddAsymCryptHandler 2025-01-07 10:38:10 +01:00
Developer 02
c27e21a702 fix(JwtSignatureHandler): The nullability of TokenParams has been removed. 2025-01-07 10:36:17 +01:00
Developer 02
4874079b69 fix: TokenParams-Kaliber erstellt, um Token-Beschreibungen über IOptions zu konfigurieren 2025-01-07 10:21:25 +01:00
Developer 02
15e909064f feat(IJwtSignatureHandler): Unterstützung für die Erstellung von Token durch den Routenwert der Tokenbeschreibung hinzugefügt. 2025-01-07 09:35:09 +01:00
Developer 02
d17c5ca6cd feat(JwtSignatureHandler): Unterstützung für die Erstellung von Token durch den Routenwert der Tokenbeschreibung hinzugefügt. 2025-01-07 09:30:33 +01:00
Developer 02
592b949f57 feat: Unterstützung für Token-Beschreibungen im JwtSignatureHandler hinzugefügt
- Methoden eingeführt, um Token-Beschreibungen im DI-Container zu konfigurieren und zu registrieren.
- Überladungen zu `AddJwtSignatureHandler` hinzugefügt, um sowohl konfigurationsbasierte als auch Inline-Token-Beschreibungen zu unterstützen.
2025-01-06 16:32:32 +01:00
Developer 02
8850ac4ac9 refactor(DIExtensions): Methode AddJwtSignatureHandler hinzugefügt 2025-01-06 16:08:45 +01:00
Developer 02
8ccf6f31ae refactor(JwtSignatureHandler): Umbenennung von CreateAndWriteToken in WriteToken 2025-01-06 15:35:51 +01:00
Developer 02
9875d023e3 Revert "refactor(TokenDescription): In die Abstraktionsschicht verschoben."
This reverts commit 2cf0eb3977.
2025-01-06 15:31:26 +01:00
Developer 02
62afba7c23 refactor: Entfernen redundanter Methodenüberladungen in IJwtSignatureHandler
- Entfernte doppelte Methodensignaturen für CreateToken und CreateAndWriteToken, die TokenDescription akzeptieren.
- Vereinfachte das Interface, um sich auf die wesentlichen Methoden für die Token-Erstellung und -Schreibung zu konzentrieren.
2025-01-06 15:26:31 +01:00
Developer 02
1d4882cfbc refactor(JwtSignatureService): umbenannt in JwtSignatureHandler.
- seine Schnittstelle umbenannt
2025-01-06 15:15:46 +01:00
Developer 02
275b9ec858 feat(IJwtSignatureService): Erstellt und implementiert 2025-01-06 15:06:31 +01:00
Developer 02
2cf0eb3977 refactor(TokenDescription): In die Abstraktionsschicht verschoben. 2025-01-06 14:39:45 +01:00
Developer 02
4ab5393deb refactor(JwtSignatureService): Injizieren von IAsymCryptHandler anstelle von AsymCryptHandler zur Abstraktion. 2025-01-06 13:13:57 +01:00
Developer 02
a2dc59d5ef refactor(AsymCryptParams): Entfernte TokenDescriptions 2025-01-06 13:11:05 +01:00
Developer 02
ed041bf7cb refactor(JwtSignatureService): CreateToken und CreateAndWriteToken Methoden mit Issuer und Audience Inputs hinzugefügt 2025-01-06 12:13:41 +01:00
Developer 02
c70327e7f4 refactor(IRSADecryptor): Methode CreateSigningCredentials hinzugefügt 2025-01-06 11:32:17 +01:00
Developer 02
0a3ce89c0d refactor(IRSACryptographer): RsaSecurityKey-Eigenschaft hinzugefügt 2025-01-06 11:29:19 +01:00
Developer 02
389d64c25d refactor(AsymCryptService): umbenannt in AsymCryptHandler 2025-01-06 10:44:03 +01:00
Developer 02
a3931414e3 refactor(AsymCryptService): Indexer und IEnumerable-Implementierung zur Vereinfachung entfernt 2024-12-21 10:10:50 +01:00
Developer 02
0dd897625a feat(SecurityExtensions): Die Match- und TryMatch-Erweiterungsmethoden wurden hinzugefügt, um die Funktionalität in SecurityExtensions zu erweitern. Diese Methoden vereinfachen das Matching von IUniqueSecurityContext durch direkte Verwendung eines Lookup-Kontexts. 2024-12-20 23:34:21 +01:00
Developer 02
351a6732cf refactor(SecurityExtensions): Nullbarkeit des out-Wertes in der TryGet-Methode wurde entfernt.
- Warnung ist deaktiviert.
 - Null-Prüfung in der Verwendung entfernt.
2024-12-20 22:59:21 +01:00
Developer 02
5a1808c6a6 refactor(CryptographerExtensions): Aktualisiert zur Verwendung von IUniqueSecurityContext anstelle von IRSACryptographer.
- umbenannt in SecurityExtensions.
2024-12-20 18:54:33 +01:00
Developer 02
50c42e9cdd rename(ISecurityIdentifier): Umbenannt in IUniqueSecurityContext und Kommentare zur Dokumentation hinzugefügt. 2024-12-20 14:42:07 +01:00
Developer 02
ec126be2aa feat(ISecurityIdentifier): Implementiert in IRSACryptographer und TokenDescription 2024-12-20 14:35:10 +01:00
Developer 02
9953bbd2ef feat(ISecurityIdentifier): Wird als Basisbezeichner in den Sicherheitsklassen erstellt. 2024-12-20 14:11:16 +01:00
Developer 02
dbecfa92f4 refactor(Extension): Zusammenlegung der Erweiterungsklassen zur Vereinfachung.
- Methoden und Klasse intern gemacht, um Komplexität zu vermeiden.
2024-12-20 10:48:37 +01:00
Developer 02
e007f15bce refactor(JwtSignatureService): removed primary constructor because this feature is not available in C# 11.0.
- Added GlobalSuppressions to avoid editor to offer this.
2024-12-20 10:40:35 +01:00
Developer 02
79dffef528 Refactor: Entfernung der generischen IRSAFactory und IAsymCryptService.
- RSAFactory und AsymCryptService aktualisiert.
 - Aktualisierte DI-Erweiterungen
2024-12-20 10:30:12 +01:00
Developer 02
af478e974c refactor(TokenDescriptorProvider): entfernt und eine Mapper-Erweiterungsmethode mit derselben Funktionalität zur Vereinfachung hinzugefügt. 2024-12-20 09:44:04 +01:00
Developer 02
435c91955c refactor(JwtSignatureService): verwendete primäre Struktur. 2024-12-20 09:29:49 +01:00
Developer 02
4142d2d948 refactor(TokenDescriptorProvider): verwendete Primärstruktur. 2024-12-20 09:27:08 +01:00
Developer 02
06260e0edb feat(JwtSignatureService): Erstellt mit grundlegender Funktionalität, um mit Token Beschreibung erstellen zu können. 2024-12-20 01:51:48 +01:00
Developer 02
2d675a16ad feat(TokenDescriptorProvider): Erstellt, um eine beliebige TokenDescription auf SecurityTokenDescriptor abzubilden. 2024-12-20 01:42:23 +01:00
Developer 02
5469b20e4f feat(AsymCryptParams): AfterCreate Ereignis für TokenDescriptions hinzugefügt.
- Eigenschaften SigningCredentials, SigningAlgorithm und SigningDigest zu TokenDescription hinzugefügt.
2024-12-20 01:16:56 +01:00
Developer 02
6f5b4efefb feat(ClaimDescriptor): Erstellt, um claimsMapper und subjectMapper von TPrincipal für SecurityTokenDescriptor zu registrieren.
- DI-Erweiterungsmethode erstellt.
2024-12-20 00:48:55 +01:00
Developer 02
b6b12c7702 feat(MappingProfile): Mapping-Profil hinzugefügt, um TokenDescription in SecurityTokenDescriptor über AutoMapper zu konvertieren 2024-12-20 00:11:33 +01:00
Developer 02
ce716d2bab feat(TokenDescription): Erstellt als eingeschränkte Version von SecurityTokenDescriptor als Wurzelbeschreibungen ohne Ansprüche 2024-12-20 00:08:31 +01:00
Developer 02
bf672d8b8c feat(RSADecryptor): Methode CreateSigningCredentials hinzugefügt 2024-12-19 01:53:20 +01:00
Developer 02
ed29c9f990 feat(RSACryptographer): RsaSecurityKey.get Eigenschaft mit Lazy Loading hinzugefügt 2024-12-19 01:52:00 +01:00
Developer 02
66ed34b664 refactor(StringExtensions): Fehlermeldungen wurden ausgearbeitet und der falsche Variablenname „mode“ wurde in „divisor“ umbenannt. 2024-12-18 18:19:17 +01:00
Developer 02
d7b4c382cd fix(StringExtensions): Die Hauptformel der ToTag-Methode wurde von (x / y) in [(x - 1) / y + 1] geändert, um korrekt zu gruppieren.
- Aktualisierte Dokumentationskommentare
2024-12-18 18:10:52 +01:00
Developer 02
4f6ca3524a feat(AsymCryptParams): DateTagFormat als Subtext des Dateinamens für die periodische Aktualisierung von pem-Dateien hinzugefügt. 2024-12-18 17:51:02 +01:00
Developer 02
bd1ae4246d refactor(Extensoin): entfernt, um die Projektanzahl zu minimieren. 2024-12-18 14:09:53 +01:00
Developer 02
d92475c230 feat: Indexer hinzugefügt, um RSA-Dechiffrierer über den Index im AsymCryptService zuzugreifen
- Neuer Indexer eingeführt, um den Zugriff auf Dechiffrierer über den Index zu ermöglichen und so flexibleren Zugriff auf Elemente in der Decryptors-Sammlung zu bieten.
- Validierung der Indexgrenzen hinzugefügt, um eine ArgumentOutOfRangeException zu werfen, wenn ein ungültiger Index angegeben wird.
- Bestehende Funktionalität zum Zugriff auf Dechiffrierer über den Schlüssel beibehalten.
2024-12-18 14:05:31 +01:00
Developer 02
15705cccc4 feat(AsymCryptParams): Schlüsselgröße zum Parameter Dateiname hinzugefügt 2024-12-18 13:45:51 +01:00
Developer 02
a8403087f6 feat(DIExtensions): Die Methode AddCryptographerConverter wurde entfernt. 2024-12-18 13:17:18 +01:00
Developer 02
0235c83075 feat(RSAFactoryParams): Umbenennung von PbeHashAlgorithmName in PbeHashAlgorithm und Hinzufügen von String-Proportionen mit dem Namen von PbeHashAlgorithmName.
- PbeHashAlgorithmName.init Methoden hinzugefügt, um zu versuchen, PbeHashAlgorithm mit Reflection zu initialisieren. Wenn er null ist, wird er nach dem Namen generiert.
- PbeHashAlgorithmName.get hinzugefügt, um den Namen von PbeHashAlgorithm zu erhalten.
2024-12-18 13:04:15 +01:00
Developer 02
63aeba982f feat(RSACryptographer): Eigenschaft PaddingName hinzugefügt, um Padding mit dem Namen RSAEncryptionPadding zu initialisieren. 2024-12-18 11:36:45 +01:00
Developer 02
514495fc8d refactor: Aktualisierung der String-Verschlüsselungsmethoden in RSAEncryptor
- `Encrypt`-Methode überarbeitet, um `ToBytes` und `ToBase64String` für Konsistenz und bessere Lesbarkeit zu verwenden.
- Parametername in der Methode `Encrypt(string)` von `data` zu `strData` geändert, um die Verständlichkeit zu verbessern.
2024-12-17 20:49:34 +01:00
Developer 02
9752fb14ec fix: Unterdrückung der Nullable-Warnung für den Pem-Getter in RSADecryptor
- CS8603-Warnung für den `Pem`-Getter in `RSADecryptor` mit `#pragma warning disable/restore` unterdrückt.
- Konsistentes Verhalten sichergestellt, ohne die Laufzeitlogik zu ändern.
2024-12-17 15:29:28 +01:00
Developer 02
b3629661a1 fix(AsymCryptParams): Dateinamenerweiterung hinzugefügt. 2024-12-17 14:06:09 +01:00
Developer 02
f38bad8531 refactor(gitignore): ignored Tests.API 2024-12-16 18:07:47 +01:00
Developer 02
154478c318 feat(ParamsConfigureOptions): Erstellt, um nach der Konfiguration über appsettings initialisiert zu werden.
- DI Extension Methoden wurden entsprechend bearbeitet.
2024-12-16 17:20:40 +01:00
Developer 02
155eb563d1 feat: Lazy-Initialisierung für threadsichere RSAFactoryParams-Initialisierung hinzugefügt
- Lazy-Initialisierungsmechanismus für threadsichere Handhabung der _pbeParameters eingeführt.
- IsInitialized-Eigenschaft hinzugefügt, um den Initialisierungsstatus zu verfolgen.
- Konstruktor geändert, um das Lazy-Objekt zu initialisieren und das AfterCreate-Ereignis auszulösen.
- Sichergestellt, dass die OnDeserialized-Methode Init aufruft, um das Objekt korrekt zu initialisieren.
2024-12-16 16:37:48 +01:00
Developer 02
4aacc3f650 feat(AsymCryptService): Vault.get RSADecryptor hinzugefügt
- Optionen aktualisiert, um Vault-Parameter hinzufügen zu können. Wenn es null ist, ist Vault der erste Entschlüsseler.
 - Standard-Entschlüssler entfernt.
2024-12-16 12:56:30 +01:00
Developer 02
f40c86ed63 feat: Erweiterung des IAsymCryptService-Interfaces um zusätzliche Verschlüsselungs- und Entschlüsselungsfunktionen
- Hinzugefügt: `IEnumerable<IRSADecryptor>` und `IEnumerable<IRSAEncryptor>` zum `IAsymCryptService`-Interface.
- Einführung einer `Default`-Eigenschaft für den einfachen Zugriff auf einen Standard-Entschlüsseler.
- Aktualisierung des `IAsymCryptService`-Interfaces zur Unterstützung sowohl von Entschlüsselungs- als auch Verschlüsselungsfunktionen.
2024-12-16 11:41:52 +01:00
Developer 02
b32f0df125 refactor(AsymCryptService): Methode Default.get hinzugefügt, um den ersten Decryptor zu erhalten.
- Wirft InvalidOperationException, wenn kein Decryptor verfügbar ist.
2024-12-16 10:54:48 +01:00
Developer 02
324a5bdb1e refactor(RSAFactory): isEncrypted-Eingang von CreateDecryptor umbenennen in encrypt. 2024-12-16 10:51:46 +01:00
Developer 02
e0a6787a87 feat(RSAFactory): Unterstützung für die Erstellung von RSA-Decryptors hinzugefügt
- Methode `CreateDecryptor` hinzugefügt, um die Erstellung von `IRSADecryptor`-Instanzen zu vereinfachen.
- Stellt sicher, dass Decryptors mit PEM, Aussteller, Empfänger, Verschlüsselungsstatus und Padding-Einstellungen initialisiert werden.
- Bestehende Funktionalität zur Erstellung privater und verschlüsselter privater Schlüssel beibehalten.
- Die RSA-Factory verbessert, um Workflows zur Entschlüsselung besser zu unterstützen.
2024-12-16 10:37:56 +01:00
Developer 02
c6a4038eab refactor: Umbenennung von Core.Security.Extensions in Core.Extension 2024-12-16 10:24:19 +01:00
Developer 02
58c8520c08 refactor(RSADecryptor): Verbesserung der PEM-Initialisierung und Konsistenz
- Die `Pem`-Eigenschaft aktualisiert, sodass während der Initialisierung automatisch `Init()` aufgerufen wird, um eine konsistente Einrichtung sicherzustellen.
- Die Methode `SetPem` überarbeitet, um nach dem Setzen des PEM-Werts `Init()` aufzurufen.
- Die Methode `Init()` verbessert, um null- oder leere PEM-Werte robuster zu behandeln.
- Fehlermeldungen für mehr Klarheit und bessere Debugging-Unterstützung verbessert.
- Interne RSA-Initialisierungslogik an die Verarbeitung von Verschlüsselungen angepasst.
2024-12-16 10:05:51 +01:00
Developer 02
eced1a5afc feat(RSAFactory): Optionale Verschlüsselungseingabe in CreatePrivateKeyPem Methode hinzugefügt.
- Falsch als Standard eingestellt.
2024-12-16 10:01:09 +01:00
Developer 02
7da93c6719 refactor(DIExtensions): Verbesserung der Registrierung von AsymCrypt-Diensten und Vereinfachung von Overloads
- `AddAsymCryptService` aktualisiert, um eine Standardimplementierung mit `AsymCryptParams` ohne generische Typen bereitzustellen.
- Neue Überladung von `AddAsymCryptService` hinzugefügt, die eine `IConfigurationSection` für Standardparameter akzeptiert.
- Lebensdauer der Service-Registrierungen für `IAsymCryptService` von `Scoped` auf `Singleton` geändert, um Konsistenz und geringeren Overhead zu gewährleisten.
2024-12-16 09:44:51 +01:00
Developer 02
6a92466490 feat: hinzugefügte Index-Eigenschaft zur IAsymCryptService-Schnittstelle
- Neue Index-Eigenschaft `this[string key]` zur `IAsymCryptService`-Schnittstelle hinzugefügt.
- Ermöglicht das Abrufen spezifischer `IRSADecryptor`-Instanzen anhand eines Schlüsselstrings.
- Schnittstellendefinition aktualisiert, um die Funktionalität für implementierende Klassen zu erweitern.
2024-12-13 16:59:02 +01:00
Developer 02
5d9d756b91 feat: hinzugefügte Index-Eigenschaft zur Abfrage eines spezifischen IRSADecryptor anhand eines Schlüssels
- Neue Index-Eigenschaft `this[string key]` in `AsymCryptService` eingeführt, um spezifische `IRSADecryptor`-Instanzen basierend auf Issuer- und Audience-Schlüsseln abzurufen.
- Validierung des Schlüsselformats und Fehlerbehandlung für Fälle hinzugefügt, in denen kein passender Decryptor gefunden wird.
- Implementierung aktualisiert, um die Kompatibilität mit der bestehenden Decryptor-Enumerationslogik sicherzustellen.
2024-12-13 16:57:30 +01:00
Developer 02
f14aaa75e1 refactor(AsymCryptParams): Umbenennung von Separator in FileNameSeparator.
- KeyNameSeparator hinzugefügt.
2024-12-13 16:40:00 +01:00
Developer 02
249f5a0ae5 feat(AsymCryptService): Encryptors.get hinzugefügt, um die Verschlüsseler der Entschlüsseler zu numerieren. 2024-12-13 16:34:53 +01:00
Developer 02
30177cf0c7 feat(AsymCryptService): Implementiert IEnumerable<IRSADecryptor> 2024-12-13 16:25:21 +01:00
Developer 02
68ef0a7537 refactor(RSACryptographer): Entfernen von _pem, IsPemNull, SetPem, Init und Methoden zur Vereinfachung von RSAEncryptor 2024-12-13 16:17:35 +01:00
Developer 02
fe2ee78d14 refactor(RSADecryptor): Umbenennung der Eigenschaft Encrypt in IsEncrypted 2024-12-13 16:02:25 +01:00
Developer 02
53e6f37a09 refactor(AsymCryptParams): Umbenennung von crypt in der Schleife in decryptor 2024-12-13 15:59:28 +01:00
Developer 02
7ec85b4e30 refactor(AsymCryptParams): Unnötige Methoden entfernt 2024-12-13 15:57:17 +01:00
Developer 02
a9ebc406f3 refactor(RSAFactory): Methode CreateEncryptedPrivateKeyPem hinzugefügt, um mit direkt benutzerdefinierten pbeParametern zu erstellen.
- Umbenennung der Methode CreateRSAPrivateKeyPem in CreatePrivateKeyPem
2024-12-13 15:45:09 +01:00
Developer 02
d013d3edfa refactor(AsymCryptService): Verschlüsselungen entfernen, da sie von Entschlüsselungen erzeugt werden müssen. 2024-12-13 15:38:50 +01:00
Developer 02
f267fe955b feat(AsymCryptParams): Funktionalität erstellt, um pem aus der Datei zu setzen, wenn diese null ist.
- Wenn die pem Datei nicht existiert, erstellt
2024-12-13 15:29:42 +01:00
Developer 02
644283cf8f refactor(AsymCryptService): Nicht-generische Schnittstelle erstellt.
- Geordnete DI-Registrierungsmethoden.
2024-12-13 14:44:09 +01:00
Developer 02
82aa8d1143 refactor(DIExtensions): Alle TryAddSingelton wurden in AddSingelton umgewandelt, um im Falle einer falschen Ausnahme den Fehler zu protokollieren.
- SetAsDefault-Parameter hinzugefügt, um nicht-generische IRSAFactory im Falle einer Konfiguration über appsettings registrieren zu können.
2024-12-13 14:00:43 +01:00
Developer 02
7459f05748 refactor(RSAFactory): Schaffung einer nicht-generischen, getrennten Schnittstelle, um eine statische Standardinstanz erstellen zu können.
- Statische Instanzklasse erstellt.
 - Geordnete DI-Registrierungsmethoden.
2024-12-13 13:47:44 +01:00
Developer 02
36f75d003a refactor(AsymCryptParams): Umbenennung von Directory in PemDirectory, um Namenskonflikte zu vermeiden. 2024-12-13 11:11:12 +01:00
Developer 02
76ce64691a refactor(RSACryptographer): Verzeichnis und Dateiname wurden entfernt.
- Datei-Leseprozess in init-Methode entfernt.
2024-12-13 10:29:49 +01:00
Developer 02
7c03282066 refactor(RSACryptographer): Interne Methoden zur Konfiguration von RSACryptographen hinzugefügt.
- IsPemNull.get-Methode hinzugefügt, um zu prüfen, ob _pem null ist.
 - SetPem-Methode hinzugefügt, um pem im Projekt aktualisieren zu können.
2024-12-13 10:15:22 +01:00
Developer 02
7ae95b729f Fix: Upgrade aufgrund einer Nuget-Paket-Abhängigkeit der abstrakten Schicht 2024-12-10 23:32:49 +01:00
Developer 02
9ee8a51664 chore(Abstraktionen): Aktualisiert von 2.2.1 auf 3.0.0 2024-12-10 23:28:34 +01:00
Developer 02
b1d1a898b8 chore(API): Aktualisiert von 2.0.1 auf 2.1 2024-12-10 23:20:40 +01:00
Developer 02
4ed3e79565 chore(Anwendung): Hochgestuft von 2 auf 3 2024-12-10 23:19:27 +01:00
Developer 02
8d9de4502e refactor(Application): Verbesserung der CRUDService zur Steigerung der Typflexibilität und Wartbarkeit
- Entfernen redundanter generischer Einschränkungen für `TUpdateDto` in `CRUDService`.
- Aktualisierung der Methode `UpdateAsync`, um einen generischen Parameter für eine bessere Typflexibilität von `TUpdateDto` einzuschließen.
- Verbesserung der Typ-Einschränkungen durch Durchsetzung von `IUnique<TId>` direkt im Methodenumfang, wo zutreffend.
- Vereinfachung der Klasse zur Einhaltung bewährter Praktiken im Design generischer Dienste.
2024-12-10 23:17:41 +01:00
Developer 02
7dd91c73c4 Merge branch 'feat/client' 2024-12-10 23:03:01 +01:00
Developer 02
65c64a3f9a chore(API): Aktualisiert auf 2.0.1 2024-12-02 11:35:33 +01:00
Developer 02
1d600aa453 refactor: Nullbarkeitsannotation zu ControllerExtensions-Methoden hinzugefügt 2024-12-02 11:33:52 +01:00
156 changed files with 1970 additions and 1737 deletions

56
.gitignore vendored
View File

@@ -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

View File

@@ -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>
{ {

View File

@@ -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>

View File

@@ -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>

View File

@@ -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;

View File

@@ -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>

View File

@@ -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; }
}

View File

@@ -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>

View File

@@ -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
}

View File

@@ -0,0 +1,8 @@
namespace DigitalData.Core.Abstractions.Security.Key;
public interface IAsymmetricDecryptor : IAsymmetricPrivateKey
{
byte[] Decrypt(byte[] data);
IAsymmetricEncryptor Encryptor { get; }
}

View File

@@ -0,0 +1,6 @@
namespace DigitalData.Core.Abstractions.Security.Key;
public interface IAsymmetricEncryptor : IAsymmetricPublicKey
{
byte[] Encrypt(byte[] data);
}

View File

@@ -0,0 +1,8 @@
namespace DigitalData.Core.Abstractions.Security.Key;
public interface IAsymmetricKey
{
string? Id { get; }
string Content { get; }
}

View File

@@ -0,0 +1,8 @@
namespace DigitalData.Core.Abstractions.Security.Key;
public interface IAsymmetricPrivateKey : IAsymmetricKey
{
bool IsEncrypted { get; }
IAsymmetricPublicKey PublicKey { get; }
}

View File

@@ -0,0 +1,5 @@
namespace DigitalData.Core.Abstractions.Security.Key;
public interface IAsymmetricPublicKey : IAsymmetricKey
{
}

View File

@@ -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
}

View File

@@ -0,0 +1,8 @@
using Microsoft.IdentityModel.Tokens;
namespace DigitalData.Core.Abstractions.Security.Key;
public interface IAsymmetricTokenValidator : IAsymmetricPublicKey
{
SecurityKey SecurityKey { get; }
}

View File

@@ -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);
}

View File

@@ -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; }
}

View File

@@ -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);
}
}

View File

@@ -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>
{ {
} }

View File

@@ -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>;
} }
} }

View File

@@ -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);
} }
} }

View File

@@ -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>

View 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
}

View File

@@ -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);
}
}

View 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);
}

View File

@@ -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;
}
}
}

View File

@@ -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; }
}
}

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View 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;
}
}
}

View File

@@ -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>

View File

@@ -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);

View File

@@ -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>();
} }

View File

@@ -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>

View File

@@ -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>

View File

@@ -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;
} }
} }

View File

@@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]

View File

@@ -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;

View File

@@ -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.

View File

@@ -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\

View File

@@ -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;

View File

@@ -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

View File

@@ -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.

View File

@@ -1 +0,0 @@
eba1674d810a2e6af850ad2ebbb9a029e7f2ff0a

View File

@@ -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\

View File

@@ -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;

View File

@@ -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>

View File

@@ -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>

View File

@@ -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"
}
}
}
}
}

View File

@@ -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>

View File

@@ -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" />

View File

@@ -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"
}
}
}
}
}

View File

@@ -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>

View File

@@ -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" />

View File

@@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]

View File

@@ -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 =

View File

@@ -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;

View File

@@ -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

View File

@@ -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>

View File

@@ -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;
} }

View File

@@ -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>

View File

@@ -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;
}
}

View File

@@ -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>

View File

@@ -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);
}

View File

@@ -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;
}
}
}

View 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);
}
}

View 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);
}
}

View File

@@ -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>

View File

@@ -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;
}
}

View File

@@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]

View File

@@ -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.

View File

@@ -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\

View File

@@ -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;

View File

@@ -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

View File

@@ -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;

Some files were not shown because too many files have changed in this diff Show More