199 Commits

Author SHA1 Message Date
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
Developer 02
816d5835f1 fix(BaseHttpClientService): Die Kodierung der Abfrageparameter wurde entfernt, da UriBuilder dies bereits tut.
- Hochgestuft auf 2.0.3
2024-11-26 23:45:06 +01:00
Developer 02
4a64a31d47 refactor(Abstraction): Hochgestuft auf 2.2.1. 2024-11-25 14:30:20 +01:00
Developer 02
e9b2ba788f refactor(IHttpClientOptions): Konvertiert Typ der Header von Key Value Pair Liste zu Dictionary. 2024-11-25 14:29:21 +01:00
Developer 02
e53813500a chore(Core.Client): aufgerüstet auf 2.0.1 2024-11-25 14:05:17 +01:00
Developer 02
25e3855de2 refactor(DIExtensions): BaseHttpClientService-Injektion entfernen 2024-11-25 14:02:54 +01:00
Developer 02
dd3d6e70cc chore(Client): hochgestuft auf 2.2.0 2024-11-25 11:49:41 +01:00
Developer 02
02a87309df chore(Abstraktionen): hochgestuft auf 2.2.0 2024-11-25 11:47:45 +01:00
Developer 02
0f7bdc9d0e refactor: Vereinfachung der Logik zur Zusammenführung von Headern und Abfrageparametern in BaseHttpClientService
- Verbesserung der Zusammenführung von Standard-Headern und Abfrageparametern durch Null-Prüfung und übersichtlichere Handhabung.
- Sicherstellung, dass die Logik einfacher zu verstehen und zu warten ist.
2024-11-25 11:46:08 +01:00
Developer 02
f9df2fb29e feat: DI-Erweiterung für HttpClient-Services verbessert
- `AddHttpClientService` refaktoriert, um `AddHttpClientServiceDefaults` für gemeinsame Setup-Logik einzuführen.
- Überladungen für `AddHttpClientService` hinzugefügt, um sowohl `IConfigurationSection` als auch direkte Options-Instanz zu unterstützen.
- Bessere Erweiterbarkeit und sauberere Service-Konfiguration sichergestellt.
2024-11-25 11:35:46 +01:00
Developer 02
ef7da0e52c refactor(HttpClientOptions): entfernt und durch IHttpClientOptions mit Klasseneinschränkung ersetzt 2024-11-25 11:19:41 +01:00
Developer 02
f602a842be revert: IHttpClientOptions entfernen 2024-11-25 11:03:15 +01:00
Developer 02
52a7664e57 fix(Client.DIExtensions): Generischer Typ zur Injektion mehrerer Client-Dienste hinzugefügt 2024-11-25 10:58:45 +01:00
Developer 02
ea3d1312b8 refactor(BaseHttpClientService): aktualisiert, um den Pfad zu initialisieren emty string, wenn es null ist und HttpClientOptions ohne IOptions hinzugefügt 2024-11-25 10:54:34 +01:00
Developer 02
3b8b315fea refactor(IHttpClientOptions): removed 2024-11-25 10:42:22 +01:00
Developer 02
c65eefb954 feat(IHttpClientOptions): Abfrage-Parameter und Header hinzugefügt.
- Geordnete DI-Erweiterungen.
2024-11-25 10:30:33 +01:00
Developer 02
997fd533ac feat(BaseHttpClientService): Path getter und intter entfernt und geschützte readonly _path Variable hinzugefügt. 2024-11-25 10:11:13 +01:00
Developer 02
bcfb5a8a70 feat(BaseHttpClientService): Uri Getter und Setter entfernt und geschützte readonly _uri Variable hinzugefügt. 2024-11-25 10:09:05 +01:00
Developer 02
049e9977f4 feat(BaseHttpClientService): Optionale Standard-Header und QueryParams hinzugefügt 2024-11-25 10:05:42 +01:00
Developer 02
0334fc4cdf refactor(BaseHttpClientService): Verwendung von IEnumerable<KeyValuePair<string, object>> anstelle von Dictionary<string, string> in queryParams, form und headers inputs der FetchAsync Methode 2024-11-25 09:28:47 +01:00
Developer 02
0c2334cefb refactor(BaseHttpClientService): Der Wert von query params wurde zum nullbaren Objekt, um Flag-Parameter hinzuzufügen.
- Aktualisierte Schnittstelle und Logik unter Berücksichtigung dieser Situation
2024-11-22 14:35:22 +01:00
Developer 02
dd7f1c1ea0 fix(BaseHttpClientService): Null-Kontrolle zum Pfad hinzugefügt 2024-11-22 13:19:42 +01:00
Developer 02
4bb242a4cc feat(Tests.Client.BaseHttpClientServiceTests): Test für Abfrageparameter hinzugefügt 2024-11-22 12:48:36 +01:00
Developer 02
b577067379 chore: gitignore aktualisieren 2024-11-22 12:47:24 +01:00
Developer 02
bd4d4856ea feat(IHttpClientOptions):
Basispfad zu http-Client-Optionen hinzugefügt
2024-11-22 12:05:13 +01:00
Developer 02
c3a12ba5b7 chore: hochgestuft auf 1.1.0 2024-11-22 10:30:26 +01:00
Developer 02
478bf13a4a Revert "chore(Client): hochgestuft auf 2,1"
This reverts commit d8849f48da.
2024-11-22 10:29:03 +01:00
Developer 02
d8849f48da chore(Client): hochgestuft auf 2,1 2024-11-22 10:26:49 +01:00
Developer 02
c466c553dc chore: hochgestuft auf 2.1 2024-11-22 10:25:32 +01:00
Developer 02
48afa6b433 feat(BaseHttpClientService.FetchAsync): Schema-, Port-, Pfad- und Query-Parameter-Optionen hinzugefügt 2024-11-22 10:12:40 +01:00
Developer 02
e44b2895c9 feat(IHttpClientOptions): erstellt zur Abstraktion 2024-11-22 09:18:19 +01:00
Developer 02
85e5fc4018 feat(BaseHttpClientService): Header hinzugefügt 2024-11-22 09:15:04 +01:00
Developer 02
70ccec9fef feat(RSAFactory.ReadRSADecryptorAsync): ReadRSADecryptorAsync-Methode hinzugefügt, um die pem-Datei zu lesen und den Decryptor asynchron zu erstellen 2024-11-22 09:06:58 +01:00
Developer 02
f7193594b1 fix(RSAFactory): Dateiname und seine Erweiterung aus der Methode DefaultRSAKeyNameFormatter entfernt 2024-11-20 17:14:12 +01:00
Developer 02
9c7319634a fix(RSAExtensions): Schlüssel in Dateinamen umbenennen 2024-11-20 17:11:44 +01:00
Developer 02
3becb208ec fix(RSAExtensions): Falsche Methoden zur Schlüsselbenennung entfernt 2024-11-20 17:10:57 +01:00
Developer 02
1b00f9afa2 feat(CryptFactory): Der Parameter seperator der Funktionseigenschaft CryptFactory.RSAKeyNameFormatter ist jetzt nullbar. 2024-11-20 16:47:26 +01:00
Developer 02
b58d4aed2f feat(RSAFactory): Statische Readonly-Eigenschaft hinzugefügt, um den Standard-RSA-Schlüsselnamen-Separator zu speichern 2024-11-20 16:43:27 +01:00
Developer 02
5adc67edf2 feat (CryptFactory): Verschieben der Standardparameter des RSA-Namensformatierers in die RSAFactory 2024-11-20 16:40:24 +01:00
Developer 02
0ff0de8159 feat (CryptFactory.RSADecryptorKeyFormatter): aktualisiert, um die erforderlichen Parameter als Eingabe zu nehmen, anstatt IRSADecryptor direkt als Eingabe zu nehmen 2024-11-20 16:37:09 +01:00
Developer 02
49b49271f3 feat(CryptFactory): ValidateForbidden ve ValidateSeparator Methoden in DefaultRSADecryptorKeyFormatter hinzugefügt 2024-11-20 15:13:05 +01:00
Developer 02
5c5a6bd181 feat(CryptFactory): RSADecryptorKeyFormatter Funktionseigenschaft hinzugefügt, um standardisierte Schlüsselnamen zu erstellen 2024-11-20 14:18:55 +01:00
Developer 02
6ab1777f7c refactor(RSADecryptor): aktualisiert, um im Passwort- und Versions-Tupel-Format zu initieren, um Datenintegrität zu gewährleisten.
- password und PasswordVersion initter entfernt.
2024-11-20 12:49:36 +01:00
Developer 02
103ddf5c2e feat(RSADecryptor): PasswordVersion-Eigenschaft hinzugefügt. Password.get intern gemacht.
- Password.get entfernt und PasswordVersion-Eigenschaft in IRSADecryptor hinzugefügt
2024-11-20 11:17:38 +01:00
Developer 02
f9c94e8464 refactor(IRSADecryptor): HasEncryptedPem getter-Methode hinzugefügt 2024-11-20 10:52:39 +01:00
Developer 02
cdb0009e7c refactor(RSADecryptor): statt der Verwendung einer separaten init-Methode zur Initialisierung von RSA, wurde Lazy Loading verwendet. 2024-11-20 10:51:18 +01:00
Developer 02
5010224500 feat(RSADecryptor): Eigenschaft hinzugefügt, um zu prüfen, ob der RSADecryptor pem verschlüsselt hat. 2024-11-20 10:38:34 +01:00
Developer 02
1ebdd7e5bb feat(RSADecryptor): Öffentliche Constructure-Methode gemacht. 2024-11-20 10:33:11 +01:00
Developer 02
0e0513e640 feat(RSAExtensions): Methoden zum Speichern von IRSACryptographer.Pem erstellt. 2024-11-20 10:32:25 +01:00
Developer 02
683b95c205 refactor(RSAExtensions): GetRSADecryptor, TryGetRSADecryptor, GetRSAEncryptor und TryGetRSADecryptor Methoden hinzugefügt. 2024-11-20 00:15:27 +01:00
Developer 02
f28b43cc06 refactor(RSADecryptor): Lazy Loading in Encryptor Getter integriert, um die Leistung zu verbessern. 2024-11-19 23:58:04 +01:00
Developer 02
777a8a73ac refactor: AddSecurity-Methode aktualisiert, um ICryptFactory direkt mit der CryptFactory-Instanz zu registrieren 2024-11-19 23:51:49 +01:00
Developer 02
77fc06991b feat(CryptFactory): Erstellung einer separaten RSAFactory zur Erzeugung einer statischen Instanz 2024-11-19 23:49:34 +01:00
Developer 02
eeb50e837d feat: Unterstützung für IRSADecryptor und Verwaltung der RSA-Entschlüsselung in den Klassen ICryptFactory und CryptFactory hinzugefügt
ICryptFactory:
- `IRSADecryptor this[string key]`-Indexer für den Zugriff auf Entschlüssler per Schlüssel hinzugefügt.
- Methode `TryGetRSADecryptor` für das sichere Abrufen von Entschlüsslern eingeführt.

CryptFactory:
- `IRSADecryptor`-Indexer für die Verwaltung von Entschlüsslern implementiert.
- Ein `Decryptors`-Dictionary hinzugefügt, um RSA-Entschlüssler nach Schlüssel zu speichern.
- Konstruktor aktualisiert, um `Decryptors` mit einem bereitgestellten oder leeren Dictionary zu initialisieren.
- `TryGetRSADecryptor` zur Entschlüssler-Abfrage implementiert.
2024-11-19 23:14:44 +01:00
Developer 02
1b210714fd feat(CryptFactory): Startprotokoll hinzugefügt, um Informationen über Core.Secrets bereitzustellen 2024-11-19 20:01:54 +01:00
Developer 02
806bc01c17 refactor(PbePassword): CryptFactory.PbePassword.get privat und Secrets.PBE_PASSWORD intern gemacht.
- JsonIgnore-Attribut zu Secrets.PBE_PASSWORD hinzugefügt
 - ICryptFactory.PbePassword.get wurde entfernt.
2024-11-19 19:44:52 +01:00
Developer 02
0169097671 Chore: Hinzufügen des .net 8-Frameworks zu allen .net-Projekten.
- Zentralisierte Nuget-Symbole.
 - Entfernte Projekte gelöscht.
2024-11-19 19:21:40 +01:00
Developer 02
90c73237eb feat(Secrets): Statische Klasse Secrets erstellt, um feste Werte wie pbe password zu speichern.
- Statische Eigenschaften wie Version und Erstellungsdatum hinzugefügt, um versteckte Konstanten in der Produktion nach einem Produktionsupdate zu verfolgen.
2024-11-19 18:08:11 +01:00
Developer 02
2a9c9551b8 refactor(ICryptFactory.Password): umbenennen in PbePassword 2024-11-19 17:16:41 +01:00
Developer 02
a39728dff5 refactor(CryptFactory.Password): umbenennen in PbePassword 2024-11-19 17:14:54 +01:00
Developer 02
7048f385ef feat: Erweiterung der CryptFactory um RSA-Schlüsselerzeugung und Verschlüsselungsunterstützung
- Hinzugefügt: Eigenschaften KeySizeInBits, Password, PbeEncryptionAlgorithm, PbeHashAlgorithmName, PbeIterationCount und EncryptedPrivateKeyPemLabel zur Unterstützung der Konfiguration von RSA-Schlüsselerzeugung und Verschlüsselung in der CryptFactory.

 - Hinzugefügt: Methoden CreateRSAPrivateKeyPem und CreateEncryptedPrivateKeyPem zur Erstellung von RSA-Privatschlüsseln und verschlüsselten Private-Key-PEMs.

 - Geändert: ICryptFactory-Schnittstelle um neue Eigenschaften und Methoden erweitert.
2024-11-19 17:11:52 +01:00
Developer 02
cb9c5746b0 feat(CryptFactory.LazyStaticCryptFactory): umbenennen in LazyInstance 2024-11-19 13:47:31 +01:00
Developer 02
ed36015d1e fix: CryptFactory.Instance in Getter-Methode für träges Laden umwandeln 2024-11-19 13:32:38 +01:00
Developer 02
6ce4a08c53 feat: DI-Erweiterung zur Registrierung von CryptFactory hinzugefügt 2024-11-19 13:19:14 +01:00
Developer 02
4c379c2d4d feat(RSAExtensions) : Methoden hinzugefügt, um einen Verschlüsseler anhand seines Ausstellers und seiner Zielgruppe aus einem Wörterbuch zu erhalten 2024-11-18 17:56:21 +01:00
Developer 02
fee43c00ca feat(CryptFactory) : initiliazierte Schnittstellen.
- Lazy-Methode hinzugefügt, um statische CryptFactory zu beweisen
2024-11-18 17:44:55 +01:00
Developer 02
ee3060158e refactor(RSADecryptor): Konstruktionsmethode intern gemacht 2024-11-18 17:35:01 +01:00
Developer 02
4e615d7e39 feat(RSACryptographer): RSAEncryptionPadding nicht erforderlich gemacht und OaepSHA256 als Standard zugewiesen 2024-11-18 17:32:14 +01:00
Developer 02
d1fea581d7 feat(Tests.Security): initialisiert RSADecryptorTests. 2024-11-18 17:22:38 +01:00
Developer 02
26a68cd477 fix(Core.Security): pem-Importprozess in den Initilizer mehetods verschoben 2024-11-18 17:14:42 +01:00
Developer 02
eccf2b32ce Refactor(Core.Security): Getrennte Pem-Eigenschaften für öffentliche und private Schlüssel wurden entfernt.
- Pem-Eigenschaft in der Hauptklasse RSACryptographer erstellt
2024-11-18 14:39:18 +01:00
Developer 02
6ff0d0a876 feat(RSADecryptor): Aktualisiert für den Import von verschlüsseltem pem 2024-11-18 14:27:53 +01:00
Developer 02
0bb779b7b6 refactor(Core.Security): Implementierung der entsprechenden Schnittstellen zu RSACryptographer, RSADecryptor und RSAEncryptor. 2024-11-18 11:04:24 +01:00
Developer 02
51ebf3fa67 refactor(Core.Security): Entfernt die Erweiterungsmethoden im aktuellen Projekt.
- Projekt Security.Extensions hinzugefügt.
2024-11-18 10:58:34 +01:00
Developer 02
8cc6fd95f7 feat(Abstraktionen.Sicherheit): Schnittstellen für IRSACryptographer, IRSADecryptor und IRSAEncryptor erstellt. 2024-11-18 10:54:57 +01:00
Developer 02
c5b422921b feat(DigitalData.Core.Security.Extensions): Verschiebung der Methoden RSAExtensions und Extensions. 2024-11-18 10:42:48 +01:00
Developer 02
7b571e4d86 feat(DigitalData.Core.Security.Extensions): Initialisiert. 2024-11-18 10:41:16 +01:00
Developer 02
c39b554165 refactor(RSADecryptor): PublicKeyPem entfernt. 2024-11-18 10:36:15 +01:00
Developer 02
489ca67203 Refactor(RSACryptographer): Entfernte Pem initter Methode.
- PrivateKeyPem initter Methode zu RSADecryptor hinzugefügt.
 - PublicKeyPem getter und initter Methoden zu RSAEncryptor hinzugefügt.
2024-11-18 10:33:38 +01:00
Developer 02
0804ea1418 refactor: RSA-Kryptografie-Klassen für bessere Flexibilität und Effizienz überarbeitet
- Konstruktoren zu `RSACryptographer`, `RSADecryptor` und `RSAEncryptor` hinzugefügt, um die Initialisierung zu verbessern.
- `PublicKeyPem` in `RSADecryptor` optimiert, um unnötige Objekterstellungen zu vermeiden.
- `Verify`-Methode in `RSAEncryptor` korrigiert, um eine korrekte Signaturprüfung zu gewährleisten.
- Code-Wiederverwendbarkeit verbessert, indem Base64-Konvertierungslogik zentralisiert wurde.
2024-11-16 03:24:19 +01:00
Developer 02
84dbca97d5 feat(Core.Security): Erstellte Erweiterungsmethoden 2024-11-16 02:14:28 +01:00
Developer 02
8c350db146 chore: update gitignroe 2024-11-14 10:26:07 +01:00
Developer 02
471dace359 feat: Projekt initialisieren 2024-11-14 09:59:14 +01:00
Developer 02
a01e6e5b16 feat: Neue Erweiterungsmethoden zum Verarbeiten von Ergebnissen hinzufügen
- `HasAnyFlag` Methode hinzugefügt, um zu überprüfen, ob eine Benachrichtigung eines der angegebenen Flags hat.
- `Then` und `ThenAsync` Methoden für `Task<DataResult<T>>` Typ hinzugefügt, um asynchrone Ergebnisse basierend auf Erfolg oder Misserfolg zu verarbeiten.
2024-09-16 10:08:11 +02:00
Developer 02
96d03a5f59 chore: NuGet-Paketversionen für Application-, Infrastructure-, DTO- und Abstractions-Ebenen aktualisiert
- Version von 1.0.1.1 auf 2.0.0.0 für Application-, Infrastructure-, DTO- und Abstractions-Projekte aktualisiert.
2024-09-16 09:13:44 +02:00
Developer 02
993d407a48 feat: ReadService hinzugefügt und in ReadController integriert
- Generischen ReadService erstellt, um Lese- (ReadById, ReadAll) und Löschoperationen zu verwalten.
- ReadService in den ReadController integriert.
2024-09-16 09:08:27 +02:00
Developer 02
2c739fbf02 refactor: ICRUDService von IReadService erweitern und Methoden aktualisieren
- ICRUDService angepasst, um von IReadService zu erben, um die Wiederverwendbarkeit von Lesevorgängen zu fördern
- ICRUDService um `CreateAsync`- und `UpdateAsync`-Methoden mit geeigneten Rückgabetypen ergänzt
- Konsistenz gewährleistet durch Durchsetzung von IUnique<TId>-Einschränkungen für DTOs und Entitäten
2024-09-13 16:48:37 +02:00
Developer 02
dcd54266c0 refactor: IUnique<TId>-Einschränkungen in den Basis-Controller-Klassen durchsetzen
- Aktualisiert ReadControllerBase, um zu verlangen, dass TEntity IUnique<TId> implementiert
- BasicCRUDControllerBase geändert, um sicherzustellen, dass sowohl TDto als auch TEntity IUnique<TId> implementieren
2024-09-13 16:40:26 +02:00
Developer 02
0bf8979a09 refactor: Einführung des IUnique<TId>-Interfaces für Entitäten und DTOs
- Aktualisiertes IBasicCRUDService-Interface, um Konsistenz bei einzigartigen Identifikatoren mit IUnique<TId> durchzusetzen
- DIExtensions-Methoden angepasst, um IUnique<TId>-Einschränkungen für DTOs und Entitäten einzuschließen
2024-09-13 16:30:52 +02:00
Developer 02
b6ac303c96 fix: HasEntity-Methode auf CountAsync aktualisiert
Die Implementierung der HasEntity-Methode wurde ersetzt, um die CountAsync-Methode des Repositories zu verwenden. Dies sorgt für eine effizientere Überprüfung der Existenz von Entitäten.
2024-09-11 10:54:41 +02:00
Developer 02
406a41b91f feat: CountAsync-Methode zum Repository-Interface und zur Implementierung hinzugefügt
Eine neue asynchrone CountAsync-Methode wurde zum Repository-Interface und zur Implementierung hinzugefügt. Diese Methode zählt die Anzahl der Entitäten mit einer bestimmten ID in der Datenbank.
2024-09-11 10:52:56 +02:00
Developer 02
adfb0daf7d feat: Füge CountAsync Methode zum ICRUDRepository Interface hinzu 2024-09-11 10:07:20 +02:00
Developer 02
a6d554fbc2 refactor: Entfernte die HandleException Methode aus der CRUDService Klasse und dem Interface
- Die Methode `HandleException` wurde aus der `CRUDService` Klasse entfernt.
- Die Methode wurde ebenfalls aus dem `ICRUDService` Interface entfernt.
2024-09-11 10:05:15 +02:00
Developer 02
c6199cc0be refactor: Entfernte nicht benötigte _keyPropertyInfo und aktualisierte CreateAsync Methode
- Entfernte `_keyPropertyInfo` und die zugehörige Methode `KeyValueOf`, da sie nicht mehr benötigt wird.
- Aktualisierte `CreateAsync` Methode, um direkt `createdEntity.Id` zurückzugeben.
2024-09-11 10:03:04 +02:00
Developer 02
ed2a591317 refactor: Kommentar zur Dokumentation aktualisieren 2024-09-11 09:57:42 +02:00
Developer 02
f6d5305c22 fix: CRUDRepository Konstruktor aktualisiert, um DbSet<TEntity> als Parameter zu akzeptieren
- `CRUDRepository` Konstruktor geändert, um `DbSet<TEntity>` direkt zu akzeptieren.
- Erlaubt flexible Handhabung von `DbSet`-Instanzen beim Erstellen des Repositories.
2024-09-11 09:56:04 +02:00
Developer 02
a6230419d8 refactor: ICRUDService, CRUDService, CRUDRepository und ICRUDRepository um IUnique<TId> Einschränkung zu erzwingen
- `IUnique<TId>` Einschränkung zu `TEntity` in den Schnittstellen `ICRUDService`, `CRUDService`, `ICRUDRepository` und `CRUDRepository` hinzugefügt.
- Relevanten Code aktualisiert, um die neue Einschränkung zu berücksichtigen und sicherzustellen, dass Entitäten `IUnique<TId>` implementieren.
2024-09-11 09:54:26 +02:00
Developer 02
b6cd520b72 refactor: CRUDService-Methoden auf vereinfachte Map-Methode umstellen
- `MapOrThrow` auf `Map` für das Mapping von DTOs in `CRUDService` geändert.
- Methoden-Signaturen und interne Logik angepasst, um die aktualisierten `Map`-Methoden zu verwenden.
- Ausnahmebehandlung und ID-Abruffunktionalität beibehalten.
2024-09-11 09:47:52 +02:00
Developer 02
68bfe93cf2 chore: MapOrThrow Methode in AutoMapperExtension als veraltet markieren
- Methode `MapOrThrow` als veraltet markiert.
- Empfohlen, stattdessen `mapper.Map<T>` direkt zu verwenden.
- Zusammenfassung aktualisiert, um die Veraltung widerzuspiegeln und Hinweise zur empfohlenen Methode zu geben.
2024-09-11 09:45:22 +02:00
Developer 02
e6849cd9c9 Fix: Überprüfung hinzugefügt, ob die Entität in UpdateAsync vorhanden ist
- Eine Überprüfung hinzugefügt, um sicherzustellen, dass die Entität vor dem Aktualisieren existiert.
- Eine Warnung wird protokolliert, wenn die Entität im Aktualisierungsprozess nicht gefunden wird.
- Das `updateDto` wird auf die bestehende Entität gemappt, anstatt eine neue zu erstellen.
2024-09-11 09:43:01 +02:00
Developer 02
d59350174c Refactor: Erzwinge IUnique<TId> Einschränkung für TUpdateDto in CRUDService
- Aktualisiert: `ICRUDService` und `CRUDService`, um die `IUnique<TId>`-Einschränkung für `TUpdateDto` sicherzustellen, dass Update-Datenübertragungsobjekte eine eindeutige Kennung enthalten.
2024-09-11 09:29:21 +02:00
Developer 02
5f18ccd2bd feat: Hinzufügen des IUnique<T>-Interfaces zur Implementierung einer eindeutigen Kennung 2024-09-11 09:26:07 +02:00
Developer 02
58d879aec5 Revert "feat: Hinzufügen des IUnique<T>-Interfaces zur Implementierung einer eindeutigen Kennung"
This reverts commit c9d07ce7bf.
2024-09-11 09:24:48 +02:00
Developer 02
c9d07ce7bf feat: Hinzufügen des IUnique<T>-Interfaces zur Implementierung einer eindeutigen Kennung 2024-09-11 09:22:48 +02:00
Developer 02
bb39b97d1e refactor: Umbenennung der ReadAll-Methode in ReadOnly im CRUDRepository 2024-09-10 11:21:21 +02:00
Developer 02
b91769d931 refactor: ReadAll-Methode aus allen Schnittstellen entfernt, da sie unnötig war. Diese Änderung verbessert die Klarheit der Schnittstellen und entspricht den Best Practices. 2024-09-10 11:17:32 +02:00
Developer 02
ee5668a5cb feat: ReadAll-Methode in ICRUDRepository und CRUDRepository implementieren
- ReadAll-Methode zur ICRUDRepository-Schnittstelle hinzugefügt, um die Abfrage aller Entitäten zu ermöglichen.
- ReadAll-Methode in der CRUDRepository-Klasse implementiert, um IQueryable<TEntity> für weitere Abfragen und Filterung bereitzustellen.
2024-09-09 17:44:18 +02:00
Developer 02
67a3c598b1 chore: Increment version number to 1.0.0.1 for package update 2024-08-30 11:51:00 +02:00
Developer 02
ceb8858dc9 fix: 'NotFound'-Flag zur Flag-Enum hinzufügen, um fehlende Ressourcen oder Operationen anzuzeigen 2024-08-29 16:15:59 +02:00
Developer 02
ed5dd43f37 chore: für NuGet-Paket konfiguriert 2024-07-31 09:59:11 +02:00
Developer 02
8224b733db chore: Build auf Debug eingestellt und Namespace von HttpExtensions auf Client aktualisiert 2024-07-29 16:11:46 +02:00
Developer 02
c1782bf4c3 refactor: Uri-Eigenschaft in BaseHttpClientService auf protected set geändert für bessere Kapselung 2024-07-29 15:36:25 +02:00
Developer 02
cff310ad59 chore: Legacy.Client für Build-Release konfiguriert 2024-07-29 14:17:06 +02:00
Developer 02
e9c5ae1683 feat: Projektlogo hinzugefügt 2024-07-29 14:05:30 +02:00
Developer 02
09ab518007 chore: Projektversion auf normale Projektversion angepasst und Projektnamen hinzugefügt 2024-07-29 13:58:23 +02:00
Developer 02
246c1123fe fix: Projektdateiname für DigitalData.Core.Legacy.Client korrigiert 2024-07-29 13:54:24 +02:00
Developer 02
d937383c78 test: Legacy.Client getestet und erfolgreich abgeschlossen, alle erforderlichen Tests bestanden 2024-07-29 13:46:30 +02:00
Developer 02
d35b638c74 refactor: Umbenennung und Konfiguration für Legacy-Projekt
- DigitalData.Core.Client.Legacy wurde in DigitalData.Core.Legacy.Client umbenannt.
- Projektdateien von DigitalData.Core.Client wurden nach DigitalData.Core.Legacy.Client kopiert.
- DigitalData.Core.Legacy.Client wurde für .NET Framework konfiguriert.
2024-07-29 13:04:36 +02:00
Developer 02
605448c0da chore: ConsoleApp-Referenz aus den Lösungen entfernt 2024-07-29 11:20:50 +02:00
Developer 02
f46a0627ce feat: DigitalData.Core.Client um .NET Framework-Unterstützung erweitert durch Erstellung des DigitalData.Core.Client.Legacy-Projekts 2024-07-29 11:17:25 +02:00
Developer 02
249e13e6a2 API nuget-package version upgraded from 1.0.2 to 1.0.2.1 2024-07-01 16:26:07 +02:00
Developer 02
97f6b6c874 Separate ReadControllerBase mit Fehlerbehandlung hinzugefügt. 2024-07-01 16:24:05 +02:00
Developer 02
deb67a99ce Die Version des API-Nuget-Pakets wurde von 1.0.1 auf 1.0.2 aktualisiert. 2024-07-01 16:12:31 +02:00
Developer 02
3c85969f5a Separate CRUDControllerBase mit Fehlerbehandlung hinzugefügt. 2024-07-01 16:10:46 +02:00
Developer 02
7789605585 try-catch zu CRUDControllerBase hinzugefügt 2024-07-01 16:01:49 +02:00
Developer 02
2cb80ec119 Projektversion 'Infrastruktur' von 1.0.1 auf 1.0.1.1.1 erhöht 2024-07-01 15:57:27 +02:00
Developer 02
b0f5738390 Bedingung vom Typ new() entfernen 2024-06-27 16:02:41 +02:00
Developer 02
8f09ec4255 Gitignore aktualisieren 2024-06-27 16:01:58 +02:00
Developer 02
ab4d8646d1 Gitignore aktualisieren. 2024-06-27 13:53:13 +02:00
Developer 02
9f649a11f2 chore: Aktualisiere den Pfad für PackageIcon 2024-06-27 12:45:23 +02:00
Developer 02
9bd377de80 chore: Upgrade Abstractions and Client projects from 1.0.0 to 1.0.1 2024-06-27 12:39:18 +02:00
Developer 02
52d350ae48 Refactor: Make Build method private to ensure IServiceProvider is only created via Lazy initialization for thread safety and consistency. 2024-06-27 12:35:37 +02:00
Developer 02
f128a719e8 feat: Implement ServiceFactory for dependency injection
- Added ServiceFactory class to manage service registrations and service provider creation.
- Implemented a lazy-loaded IServiceProvider to ensure services are only built once.
- Prevent further modifications to the service collection after the service provider is created.
- Added Provide<T>() method to resolve and retrieve services from the service provider.
2024-06-27 12:29:31 +02:00
Developer 02
c09ff44287 Gitignore aktualisieren. 2024-06-27 09:18:30 +02:00
Developer 02
d84ef820f1 GetCookies-Methode hinzugefügt. Test für http-Dienst hinzugefügt 2024-06-26 16:57:30 +02:00
Developer 02
8d38e883df Die Klasse Method (Http) und unnötige Erweiterungen wurden entfernt. 2024-06-26 16:40:54 +02:00
Developer 02
ba94f4689a feat: Implementierung von BaseHttpClientService und DIExtensions für HTTP-Client-Dienste
- Hinzugefügt: `BaseHttpClientService` zur Handhabung von HTTP-Anfragen mit Cookie-Verwaltung.
- Implementiert: `HttpClientService<TClientOptions>`, das `BaseHttpClientService` für typisierte Client-Optionen erweitert.
- Erstellt: `DIExtensions` zur Registrierung von HTTP-Client-Diensten im Dependency Injection Container.
- Bereitgestellt: Methoden zum Hinzufügen von HTTP-Client-Diensten mit und ohne spezifische Client-Optionen.
- Konfiguriert: Optionen zum Festlegen der Basis-URI für HTTP-Clients.
2024-06-26 13:38:08 +02:00
Developer 02
5e26545036 Aktualisierung der API-Version von 1.0.0 auf 1.0.1 2024-06-24 14:38:51 +02:00
Developer 02
e554197089 Erweiterungsmethode hinzugefügt, um IStringLocalizer in ein dynamisches Objekt zu konvertieren. 2024-06-24 14:34:24 +02:00
Developer 02
b6adf7ed8b Core.API ist für die Paketierung konfiguriert. 2024-06-20 16:58:39 +02:00
Developer 02
0ad92e7592 Kommentare zur Dokumentation hinzugefügt und Pakete konfiguriert. 2024-06-20 16:20:50 +02:00
Developer 02
b7584a1632 Aktualisierter Gitignore. 2024-06-20 15:12:13 +02:00
Developer 02
cf0689e349 Paketkonfiguration aktualisieren. 2024-06-20 14:01:15 +02:00
Developer 02
316847a11b Gitignore aktualisieren 2024-06-20 14:00:32 +02:00
Developer 02
58e86e1405 Refaktorieren: Projektname von "Contracts" zu "Abstractions" geändert, um den Zweck besser widerzuspiegeln. 2024-06-20 12:17:30 +02:00
Developer 02
3844f9d8d8 Refactored ICRUDService interface to remove the generic TCRUDRepository parameter for simplification and improved readability. 2024-06-15 00:41:24 +02:00
Developer 02
0697f5ff58 feat: DirectorySearchOptions-Klasse hinzugefügt und DirectorySearchService refaktoriert, um IOptions für eine verbesserte Konfigurationsverwaltung zu verwenden. 2024-06-13 15:44:57 +02:00
Developer 02
ee045d5bfd Standard-String-Localizer aus Diensten entfernt. 2024-06-13 14:12:09 +02:00
Developer 02
cb28ce39a1 Hinzufügen der ConfigureBySection-Methode zur Konfiguration von Diensten nach Abschnitt und Rückgabe des Builders. 2024-06-11 18:57:44 +02:00
Developer 02
63bcf8a9b9 Revert "feat: Index-Parameter zu Message-Methoden in DTOExtensions hinzugefügt, um Nachrichten an einer bestimmten Position einzufügen."
This reverts commit 09a2360640.
2024-06-10 14:57:02 +02:00
Developer 02
09a2360640 feat: Index-Parameter zu Message-Methoden in DTOExtensions hinzugefügt, um Nachrichten an einer bestimmten Position einzufügen. 2024-06-10 14:48:50 +02:00
Developer 02
4ed0bbc21f feat: Hinzufügen der ToFail-Methode zur DataResult-Klasse zur Umwandlung in einen Fehlerzustand mit Nachrichten und Hinweisen. 2024-06-10 14:32:25 +02:00
Developer 02
73ea081f7d Erweiterungsmethoden für HttpResponseMessage hinzugefügt, um JSON und dynamische Antworten zu verarbeiten. Fetch-Methode implementiert, um HTTP-GET-Anfragen auszuführen. ThenAsync für Task-Fortsetzungen und ForEach für IEnumerable-Iteration hinzugefügt. 2024-06-07 15:04:10 +02:00
Developer 02
a01cb0e2a8 Gitignore aktualisieren 2024-06-07 15:01:02 +02:00
Developer 02
132183e1d8 Einen neuen Test für IEnumerable zu BaseDtoTest hinzugefügt. 2024-06-06 15:37:44 +02:00
Developer 02
0e0f78aaa2 Umbenennung von BaseDto in BaseDTO für eine konsistente Namensgebung. 2024-06-06 15:24:37 +02:00
Developer 02
419974ba12 feat: Füge BaseDto-Datensatz mit überschriebenem GetHashCode 2024-06-06 15:17:22 +02:00
Developer 02
5b21f7f208 .gitignore aktualisieren 2024-06-06 15:17:03 +02:00
Developer 02
5c016be71a Methoden zur DTOExtensions hinzugefügt, um die Handhabung von booleschen DataResults zu verbessern. 2024-06-06 10:40:48 +02:00
Developer 02
f21944f177 IsFailed-Eigenschaft zur Result-Klasse hinzugefügt, um den Fehlerzustand bequem zu überprüfen. 2024-06-04 15:26:57 +02:00
Developer 02
401e742ea3 Erweiterungsmethode hinzugefügt, um alle lokalisierten Zeichenfolgen im String-Localizer in ein Wörterbuch umzuwandeln. 2024-05-31 09:31:59 +02:00
Developer 02
5f84f6bcab Removed unnecessary reference 2024-05-24 13:39:59 +02:00
Developer 02
c559662286 Methoden hinzugefügt, um DiP-Modus und kombinierten Dev- oder DiP-Modus zu prüfen. 2024-05-22 13:03:51 +02:00
Developer 02
0138fb5166 Hinzufügen von IEnumerable-Überladungen für Message- und Notice-Methoden in DTOExtensions. 2024-05-16 16:12:51 +02:00
Developer 02
b71c778a4d feat: Implementierung von CSPMiddleware zur Hinzufügung von CSP-Headern mit Nonce für verbesserte Sicherheit. 2024-05-14 11:19:22 +02:00
Developer 02
f7a5d4fc28 Erweitere ThenAsync Methoden in DTOExtensions um asynchrone Success-Funktionalität. 2024-05-03 10:30:09 +02:00
Developer 02
f170a4dd34 Refaktorisierung von CRUDControllerBase zur Vereinfachung der Generizität und Entfernung nicht benötigter Typparameter. 2024-05-03 09:45:27 +02:00
Developer 02
efb573b945 Refaktorisierung von CRUDControllerBase zur Nutzung des Result-Musters für eine sauberere Fehlerbehandlung und Codestruktur. 2024-05-03 09:36:26 +02:00
Developer 02
f5c0a76f30 Überarbeite Methodennamen in der DTOExtensions-Klasse für Klarheit und Konsistenz. 2024-05-03 09:05:34 +02:00
Developer 02
f72b6f26f3 Umbenennung der Then-Methoden für Konsistenz zu ThenAsync 2024-05-02 17:53:18 +02:00
Developer 02
eca0e34740 Added empty string as a default resourcesPath 2024-05-02 17:25:39 +02:00
Developer 02
f385619bcf Füge die Methoden HasFlag und HasAnyFlag zur Result-Klasse hinzu, um spezifische Hinweis-Flags zu prüfen. 2024-05-02 16:41:27 +02:00
Developer 02
94da0733ce Refaktorisiere LogNotice, um ILogger ohne Generika zu verwenden, und füge eine Überladung hinzu, um Result-Objekte direkt zu loggen. 2024-05-02 16:28:05 +02:00
Developer 02
2521d3d887 Ermöglicht die nachträgliche Modifikation der Data-Eigenschaft in DataResult<T>, indem sie von init-only auf setzbar geändert wird. 2024-05-02 16:03:47 +02:00
Developer 02
4b71836fea Erweiterung der DTOs und Implementierung der Lokalisierungsdienste
- Neue DTO-Extension-Methoden hinzugefügt, um die Verarbeitung und Zuweisung von Nachrichten und Benachrichtigungen in Ergebnisobjekten zu vereinfachen.
- Lokalisierungsunterstützung in der API-Schicht implementiert, einschließlich Cookie-basierter Lokalisierung und Konfiguration unterstützter Kulturen.
- Die Integration von StringLocalizer in die API-Schicht wurde durchgeführt, um eine nahtlose Mehrsprachigkeit zu ermöglichen.
- Fehlerbehandlung für fehlende Konfigurationseinstellungen verbessert.

Die Änderungen verbessern die Flexibilität und Wartbarkeit des Codes und unterstützen eine effizientere Internationalisierung der Anwendung.
2024-04-30 17:01:26 +02:00
Developer 02
f6d8721c27 Aktualisierte .gitignore 2024-04-30 11:24:21 +02:00
Developer 02
8188fa759f feat: Cookie-basierte Lokalisierung implementiert, ToLocal Erweiterungsmethoden hinzugefügt und Translation-Service entfernt. Stattdessen wird IStringLocalizer<T> verwendet, abhängig von der Situation wie Cookie-basierter Kultur oder Kultur basierend auf der Route. 2024-04-29 13:31:37 +02:00
Developer 02
1281d37239 Stage commit 2024-04-29 13:31:07 +02:00
Developer 02
70088fe42a Add Translation Extensions Methoden. 2024-04-26 10:24:44 +02:00
Developer 02
1e3c5755c4 Den Fehler in der WithFlag-Methode behoben und die Enum-Übersetzung integriert. 2024-04-26 10:06:28 +02:00
Developer 02
8e9dd5b0f9 Hinzufügen neuer Flags zum Flag-Enum 2024-04-23 10:27:33 +02:00
Developer 02
da3d1cd357 Überarbeiten Sie die Methoden zur Handhabung von Service-Nachrichtenflags, stellen Sie sicher, dass sie ordnungsgemäß in ICollection konvertiert werden, und verbessern Sie die Klarheit. 2024-04-23 10:23:30 +02:00
Developer 02
385a286ef5 Hinzufügen und Dokumentieren von Flag-Erweiterungsmethoden in ServiceMessageExtensions zum Setzen und Überprüfen von Flags 2024-04-22 16:10:57 +02:00
Developer 02
29cdbbf7b1 Refaktorisierung aller Nachrichteneigenschaften in ServiceMessage von List zu ICollection für verbesserte Flexibilität. 2024-04-22 15:02:20 +02:00
Developer 02
bb5837047a Refaktorisierung des Flag-Enums: Flag auf nullable gesetzt, HasFlag-Methode für Nullable-Prüfung aktualisiert, Null-Flag entfernt, SecurityBreachOrDataIntegrity für überlappende Probleme hinzugefügt. 2024-04-22 14:25:09 +02:00
Developer 02
40c3b6fdc1 Hinzugefügt WithFlag Methode zu ServiceMessageExtensions für das direkte Setzen von Flags auf IServiceMessage Instanzen. 2024-04-22 10:27:29 +02:00
Developer 02
4dea6b9b00 Flag-Enum implementiert und IServiceMessage mit Flag-Unterstützung aktualisiert
- Flag-Enum mit Null und SecurityBreach definiert.
- Flag-Eigenschaft und HasFlag-Methode zu IServiceMessage hinzugefügt.
2024-04-22 10:21:39 +02:00
Developer 02
fae750c1d8 Korrigiere Separator in Join-Methode und benenne Klasse um 2024-04-22 08:54:02 +02:00
Developer 02
36889df1c0 Funktion: Erweiterung von IServiceMessage mit Methoden zur Nachrichtenverwaltung
- Hinzufügen von Erweiterungsmethoden zu IServiceMessage für das Hinzufügen von Client-, Trace-, Debug-, Informations-, Warn-, Fehler- und kritischen Nachrichten.
- Einbeziehung von Methoden für direkte Nachrichten und auf Enum basierende Schlüssel, die Lokalisierung und benutzerdefinierte Formatierung unterstützen.
2024-04-19 14:08:33 +02:00
Developer 02
ce462a8b66 Funktion: Hinzufügen von strukturierten Logging-Erweiterungen und Korrektur eines Parameterfehlers
- Hinzufügen der Methoden `LogMessageList` und `LogServiceMessage` für verbessertes Nachrichten-Logging.
- Korrektur der Schreibweise des Parameters `separator`.
- Dokumentation der Methoden für bessere Klarheit.
2024-04-19 10:05:43 +02:00
Developer 02
052448b6bf Fügen Sie die InnerServiceError-Erweiterung für die Behandlung von 500-Fehlern hinzu
Führt die Methode InnerServiceError ein, um die Fehlerbehandlung in ControllerBase mit optionalen detaillierten Nachrichten oder Ausnahmen zu verbessern. Enthält Dokumentationskommentare.
2024-04-18 16:44:11 +02:00
Developer 02
c350c63b1f Fügen Sie 'ohne Nachricht' Methoden in ResponseService hinzu
Implementieren und dokumentieren Sie Dienstmethoden, die ohne zusätzliche Nachrichten funktionieren, um die Einfachheit der Schnittstelle zu verbessern.
2024-04-18 14:29:11 +02:00
Developer 02
7b0ef9b0c2 Implementierung von Enum-basierter Nachrichtenverarbeitung in ResponseService
Erweitern Sie den ResponseService, um Enum-Arrays für Nachrichten zu akzeptieren, und konvertieren Sie sie zu Strings für die Kompatibilität. Beinhaltet aktualisierte Dokumentationskommentare und gewährleistet Rückwärtskompatibilität.
2024-04-18 13:57:19 +02:00
Developer 02
124fe0787b Implementiere WithMessage und WithMessageKey Methoden in IServiceMessage
Methoden hinzugefügt, um Nachrichten direkt oder über Enum-Schlüssel hinzuzufügen, unterstützt Methodenverkettung in IServiceMessage.
2024-04-18 09:45:15 +02:00
Developer 02
f0b778abf0 Entfernte Dateien aus der Verfolgung 2024-04-18 09:13:48 +02:00
Developer 02
217f4049db Configure project for NuGet packaging and implement WithData for chainable ViewData updates 2024-04-17 16:55:53 +02:00
Developer 02
82da3586a5 Implementierung von AddCookieConsentSettings zum Laden der Cookie-Zustimmungseinstellungen aus der Konfiguration
Eine Methode wurde hinzugefügt, um die CookieConsentSettings aus der appsettings.json als Singleton zu laden und zu registrieren. Diese Einstellungen verwalten die Benutzerzustimmung für Cookies. Beinhaltet Fehlerbehandlung für fehlende oder falsche Konfigurationen.
2024-04-15 14:15:12 +02:00
Developer 02
49e3d29fd4 Implementierung von JWTService und IJWTService für JWT-Operationen
Hinzugefügt wurden die JWTService-Klasse und das IJWTService-Interface zur Unterstützung der Generierung und Validierung von JWTs basierend auf Anspruchstypen. Enthält Methoden zum Erstellen von Sicherheitsschlüsseln, Generieren von Tokens und Lesen von Tokens mit ausführlicher Dokumentation.
2024-04-15 13:52:59 +02:00
356 changed files with 4249 additions and 16692 deletions

412
.gitignore vendored Normal file
View File

@@ -0,0 +1,412 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
/.vs/DigitalData.Core/DesignTimeBuild/.dtbcache.v2
/.vs/DigitalData.Core/v17/.suo
/.vs/ProjectEvaluation/digitaldata.core.metadata.v6.1
/.vs/DigitalData.Core/v17/.futdcache.v2
/DigitalData.Core.Application/obj/Debug/net7.0/DigitalData.Core.Application.assets.cache
/DigitalData.Core.Application/obj/Debug/net7.0/DigitalData.Core.Application.csproj.FileListAbsolute.txt
/DigitalData.Core.CultureServices/obj/Debug/net7.0/DigitalData.Core.CultureServices.assets.cache
/DigitalData.Core.CultureServices/obj/Debug/net7.0/DigitalData.Core.CultureServices.csproj.FileListAbsolute.txt
/.vs/DigitalData.Core/DesignTimeBuild/.dtbcache.v2
/.vs/DigitalData.Core/v17/.suo
/.vs/ProjectEvaluation/digitaldata.core.metadata.v6.1
/.vs/ProjectEvaluation/digitaldata.core.projects.v6.1
/.vs/DigitalData.Core/v17/.futdcache.v2
/DigitalData.Core.Tests/obj/Debug/net7.0/DigitalData.Core.Tests.assets.cache
/DigitalData.Core.Tests/obj/Debug/net7.0/DigitalData.Core.Tests.csproj.FileListAbsolute.txt
/DigitalData.Core.Infrastructure/obj/Debug/net7.0/DigitalData.Core.Infrastructure.assets.cache
/DigitalData.Core.Infrastructure/obj/Debug/net7.0/DigitalData.Core.Infrastructure.csproj.FileListAbsolute.txt
/DigitalData.Core.Application/obj/Debug/net7.0/DigitalData.Core.Application.assets.cache
/DigitalData.Core.Application/obj/Debug/net7.0/DigitalData.Core.Application.csproj.FileListAbsolute.txt
/DigitalData.Core.CultureServices/obj/Debug/net7.0/DigitalData.Core.CultureServices.assets.cache
/DigitalData.Core.CultureServices/obj/Debug/net7.0/DigitalData.Core.CultureServices.csproj.FileListAbsolute.txt
/DigitalData.Core.CultureServices/MockStringLocalizer.cs
/DigitalData.Core.Application/obj/DigitalData.Core.Application.csproj.nuget.dgspec.json
/DigitalData.Core.Application/obj/project.assets.json
/DigitalData.Core.Infrastructure/obj/DigitalData.Core.Infrastructure.csproj.nuget.dgspec.json
/DigitalData.Core.Infrastructure/obj/project.assets.json
/DigitalData.Core.Contracts/obj/Debug/net7.0/DigitalData.Core.Contracts.assets.cache
/DigitalData.Core.Contracts/obj/Debug/net7.0/DigitalData.Core.Contracts.csproj.FileListAbsolute.txt
/DigitalData.Core.Contracts/obj/DigitalData.Core.Contracts.csproj.nuget.dgspec.json
/DigitalData.Core.Contracts/obj/project.assets.json
/.vs/DigitalData.Core/v17/TestStore/0/000.testlog
/DigitalData.Core.Tests/obj/Debug/net7.0/DigitalData.Core.Tests.assets.cache
/DigitalData.Core.Tests/obj/DigitalData.Core.Tests.csproj.nuget.dgspec.json
/DigitalData.Core.Tests/obj/DigitalData.Core.Tests.csproj.nuget.g.targets
/DigitalData.Core.Tests/obj/project.assets.json
/.vs/DigitalData.Core/v17/TestStore/0/000.testlog
/DigitalData.Core.Tests/obj/Debug/net7.0/DigitalData.Core.Tests.assets.cache
/DigitalData.Core.Tests/obj/DigitalData.Core.Tests.csproj.nuget.dgspec.json
/DigitalData.Core.Tests/obj/DigitalData.Core.Tests.csproj.nuget.g.targets
/DigitalData.Core.Tests/obj/project.assets.json
/.vs/DigitalData.Core/v17/TestStore/0/testlog.manifest
/DigitalData.Core.Infrastructure/obj
/DigitalData.Core.Application/obj/Release/net7.0/DigitalData.Core.Application.AssemblyInfo.cs
/DigitalData.Core.Application/obj/Release/net7.0/ref/DigitalData.Core.Application.dll
/DigitalData.Core.ConsoleApp/DigitalData.Core.ConsoleApp.csproj
/DigitalData.Core.ConsoleApp/Program.cs
/DigitalData.Core.ConsoleApp/FooHttpOptions.cs
/DigitalData.Core.Tests/obj/
/DigitalData.Core.Terminal

Binary file not shown.

View File

@@ -1,19 +1,17 @@
using DigitalData.Core.Contracts.Application; using DigitalData.Core.Abstractions;
using DigitalData.Core.Contracts.Infrastructure; using DigitalData.Core.Abstractions.Application;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace DigitalData.Core.API namespace DigitalData.Core.API
{ {
[ApiController] [ApiController]
[Route("api/[controller]")] [Route("api/[controller]")]
public class BasicCRUDControllerBase<TOriginalController, TCRUDService, TCRUDRepository, TDto, TEntity, TId> : CRUDControllerBase<TOriginalController, TCRUDService, TCRUDRepository, TDto, TDto, TDto, TEntity, TId> public class BasicCRUDControllerBase<TCRUDService, TDto, TEntity, TId> : CRUDControllerBase<TCRUDService, TDto, TDto, TDto, TEntity, TId>
where TOriginalController : CRUDControllerBase<TOriginalController, TCRUDService, TCRUDRepository, TDto, TDto, TDto, TEntity, TId> where TCRUDService : ICRUDService<TDto, TDto, TDto, TEntity, TId>
where TCRUDService : ICRUDService<TCRUDRepository, TDto, TDto, TDto, TEntity, TId> where TDto : class, IUnique<TId>
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TEntity : class, IUnique<TId>
where TDto : class
where TEntity : class
{ {
public BasicCRUDControllerBase(ILogger<TOriginalController> logger, TCRUDService service) : base(logger, service) public BasicCRUDControllerBase(ILogger logger, TCRUDService service) : base(logger, service)
{ {
} }
} }

View File

@@ -1,5 +1,6 @@
using DigitalData.Core.Contracts.Application; using DigitalData.Core.Abstractions;
using DigitalData.Core.Contracts.Infrastructure; using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.DTO;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace DigitalData.Core.API namespace DigitalData.Core.API
@@ -7,7 +8,6 @@ namespace DigitalData.Core.API
/// <summary> /// <summary>
/// A base controller class providing generic CRUD (Create, Read, Update, Delete) operations for a specified entity type. /// A base controller class providing generic CRUD (Create, Read, Update, Delete) operations for a specified entity type.
/// </summary> /// </summary>
/// <typeparam name="TOriginalController">The derived controller type implementing this base class.</typeparam>
/// <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>
@@ -16,16 +16,14 @@ namespace DigitalData.Core.API
/// <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<TOriginalController, TCRUDService, TCRUDRepository, TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : ControllerBase public class CRUDControllerBase<TCRUDService, TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : ControllerBase
where TOriginalController : CRUDControllerBase<TOriginalController, TCRUDService, TCRUDRepository, TCreateDto, TReadDto, TUpdateDto, TEntity, TId> where TCRUDService : ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>
where TCRUDService : ICRUDService<TCRUDRepository, TCreateDto, TReadDto, TUpdateDto, TEntity, TId>
where TCRUDRepository : ICRUDRepository<TEntity, TId>
where TCreateDto : class where TCreateDto : class
where TReadDto : class where TReadDto : class
where TUpdateDto : class where TUpdateDto : class, IUnique<TId>
where TEntity : class where TEntity : class, IUnique<TId>
{ {
protected readonly ILogger<TOriginalController> _logger; protected readonly ILogger _logger;
protected readonly TCRUDService _service; protected readonly TCRUDService _service;
/// <summary> /// <summary>
@@ -34,7 +32,7 @@ namespace DigitalData.Core.API
/// <param name="logger">The logger to be used by the controller.</param> /// <param name="logger">The logger to be used by the controller.</param>
/// <param name="service">The CRUD service handling business logic for the entity.</param> /// <param name="service">The CRUD service handling business logic for the entity.</param>
public CRUDControllerBase( public CRUDControllerBase(
ILogger<TOriginalController> logger, ILogger logger,
TCRUDService service) TCRUDService service)
{ {
_logger = logger ?? throw new ArgumentNullException(nameof(logger)); _logger = logger ?? throw new ArgumentNullException(nameof(logger));
@@ -49,15 +47,19 @@ namespace DigitalData.Core.API
[HttpPost] [HttpPost]
public virtual async Task<IActionResult> Create(TCreateDto createDto) public virtual async Task<IActionResult> Create(TCreateDto createDto)
{ {
var result = await _service.CreateAsync(createDto); return await _service.CreateAsync(createDto).ThenAsync<TId, IActionResult>(
if (result.IsSuccess) Success: id =>
{ {
var createdResource = new { Id = result.Data }; var createdResource = new { Id = id };
var actionName = nameof(GetById); var actionName = nameof(GetById);
var routeValues = new { id = createdResource.Id }; var routeValues = new { id = createdResource.Id };
return CreatedAtAction(actionName, routeValues, createdResource); return CreatedAtAction(actionName, routeValues, createdResource);
} },
return BadRequest(result); Fail: (messages, notices) =>
{
_logger.LogNotice(notices);
return BadRequest(messages);
});
} }
/// <summary> /// <summary>
@@ -68,12 +70,13 @@ namespace DigitalData.Core.API
[HttpGet("{id}")] [HttpGet("{id}")]
public virtual async Task<IActionResult> GetById([FromRoute] TId id) public virtual async Task<IActionResult> GetById([FromRoute] TId id)
{ {
var result = await _service.ReadByIdAsync(id); return await _service.ReadByIdAsync(id).ThenAsync(
if (result.IsSuccess) Success: Ok,
{ Fail: IActionResult (messages, notices) =>
return Ok(result); {
} _logger.LogNotice(notices);
return NotFound(result); return NotFound(messages);
});
} }
/// <summary> /// <summary>
@@ -83,12 +86,13 @@ namespace DigitalData.Core.API
[HttpGet] [HttpGet]
public virtual async Task<IActionResult> GetAll() public virtual async Task<IActionResult> GetAll()
{ {
var result = await _service.ReadAllAsync(); return await _service.ReadAllAsync().ThenAsync(
if (result.IsSuccess) Success: Ok,
{ Fail: IActionResult (messages, notices) =>
return Ok(result); {
} _logger.LogNotice(notices);
return NotFound(result); return NotFound(messages);
});
} }
/// <summary> /// <summary>
@@ -99,12 +103,13 @@ namespace DigitalData.Core.API
[HttpPut] [HttpPut]
public virtual async Task<IActionResult> Update(TUpdateDto updateDto) public virtual async Task<IActionResult> Update(TUpdateDto updateDto)
{ {
var result = await _service.UpdateAsync(updateDto); return await _service.UpdateAsync(updateDto).ThenAsync(
if (result.IsSuccess) Success: Ok,
{ Fail: IActionResult (messages, notices) =>
return Ok(result); {
} _logger.LogNotice(notices);
return BadRequest(result); return BadRequest(messages);
});
} }
/// <summary> /// <summary>
@@ -115,13 +120,13 @@ namespace DigitalData.Core.API
[HttpDelete("{id}")] [HttpDelete("{id}")]
public virtual async Task<IActionResult> Delete([FromRoute] TId id) public virtual async Task<IActionResult> Delete([FromRoute] TId id)
{ {
var result = await _service.DeleteAsyncById(id); return await _service.DeleteAsyncById(id).ThenAsync(
if (result.IsSuccess) Success: Ok,
{ Fail: IActionResult (messages, notices) =>
return Ok(result); {
} _logger.LogNotice(notices);
return BadRequest(result); return BadRequest(messages);
});
} }
} }
} }

View File

@@ -0,0 +1,173 @@
using DigitalData.Core.Abstractions;
using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.DTO;
using Microsoft.AspNetCore.Mvc;
namespace DigitalData.Core.API
{
/// <summary>
/// A base controller class that provides generic CRUD (Create, Read, Update, Delete) operations for a specified entity type,
/// with enhanced error handling to ensure robust and reliable API endpoints.
/// </summary>
/// <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="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="TId">The type of the entity's identifier.</typeparam>
[ApiController]
[Route("api/[controller]")]
public class CRUDControllerBaseWithErrorHandling<TCRUDService, TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : ControllerBase
where TCRUDService : ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>
where TCreateDto : class
where TReadDto : class
where TUpdateDto : class, IUnique<TId>
where TEntity : class, IUnique<TId>
{
protected readonly ILogger _logger;
protected readonly TCRUDService _service;
/// <summary>
/// Initializes a new instance of the CRUDControllerBase class with specified logger and CRUD service.
/// </summary>
/// <param name="logger">The logger to be used by the controller.</param>
/// <param name="service">The CRUD service handling business logic for the entity.</param>
public CRUDControllerBaseWithErrorHandling(
ILogger logger,
TCRUDService service)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_service = service ?? throw new ArgumentNullException(nameof(service));
}
/// <summary>
/// Creates a new entity based on the provided DTO.
/// </summary>
/// <param name="createDto">The DTO from which to create the entity.</param>
/// <returns>A task that represents the asynchronous create operation. The task result contains the action result.</returns>
[HttpPost]
public virtual async Task<IActionResult> Create(TCreateDto createDto)
{
try
{
return await _service.CreateAsync(createDto).ThenAsync<TId, IActionResult>(
Success: id =>
{
var createdResource = new { Id = id };
var actionName = nameof(GetById);
var routeValues = new { id = createdResource.Id };
return CreatedAtAction(actionName, routeValues, createdResource);
},
Fail: (messages, notices) =>
{
_logger.LogNotice(notices);
return BadRequest(messages);
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
/// <summary>
/// Retrieves an entity by its identifier.
/// </summary>
/// <param name="id">The identifier of the entity to retrieve.</param>
/// <returns>A task that represents the asynchronous read operation. The task result contains the action result.</returns>
[HttpGet("{id}")]
public virtual async Task<IActionResult> GetById([FromRoute] TId id)
{
try
{
return await _service.ReadByIdAsync(id).ThenAsync(
Success: Ok,
Fail: IActionResult (messages, notices) =>
{
_logger.LogNotice(notices);
return NotFound(messages);
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
/// <summary>
/// Retrieves all entities.
/// </summary>
/// <returns>A task that represents the asynchronous read-all operation. The task result contains the action result.</returns>
[HttpGet]
public virtual async Task<IActionResult> GetAll()
{
try
{
return await _service.ReadAllAsync().ThenAsync(
Success: Ok,
Fail: IActionResult (messages, notices) =>
{
_logger.LogNotice(notices);
return NotFound(messages);
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
/// <summary>
/// Updates an existing entity based on the provided DTO.
/// </summary>
/// <param name="updateDto">The DTO containing the updated data for the entity.</param>
/// <returns>A task that represents the asynchronous update operation. The task result contains the action result.</returns>
[HttpPut]
public virtual async Task<IActionResult> Update(TUpdateDto updateDto)
{
try
{
return await _service.UpdateAsync(updateDto).ThenAsync(
Success: Ok,
Fail: IActionResult (messages, notices) =>
{
_logger.LogNotice(notices);
return BadRequest(messages);
});
}
catch(Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
/// <summary>
/// Deletes an entity by its identifier.
/// </summary>
/// <param name="id">The identifier of the entity to delete.</param>
/// <returns>A task that represents the asynchronous delete operation. The task result contains the action result.</returns>
[HttpDelete("{id}")]
public virtual async Task<IActionResult> Delete([FromRoute] TId id)
{
try
{
return await _service.DeleteAsyncById(id).ThenAsync(
Success: Ok,
Fail: IActionResult (messages, notices) =>
{
_logger.LogNotice(notices);
return BadRequest(messages);
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
}

View File

@@ -0,0 +1,47 @@
namespace DigitalData.Core.API
{
/// <summary>
/// Middleware to add Content Security Policy (CSP) headers to the HTTP response.
/// </summary>
public class CSPMiddleware
{
private readonly RequestDelegate _next;
private readonly string _policy;
/// <summary>
/// Initializes a new instance of the <see cref="CSPMiddleware"/> class.
/// </summary>
/// <param name="next">The next middleware in the request pipeline.</param>
/// <param name="policy">The CSP policy string with placeholders for nonces.</param>
public CSPMiddleware(RequestDelegate next, string policy)
{
_next = next;
_policy = policy;
}
/// <summary>
/// Invokes the middleware to add the CSP header to the response.
/// </summary>
/// <param name="context">The HTTP context.</param>
/// <returns>A task that represents the completion of request processing.</returns>
public async Task Invoke(HttpContext context)
{
// Generate a nonce (number used once) for inline scripts and styles
var nonce = Convert.ToBase64String(Guid.NewGuid().ToByteArray());
// Store the nonce in the context items for later use
context.Items["csp-nonce"] = nonce;
// Add the CSP header to the response
context.Response.OnStarting(() =>
{
context.Response.Headers.Add("Content-Security-Policy",
string.Format(_policy, nonce));
return Task.CompletedTask;
});
// Call the next middleware in the pipeline
await _next(context);
}
}
}

View File

@@ -0,0 +1,55 @@
using DigitalData.Core.DTO;
using Microsoft.AspNetCore.Mvc;
using System.Text;
namespace DigitalData.Core.API
{
/// <summary>
/// Provides extension methods for controllers in ASP.NET Core applications.
/// This class is designed to enhance the functionality of <see cref="Controller"/>, <see cref="ControllerBase"/>,
/// and their related results such as <see cref="ViewResult"/>.
/// </summary>
public static class ControllerExtensions
{
/// <summary>
/// Adds or updates a value in the ViewData dictionary of a ViewResult. This method supports fluent chaining,
/// enabling cleaner and more readable modifications to ViewData.
/// </summary>
/// <param name="viewResult">The ViewResult to which ViewData will be added or updated.</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>
/// <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)
{
viewResult.ViewData[index] = value;
return viewResult;
}
/// <summary>
/// Returns an ObjectResult representing an internal server error (status code 500) with optional exception and message details.
/// </summary>
/// <param name="controllerBase">The ControllerBase instance representing the controller.</param>
/// <param name="ex">Optional. The exception that occurred, if any.</param>
/// <param name="message">Optional. A custom error message to include in the response.</param>
/// /// <param name="messageKey">Optional. A custom error message key to include in the response.</param>
/// <returns>An ObjectResult representing an internal server error (status code 500).</returns>
public static ObjectResult InnerServiceError(this ControllerBase controllerBase, Exception? ex = null, string? message = null)
{
var sb = new StringBuilder();
if (ex is not null)
sb.AppendLine(ex.Message);
if (message is not null)
sb.AppendLine(message);
return controllerBase.StatusCode(500, sb.Length > 0 ? sb.ToString() : null);
}
/// <summary>
/// Returns an ObjectResult representing an internal server error (status code 500) with optional exception and message details.
/// </summary>
/// <param name="controllerBase">The ControllerBase instance representing the controller.</param>
/// <param name="result">Optional. A custom error resul to include in the response.</param>
/// <returns>An ObjectResult representing an internal server error (status code 500).</returns>
public static ObjectResult InnerServiceError(this ControllerBase controllerBase, Result? result = null) => controllerBase.StatusCode(500, result);
}
}

View File

@@ -0,0 +1,69 @@
using Microsoft.AspNetCore.Builder;
using System.Configuration;
namespace DigitalData.Core.API
{
/// <summary>
/// Provides extension methods for adding middleware to the application's request pipeline.
/// </summary>
public static class DIExtensions
{
/// <summary>
/// Adds the <see cref="CSPMiddleware"/> to the application's request pipeline to include
/// Content Security Policy (CSP) headers in the HTTP response.
/// </summary>
/// <param name="app">The application builder.</param>
/// <param name="policy">
/// The CSP policy string with placeholders. The first format parameter {0} will be replaced
/// by the nonce value.
/// </param>
/// <returns>The application builder with the CSP middleware added.</returns>
public static IApplicationBuilder UseCSPMiddleware(this IApplicationBuilder app, string policy)
=> app.UseMiddleware<CSPMiddleware>(policy);
/// <summary>
/// Checks if the DiP (Development in Production) mode is enabled for the WebApplicationBuilder.
/// </summary>
/// <param name="builder">The WebApplicationBuilder instance.</param>
/// <returns>True if DiP mode is enabled; otherwise, false.</returns>
public static bool IsDiP(this WebApplicationBuilder builder) => builder.Configuration.GetValue<bool>("DiPMode");
/// <summary>
/// Checks if the DiP (Development in Production) mode is enabled for the WebApplication.
/// </summary>
/// <param name="app">The WebApplication instance.</param>
/// <returns>True if DiP mode is enabled; otherwise, false.</returns>
public static bool IsDiP(this WebApplication app) => app.Configuration.GetValue<bool>("DiPMode");
/// <summary>
/// Checks if the environment is Development or DiP (Development in Production) mode is enabled for the WebApplicationBuilder.
/// </summary>
/// <param name="builder">The WebApplicationBuilder instance.</param>
/// <returns>True if the environment is Development or DiP mode is enabled; otherwise, false.</returns>
public static bool IsDevOrDiP(this WebApplicationBuilder builder) => builder.Environment.IsDevelopment() || builder.IsDiP();
/// <summary>
/// Checks if the environment is Development or DiP (Development in Production) mode is enabled for the WebApplication.
/// </summary>
/// <param name="app">The WebApplication instance.</param>
/// <returns>True if the environment is Development or DiP mode is enabled; otherwise, false.</returns>
public static bool IsDevOrDiP(this WebApplication app) => app.Environment.IsDevelopment() || app.IsDiP();
/// <summary>
/// Configures the services with options from the specified section of the appsettings.json file.
/// </summary>
/// <typeparam name="T">The options class type. Must be a reference type.</typeparam>
/// <param name="builder">The WebApplicationBuilder instance.</param>
/// <returns>The WebApplicationBuilder instance for chaining.</returns>
/// <exception cref="InvalidOperationException">Thrown if the section is not found in the configuration.</exception>
public static WebApplicationBuilder ConfigureBySection<T>(this WebApplicationBuilder builder) where T : class
{
var section = builder.Configuration.GetSection(typeof(T).Name);
if (!section.Exists())
throw new InvalidOperationException($"Section '{typeof(T).Name}' not found in appsettings.");
builder.Services.Configure<T>(section);
return builder;
}
}
}

View File

@@ -1,18 +1,47 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFrameworks>net7.0;net8.0</TargetFrameworks>
<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>
<PackageId>DigitalData.Core.API</PackageId>
<Version>2.0.1</Version>
<Authors>Digital Data GmbH</Authors>
<Company>Digital Data GmbH</Company>
<Product>DigitalData.Core.API</Product>
<Copyright>Copyright 2024</Copyright>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<PackageTags>digital data core api</PackageTags>
<PackageIcon>core_icon.png</PackageIcon>
<AssemblyVersion>2.0.1</AssemblyVersion>
<FileVersion>2.0.1</FileVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<None Include="..\..\nuget-package-icons\core_icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DigitalData.Core.Contracts\DigitalData.Core.Contracts.csproj" /> <ProjectReference Include="..\DigitalData.Core.Abstractions\DigitalData.Core.Abstractions.csproj" />
<ProjectReference Include="..\DigitalData.Core.DTO\DigitalData.Core.DTO.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="Assets\icon.png">
<PackagePath>\</PackagePath>
<Pack>True</Pack>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -0,0 +1,82 @@
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.Localization;
using System.Dynamic;
using System.Globalization;
namespace DigitalData.Core.API
{
/// <summary>
/// Provides extension methods for configuring localization services in an ASP.NET Core application.
/// These methods simplify the integration of cookie-based localization by setting up resource paths
/// and defining supported cultures.
/// </summary>
public static class LocalizationExtensions
{
/// <summary>
/// Adds localized resources and view localization services to the application.
/// </summary>
/// <param name="services">The IServiceCollection to add services to.</param>
/// <param name="resourcesPath">The path to the resource files used for localization.</param>
/// <returns>The IServiceCollection for chaining.</returns>
public static IServiceCollection AddCookieBasedLocalizer(this IServiceCollection services, string resourcesPath = "")
{
// Adds localization services with the specified resources path.
services.AddLocalization(options => options.ResourcesPath = resourcesPath)
// Adds MVC services with view localization and data annotations localization.
.AddMvc().AddViewLocalization(Microsoft.AspNetCore.Mvc.Razor.LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
return services;
}
/// <summary>
/// Configures the application to use cookie-based localization with support for multiple cultures.
/// </summary>
/// <param name="app">The IApplicationBuilder to configure.</param>
/// <param name="supportedCultureNames">A params array of supported culture names.</param>
/// <returns>The IApplicationBuilder for chaining.</returns>
public static IApplicationBuilder UseCookieBasedLocalizer(this IApplicationBuilder app, params string[] supportedCultureNames)
{
// Converts supported culture names into CultureInfo objects and checks for null or empty array.
IList<CultureInfo> supportedCultures = supportedCultureNames.Select(cn => new CultureInfo(cn)).ToList();
var defaultCultureInfo = supportedCultures.FirstOrDefault() ??
throw new ArgumentNullException(nameof(supportedCultureNames), "Supported cultures cannot be empty.");
// Configures localization options including default and supported cultures.
var options = new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture(culture: defaultCultureInfo.Name, uiCulture: defaultCultureInfo.Name),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
};
options.RequestCultureProviders.Add(new QueryStringRequestCultureProvider());
// Applies the localization settings to the application.
app.UseRequestLocalization(options);
return app;
}
/// <summary>
/// Converts all localized strings to a dictionary.
/// </summary>
/// <param name="localizer">The <see cref="IStringLocalizer"/> instance containing the localized strings.</param>
/// <returns>A dictionary containing all localized strings, where the key is the name of the string and the value is the localized value.</returns>
public static Dictionary<string, string> ToDictionary(this IStringLocalizer localizer) => localizer.GetAllStrings().ToDictionary(ls => ls.Name, ls => ls.Value);
/// <summary>
/// Converts the localized strings from an <see cref="IStringLocalizer"/> to a dynamic object.
/// </summary>
/// <param name="localizer">The string localizer to get localized strings from.</param>
/// <returns>A dynamic object containing all localized strings.</returns>
public static dynamic ToDynamic(this IStringLocalizer localizer)
{
var expando = new ExpandoObject() as IDictionary<string, object>;
foreach (var localizedString in localizer.GetAllStrings())
{
expando[localizedString.Name] = localizedString.Value;
}
return expando;
}
}
}

View File

@@ -1,12 +1,12 @@
{ {
"profiles": { "profiles": {
"DigitalData.Core.API": { "DigitalData.Core.API": {
"commandName": "Project", "commandName": "Project",
"launchBrowser": true, "launchBrowser": true,
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
}, },
"applicationUrl": "https://localhost:59445;http://localhost:59446" "applicationUrl": "https://localhost:50245;http://localhost:50246"
} }
} }
} }

View File

@@ -1,5 +1,5 @@
using DigitalData.Core.Contracts.Application; using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.Contracts.Infrastructure; using DigitalData.Core.DTO;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace DigitalData.Core.API namespace DigitalData.Core.API
@@ -7,21 +7,18 @@ namespace DigitalData.Core.API
/// <summary> /// <summary>
/// A base controller class providing Read operation for a specified entity type. /// A base controller class providing Read operation for a specified entity type.
/// </summary> /// </summary>
/// <typeparam name="TOriginalController">The derived controller type implementing this base class.</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="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 ReadControllerBase<TOriginalController, TBasicCRUDService, TCRUDRepository, TReadDto, TEntity, TId> : ControllerBase public class ReadControllerBase<TReadService, TReadDto, TEntity, TId> : ControllerBase
where TOriginalController : ReadControllerBase<TOriginalController, TBasicCRUDService, TCRUDRepository, TReadDto, TEntity, TId> where TReadService : IReadService<TReadDto, TEntity, TId>
where TBasicCRUDService : IBasicCRUDService<TCRUDRepository, TReadDto, TEntity, TId>
where TCRUDRepository : ICRUDRepository<TEntity, TId>
where TReadDto : class where TReadDto : class
where TEntity : class where TEntity : class
{ {
protected readonly ILogger<TOriginalController> _logger; protected readonly ILogger _logger;
protected readonly TBasicCRUDService _service; protected readonly TReadService _service;
/// <summary> /// <summary>
/// Initializes a new instance of the CRUDControllerBase class with specified logger and CRUD service. /// Initializes a new instance of the CRUDControllerBase class with specified logger and CRUD service.
@@ -29,8 +26,8 @@ namespace DigitalData.Core.API
/// <param name="logger">The logger to be used by the controller.</param> /// <param name="logger">The logger to be used by the controller.</param>
/// <param name="service">The CRUD service handling business logic for the entity.</param> /// <param name="service">The CRUD service handling business logic for the entity.</param>
public ReadControllerBase( public ReadControllerBase(
ILogger<TOriginalController> logger, ILogger logger,
TBasicCRUDService service) TReadService service)
{ {
_logger = logger; _logger = logger;
_service = service; _service = service;
@@ -44,12 +41,13 @@ namespace DigitalData.Core.API
[HttpGet("{id}")] [HttpGet("{id}")]
public virtual async Task<IActionResult> GetById([FromRoute] TId id) public virtual async Task<IActionResult> GetById([FromRoute] TId id)
{ {
var result = await _service.ReadByIdAsync(id); return await _service.ReadByIdAsync(id).ThenAsync(
if (result.IsSuccess) Success: Ok,
{ Fail: IActionResult (messages, notices) =>
return Ok(result); {
} _logger.LogNotice(notices);
return NotFound(result); return NotFound(messages);
});
} }
/// <summary> /// <summary>
@@ -59,12 +57,13 @@ namespace DigitalData.Core.API
[HttpGet] [HttpGet]
public virtual async Task<IActionResult> GetAll() public virtual async Task<IActionResult> GetAll()
{ {
var result = await _service.ReadAllAsync(); return await _service.ReadAllAsync().ThenAsync(
if (result.IsSuccess) Success: Ok,
{ Fail: IActionResult (messages, notices) =>
return Ok(result); {
} _logger.LogNotice(notices);
return NotFound(result); return NotFound(messages);
});
} }
} }
} }

View File

@@ -0,0 +1,86 @@
using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.DTO;
using Microsoft.AspNetCore.Mvc;
namespace DigitalData.Core.API
{
/// <summary>
/// A base controller class providing Read operation for a specified entity type,
/// with enhanced error handling to ensure robust and reliable API endpoints.
/// </summary>
/// <typeparam name="TReadDto">The Data Transfer Object type for read operations.</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>
[ApiController]
[Route("api/[controller]")]
public class ReadControllerBaseWithErrorHandling<TReadService, TReadDto, TEntity, TId> : ControllerBase
where TReadService : IReadService<TReadDto, TEntity, TId>
where TReadDto : class
where TEntity : class
{
protected readonly ILogger _logger;
protected readonly TReadService _service;
/// <summary>
/// Initializes a new instance of the CRUDControllerBase class with specified logger and CRUD service.
/// </summary>
/// <param name="logger">The logger to be used by the controller.</param>
/// <param name="service">The CRUD service handling business logic for the entity.</param>
public ReadControllerBaseWithErrorHandling(
ILogger logger,
TReadService service)
{
_logger = logger;
_service = service;
}
/// <summary>
/// Retrieves an entity by its identifier.
/// </summary>
/// <param name="id">The identifier of the entity to retrieve.</param>
/// <returns>A task that represents the asynchronous read operation. The task result contains the action result.</returns>
[HttpGet("{id}")]
public virtual async Task<IActionResult> GetById([FromRoute] TId id)
{
try
{
return await _service.ReadByIdAsync(id).ThenAsync(
Success: Ok,
Fail: IActionResult (messages, notices) =>
{
_logger.LogNotice(notices);
return NotFound(messages);
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
/// <summary>
/// Retrieves all entities.
/// </summary>
/// <returns>A task that represents the asynchronous read-all operation. The task result contains the action result.</returns>
[HttpGet]
public virtual async Task<IActionResult> GetAll()
{
try
{
return await _service.ReadAllAsync().ThenAsync(
Success: Ok,
Fail: IActionResult (messages, notices) =>
{
_logger.LogNotice(notices);
return NotFound(messages);
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
}

View File

@@ -1,398 +0,0 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v7.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v7.0": {
"DigitalData.Core.API/1.0.0": {
"dependencies": {
"DigitalData.Core.Contracts": "1.0.0",
"Microsoft.Extensions.Logging": "7.0.0"
},
"runtime": {
"DigitalData.Core.API.dll": {}
}
},
"Microsoft.Extensions.Caching.Abstractions/7.0.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "7.0.0"
}
},
"Microsoft.Extensions.Caching.Memory/7.0.0": {
"dependencies": {
"Microsoft.Extensions.Caching.Abstractions": "7.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
"Microsoft.Extensions.Logging.Abstractions": "7.0.0",
"Microsoft.Extensions.Options": "7.0.0",
"Microsoft.Extensions.Primitives": "7.0.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions/7.0.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "7.0.0"
}
},
"Microsoft.Extensions.Configuration.Binder/7.0.4": {
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.Configuration.Binder.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.423.11508"
}
}
},
"Microsoft.Extensions.DependencyInjection/7.0.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions/7.0.0": {},
"Microsoft.Extensions.Logging/7.0.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "7.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
"Microsoft.Extensions.Logging.Abstractions": "7.0.0",
"Microsoft.Extensions.Options": "7.0.0"
}
},
"Microsoft.Extensions.Logging.Abstractions/7.0.0": {},
"Microsoft.Extensions.Options/7.0.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
"Microsoft.Extensions.Primitives": "7.0.0"
}
},
"Microsoft.Extensions.Primitives/7.0.0": {},
"Microsoft.Win32.SystemEvents/7.0.0": {
"runtime": {
"lib/net7.0/Microsoft.Win32.SystemEvents.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/Microsoft.Win32.SystemEvents.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Configuration.ConfigurationManager/7.0.0": {
"dependencies": {
"System.Diagnostics.EventLog": "7.0.0",
"System.Security.Cryptography.ProtectedData": "7.0.0",
"System.Security.Permissions": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Configuration.ConfigurationManager.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Diagnostics.EventLog/7.0.0": {},
"System.DirectoryServices/7.0.1": {
"dependencies": {
"System.Security.Permissions": "7.0.0"
},
"runtime": {
"lib/net7.0/System.DirectoryServices.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "7.0.323.6910"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.DirectoryServices.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "4.0.0.0",
"fileVersion": "7.0.323.6910"
}
}
},
"System.DirectoryServices.AccountManagement/7.0.1": {
"dependencies": {
"System.Configuration.ConfigurationManager": "7.0.0",
"System.DirectoryServices": "7.0.1",
"System.DirectoryServices.Protocols": "7.0.1"
},
"runtime": {
"lib/net7.0/System.DirectoryServices.AccountManagement.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "7.0.1123.42427"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.DirectoryServices.AccountManagement.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "4.0.0.0",
"fileVersion": "7.0.1123.42427"
}
}
},
"System.DirectoryServices.Protocols/7.0.1": {
"runtime": {
"lib/net7.0/System.DirectoryServices.Protocols.dll": {
"assemblyVersion": "7.0.0.1",
"fileVersion": "7.0.723.27404"
}
},
"runtimeTargets": {
"runtimes/linux/lib/net7.0/System.DirectoryServices.Protocols.dll": {
"rid": "linux",
"assetType": "runtime",
"assemblyVersion": "7.0.0.1",
"fileVersion": "7.0.723.27404"
},
"runtimes/osx/lib/net7.0/System.DirectoryServices.Protocols.dll": {
"rid": "osx",
"assetType": "runtime",
"assemblyVersion": "7.0.0.1",
"fileVersion": "7.0.723.27404"
},
"runtimes/win/lib/net7.0/System.DirectoryServices.Protocols.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.1",
"fileVersion": "7.0.723.27404"
}
}
},
"System.Drawing.Common/7.0.0": {
"dependencies": {
"Microsoft.Win32.SystemEvents": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Drawing.Common.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.Drawing.Common.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Security.Cryptography.ProtectedData/7.0.0": {
"runtime": {
"lib/net7.0/System.Security.Cryptography.ProtectedData.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.Security.Cryptography.ProtectedData.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Security.Permissions/7.0.0": {
"dependencies": {
"System.Windows.Extensions": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Security.Permissions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Windows.Extensions/7.0.0": {
"dependencies": {
"System.Drawing.Common": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Windows.Extensions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.Windows.Extensions.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"DigitalData.Core.Contracts/1.0.0": {
"dependencies": {
"Microsoft.Extensions.Caching.Memory": "7.0.0",
"Microsoft.Extensions.Configuration.Binder": "7.0.4",
"System.DirectoryServices": "7.0.1",
"System.DirectoryServices.AccountManagement": "7.0.1"
},
"runtime": {
"DigitalData.Core.Contracts.dll": {}
}
}
}
},
"libraries": {
"DigitalData.Core.API/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.Extensions.Caching.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-IeimUd0TNbhB4ded3AbgBLQv2SnsiVugDyGV1MvspQFVlA07nDC7Zul7kcwH5jWN3JiTcp/ySE83AIJo8yfKjg==",
"path": "microsoft.extensions.caching.abstractions/7.0.0",
"hashPath": "microsoft.extensions.caching.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Caching.Memory/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-xpidBs2KCE2gw1JrD0quHE72kvCaI3xFql5/Peb2GRtUuZX+dYPoK/NTdVMiM67Svym0M0Df9A3xyU0FbMQhHw==",
"path": "microsoft.extensions.caching.memory/7.0.0",
"hashPath": "microsoft.extensions.caching.memory.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==",
"path": "microsoft.extensions.configuration.abstractions/7.0.0",
"hashPath": "microsoft.extensions.configuration.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.Binder/7.0.4": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8+XPvJnHZsYgHOQlcMuQe7QNF5KdVKHH1F/wW3nd8/u81Gk/XFAYMDP0Lpz18h7/AM95M662vvqMorcYxCBB4w==",
"path": "microsoft.extensions.configuration.binder/7.0.4",
"hashPath": "microsoft.extensions.configuration.binder.7.0.4.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==",
"path": "microsoft.extensions.dependencyinjection/7.0.0",
"hashPath": "microsoft.extensions.dependencyinjection.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==",
"path": "microsoft.extensions.dependencyinjection.abstractions/7.0.0",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Logging/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==",
"path": "microsoft.extensions.logging/7.0.0",
"hashPath": "microsoft.extensions.logging.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==",
"path": "microsoft.extensions.logging.abstractions/7.0.0",
"hashPath": "microsoft.extensions.logging.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Options/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==",
"path": "microsoft.extensions.options/7.0.0",
"hashPath": "microsoft.extensions.options.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Primitives/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==",
"path": "microsoft.extensions.primitives/7.0.0",
"hashPath": "microsoft.extensions.primitives.7.0.0.nupkg.sha512"
},
"Microsoft.Win32.SystemEvents/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ==",
"path": "microsoft.win32.systemevents/7.0.0",
"hashPath": "microsoft.win32.systemevents.7.0.0.nupkg.sha512"
},
"System.Configuration.ConfigurationManager/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-WvRUdlL1lB0dTRZSs5XcQOd5q9MYNk90GkbmRmiCvRHThWiojkpGqWdmEDJdXyHbxG/BhE5hmVbMfRLXW9FJVA==",
"path": "system.configuration.configurationmanager/7.0.0",
"hashPath": "system.configuration.configurationmanager.7.0.0.nupkg.sha512"
},
"System.Diagnostics.EventLog/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-eUDP47obqQm3SFJfP6z+Fx2nJ4KKTQbXB4Q9Uesnzw9SbYdhjyoGXuvDn/gEmFY6N5Z3bFFbpAQGA7m6hrYJCw==",
"path": "system.diagnostics.eventlog/7.0.0",
"hashPath": "system.diagnostics.eventlog.7.0.0.nupkg.sha512"
},
"System.DirectoryServices/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Z4FVdUJEVXbf7/f/hU6cFZDtxN5ozUVKJMzXoHmC+GCeTcqzlxqmWtxurejxG3K+kZ6H0UKwNshoK1CYnmJ1sg==",
"path": "system.directoryservices/7.0.1",
"hashPath": "system.directoryservices.7.0.1.nupkg.sha512"
},
"System.DirectoryServices.AccountManagement/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-UNytHYwA5IF55WQhashsMG57ize83JUGJxD8YJlOyO9ZlMTOD4Nt7y+A6mvmrU/swDoYWaVL+TNwE6hk9lyvbA==",
"path": "system.directoryservices.accountmanagement/7.0.1",
"hashPath": "system.directoryservices.accountmanagement.7.0.1.nupkg.sha512"
},
"System.DirectoryServices.Protocols/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-t9hsL+UYRzNs30pnT2Tdx6ngX8McFUjru0a0ekNgu/YXfkXN+dx5OvSEv0/p7H2q3pdJLH7TJPWX7e55J8QB9A==",
"path": "system.directoryservices.protocols/7.0.1",
"hashPath": "system.directoryservices.protocols.7.0.1.nupkg.sha512"
},
"System.Drawing.Common/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
"path": "system.drawing.common/7.0.0",
"hashPath": "system.drawing.common.7.0.0.nupkg.sha512"
},
"System.Security.Cryptography.ProtectedData/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-xSPiLNlHT6wAHtugASbKAJwV5GVqQK351crnILAucUioFqqieDN79evO1rku1ckt/GfjIn+b17UaSskoY03JuA==",
"path": "system.security.cryptography.protecteddata/7.0.0",
"hashPath": "system.security.cryptography.protecteddata.7.0.0.nupkg.sha512"
},
"System.Security.Permissions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Vmp0iRmCEno9BWiskOW5pxJ3d9n+jUqKxvX4GhLwFhnQaySZmBN2FuC0N5gjFHgyFMUjC5sfIJ8KZfoJwkcMmA==",
"path": "system.security.permissions/7.0.0",
"hashPath": "system.security.permissions.7.0.0.nupkg.sha512"
},
"System.Windows.Extensions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-bR4qdCmssMMbo9Fatci49An5B1UaVJZHKNq70PRgzoLYIlitb8Tj7ns/Xt5Pz1CkERiTjcVBDU2y1AVrPBYkaw==",
"path": "system.windows.extensions/7.0.0",
"hashPath": "system.windows.extensions.7.0.0.nupkg.sha512"
},
"DigitalData.Core.Contracts/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}

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.API")]
[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.API")]
[assembly: System.Reflection.AssemblyTitleAttribute("DigitalData.Core.API")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@@ -1 +0,0 @@
7d1ea8004d4313e68e39d2fb57a90dde56c76724

View File

@@ -1,17 +0,0 @@
is_global = true
build_property.TargetFramework = net7.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb = true
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = DigitalData.Core.API
build_property.RootNamespace = DigitalData.Core.API
build_property.ProjectDir = E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\
build_property.RazorLangVersion = 7.0
build_property.SupportLocalizedComponentNames =
build_property.GenerateRazorMetadataSourceChecksumAttributes =
build_property.MSBuildProjectDirectory = E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API
build_property._RazorSourceGeneratorDebug =

View File

@@ -1,17 +0,0 @@
// <auto-generated/>
global using global::Microsoft.AspNetCore.Builder;
global using global::Microsoft.AspNetCore.Hosting;
global using global::Microsoft.AspNetCore.Http;
global using global::Microsoft.AspNetCore.Routing;
global using global::Microsoft.Extensions.Configuration;
global using global::Microsoft.Extensions.DependencyInjection;
global using global::Microsoft.Extensions.Hosting;
global using global::Microsoft.Extensions.Logging;
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.Net.Http.Json;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -1 +0,0 @@
59f2783e50792a73219c75f235364a0eca9fd664

View File

@@ -1,92 +0,0 @@
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.API.deps.json
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.API.dll
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.API.pdb
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.csproj.AssemblyReference.cache
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.GeneratedMSBuildEditorConfig.editorconfig
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.AssemblyInfoInputs.cache
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.AssemblyInfo.cs
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.csproj.CoreCompileInputs.cache
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.DigitalData.Core.API.Microsoft.AspNetCore.StaticWebAssets.props
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.build.DigitalData.Core.API.props
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.buildMultiTargeting.DigitalData.Core.API.props
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.buildTransitive.DigitalData.Core.API.props
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets.pack.json
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets.build.json
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets.development.json
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\scopedcss\bundle\DigitalData.Core.API.styles.css
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.csproj.CopyComplete
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.dll
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\refint\DigitalData.Core.API.dll
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.pdb
E:\TekH\Visual Studio\DigitalData\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\ref\DigitalData.Core.API.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.API.deps.json
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.API.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.API.pdb
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.csproj.AssemblyReference.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.GeneratedMSBuildEditorConfig.editorconfig
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.AssemblyInfoInputs.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.AssemblyInfo.cs
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.csproj.CoreCompileInputs.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.DigitalData.Core.API.Microsoft.AspNetCore.StaticWebAssets.props
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.build.DigitalData.Core.API.props
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.buildMultiTargeting.DigitalData.Core.API.props
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.buildTransitive.DigitalData.Core.API.props
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets.pack.json
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets.build.json
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets.development.json
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\scopedcss\bundle\DigitalData.Core.API.styles.css
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.csproj.CopyComplete
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\refint\DigitalData.Core.API.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.pdb
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.API\obj\Debug\net7.0\ref\DigitalData.Core.API.dll
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.API.deps.json
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.API.dll
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.API.pdb
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.csproj.AssemblyReference.cache
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.GeneratedMSBuildEditorConfig.editorconfig
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.AssemblyInfoInputs.cache
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.AssemblyInfo.cs
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.csproj.CoreCompileInputs.cache
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.DigitalData.Core.API.Microsoft.AspNetCore.StaticWebAssets.props
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.build.DigitalData.Core.API.props
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.buildMultiTargeting.DigitalData.Core.API.props
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.buildTransitive.DigitalData.Core.API.props
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets.pack.json
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets.build.json
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets.development.json
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\scopedcss\bundle\DigitalData.Core.API.styles.css
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.csproj.CopyComplete
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.dll
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\refint\DigitalData.Core.API.dll
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.pdb
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\ref\DigitalData.Core.API.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.API.deps.json
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.API.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.API.pdb
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.csproj.AssemblyReference.cache
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.GeneratedMSBuildEditorConfig.editorconfig
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.AssemblyInfoInputs.cache
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.AssemblyInfo.cs
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.csproj.CoreCompileInputs.cache
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.DigitalData.Core.API.Microsoft.AspNetCore.StaticWebAssets.props
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.build.DigitalData.Core.API.props
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.buildMultiTargeting.DigitalData.Core.API.props
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets\msbuild.buildTransitive.DigitalData.Core.API.props
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets.pack.json
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets.build.json
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\staticwebassets.development.json
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\scopedcss\bundle\DigitalData.Core.API.styles.css
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.csproj.CopyComplete
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\refint\DigitalData.Core.API.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\DigitalData.Core.API.pdb
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.API\obj\Debug\net7.0\ref\DigitalData.Core.API.dll

View File

@@ -1,11 +0,0 @@
{
"Version": 1,
"Hash": "4+tU9KKVv53aK5RYsuialTUxw3XqQuMYDrHUVjaTeKo=",
"Source": "DigitalData.Core.API",
"BasePath": "_content/DigitalData.Core.API",
"Mode": "Default",
"ManifestType": "Build",
"ReferencedProjectsConfiguration": [],
"DiscoveryPatterns": [],
"Assets": []
}

View File

@@ -1,3 +0,0 @@
<Project>
<Import Project="Microsoft.AspNetCore.StaticWebAssets.props" />
</Project>

View File

@@ -1,3 +0,0 @@
<Project>
<Import Project="..\build\DigitalData.Core.API.props" />
</Project>

View File

@@ -1,3 +0,0 @@
<Project>
<Import Project="..\buildMultiTargeting\DigitalData.Core.API.props" />
</Project>

View File

@@ -1,171 +0,0 @@
{
"format": 1,
"restore": {
"E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.API\\DigitalData.Core.API.csproj": {}
},
"projects": {
"E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.API\\DigitalData.Core.API.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.API\\DigitalData.Core.API.csproj",
"projectName": "DigitalData.Core.API",
"projectPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.API\\DigitalData.Core.API.csproj",
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
"outputPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.API\\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\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
"projectPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj"
}
}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"dependencies": {
"Microsoft.Extensions.Logging": {
"target": "Package",
"version": "[7.0.0, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.AspNetCore.App": {
"privateAssets": "none"
},
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.202\\RuntimeIdentifierGraph.json"
}
}
},
"E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
"projectName": "DigitalData.Core.Contracts",
"projectPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
"outputPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\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": {
"Microsoft.Extensions.Caching.Memory": {
"target": "Package",
"version": "[7.0.0, )"
},
"Microsoft.Extensions.Configuration.Binder": {
"target": "Package",
"version": "[7.0.4, )"
},
"System.DirectoryServices": {
"target": "Package",
"version": "[7.0.1, )"
},
"System.DirectoryServices.AccountManagement": {
"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"
}
}
}
}
}

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,6 +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=" '$(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>

File diff suppressed because it is too large Load Diff

View File

@@ -1,29 +0,0 @@
{
"version": 2,
"dgSpecHash": "ziLIEWsKtXzM+1p9xIcd95VClmuwIIVugVL7dkBzQoH6v10ibYNoFJNQ+dzv0oYSkn8+FpgbdtPIV/MKZ+mztw==",
"success": true,
"projectFilePath": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.API\\DigitalData.Core.API.csproj",
"expectedPackageFiles": [
"C:\\Users\\tekh\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\7.0.0\\microsoft.extensions.caching.abstractions.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\microsoft.extensions.caching.memory\\7.0.0\\microsoft.extensions.caching.memory.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\7.0.0\\microsoft.extensions.configuration.abstractions.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\microsoft.extensions.configuration.binder\\7.0.4\\microsoft.extensions.configuration.binder.7.0.4.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\7.0.0\\microsoft.extensions.dependencyinjection.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\7.0.0\\microsoft.extensions.dependencyinjection.abstractions.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\microsoft.extensions.logging\\7.0.0\\microsoft.extensions.logging.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\7.0.0\\microsoft.extensions.logging.abstractions.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\microsoft.extensions.options\\7.0.0\\microsoft.extensions.options.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\microsoft.extensions.primitives\\7.0.0\\microsoft.extensions.primitives.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\microsoft.win32.systemevents\\7.0.0\\microsoft.win32.systemevents.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\system.configuration.configurationmanager\\7.0.0\\system.configuration.configurationmanager.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\system.diagnostics.eventlog\\7.0.0\\system.diagnostics.eventlog.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\system.directoryservices\\7.0.1\\system.directoryservices.7.0.1.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\system.directoryservices.accountmanagement\\7.0.1\\system.directoryservices.accountmanagement.7.0.1.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\system.directoryservices.protocols\\7.0.1\\system.directoryservices.protocols.7.0.1.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\system.drawing.common\\7.0.0\\system.drawing.common.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\system.security.cryptography.protecteddata\\7.0.0\\system.security.cryptography.protecteddata.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\system.security.permissions\\7.0.0\\system.security.permissions.7.0.0.nupkg.sha512",
"C:\\Users\\tekh\\.nuget\\packages\\system.windows.extensions\\7.0.0\\system.windows.extensions.7.0.0.nupkg.sha512"
],
"logs": []
}

View File

@@ -1,6 +1,6 @@
using DigitalData.Core.Contracts.Infrastructure; using DigitalData.Core.Abstractions.Infrastructure;
namespace DigitalData.Core.Contracts.Application namespace DigitalData.Core.Abstractions.Application
{ {
/// <summary> /// <summary>
/// Implements a simplified CRUD service interface that uses a single Data Transfer Object (DTO) type for all CRUD operations, /// Implements a simplified CRUD service interface that uses a single Data Transfer Object (DTO) type for all CRUD operations,
@@ -8,7 +8,6 @@ namespace DigitalData.Core.Contracts.Application
/// This interface inherits from the ICRUDService interface, applying the same DTO type for all generic type parameters, /// This interface inherits from the ICRUDService interface, applying the same DTO type for all generic type parameters,
/// thereby simplifying the usage for cases where a single DTO is sufficient for all operations on an entity. /// thereby simplifying the usage for cases where a single DTO is sufficient for all operations on an entity.
/// </summary> /// </summary>
/// <typeparam name="TCRUDRepository">The repository type that provides CRUD operations for entities of type TEntity.</typeparam>
/// <typeparam name="TDto">The type of the Data Transfer Object used for all CRUD operations.</typeparam> /// <typeparam name="TDto">The type of the Data Transfer Object used for all CRUD operations.</typeparam>
/// <typeparam name="TEntity">The type of the entity this service maps to.</typeparam> /// <typeparam name="TEntity">The type of the entity this service maps to.</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>
@@ -16,8 +15,8 @@ namespace DigitalData.Core.Contracts.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<TCRUDRepository, TDto, TEntity, TId> : ICRUDService<TCRUDRepository, TDto, TDto, TDto, TEntity, TId> public interface IBasicCRUDService<TDto, TEntity, TId> : ICRUDService<TDto, TDto, TDto, TEntity, TId>
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TDto : class where TEntity : class where TDto : class, IUnique<TId> where TEntity : class, IUnique<TId>
{ {
} }
} }

View File

@@ -0,0 +1,25 @@
using DigitalData.Core.DTO;
namespace DigitalData.Core.Abstractions.Application
{
public interface ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : IReadService<TReadDto, TEntity, TId>
where TCreateDto : class where TReadDto : class where TUpdateDto : IUnique<TId> where TEntity : class, IUnique<TId>
{
/// <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}"/>.
/// The <see cref="DataResult{TId}"/> contains the identifier of the newly created entity on success or an error message on failure.
/// </summary>
/// <param name="createDto">The data transfer object containing the information for the new entity.</param>
/// <returns>A task representing the asynchronous operation, with a <see cref="DataResult{TId}"/> containing the identifier of the created entity or an error message.</returns>
Task<DataResult<TId>> CreateAsync(TCreateDto createDto);
/// <summary>
/// Updates an existing entity based on the provided updateDTO and returns the result wrapped in an IServiceMessage,
/// indicating the success or failure of the operation, including the error messages on failure.
/// </summary>
/// <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>
Task<Result> UpdateAsync(TUpdateDto updateDto);
}
}

View File

@@ -0,0 +1,26 @@
using DigitalData.Core.DTO;
using System.DirectoryServices;
namespace DigitalData.Core.Abstractions.Application
{
public interface IDirectorySearchService
{
public string ServerName { get; }
public string Root { get; }
string SearchRootPath { get; }
Dictionary<string, string> CustomSearchFilters { get; }
bool ValidateCredentials(string dirEntryUsername, string dirEntryPassword);
DataResult<IEnumerable<ResultPropertyCollection>> FindAll(DirectoryEntry searchRoot, 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);
void SetSearchRootCache(string username, string password);
DirectoryEntry? GetSearchRootCache(string username);
}
}

View File

@@ -0,0 +1,41 @@
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Cryptography;
namespace DigitalData.Core.Application
{
/// <summary>
/// Defines the operations for JWT service handling claims of type <typeparamref name="TClaimValue"/>.
/// </summary>
public interface IJWTService<TClaimValue>
{
/// <summary>
/// Generates a symmetric security key with the specified byte size.
/// </summary>
/// <param name="byteSize">The size of the security key in bytes. Default is 32 bytes.</param>
/// <returns>A new instance of <see cref="SymmetricSecurityKey"/>.</returns>
public static SymmetricSecurityKey GenerateSecurityKey(int byteSize = 32)
{
using var rng = RandomNumberGenerator.Create();
var randomBytes = new byte[byteSize];
rng.GetBytes(randomBytes);
var securityKey = new SymmetricSecurityKey(randomBytes);
return securityKey;
}
/// <summary>
/// Generates a token based on the specified claim value.
/// </summary>
/// <param name="claimValue">The claim value to encode in the token.</param>
/// <returns>A JWT as a string.</returns>
string GenerateToken(TClaimValue claimValue);
/// <summary>
/// Reads and validates a security token from a string representation.
/// </summary>
/// <param name="token">The JWT to read.</param>
/// <returns>A <see cref="JwtSecurityToken"/> if the token is valid; otherwise, null.</returns>
JwtSecurityToken? ReadSecurityToken(string token);
}
}

View File

@@ -0,0 +1,38 @@
using DigitalData.Core.DTO;
namespace DigitalData.Core.Abstractions.Application
{
public interface IReadService<TReadDto, TEntity, TId>
where TReadDto : class where TEntity : class
{
/// <summary>
/// Retrieves an entity by its identifier and returns its readDTO representation wrapped in an IServiceResult,
/// including the readDTO on success or null and an error message on failure.
/// </summary>
/// <param name="id">The identifier of the entity to retrieve.</param>
/// <returns>An DataResult containing the readDTO representing the found entity or null, with an appropriate message.</returns>
Task<DataResult<TReadDto>> ReadByIdAsync(TId id);
/// <summary>
/// Retrieves all entities and returns their readDTO representations wrapped in an IServiceResult,
/// including a collection of readDTOs on success or an error message on failure.
/// </summary>
/// <returns>An DataResult containing a collection of readDTOs representing all entities or an error message.</returns>
Task<DataResult<IEnumerable<TReadDto>>> ReadAllAsync();
/// <summary>
/// Deletes an entity by its identifier and returns the result wrapped in an IServiceMessage,
/// indicating the success or failure of the operation, including the error messages on failure.
/// </summary>
/// <param name="id">The identifier of the entity to delete.</param>
/// <returns>An Result indicating the outcome of the delete operation, with an appropriate message.</returns>
Task<Result> DeleteAsyncById(TId id);
/// <summary>
/// Asynchronously checks if an entity with the specified identifier exists within the data store.
/// </summary>
/// <param name="id">The identifier of the entity to check.</param>
/// <returns>A task that represents the asynchronous operation. The task result contains a boolean value indicating whether the entity exists.</returns>
Task<bool> HasEntity(TId id);
}
}

View File

@@ -0,0 +1,22 @@
using System.Net;
namespace DigitalData.Core.Abstractions.Client
{
public interface IBaseHttpClientService
{
CookieCollection GetCookies(string path = "");
Task<HttpResponseMessage> FetchAsync(
string? scheme = null,
int? port = null,
string path = "",
IEnumerable<KeyValuePair<string, object?>>? queryParams = null,
HttpMethod? method = null,
HttpContent? body = null,
IEnumerable<KeyValuePair<string, object>>? form = null,
IEnumerable<KeyValuePair<string, object>>? headers = null,
bool sendWithCookie = true,
bool saveCookie = true
);
}
}

View File

@@ -0,0 +1,13 @@
namespace DigitalData.Core.Abstractions.Client
{
public interface IHttpClientOptions
{
string Uri { get; init; }
string? Path { get; init; }
Dictionary<string, object>? Headers { get; init; }
Dictionary<string, object?>? QueryParams { get; init; }
}
}

View File

@@ -0,0 +1,6 @@
namespace DigitalData.Core.Abstractions.Client
{
public interface IHttpClientService<TClientOptions> : IBaseHttpClientService where TClientOptions : IHttpClientOptions
{
}
}

View File

@@ -0,0 +1,44 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<!-- NuGet Package Metadata -->
<PackageId>DigitalData.Core.Abstractions</PackageId>
<Authors>Digital Data GmbH</Authors>
<Company>Digital Data GmbH</Company>
<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>
<PackageTags>digital data core abstractions clean architecture</PackageTags>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<Copyright>Copyright 2024</Copyright>
<PackageProjectUrl></PackageProjectUrl>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<PackAsTool>False</PackAsTool>
<PackageIcon>core_icon.png</PackageIcon>
<Version>2.2.1</Version>
<AssemblyVersion>2.2.1</AssemblyVersion>
<FileVersion>2.2.1</FileVersion>
</PropertyGroup>
<ItemGroup>
<None Include="..\..\nuget-package-icons\core_icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="7.0.4" />
<PackageReference Include="System.DirectoryServices" Version="7.0.1" />
<PackageReference Include="System.DirectoryServices.AccountManagement" Version="7.0.1" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.5.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DigitalData.Core.DTO\DigitalData.Core.DTO.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,7 @@
namespace DigitalData.Core.Abstractions
{
public interface IUnique<T>
{
public T Id { get; }
}
}

View File

@@ -1,11 +1,11 @@
namespace DigitalData.Core.Contracts.Infrastructure namespace DigitalData.Core.Abstractions.Infrastructure
{ {
/// <summary> /// <summary>
/// Defines the contract for CRUD operations on a repository for entities of type TEntity. /// Defines the contract for CRUD operations on a repository for entities of type TEntity.
/// </summary> /// </summary>
/// <typeparam name="TEntity">The type of the entity this repository works with.</typeparam> /// <typeparam name="TEntity">The type of the entity this repository works with.</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 interface ICRUDRepository<TEntity, TId> where TEntity : class public interface ICRUDRepository<TEntity, TId> where TEntity : class, IUnique<TId>
{ {
/// <summary> /// <summary>
/// Adds a new entity to the repository. /// Adds a new entity to the repository.
@@ -40,5 +40,23 @@
/// <param name="entity">The entity to delete.</param> /// <param name="entity">The entity to delete.</param>
/// <returns>If entity is deleted, return true othwerwise return false.</returns> /// <returns>If entity is deleted, return true othwerwise return false.</returns>
Task<bool> DeleteAsync(TEntity entity); Task<bool> DeleteAsync(TEntity entity);
/// <summary>
/// Asynchronously counts all entities in the repository.
/// </summary>
/// <returns>The total number of entities in the repository.</returns>
Task<int> CountAsync();
/// <summary>
/// Asynchronously counts the number of entities in the repository that match a specific identifier.
/// </summary>
/// <param name="id">The identifier of the entities to count.</param>
/// <returns>The number of entities with the specified identifier.</returns>
/// <remarks>
/// This method provides a count of entities in the database that match the given identifier.
/// If there are multiple entities with the same identifier, they will all be counted.
/// The default implementation assumes that the identifier is unique for each entity.
/// </remarks>
Task<int> CountAsync(TId id);
} }
} }

View File

@@ -0,0 +1,48 @@
using System.Security.Cryptography;
namespace DigitalData.Core.Abstractions.Security
{
public interface ICryptFactory
{
int KeySizeInBits { get; init; }
string PbePassword { init; }
PbeEncryptionAlgorithm PbeEncryptionAlgorithm { get; init; }
HashAlgorithmName PbeHashAlgorithmName { get; init; }
int PbeIterationCount { get; init; }
PbeParameters PbeParameters { get; }
string EncryptedPrivateKeyPemLabel { get; init; }
/// <summary>
/// Gets the formatter function for generating RSA key names.
/// This formatter takes an issuer, audience, isPrivate, and optional version and separator
/// to produce a formatted string used for the key naming convention.
/// </summary>
/// <param name="issuer">A string representing the issuer of the key. It should not contain invalid file name characters or the separator.</param>
/// <param name="audience">A string representing the audience for which the key is intended. It should not contain invalid file name characters or the separator.</param>
/// <param name="isPrivate">An bool to check if the key is private.</param>
/// <param name="version">An instance of the <see cref="Version?"/> interface, which is used to keep the version of Pbe password.</param>
/// <param name="separator">An optional string separator used to separate the issuer and audience. The default is "-_-". It should not be included in the issuer or audience strings.</param>
/// <returns>A formatted string combining the issuer, audience, and separator, which adheres to valid file naming rules.</returns>
/// <exception cref="ArgumentException">Thrown when the issuer, audience, or separator contains invalid characters or when the separator is present within the issuer or audience.</exception>
Func<string, string, bool, Version?, string?, string> RSAKeyNameFormatter { get; }
string CreateRSAPrivateKeyPem(int? keySizeInBits = null);
string CreateEncryptedPrivateKeyPem(
int? keySizeInBits = null,
string? password = null,
PbeEncryptionAlgorithm? pbeEncryptionAlgorithm = null,
HashAlgorithmName? hashAlgorithmName = null,
int? iterationCount = null);
IRSADecryptor this[string key] { get; }
bool TryGetRSADecryptor(string key, out IRSADecryptor? decryptor);
}
}

View File

@@ -0,0 +1,11 @@
using System.Security.Cryptography;
namespace DigitalData.Core.Abstractions.Security
{
public interface IRSACryptographer
{
public string Pem { get; init; }
public RSAEncryptionPadding Padding { get; init; }
}
}

View File

@@ -0,0 +1,17 @@
namespace DigitalData.Core.Abstractions.Security
{
public interface IRSADecryptor : IRSACryptographer
{
(string Value, Version Version)? VersionedPassword { init; }
Version? PasswordVersion { get; }
bool HasEncryptedPem { get; }
IRSAEncryptor Encryptor { get; }
byte[] Decrypt(byte[] data);
string Decrypt(string data);
}
}

View File

@@ -0,0 +1,11 @@
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,7 +1,7 @@
using AutoMapper; using AutoMapper;
using DigitalData.Core.Contracts.Application; using DigitalData.Core.Abstractions;
using DigitalData.Core.Contracts.Infrastructure; using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.Contracts.CultureServices; using DigitalData.Core.Abstractions.Infrastructure;
namespace DigitalData.Core.Application namespace DigitalData.Core.Application
{ {
@@ -19,17 +19,16 @@ 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<TCRUDRepository, TDto, TEntity, TId> CRUDService<TCRUDRepository, TDto, TDto, TDto, TEntity, TId>, IBasicCRUDService<TDto, TEntity, TId>
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TDto : class where TEntity : class where TCRUDRepository : ICRUDRepository<TEntity, TId> where TDto : class, IUnique<TId> where TEntity : class, IUnique<TId>
{ {
/// <summary> /// <summary>
/// Initializes a new instance of the BasicCRUDService with the specified repository, translation service, and AutoMapper configuration. /// Initializes a new instance of the BasicCRUDService with the specified repository, translation service, and AutoMapper configuration.
/// </summary> /// </summary>
/// <param name="repository">The CRUD repository for accessing and manipulating entity data.</param> /// <param name="repository">The CRUD repository for accessing and manipulating entity data.</param>
/// <param name="translationService">The service used for key-based text translations, facilitating localization.</param>
/// <param name="mapper">The AutoMapper instance for mapping between DTOs and entities.</param> /// <param name="mapper">The AutoMapper instance for mapping between DTOs and entities.</param>
public BasicCRUDService(TCRUDRepository repository, IKeyTranslationService translationService, IMapper mapper) : public BasicCRUDService(TCRUDRepository repository, IMapper mapper) :
base(repository, translationService, mapper) base(repository, mapper)
{ {
} }
} }

View File

@@ -1,9 +1,9 @@
using DigitalData.Core.Contracts.Application; using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.Contracts.Infrastructure; using DigitalData.Core.Abstractions.Infrastructure;
using DigitalData.Core.Contracts.CultureServices;
using AutoMapper; using AutoMapper;
using System.Reflection; using DigitalData.Core.DTO;
using System.ComponentModel.DataAnnotations; using DigitalData.Core.Abstractions;
using Microsoft.Extensions.Logging;
namespace DigitalData.Core.Application namespace DigitalData.Core.Application
{ {
@@ -15,28 +15,17 @@ namespace DigitalData.Core.Application
/// <typeparam name="TUpdateDto">The DTO type for update 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> : ServiceBase, ICRUDService<TCRUDRepository, TCreateDto, TReadDto, TUpdateDto, TEntity, TId>, IServiceBase public class CRUDService<TCRUDRepository, TCreateDto, TReadDto, TUpdateDto, TEntity, TId> : ReadService<TCRUDRepository, TReadDto, TEntity, TId>, ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TCreateDto : class where TReadDto : class where TUpdateDto : class where TEntity : class where TCRUDRepository : ICRUDRepository<TEntity, TId> where TCreateDto : class where TReadDto : class where TUpdateDto : IUnique<TId> where TEntity : class, IUnique<TId>
{ {
protected readonly TCRUDRepository _repository;
protected readonly IMapper _mapper;
protected readonly IKeyTranslationService _translationService;
protected readonly PropertyInfo? _keyPropertyInfo;
/// <summary> /// <summary>
/// Initializes a new instance of the CRUDService class with the specified repository, translation service, and mapper. /// Initializes a new instance of the CRUDService class with the specified repository, translation service, and mapper.
/// </summary> /// </summary>
/// <param name="repository">The CRUD repository for accessing the database.</param> /// <param name="repository">The CRUD repository for accessing the database.</param>
/// <param name="translationService">The service for translating messages based on culture.</param>
/// <param name="mapper">The AutoMapper instance for mapping between DTOs and entity objects.</param> /// <param name="mapper">The AutoMapper instance for mapping between DTOs and entity objects.</param>
public CRUDService(TCRUDRepository repository, IKeyTranslationService translationService, IMapper mapper) public CRUDService(TCRUDRepository repository, IMapper mapper) : base(repository: repository, mapper: mapper)
{ {
_repository = repository;
_translationService = translationService;
_mapper = mapper;
_keyPropertyInfo = typeof(TEntity).GetProperties()
.FirstOrDefault(prop => Attribute.IsDefined(prop, typeof(KeyAttribute)));
} }
/// <summary> /// <summary>
@@ -44,42 +33,11 @@ namespace DigitalData.Core.Application
/// </summary> /// </summary>
/// <param name="createDto">The DTO to create an entity from.</param> /// <param name="createDto">The DTO to create an entity from.</param>
/// <returns>A service result indicating success or failure, including the entity DTO.</returns> /// <returns>A service result indicating success or failure, including the entity DTO.</returns>
public virtual async Task<IServiceResult<TId>> CreateAsync(TCreateDto createDto) public virtual async Task<DataResult<TId>> CreateAsync(TCreateDto createDto)
{ {
var entity = _mapper.MapOrThrow<TEntity>(createDto); var entity = _mapper.Map<TEntity>(createDto);
var createdEntity = await _repository.CreateAsync(entity); var createdEntity = await _repository.CreateAsync(entity);
if (createdEntity is null) return createdEntity is null ? Result.Fail<TId>() : Result.Success(createdEntity.Id);
return Failed<TId>();
else
return Successful(KeyValueOf(createdEntity));
}
/// <summary>
/// Asynchronously reads an entity by its identifier and maps it to a read DTO.
/// </summary>
/// <param name="id">The identifier of the entity to read.</param>
/// <returns>A service result indicating success or failure, including the read DTO if successful.</returns>
public virtual async Task<IServiceResult<TReadDto>> ReadByIdAsync(TId id)
{
var entity = await _repository.ReadByIdAsync(id);
if (entity is null)
{
var translatedMessage = _translationService.Translate(MessageKey.EntityDoesNotExist);
return Failed<TReadDto>();
}
else
return Successful(_mapper.MapOrThrow<TReadDto>(entity));
}
/// <summary>
/// Asynchronously reads all entities and maps them to read DTOs.
/// </summary>
/// <returns>A service result including a collection of read DTOs.</returns>
public virtual async Task<IServiceResult<IEnumerable<TReadDto>>> ReadAllAsync()
{
var entities = await _repository.ReadAllAsync();
var readDto = _mapper.MapOrThrow<IEnumerable<TReadDto>>(entities);
return Successful(readDto);
} }
/// <summary> /// <summary>
@@ -87,83 +45,18 @@ 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<IServiceMessage> UpdateAsync(TUpdateDto updateDto) public virtual async Task<Result> UpdateAsync(TUpdateDto updateDto)
{ {
var entity = _mapper.MapOrThrow<TEntity>(updateDto); var currentEntitiy = await _repository.ReadByIdAsync(updateDto.Id);
bool isUpdated = await _repository.UpdateAsync(entity);
if (isUpdated)
return Successful();
else
{
var translatedMessage = _translationService.Translate(MessageKey.UpdateFailed);
return Failed(translatedMessage);
}
}
/// <summary> if (currentEntitiy is null)
/// Asynchronously deletes an entity by its identifier. return Result.Fail().Notice(LogLevel.Warning, Flag.NotFound, $"{updateDto.Id} is not found in update process of {GetType()} entity.");
/// </summary>
/// <param name="id">The identifier of the entity to delete.</param> var entity = _mapper.Map(updateDto, currentEntitiy);
/// <returns>A service message indicating success or failure.</returns>
public virtual async Task<IServiceMessage> DeleteAsyncById(TId id)
{
TEntity? entity = await _repository.ReadByIdAsync(id);
if (entity is null) return await _repository.UpdateAsync(entity)
{ ? Result.Success()
var deletionFailedMessage = _translationService.Translate(MessageKey.DeletionFailed); : Result.Fail();
var entityDoesNotExistMessage = _translationService.Translate(MessageKey.EntityDoesNotExist);
return new ServiceMessage(isSuccess: false, deletionFailedMessage, entityDoesNotExistMessage);
}
bool isDeleted = await _repository.DeleteAsync(entity);
if (isDeleted)
return Successful();
else
{
var deletionFailedMessage = _translationService.Translate(MessageKey.DeletionFailed);
return Failed(deletionFailedMessage);
}
}
/// <summary>
/// Asynchronously checks if an entity with the specified identifier exists.
/// </summary>
/// <param name="id">The identifier of the entity to check.</param>
/// <returns>A Task that represents the asynchronous operation. The task result contains a boolean value indicating whether the entity exists.</returns>
public virtual async Task<bool> HasEntity(TId id)
{
var entity = await _repository.ReadByIdAsync(id);
return entity is not null;
}
/// <summary>
/// Retrieves the ID value of an entity based on the defined [Key] attribute.
/// </summary>
/// <param name="entity">The entity from which to extract the ID.</param>
/// <returns>The ID of the entity.</returns>
protected virtual TId KeyValueOf(TEntity entity)
{
if (_keyPropertyInfo is null)
throw new InvalidOperationException($"No property with [Key] attribute found on {typeof(TEntity).Name} entity.");
object idObj = _keyPropertyInfo?.GetValue(entity) ?? throw new InvalidOperationException($"The ID property of {typeof(TEntity).Name} entity cannot be null.");
if (idObj is TId id)
return id;
else
throw new InvalidCastException($"The ID of {typeof(TEntity).Name} entity must be type of {typeof(TId).Name}, but it is type of {idObj.GetType().Name}.");
}
/// <summary>
/// Handles exceptions that occur during CRUD operations, providing a structured string.
/// </summary>
/// <param name="ex">The exception that was caught during CRUD operations.</param>
/// <returns>A <see cref="IServiceMessage"/> containing information about the failure, including a user-friendly error message and additional error details.</returns>
public virtual string HandleException(Exception ex)
{
return $"An unexpected error occurred on the server side. Please inform the IT support team.\n{ex.GetType().Name}\n{ex.Message}";
} }
} }
} }

View File

@@ -1,7 +1,10 @@
using AutoMapper; using AutoMapper;
using DigitalData.Core.Contracts.Application; using DigitalData.Core.Abstractions;
using DigitalData.Core.Contracts.Infrastructure; using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.Abstractions.Infrastructure;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
namespace DigitalData.Core.Application namespace DigitalData.Core.Application
{ {
@@ -21,9 +24,9 @@ namespace DigitalData.Core.Application
/// <param name="configureService">An optional action to configure additional services for the CRUD service.</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> /// <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) public static IServiceCollection AddCleanBasicCRUDService<TCRUDRepository, TDto, TEntity, TId, TProfile>(this IServiceCollection services, Action<IServiceCollection>? configureService = null)
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TDto : class where TEntity : class where TProfile : Profile where TCRUDRepository : ICRUDRepository<TEntity, TId> where TDto : class, IUnique<TId> where TEntity : class, IUnique<TId> where TProfile : Profile
{ {
services.AddScoped<IBasicCRUDService<TCRUDRepository, TDto, TEntity, TId>, BasicCRUDService<TCRUDRepository, TDto, TEntity, TId>>(); services.AddScoped<IBasicCRUDService<TDto, TEntity, TId>, BasicCRUDService<TCRUDRepository, TDto, TEntity, TId>>();
configureService?.Invoke(services); configureService?.Invoke(services);
services.AddAutoMapper(typeof(TProfile).Assembly); services.AddAutoMapper(typeof(TProfile).Assembly);
@@ -45,9 +48,9 @@ namespace DigitalData.Core.Application
/// <param name="configureService">An optional action to configure additional services for the CRUD service.</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> /// <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) 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 where TEntity : class where TProfile : Profile 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<TCRUDRepository, TCreateDto, TReadDto, TUpdateDto, TEntity, TId>, CRUDService<TCRUDRepository, TCreateDto, TReadDto, TUpdateDto, TEntity, TId>>(); services.AddScoped<ICRUDService<TCreateDto, TReadDto, TUpdateDto, TEntity, TId>, CRUDService<TCRUDRepository, TCreateDto, TReadDto, TUpdateDto, TEntity, TId>>();
configureService?.Invoke(services); configureService?.Invoke(services);
services.AddAutoMapper(typeof(TProfile).Assembly); services.AddAutoMapper(typeof(TProfile).Assembly);
@@ -55,17 +58,43 @@ namespace DigitalData.Core.Application
return services; return services;
} }
public static IServiceCollection AddDirectorySearchService(this IServiceCollection service) /// <summary>
/// Adds the directory search service to the <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="service">The <see cref="IServiceCollection"/> to add services to.</param>
/// <param name="directorySearchOptions">
/// Optional. An instance of <see cref="DirectorySearchOptions"/> to configure the directory search service.
/// If not provided, the options need to be configured separately.
/// </param>
/// <returns>The updated <see cref="IServiceCollection"/>.</returns>
/// <remarks>
/// This method adds the necessary services for directory search functionality, including memory caching.
/// If <paramref name="directorySearchOptions"/> is not provided, ensure to configure the options separately
/// using the <see cref="IOptions{TOptions}"/> pattern.
/// </remarks>
public static IServiceCollection AddDirectorySearchService(this IServiceCollection service, DirectorySearchOptions? directorySearchOptions = null)
{ {
service.AddMemoryCache(); if(directorySearchOptions is not null)
service.AddScoped<IDirectorySearchService, DirectorySearchService>(); service.AddSingleton(Options.Create(directorySearchOptions));
return service;
return service
.AddMemoryCache()
.AddScoped<IDirectorySearchService, DirectorySearchService>();
} }
public static IServiceCollection AddResponseService(this IServiceCollection service) /// <summary>
/// Adds the JWT service to the <see cref="IServiceCollection"/>.
/// </summary>
/// <typeparam name="TClaimValue">The type of the claim value used in the JWT token.</typeparam>
/// <param name="services">The <see cref="IServiceCollection"/> to add the service to.</param>
/// <param name="tokenDescriptorFactory">A function that takes a claim value of type <typeparamref name="TClaimValue"/> and returns a <see cref="SecurityTokenDescriptor"/> used to configure the JWT token.</param>
/// <returns>The original <see cref="IServiceCollection"/> instance, allowing further configuration.</returns>
/// <remarks>
/// This method adds the necessary services for handling JWT tokens. The <paramref name="tokenDescriptorFactory"/> function is used to generate the <see cref="SecurityTokenDescriptor"/> which is essential for creating the JWT tokens.
/// </remarks>
public static IServiceCollection AddJWTService<TClaimValue>(this IServiceCollection services, Func<TClaimValue, SecurityTokenDescriptor> tokenDescriptorFactory)
{ {
service.AddScoped<IResponseService, ResponseService>(); return services.AddScoped<IJWTService<TClaimValue>, JWTService<TClaimValue>>(provider => new (tokenDescriptorFactory));
return service;
} }
} }
} }

View File

@@ -1,21 +1,42 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFrameworks>net7.0;net8.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<Description>This package provides implementations for application services within the DigitalData.Core.Abstractions library. It includes generic CRUD operations using Entity Framework Core, AutoMapper integration for object mapping, and additional services such as JWT handling and directory search functionality, adhering to Clean Architecture principles to ensure separation of concerns and maintainability.</Description>
<PackageId>DigitalData.Core.Application</PackageId>
<Authors>Digital Data GmbH</Authors>
<Company>Digital Data GmbH</Company>
<Product>DigitalData.Core.Application</Product>
<Copyright>Copyright 2024</Copyright>
<PackageIcon>core_icon.png</PackageIcon>
<RepositoryUrl>http://git.dd:3000/AppStd/WebCoreModules.git</RepositoryUrl>
<PackageTags>digital data core application clean architecture</PackageTags>
<Version>2.0.0.0</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<None Include="..\..\nuget-package-icons\core_icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="AutoMapper" Version="13.0.1" /> <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.Logging" Version="7.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging" 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.Security.Cryptography.Cng" Version="5.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DigitalData.Core.Contracts\DigitalData.Core.Contracts.csproj" /> <ProjectReference Include="..\DigitalData.Core.Abstractions\DigitalData.Core.Abstractions.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -0,0 +1,28 @@
namespace DigitalData.Core.Application
{
/// <summary>
/// Represents the options for configuring directory search operations.
/// </summary>
public class DirectorySearchOptions
{
/// <summary>
/// Gets or initializes the name of the server to be used in the directory search.
/// </summary>
public string? ServerName { get; init; }
/// <summary>
/// Gets or initializes the root directory path for the search.
/// </summary>
public string? Root { get; init; }
/// <summary>
/// Gets or initializes the number of days before the user cache expires.
/// </summary>
public int UserCacheExpirationDays { get; init; }
/// <summary>
/// Gets or initializes the custom search filters to be applied during directory searches.
/// </summary>
public Dictionary<string, string> CustomSearchFilters { get; init; } = new();
}
}

View File

@@ -1,15 +1,15 @@
using DigitalData.Core.Contracts.Application; using DigitalData.Core.Abstractions.Application;
using Microsoft.Extensions.Logging;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.DirectoryServices; using System.DirectoryServices;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration;
using System.DirectoryServices.AccountManagement; using System.DirectoryServices.AccountManagement;
using DigitalData.Core.DTO;
using Microsoft.Extensions.Options;
namespace DigitalData.Core.Application namespace DigitalData.Core.Application
{ {
[SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>")] [SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>")]
public class DirectorySearchService : ServiceBase, IDirectorySearchService public class DirectorySearchService : IDirectorySearchService
{ {
private readonly IMemoryCache _memoryCache; private readonly IMemoryCache _memoryCache;
public string ServerName { get; } public string ServerName { get; }
@@ -18,33 +18,57 @@ namespace DigitalData.Core.Application
private readonly DateTimeOffset _userCacheExpiration; private readonly DateTimeOffset _userCacheExpiration;
public Dictionary<string, string> CustomSearchFilters { get; } public Dictionary<string, string> CustomSearchFilters { get; }
public DirectorySearchService(IConfiguration configuration, ILogger<DirectorySearchService> logger, IMemoryCache memoryCache) /// <summary>
/// Initializes a new instance of the <see cref="DirectorySearchService"/> class.
/// </summary>
/// <param name="options">The options for directory search.</param>
/// <param name="memoryCache">The memory cache.</param>
/// <exception cref="InvalidOperationException">
/// Thrown if the server name or root directory is not configured.
/// </exception>
public DirectorySearchService(IOptions<DirectorySearchOptions> options, IMemoryCache memoryCache)
{ {
_memoryCache = memoryCache; _memoryCache = memoryCache;
ServerName = configuration["DirectorySearch:ServerName"] ?? throw new InvalidOperationException("The server name for directory search is not configured. Please specify the 'DirectorySearch:ServerName' in the configuration."); var dirSearchOptions = options.Value;
Root = configuration["DirectorySearch:Root"] ?? throw new InvalidOperationException("The root for directory search is not configured. Please specify the 'DirectorySearch:Root' in the configuration."); ServerName = dirSearchOptions.ServerName ?? throw new InvalidOperationException("The server name for directory search is not configured. Please specify the 'DirectorySearch:ServerName' in the configuration.");
Root = dirSearchOptions.Root ?? throw new InvalidOperationException("The root for directory search is not configured. Please specify the 'DirectorySearch:Root' in the configuration.");
SearchRootPath = $"LDAP://{ServerName}/{Root}"; SearchRootPath = $"LDAP://{ServerName}/{Root}";
CustomSearchFilters = dirSearchOptions.CustomSearchFilters;
var customSearchFiltersSection = configuration.GetSection("DirectorySearch:CustomSearchFilters"); var dayCounts = dirSearchOptions.UserCacheExpirationDays;
CustomSearchFilters = customSearchFiltersSection.Get<Dictionary<string, string>>() ?? new();
var dayCounts = configuration.GetValue<int>("DirectorySearch:UserCacheExpirationDays");
if (dayCounts == default) if (dayCounts == default)
_userCacheExpiration = default; _userCacheExpiration = default;
else else
_userCacheExpiration = DateTimeOffset.Now.Date.AddDays(dayCounts); _userCacheExpiration = DateTimeOffset.Now.Date.AddDays(dayCounts);
} }
/// <summary>
/// Validates the credentials of a directory entry.
/// </summary>
/// <param name="dirEntryUsername">The directory entry username.</param>
/// <param name="dirEntryPassword">The directory entry password.</param>
/// <returns>True if the credentials are valid; otherwise, false.</returns>
public bool ValidateCredentials(string dirEntryUsername, string dirEntryPassword) public bool ValidateCredentials(string dirEntryUsername, string dirEntryPassword)
{ {
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(dirEntryUsername, dirEntryPassword);
} }
public IServiceResult<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.
/// </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 DataResult<IEnumerable<ResultPropertyCollection>> FindAll(DirectoryEntry searchRoot, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties)
{ {
List<ResultPropertyCollection> list = new(); List<ResultPropertyCollection> list = new();
@@ -70,21 +94,33 @@ namespace DigitalData.Core.Application
list.Add(rpc); list.Add(rpc);
} }
return Successful<IEnumerable<ResultPropertyCollection>>(list); return Result.Success<IEnumerable<ResultPropertyCollection>>(list);
} }
public IServiceResult<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, 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 DataResult<IEnumerable<ResultPropertyCollection>> FindAllByUserCache(string username, string filter, SearchScope searchScope = SearchScope.Subtree, int sizeLimit = 5000, params string[] properties)
{ {
List<ResultPropertyCollection> list = new();
_memoryCache.TryGetValue(username, out DirectoryEntry? searchRoot); _memoryCache.TryGetValue(username, out DirectoryEntry? searchRoot);
if (searchRoot is null) if (searchRoot is null)
return Failed<IEnumerable<ResultPropertyCollection>>(MessageKey.DirSearcherDisconnected.ToString()); return Result.Fail<IEnumerable<ResultPropertyCollection>>();
return FindAll(searchRoot, filter, searchScope, sizeLimit, properties); return FindAll(searchRoot, filter, searchScope, sizeLimit, properties);
} }
/// <summary>
/// Sets the search root in the cache.
/// </summary>
/// <param name="dirEntryUsername">The directory entry username.</param>
/// <param name="dirEntryPassword">The directory entry password.</param>
public void SetSearchRootCache(string dirEntryUsername, string dirEntryPassword) public void SetSearchRootCache(string dirEntryUsername, string dirEntryPassword)
{ {
if (_userCacheExpiration == default) if (_userCacheExpiration == default)
@@ -93,6 +129,12 @@ namespace DigitalData.Core.Application
_memoryCache.Set(key: dirEntryUsername, new DirectoryEntry(path: SearchRootPath, username: dirEntryUsername, password: dirEntryPassword), absoluteExpiration: _userCacheExpiration); _memoryCache.Set(key: dirEntryUsername, new DirectoryEntry(path: SearchRootPath, username: dirEntryUsername, password: dirEntryPassword), absoluteExpiration: _userCacheExpiration);
} }
/// <summary>
/// Gets the search root from the cache.
/// </summary>
/// <param name="dirEntryUsername">The directory entry username.</param>
/// <returns>The cached <see cref="DirectoryEntry"/> if found; otherwise, null.</returns>
public DirectoryEntry? GetSearchRootCache(string dirEntryUsername) public DirectoryEntry? GetSearchRootCache(string dirEntryUsername)
{ {
_memoryCache.TryGetValue(dirEntryUsername, out DirectoryEntry? root); _memoryCache.TryGetValue(dirEntryUsername, out DirectoryEntry? root);

View File

@@ -0,0 +1,63 @@
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Cryptography;
namespace DigitalData.Core.Application
{
/// <summary>
/// Implements the <see cref="IJWTService{TClaimValue}"/> interface to manage JWT operations for claims of type <typeparamref name="TClaimValue"/>.
/// </summary>
public class JWTService<TClaimValue> : IJWTService<TClaimValue>
{
private readonly Func<TClaimValue, SecurityTokenDescriptor> _factory;
/// <summary>
/// Initializes a new instance of the <see cref="JWTService{TClaimValue}"/> class.
/// </summary>
/// <param name="tokenDescriptorFactory">A factory function to produce <see cref="SecurityTokenDescriptor"/> based on the claim value.</param>
public JWTService(Func<TClaimValue, SecurityTokenDescriptor> tokenDescriptorFactory)
{
_factory = tokenDescriptorFactory;
}
/// <summary>
/// Generates a symmetric security key with the specified byte size.
/// </summary>
/// <param name="byteSize">The size of the security key in bytes. Default is 32 bytes.</param>
/// <returns>A new instance of <see cref="SymmetricSecurityKey"/>.</returns>
public static SymmetricSecurityKey GenerateSecurityKey(int byteSize = 32)
{
using var rng = RandomNumberGenerator.Create();
var randomBytes = new byte[byteSize];
rng.GetBytes(randomBytes);
var securityKey = new SymmetricSecurityKey(randomBytes);
return securityKey;
}
/// <summary>
/// Generates a JWT for the specified claim value.
/// </summary>
/// <param name="claimValue">The claim value to encode in the JWT.</param>
/// <returns>A JWT as a string.</returns>
public string GenerateToken(TClaimValue claimValue)
{
var tokenDescriptor = _factory(claimValue);
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
/// <summary>
/// Reads and validates a security token from a string representation.
/// </summary>
/// <param name="token">The JWT to read.</param>
/// <returns>A <see cref="JwtSecurityToken"/> if the token is valid; otherwise, null.</returns>
public JwtSecurityToken? ReadSecurityToken(string token)
{
var tokenHandler = new JwtSecurityTokenHandler();
return tokenHandler.CanReadToken(token) ? tokenHandler.ReadToken(token) as JwtSecurityToken : null;
}
}
}

View File

@@ -0,0 +1,11 @@
namespace DigitalData.Core.Application
{
public static class Key
{
public static readonly string EntityDoesNotExist = "EntityDoesNotExist";
public static readonly string ReadFailed = "ReadFailed";
public static readonly string UpdateFailed = "UpdateFailed";
public static readonly string DeletionFailed = "DeletionFailed";
public static readonly string DirSearcherDisconnected = "DirSearcherDisconnected";
}
}

View File

@@ -1,17 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DigitalData.Core.Application
{
public enum MessageKey
{
EntityDoesNotExist,
ReadFailed,
UpdateFailed,
DeletionFailed,
DirSearcherDisconnected
}
}

View File

@@ -0,0 +1,79 @@
using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.Abstractions.Infrastructure;
using AutoMapper;
using DigitalData.Core.DTO;
using DigitalData.Core.Abstractions;
namespace DigitalData.Core.Application
{
/// <summary>
/// Provides generic Read (Read and Delete) operations for a specified type of entity.
/// </summary>
/// <typeparam name="TReadDto">The DTO type for read operations.</typeparam>
/// <typeparam name="TEntity">The entity type.</typeparam>
/// <typeparam name="TId">The type of the identifier for the entity.</typeparam>
public class ReadService<TCRUDRepository, TReadDto, TEntity, TId> : IReadService<TReadDto, TEntity, TId>
where TCRUDRepository : ICRUDRepository<TEntity, TId> where TReadDto : class where TEntity : class, IUnique<TId>
{
protected readonly TCRUDRepository _repository;
protected readonly IMapper _mapper;
/// <summary>
/// Initializes a new instance of the CRUDService class with the specified repository, translation service, and mapper.
/// </summary>
/// <param name="repository">The CRUD repository for accessing the database.</param>
/// <param name="mapper">The AutoMapper instance for mapping between DTOs and entity objects.</param>
public ReadService(TCRUDRepository repository, IMapper mapper)
{
_repository = repository;
_mapper = mapper;
}
/// <summary>
/// Asynchronously reads an entity by its identifier and maps it to a read DTO.
/// </summary>
/// <param name="id">The identifier of the entity to read.</param>
/// <returns>A service result indicating success or failure, including the read DTO if successful.</returns>
public virtual async Task<DataResult<TReadDto>> ReadByIdAsync(TId id)
{
var entity = await _repository.ReadByIdAsync(id);
return entity is null
? Result.Fail<TReadDto>()
: Result.Success(_mapper.Map<TReadDto>(entity));
}
/// <summary>
/// Asynchronously reads all entities and maps them to read DTOs.
/// </summary>
/// <returns>A service result including a collection of read DTOs.</returns>
public virtual async Task<DataResult<IEnumerable<TReadDto>>> ReadAllAsync()
{
var entities = await _repository.ReadAllAsync();
var readDto = _mapper.Map<IEnumerable<TReadDto>>(entities);
return Result.Success(readDto);
}
/// <summary>
/// Asynchronously deletes an entity by its identifier.
/// </summary>
/// <param name="id">The identifier of the entity to delete.</param>
/// <returns>A service message indicating success or failure.</returns>
public virtual async Task<Result> DeleteAsyncById(TId id)
{
TEntity? entity = await _repository.ReadByIdAsync(id);
if (entity is null)
return Result.Fail();
bool isDeleted = await _repository.DeleteAsync(entity);
return isDeleted ? Result.Success() : Result.Fail();
}
/// <summary>
/// Asynchronously checks if an entity with the specified identifier exists.
/// </summary>
/// <param name="id">The identifier of the entity to check.</param>
/// <returns>A Task that represents the asynchronous operation. The task result contains a boolean value indicating whether the entity exists.</returns>
public virtual async Task<bool> HasEntity(TId id) => await _repository.CountAsync(id) > 0;
}
}

View File

@@ -1,80 +0,0 @@
using DigitalData.Core.Contracts.Application;
namespace DigitalData.Core.Application
{
/// <summary>
/// Provides a base implementation of <see cref="IServiceBase"/>, offering basic service messaging and result creation functionalities.
/// </summary>
public class ResponseService : IResponseService
{
/// <summary>
/// Creates a service message with the specified success flag and messages.
/// </summary>
/// <param name="isSuccess">Indicates if the operation was successful.</param>
/// <param name="messages">An array of messages associated with the operation.</param>
/// <returns>A new instance of <see cref="ServiceMessage"/> reflecting the operation outcome.</returns>
public virtual IServiceMessage CreateMessage(bool isSuccess, params string[] messages)
{
return new ServiceMessage(isSuccess, messages);
}
/// <summary>
/// Creates a service result containing the provided data, success flag, and messages.
/// </summary>
/// <typeparam name="T">The type of the data included in the result.</typeparam>
/// <param name="data">The data to include in the result.</param>
/// <param name="isSuccess">Indicates if the operation was successful.</param>
/// <param name="messages">An array of messages associated with the operation.</param>
/// <returns>A new instance of <see cref="ServiceResult{T}"/> with the specified data and outcome.</returns>
public virtual IServiceResult<T> CreateResult<T>(T? data = default, bool isSuccess = true, params string[] messages)
{
return new ServiceResult<T>(data, isSuccess, messages);
}
/// <summary>
/// Creates a successful service message.
/// </summary>
/// <param name="messages">An array of success messages.</param>
/// <returns>A successful service message.</returns>
public virtual IServiceMessage Successful(params string[] messages) => CreateMessage(true, messages);
/// <summary>
/// Creates a failed service message.
/// </summary>
/// <param name="messages">An array of failure messages.</param>
/// <returns>A failed service message.</returns>
public virtual IServiceMessage Failed(params string[] messages) => CreateMessage(false, messages);
/// <summary>
/// Creates a successful service result with the provided data.
/// </summary>
/// <typeparam name="T">The type of data included in the result.</typeparam>
/// <param name="data">The data to include in the result.</param>
/// <param name="messages">An array of success messages.</param>
/// <returns>A successful service result containing the specified data.</returns>
public virtual IServiceResult<T> Successful<T>(T data, params string[] messages) => CreateResult(data, true, messages);
/// <summary>
/// Creates a failed service result, optionally including data.
/// </summary>
/// <typeparam name="T">The type of data the service result can contain.</typeparam>
/// <param name="data">Optional data to include in the failed result.</param>
/// <param name="messages">An array of failure messages.</param>
/// <returns>A failed service result, which may or may not contain the specified data.</returns>
public virtual IServiceResult<T> Failed<T>(T? data = default, params string[] messages) => CreateResult(data, false, messages);
/// <summary>
/// Creates a failed service result using only failure messages, without explicitly including data.
/// </summary>
/// <remarks>
/// This method provides a convenient way to create a failed service result when the failure does not pertain to any specific data,
/// or when the inclusion of data is not necessary to convey the failure reason. The data part of the result will be set to its default value.
/// </remarks>
/// <typeparam name="T">The type of data the service result can contain. The result will contain the default value for this type.</typeparam>
/// <param name="messages">An array of failure messages that provide details about the reasons for the operation's failure.</param>
/// <returns>A failed service result. The data part of the result will be set to the default value for the specified type,
/// and it will include the provided failure messages.</returns>
public virtual IServiceResult<T> Failed<T>(params string[] messages) => Failed<T>(default, messages);
}
}

View File

@@ -1,31 +0,0 @@
using AutoMapper;
using DigitalData.Core.Contracts.Application;
namespace DigitalData.Core.Application
{
/// <summary>
/// Provides a base implementation of <see cref="IServiceBase"/>, offering basic service messaging and result creation functionalities.
/// </summary>
public class ServiceBase : ResponseService, IServiceBase, IResponseService
{
}
public static class AutoMapperExtension
{
/// <summary>
/// Maps a source object to a destination object, or throws an exception if the mapping result is null.
/// </summary>
/// <typeparam name="TSource">The source object type.</typeparam>
/// <typeparam name="TDestination">The destination object type.</typeparam>
/// <param name="source">The source object to map from.</param>
/// <returns>The mapped destination object.</returns>
/// <exception cref="MappingResultNullException">Thrown when the mapping result is null.</exception>
public static TDestination MapOrThrow<TDestination>(this IMapper mapper, object source)
{
return mapper.Map<TDestination>(source) ?? throw new AutoMapperMappingException(
$"Mapping to {typeof(TDestination).FullName} resulted in a null object. " +
"Hint: Ensure that the AutoMapper profile configuration for this mapping is correct.");
}
}
}

View File

@@ -1,33 +0,0 @@
using DigitalData.Core.Contracts.Application;
namespace DigitalData.Core.Application
{
/// <summary>
/// Represents the outcome of a service operation, encapsulating the success or failure status,
/// and any associated messages.
/// </summary>
public class ServiceMessage : IServiceMessage
{
/// <summary>
/// Initializes a new instance of the ServiceMessage class with specified success status, and messages.
/// </summary>
/// <param name="isSuccess">Indicates whether the service operation was successful.</param>
/// <param name="data">The data associated with a successful operation.</param>
/// <param name="messages">An array of messages related to the operation's outcome.</param>
public ServiceMessage(bool isSuccess, params string[] messages)
{
IsSuccess = isSuccess;
Messages = messages.ToList<string>();
}
/// <summary>
/// Gets or sets a value indicating whether the service operation was successful.
/// </summary>
public bool IsSuccess { get; set; }
/// <summary>
/// Gets or sets a collection of messages associated with the service operation.
/// </summary>
public List<string> Messages { get; set; } = new List<string>();
}
}

View File

@@ -1,25 +0,0 @@
using DigitalData.Core.Contracts.Application;
namespace DigitalData.Core.Application
{
/// <summary>
/// Represents the outcome of a service operation, encapsulating the success or failure status,
/// the data returned by the operation, and any associated messages.
/// </summary>
/// <typeparam name="T">The type of data returned by the service operation, if any.</typeparam>
public class ServiceResult<T> : ServiceMessage, IServiceResult<T>
{
/// <summary>
/// Initializes a new instance of the ServiceResult class with specified success status, data, and messages.
/// </summary>
/// <param name="data">The data associated with a successful operation.</param>
/// <param name="isSuccess">Indicates whether the service operation was successful.</param>
/// <param name="messages">An array of messages related to the operation's outcome.</param>
public ServiceResult(T? data, bool isSuccess, params string[] messages) : base(isSuccess, messages) => Data = data;
/// <summary>
/// Gets or sets the data resulting from the service operation.
/// </summary>
public T? Data { get; set; }
}
}

View File

@@ -1,517 +0,0 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v7.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v7.0": {
"DigitalData.Core.Application/1.0.0": {
"dependencies": {
"AutoMapper": "13.0.1",
"DigitalData.Core.Contracts": "1.0.0",
"Microsoft.Extensions.Caching.Abstractions": "7.0.0",
"Microsoft.Extensions.Configuration": "7.0.0",
"Microsoft.Extensions.Logging": "7.0.0",
"System.DirectoryServices.AccountManagement": "7.0.1"
},
"runtime": {
"DigitalData.Core.Application.dll": {}
}
},
"AutoMapper/13.0.1": {
"dependencies": {
"Microsoft.Extensions.Options": "7.0.0"
},
"runtime": {
"lib/net6.0/AutoMapper.dll": {
"assemblyVersion": "13.0.0.0",
"fileVersion": "13.0.1.0"
}
}
},
"Microsoft.Extensions.Caching.Abstractions/7.0.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.Caching.Abstractions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Extensions.Caching.Memory/7.0.0": {
"dependencies": {
"Microsoft.Extensions.Caching.Abstractions": "7.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
"Microsoft.Extensions.Logging.Abstractions": "7.0.0",
"Microsoft.Extensions.Options": "7.0.0",
"Microsoft.Extensions.Primitives": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.Caching.Memory.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Extensions.Configuration/7.0.0": {
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "7.0.0",
"Microsoft.Extensions.Primitives": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.Configuration.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Extensions.Configuration.Abstractions/7.0.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.Configuration.Abstractions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Extensions.Configuration.Binder/7.0.4": {
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.Configuration.Binder.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.423.11508"
}
}
},
"Microsoft.Extensions.DependencyInjection/7.0.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.DependencyInjection.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions/7.0.0": {
"runtime": {
"lib/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Extensions.Logging/7.0.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "7.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
"Microsoft.Extensions.Logging.Abstractions": "7.0.0",
"Microsoft.Extensions.Options": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.Logging.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Extensions.Logging.Abstractions/7.0.0": {
"runtime": {
"lib/net7.0/Microsoft.Extensions.Logging.Abstractions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Extensions.Options/7.0.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
"Microsoft.Extensions.Primitives": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.Options.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Extensions.Primitives/7.0.0": {
"runtime": {
"lib/net7.0/Microsoft.Extensions.Primitives.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Win32.SystemEvents/7.0.0": {
"runtime": {
"lib/net7.0/Microsoft.Win32.SystemEvents.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/Microsoft.Win32.SystemEvents.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Configuration.ConfigurationManager/7.0.0": {
"dependencies": {
"System.Diagnostics.EventLog": "7.0.0",
"System.Security.Cryptography.ProtectedData": "7.0.0",
"System.Security.Permissions": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Configuration.ConfigurationManager.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Diagnostics.EventLog/7.0.0": {
"runtime": {
"lib/net7.0/System.Diagnostics.EventLog.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.Diagnostics.EventLog.Messages.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "0.0.0.0"
},
"runtimes/win/lib/net7.0/System.Diagnostics.EventLog.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.DirectoryServices/7.0.1": {
"dependencies": {
"System.Security.Permissions": "7.0.0"
},
"runtime": {
"lib/net7.0/System.DirectoryServices.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "7.0.323.6910"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.DirectoryServices.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "4.0.0.0",
"fileVersion": "7.0.323.6910"
}
}
},
"System.DirectoryServices.AccountManagement/7.0.1": {
"dependencies": {
"System.Configuration.ConfigurationManager": "7.0.0",
"System.DirectoryServices": "7.0.1",
"System.DirectoryServices.Protocols": "7.0.1"
},
"runtime": {
"lib/net7.0/System.DirectoryServices.AccountManagement.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "7.0.1123.42427"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.DirectoryServices.AccountManagement.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "4.0.0.0",
"fileVersion": "7.0.1123.42427"
}
}
},
"System.DirectoryServices.Protocols/7.0.1": {
"runtime": {
"lib/net7.0/System.DirectoryServices.Protocols.dll": {
"assemblyVersion": "7.0.0.1",
"fileVersion": "7.0.723.27404"
}
},
"runtimeTargets": {
"runtimes/linux/lib/net7.0/System.DirectoryServices.Protocols.dll": {
"rid": "linux",
"assetType": "runtime",
"assemblyVersion": "7.0.0.1",
"fileVersion": "7.0.723.27404"
},
"runtimes/osx/lib/net7.0/System.DirectoryServices.Protocols.dll": {
"rid": "osx",
"assetType": "runtime",
"assemblyVersion": "7.0.0.1",
"fileVersion": "7.0.723.27404"
},
"runtimes/win/lib/net7.0/System.DirectoryServices.Protocols.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.1",
"fileVersion": "7.0.723.27404"
}
}
},
"System.Drawing.Common/7.0.0": {
"dependencies": {
"Microsoft.Win32.SystemEvents": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Drawing.Common.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.Drawing.Common.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Security.Cryptography.ProtectedData/7.0.0": {
"runtime": {
"lib/net7.0/System.Security.Cryptography.ProtectedData.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.Security.Cryptography.ProtectedData.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Security.Permissions/7.0.0": {
"dependencies": {
"System.Windows.Extensions": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Security.Permissions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Windows.Extensions/7.0.0": {
"dependencies": {
"System.Drawing.Common": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Windows.Extensions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
},
"runtimeTargets": {
"runtimes/win/lib/net7.0/System.Windows.Extensions.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"DigitalData.Core.Contracts/1.0.0": {
"dependencies": {
"Microsoft.Extensions.Caching.Memory": "7.0.0",
"Microsoft.Extensions.Configuration.Binder": "7.0.4",
"System.DirectoryServices": "7.0.1",
"System.DirectoryServices.AccountManagement": "7.0.1"
},
"runtime": {
"DigitalData.Core.Contracts.dll": {}
}
}
}
},
"libraries": {
"DigitalData.Core.Application/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"AutoMapper/13.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/Fx1SbJ16qS7dU4i604Sle+U9VLX+WSNVJggk6MupKVkYvvBm4XqYaeFuf67diHefHKHs50uQIS2YEDFhPCakQ==",
"path": "automapper/13.0.1",
"hashPath": "automapper.13.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Caching.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-IeimUd0TNbhB4ded3AbgBLQv2SnsiVugDyGV1MvspQFVlA07nDC7Zul7kcwH5jWN3JiTcp/ySE83AIJo8yfKjg==",
"path": "microsoft.extensions.caching.abstractions/7.0.0",
"hashPath": "microsoft.extensions.caching.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Caching.Memory/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-xpidBs2KCE2gw1JrD0quHE72kvCaI3xFql5/Peb2GRtUuZX+dYPoK/NTdVMiM67Svym0M0Df9A3xyU0FbMQhHw==",
"path": "microsoft.extensions.caching.memory/7.0.0",
"hashPath": "microsoft.extensions.caching.memory.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Configuration/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-tldQUBWt/xeH2K7/hMPPo5g8zuLc3Ro9I5d4o/XrxvxOCA2EZBtW7bCHHTc49fcBtvB8tLAb/Qsmfrq+2SJ4vA==",
"path": "microsoft.extensions.configuration/7.0.0",
"hashPath": "microsoft.extensions.configuration.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==",
"path": "microsoft.extensions.configuration.abstractions/7.0.0",
"hashPath": "microsoft.extensions.configuration.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.Binder/7.0.4": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8+XPvJnHZsYgHOQlcMuQe7QNF5KdVKHH1F/wW3nd8/u81Gk/XFAYMDP0Lpz18h7/AM95M662vvqMorcYxCBB4w==",
"path": "microsoft.extensions.configuration.binder/7.0.4",
"hashPath": "microsoft.extensions.configuration.binder.7.0.4.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==",
"path": "microsoft.extensions.dependencyinjection/7.0.0",
"hashPath": "microsoft.extensions.dependencyinjection.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==",
"path": "microsoft.extensions.dependencyinjection.abstractions/7.0.0",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Logging/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==",
"path": "microsoft.extensions.logging/7.0.0",
"hashPath": "microsoft.extensions.logging.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==",
"path": "microsoft.extensions.logging.abstractions/7.0.0",
"hashPath": "microsoft.extensions.logging.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Options/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==",
"path": "microsoft.extensions.options/7.0.0",
"hashPath": "microsoft.extensions.options.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Primitives/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==",
"path": "microsoft.extensions.primitives/7.0.0",
"hashPath": "microsoft.extensions.primitives.7.0.0.nupkg.sha512"
},
"Microsoft.Win32.SystemEvents/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ==",
"path": "microsoft.win32.systemevents/7.0.0",
"hashPath": "microsoft.win32.systemevents.7.0.0.nupkg.sha512"
},
"System.Configuration.ConfigurationManager/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-WvRUdlL1lB0dTRZSs5XcQOd5q9MYNk90GkbmRmiCvRHThWiojkpGqWdmEDJdXyHbxG/BhE5hmVbMfRLXW9FJVA==",
"path": "system.configuration.configurationmanager/7.0.0",
"hashPath": "system.configuration.configurationmanager.7.0.0.nupkg.sha512"
},
"System.Diagnostics.EventLog/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-eUDP47obqQm3SFJfP6z+Fx2nJ4KKTQbXB4Q9Uesnzw9SbYdhjyoGXuvDn/gEmFY6N5Z3bFFbpAQGA7m6hrYJCw==",
"path": "system.diagnostics.eventlog/7.0.0",
"hashPath": "system.diagnostics.eventlog.7.0.0.nupkg.sha512"
},
"System.DirectoryServices/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Z4FVdUJEVXbf7/f/hU6cFZDtxN5ozUVKJMzXoHmC+GCeTcqzlxqmWtxurejxG3K+kZ6H0UKwNshoK1CYnmJ1sg==",
"path": "system.directoryservices/7.0.1",
"hashPath": "system.directoryservices.7.0.1.nupkg.sha512"
},
"System.DirectoryServices.AccountManagement/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-UNytHYwA5IF55WQhashsMG57ize83JUGJxD8YJlOyO9ZlMTOD4Nt7y+A6mvmrU/swDoYWaVL+TNwE6hk9lyvbA==",
"path": "system.directoryservices.accountmanagement/7.0.1",
"hashPath": "system.directoryservices.accountmanagement.7.0.1.nupkg.sha512"
},
"System.DirectoryServices.Protocols/7.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-t9hsL+UYRzNs30pnT2Tdx6ngX8McFUjru0a0ekNgu/YXfkXN+dx5OvSEv0/p7H2q3pdJLH7TJPWX7e55J8QB9A==",
"path": "system.directoryservices.protocols/7.0.1",
"hashPath": "system.directoryservices.protocols.7.0.1.nupkg.sha512"
},
"System.Drawing.Common/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==",
"path": "system.drawing.common/7.0.0",
"hashPath": "system.drawing.common.7.0.0.nupkg.sha512"
},
"System.Security.Cryptography.ProtectedData/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-xSPiLNlHT6wAHtugASbKAJwV5GVqQK351crnILAucUioFqqieDN79evO1rku1ckt/GfjIn+b17UaSskoY03JuA==",
"path": "system.security.cryptography.protecteddata/7.0.0",
"hashPath": "system.security.cryptography.protecteddata.7.0.0.nupkg.sha512"
},
"System.Security.Permissions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Vmp0iRmCEno9BWiskOW5pxJ3d9n+jUqKxvX4GhLwFhnQaySZmBN2FuC0N5gjFHgyFMUjC5sfIJ8KZfoJwkcMmA==",
"path": "system.security.permissions/7.0.0",
"hashPath": "system.security.permissions.7.0.0.nupkg.sha512"
},
"System.Windows.Extensions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-bR4qdCmssMMbo9Fatci49An5B1UaVJZHKNq70PRgzoLYIlitb8Tj7ns/Xt5Pz1CkERiTjcVBDU2y1AVrPBYkaw==",
"path": "system.windows.extensions/7.0.0",
"hashPath": "system.windows.extensions.7.0.0.nupkg.sha512"
},
"DigitalData.Core.Contracts/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}

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.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.Application")]
[assembly: System.Reflection.AssemblyTitleAttribute("DigitalData.Core.Application")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@@ -1 +0,0 @@
07702634e271f37711fc7057b2e2d525a4d37394

View File

@@ -1 +0,0 @@
9c98a8de39558d32de60bd00a4f3744b3887e0d2

View File

@@ -1,62 +0,0 @@
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Application.deps.json
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\bin\Debug\net7.0\DigitalData.Core.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.Utilities.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\bin\Debug\net7.0\DigitalData.Core.Utilities.pdb
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.Application.csproj.AssemblyReference.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.Application.GeneratedMSBuildEditorConfig.editorconfig
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.Application.AssemblyInfoInputs.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.Application.AssemblyInfo.cs
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.Application.csproj.CoreCompileInputs.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.Application.csproj.CopyComplete
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\refint\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\DigitalData.Core.Application.pdb
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.CleanArchitecture.Application\obj\Debug\net7.0\ref\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Application.deps.json
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Application.pdb
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.csproj.AssemblyReference.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.GeneratedMSBuildEditorConfig.editorconfig
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.AssemblyInfoInputs.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.AssemblyInfo.cs
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.csproj.CoreCompileInputs.cache
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.csproj.CopyComplete
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\obj\Debug\net7.0\refint\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.pdb
E:\TekH\Visual Studio\DDWeb\DigitalData.Core\DigitalData.Core.Application\obj\Debug\net7.0\ref\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Application.deps.json
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Application.pdb
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.csproj.AssemblyReference.cache
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.GeneratedMSBuildEditorConfig.editorconfig
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.AssemblyInfoInputs.cache
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.AssemblyInfo.cs
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.csproj.CoreCompileInputs.cache
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.csproj.CopyComplete
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\refint\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.pdb
E:\TekH\Visual Studio\DDWeb\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\ref\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Application.deps.json
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Application.pdb
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\bin\Debug\net7.0\DigitalData.Core.Contracts.pdb
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.csproj.AssemblyReference.cache
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.GeneratedMSBuildEditorConfig.editorconfig
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.AssemblyInfoInputs.cache
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.AssemblyInfo.cs
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.csproj.CoreCompileInputs.cache
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.csproj.CopyComplete
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\refint\DigitalData.Core.Application.dll
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\DigitalData.Core.Application.pdb
E:\TekH\Visual Studio\WebCoreModules\DigitalData.Core.Application\obj\Debug\net7.0\ref\DigitalData.Core.Application.dll

View File

@@ -1,184 +0,0 @@
{
"format": 1,
"restore": {
"E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Application\\DigitalData.Core.Application.csproj": {}
},
"projects": {
"E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Application\\DigitalData.Core.Application.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Application\\DigitalData.Core.Application.csproj",
"projectName": "DigitalData.Core.Application",
"projectPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Application\\DigitalData.Core.Application.csproj",
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
"outputPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\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\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
"projectPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj"
}
}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"dependencies": {
"AutoMapper": {
"target": "Package",
"version": "[13.0.1, )"
},
"Microsoft.Extensions.Caching.Abstractions": {
"target": "Package",
"version": "[7.0.0, )"
},
"Microsoft.Extensions.Configuration": {
"target": "Package",
"version": "[7.0.0, )"
},
"Microsoft.Extensions.Logging": {
"target": "Package",
"version": "[7.0.0, )"
},
"System.DirectoryServices.AccountManagement": {
"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\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
"projectName": "DigitalData.Core.Contracts",
"projectPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\DigitalData.Core.Contracts\\DigitalData.Core.Contracts.csproj",
"packagesPath": "C:\\Users\\tekh\\.nuget\\packages\\",
"outputPath": "E:\\TekH\\Visual Studio\\WebCoreModules\\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": {
"Microsoft.Extensions.Caching.Memory": {
"target": "Package",
"version": "[7.0.0, )"
},
"Microsoft.Extensions.Configuration.Binder": {
"target": "Package",
"version": "[7.0.4, )"
},
"System.DirectoryServices": {
"target": "Package",
"version": "[7.0.1, )"
},
"System.DirectoryServices.AccountManagement": {
"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"
}
}
}
}
}

View File

@@ -5,14 +5,12 @@
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool> <RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile> <ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot> <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> <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\tekh\.nuget\packages\;D:\ProgramFiles\DevExpress 21.2\Components\Offline Packages</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle> <NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.5.0</NuGetToolVersion> <NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.9.1</NuGetToolVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' "> <ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\tekh\.nuget\packages\" /> <SourceRoot Include="C:\Users\tekh\.nuget\packages\" />
<SourceRoot Include="D:\ProgramFiles\DevExpress 21.2\Components\Offline 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> </ItemGroup>
</Project> </Project>

View File

@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?> <?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' "> <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')" /> <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>
</Project> </Project>

View File

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

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