Compare commits

185 Commits

Author SHA1 Message Date
7ea89aa35e chore(DI): bump to 1.1.3 2025-08-19 12:11:18 +02:00
50f5289191 refactor(BaseEntity): Aktualisierung des Namespace der BaseEntity für Multi-Targeting
- Anpassung des Namespace und der Klammern der Klasse „User“, um sowohl .NET als auch .NET Framework zu unterstützen.
- Beibehaltung bestehender Eigenschaften und Anmerkungen, einschließlich der Behandlung von Nullwerten und erforderlichen Angaben pro Ziel.
- Gewährleistet die korrekte Kompilierung unter den Bedingungen „#if NET“ und „#if NETFRAMEWORK“.
2025-08-19 11:54:57 +02:00
f8dcd5ba41 refactor(User): Aktualisierung des Namespace der User-Entität für Multi-Targeting
- Anpassung des Namespace und der Klammern der Klasse „User“, um sowohl .NET als auch .NET Framework zu unterstützen.
- Beibehaltung bestehender Eigenschaften und Anmerkungen, einschließlich der Behandlung von Nullwerten und erforderlichen Angaben pro Ziel.
- Gewährleistet die korrekte Kompilierung unter den Bedingungen „#if NET“ und „#if NETFRAMEWORK“.
2025-08-19 11:36:43 +02:00
8f5015f7d7 Refactor(Domain): Aktualisieren Sie die Framework-Bedingung, um das gesamte .NET zu unterstützen, anstatt nur .NET 7 oder höher. 2025-08-19 11:32:05 +02:00
efcd26fb29 bump to 6.1.4 2025-08-11 13:42:05 +02:00
2ee0f976fd refactor(cnnString): Remove user ID encryption 2025-08-11 12:59:00 +02:00
a3087a5e34 refactor(appsettings.Auth.json): change Audiance 2025-08-11 11:32:30 +02:00
525a30b541 refactor(DirectoryController): Ersetzen der Benutzersuche im Cache durch direkten DirectoryEntry aus Optionen
- Hinzufügen der Abhängigkeitsinjektion `IOptions<DirSearchRoot>`, um den vorkonfigurierten DirectoryEntry-Stamm zu verwenden.
- Einführung des Feldes `_dirSearchRoot` für wiederverwendbare LDAP-Root-Bindung.
- Ersetzen der Aufrufe von `FindAllByUserCache` durch `FindAll` unter Verwendung von `DirectoryEntry` aus `_dirSearchRoot`.
- Entfernen der veralteten Endpunkte `GetRootOf` und `CreateSearchRoot`.
- Sicherstellen des Musters `using var sRoot` für die ordnungsgemäße Entsorgung von DirectoryEntry-Instanzen.
2025-08-11 11:06:07 +02:00
f5471a8d01 feat(api): DirSearchRoot-Modell für die Konfiguration der LDAP-Verzeichnissuche und die Konvertierung zu DirectoryEntry hinzufügen 2025-08-11 10:51:58 +02:00
bcdcdd679a fix: version number 2025-08-08 13:38:43 +02:00
88cffc12a5 chore: add api-version and bind with footer 2025-08-08 13:26:15 +02:00
3bffdabc64 chore(api): bump to 6.1.3 2025-08-08 13:12:03 +02:00
5b45bdfa6b refactor(style.css): update to disable user selection 2025-08-08 12:59:40 +02:00
4f5d034e53 feat(footer): bind version with package.json 2025-08-08 12:55:05 +02:00
17d4bc51f4 refactor(privacy-policy): style: iframe-Styling zur Layoutanpassung aktualisiert
- Versionsinformationen zur Fußzeile hinzufügen
2025-08-08 12:16:54 +02:00
fc4209eb40 feat(footer): add the component with css 2025-08-08 11:12:00 +02:00
545b629129 refactor(privacy-policy.component): Aktualisiert, um iframe zu verwenden.
- Mit dem Pfad privacy-policy verknüpfen
2025-08-07 17:58:27 +02:00
eceace7e5e add mock privacy policy 2025-08-07 14:07:20 +02:00
cb9c7694db feat(privacy-policy.component): create privacy-polic using pdf-viewer 2025-08-07 13:42:48 +02:00
4c99e1cbee add ng2-pdf-viewer package 2025-08-07 13:36:06 +02:00
39c97e1e3c fix(group-update-form.component): update component to siable save button if the group is internal 2025-08-07 12:29:04 +02:00
720c25bd5c feat(api-service): Snackbar bei erfolgreichem Update anzeigen 2025-08-07 11:58:03 +02:00
ae0301c5be feat(group-update-form.component): update the component template to disable group name, comment, and aktiv components 2025-08-07 11:41:34 +02:00
8f31377b99 fix(GroupService): update to disable to change if the group is internal 2025-08-07 11:27:17 +02:00
Developer 02
addf7585f2 chore: configure for pnpm 2025-08-06 20:00:53 +02:00
Developer 02
dddabefc7d refactor(proxy.conf): change proxy port 2025-08-06 19:02:58 +02:00
Developer 02
9c5cf2de30 feat(config): Alle Nicht-Entwicklungs-appsettings.*.json-Dateien dynamisch laden
- Es wurde eine Logik hinzugefügt, um alle `appsettings.*.json`-Dateien in Nicht-Entwicklungsumgebungen einzubeziehen,
mit Ausnahme von `appsettings.Development.json`, sodass umgebungsspezifische Konfigurationen automatisch geladen werden können.
2025-08-06 16:46:29 +02:00
Developer 02
ca214225ea feat: Neue Update-Methode in GroupService hinzugefügt mit Validierung für Systemgruppen 2025-08-05 20:27:15 +02:00
Developer 02
733cb967cb refactor(CRUDControllerBaseWithErrorHandling): update use CRUDControllerBase 2025-08-05 19:53:04 +02:00
Developer 02
278090ea85 refactor(UserRepController): remove try-catch block 2025-08-05 19:50:43 +02:00
Developer 02
5f41e1b604 refactor(UserController): remove try-catch block 2025-08-05 19:50:04 +02:00
Developer 02
e0683a8d17 refactor(ModuleOfUserController): remove try-catch block 2025-08-05 19:49:13 +02:00
Developer 02
dda2f25b57 refactor(GroupOfUserController): remove try-catch block 2025-08-05 19:48:36 +02:00
Developer 02
d252859b11 refactor(GroupController): remove try-catch block 2025-08-05 19:47:56 +02:00
Developer 02
9fd66d41ca refactor(DirectoryController): remove try-catch block 2025-08-05 19:47:24 +02:00
Developer 02
4725614bb3 refactor(AuthController): remove try-catch block 2025-08-05 19:45:37 +02:00
Developer 02
5f7e040e3e refactor(ExceptionHandlingMiddleware): update to handle ForbiddenException 2025-08-05 19:44:37 +02:00
Developer 02
6e6af4b667 feat(ExceptionHandlingMiddleware): add middleware to handle error 2025-08-05 19:27:37 +02:00
Developer 02
f6c2568b25 refactor(GroupReadDto): made internal notnull 2025-08-05 19:24:40 +02:00
Developer 02
e35dbefb6f fix(csproj): change packge icon path 2025-08-05 19:05:29 +02:00
Developer 02
448ddf7eba chore: move projects to src dir 2025-08-05 19:01:02 +02:00
Developer 02
cb446ef25a refactor(wwwroot): deleted 2025-08-05 18:56:42 +02:00
098c2e1c47 feat(Verzeichnis): Client-Methode erstellt und Endpunkte angeordnet 2025-07-29 09:59:52 +02:00
3d8076e3b6 fix references 2025-07-28 15:15:38 +02:00
5cfc31b83c refactor(changeDetection): update to use On push in components and pages 2025-07-28 14:07:13 +02:00
cca98e136f refactor(appsettings): ipdated AuthClientParams to use 172.24.12.39:9090 2025-07-28 11:27:01 +02:00
9a91d1f14d Set minimum log level Trace 2025-07-28 10:57:17 +02:00
0057a2d260 chore: upgrede auf 6.1.1
- Bauort nach \API verschieben
 - AuthClientParams.Url auf 9090 aktualisieren
2025-07-22 17:55:06 +02:00
854db39f30 chore(Domain): update version 2025-07-22 15:50:40 +02:00
f79fa4ca27 fix(auth): Verbesserung von isAuthenticated() durch Überprüfung des HTTP-Antwortstatus
Die isAuthenticated()-Methode wurde aktualisiert, um den Anmeldestatus anhand des HTTP-Antwortstatus zu bestimmen, anstatt sich nur auf den Antwortkörper zu verlassen. Außerdem wird sichergestellt, dass `_isLogedIn` im Fehlerfall explizit auf false gesetzt wird. Dies verbessert die Zuverlässigkeit der Sitzungsvalidierung.
2025-07-22 15:45:38 +02:00
55822047bc refactor(api.models): Verschiebung ins api-Verzeichnis und Vereinfachung der Namenskonvention 2025-07-22 14:21:31 +02:00
de360968dc refactor(User): Aktualisierung des User-Modells. 2025-07-22 14:15:35 +02:00
06303ec2b5 refactor(startup): remove cookie-based authentication configuration 2025-07-22 13:13:52 +02:00
437f33a323 fix(auth): Fehlermeldung bei 401 unauthorized während der Login-Prüfung verhindern
Überspringe die Anzeige der Fehlermeldung in isAuthenticated, wenn der Antwortstatus 401,
ist, was typischerweise anzeigt, dass der Benutzer einfach nicht eingeloggt ist, nicht ein Serverproblem.
2025-07-22 10:33:42 +02:00
963ab12488 chore: add scripts to be able to start without ssl
- changed target of proxy
2025-07-22 10:19:36 +02:00
df24905a0e feat(logging): NLog nur in Nicht-Entwicklungsumgebungen anwenden
Die Einrichtung des Logging-Anbieters wurde mit einer Prüfung versehen, um sicherzustellen, dass NLog nur verwendet wird, wenn es sich nicht in der Entwicklung befindet. Dadurch wird verhindert, dass das Standard-Protokollierungsverhalten während der Entwicklung überschrieben wird.
2025-07-22 08:51:06 +02:00
0659734346 Bump package versions and update User class declaration
Incremented version numbers in DependencyInjection and Domain projects.
Changed User class to partial for better organization and flexibility.
2025-06-26 16:36:24 +02:00
9af19713a0 Bump version numbers for multiple projects
Updated version, AssemblyVersion, and FileVersion for:
- DigitalData.UserManager.API: 6.1.0 to 6.1.1
- DigitalData.UserManager.Application: 3.2.0 to 3.2.1
- DigitalData.UserManager.DependencyInjection: 1.1.0 to 1.1.1
- DigitalData.UserManager.Domain: 3.2.0 to 3.2.1
- DigitalData.UserManager.Infrastructure: 3.1.0 to 3.1.1
2025-06-26 15:48:30 +02:00
06ad3516f1 Enhance User entity with required properties and updates
- Added conditional compilation for .NET Framework.
- Made `GeneralViewer`, `WanEnvironment`, and `DeletedWho` properties required with appropriate attributes.
- Renamed `UseridFkIntEcm` to `UserIdFkIntEcm` and marked it as required.
- Changed `DeletedWhen` to a non-nullable `DateTime`.
- Removed previously ignored columns, activating them in the class definition.
2025-06-26 15:45:22 +02:00
23c7b7a293 Bump version numbers
Updated version, assembly version, and file version for:
- DigitalData.UserManager.API: 6.0.1 to 6.1.0
- DigitalData.UserManager.Application: 3.1.3 to 3.2.0
- DigitalData.UserManager.DependencyInjection: 1.0.0 to 1.1.0
- DigitalData.UserManager.Domain: 3.1.0 to 3.2.0
- DigitalData.UserManager.Infrastructure: 3.0.2 to 3.1.0
2025-06-26 14:02:59 +02:00
53bfc4a413 Suppress warnings for obsolete members and update repo
Added warning suppression in `Program.cs` for obsolete user manager configuration. Marked `ClientUserRepository` as obsolete to encourage transition to the new `Repository` class.
2025-06-26 13:56:42 +02:00
3de7e64f85 Deprecate services and update mapping profiles
- Added obsolete attributes to `AuthController`, `ModuleController`, and various mapping profiles, recommending the use of MediatR and DigitalData.Core.Exceptions.
- Updated `User` class to use `required` keyword for `DateFormat` in .NET 7.0 or greater.
- Marked methods in `Extensions` and `AddUserManagerInfrastructure` as obsolete, suggesting the use of IRepository.
- Adjusted import statements in `DependencyInjection.cs` and marked `GroupOfUserRepository` and `ModuleRepository` as obsolete, recommending a Repository pattern.
2025-06-26 13:53:54 +02:00
39a9181257 Deprecate methods and classes in UserManager.Application
Introduce `[Obsolete]` attributes to various methods and classes, suggesting alternatives such as MediatR and IRepository. Mark multiple DTOs and repository classes as obsolete, recommending the use of DigitalData.Core.Exceptions and .Middleware or Repository. This change aims to enhance maintainability and clarity in the codebase.
2025-06-26 13:37:59 +02:00
5d3f73bb13 Refactor entity properties for nullability and requirements
Removed nullable indicators from string properties in
BaseEntity.cs, ClientUser.cs, Group.cs, and User.cs.
The Username property in User.cs is now marked as
required for .NET 7 or greater, improving data integrity
and reducing null reference risks.
2025-06-26 13:20:54 +02:00
bc44de63ee Update project for multi-targeting and nullable types
Updated `DigitalData.UserManager.Domain.csproj` to support .NET 4.6.2, 7.0, 8.0, and 9.0. Adjusted implicit usings and nullable reference types settings based on the target framework, disabling nullable types for `net462` and enabling them for others.

Refactored entity classes (`BaseEntity`, `ClientUser`, `Group`, `GroupOfUser`, `Module`, `ModuleOfUser`, `User`, and `UserRep`) to conditionally include nullable reference types. Added `?` operator for string properties in .NET 7.0 and above, enhancing code safety and reducing null reference exceptions.
2025-06-26 13:15:36 +02:00
b1075c8b82 Add .NET Framework 4.6.2 support and improve nullability
Updated `DigitalData.UserManager.Domain.csproj` to target .NET Framework 4.6.2 alongside .NET 7.0, 8.0, and 9.0. Corrected `PackageTags` from "user maanger" to "user manager" and added property groups for implicit usings and language versions.

Introduced nullable reference types in entity classes (`BaseEntity`, `ClientUser`, `Group`, `User`, etc.) for enhanced type safety. Updated properties in the `User` and `UserRep` classes to use the new nullable syntax, ensuring consistency across the codebase.

These changes improve compatibility with newer C# features and maintain support for multiple frameworks.
2025-06-26 12:27:24 +02:00
40deb9968f Update namespaces and package references
Refactor namespaces from `DigitalData.Core.DTO` to `DigitalData.Core.Abstraction.Application.DTO` in multiple controllers to adopt a new abstraction layer. Update `DigitalData.Core.API` package from version `2.2.0` to `2.2.1` and add `DigitalData.Core.Abstraction.Application` package with version `1.0.0`. Add `[Obsolete("Use MediatR")]` attribute to several controllers to encourage transitioning to MediatR for request handling.
2025-06-26 11:47:43 +02:00
182771afd2 Refactor AuthController to use MediatR
- Added using directive for DigitalData.Core.Abstraction.Application.DTO.
- Marked IUserService and GetUserWithClaims as obsolete.
- Transitioning towards MediatR for handling requests and responses.
2025-06-26 10:15:58 +02:00
668eef2a4d Update BaseReadDto namespace and mark as obsolete
Replaced the namespace import from `DigitalData.Core.DTO` to `DigitalData.Core.Abstraction.Application.DTO` in `BaseReadDto.cs`. Added an `Obsolete` attribute to indicate deprecation and recommend using `DigitalData.Core.Exceptions and .Middleware` instead. This change enhances code organization and clarity.
2025-06-26 10:00:01 +02:00
e9527ca61e Refactor namespaces and update DTO structures
Updated namespaces for DTOs and services to improve project organization. Marked several interfaces as obsolete in favor of MediatR for better request handling. Simplified `BaseUpdateDto` and other DTOs by removing `IUnique<int>` implementation. Changed return types of `CreateAsync` methods to return corresponding read DTOs. Removed reference to `DigitalData.Core.DTO` in the project file, reflecting a shift in architecture for maintainability.
2025-06-25 17:14:24 +02:00
8f2ec82d4f Mark IBaseService as obsolete for MediatR usage
Added an `Obsolete` attribute to the `IBaseService` interface, recommending the use of MediatR instead. This change serves as a warning to developers about potential deprecation, encouraging a transition to the suggested alternative.
2025-06-25 16:04:27 +02:00
cc708cae0c Refactor namespace and update project dependencies
Updated the import statement for `DigitalData.Core.Abstractions.Application` to `DigitalData.Core.Abstraction.Application` in `IBaseService.cs`. Removed the `PackageReference` for `DigitalData.Core.Abstractions` version `4.0.0` from the project file, indicating a shift in library usage.
2025-06-25 16:03:14 +02:00
b936677c16 Update packages and simplify entity definitions
- Updated package references to newer versions for `DigitalData.Auth.Client`, `DigitalData.Core.API`, `DigitalData.Core.Abstractions`, `DigitalData.Core.Application`, and `DigitalData.EmailProfilerDispatcher.Abstraction`.
- Changed `UserManager.Domain` package version from `3.0.2` to `3.1.0` and updated assembly and file versions.
- Removed `IUnique<int>` interface implementation from `BaseEntity`, `ClientUser`, `Module`, and `ModuleOfUser`.
- Added data annotations to the `User` class for various properties that were previously commented out.
- Updated `Microsoft.EntityFrameworkCore` package references in the `Infrastructure` project for `net7.0` and `net9.0`.
- Modified solution configuration to change a project's build configuration from Debug to Release.
2025-06-25 14:46:39 +02:00
Developer 02
d1155cb406 Update project file for version 3.0.2 release
- Changed SDK declaration to include a non-breaking Unicode character.
- Incremented version number from 3.0.1 to 3.0.2 for package and assembly.
- Updated copyright year to 2024.
2025-04-16 14:29:33 +02:00
Developer 02
9ae3345859 chore: Aktualisierung des Verweises auf das Paketsymbol in den Projektdateien
Die Projektdateien für `DigitalData.UserManager` wurden geändert, um auf ein neues Paketsymbol zu verweisen, das sich unter `..\Assets\icon.png` befindet. Dazu gehört das Hinzufügen des Elements „<PackageIcon>“ in „DigitalData.UserManager.API.csproj“ und die Aktualisierung der Elemente „<None>“ in mehreren Projektdateien. Die alte Icondatei wurde gelöscht, und die Abschnitte von `<ItemGroup>` wurden angepasst, um sicherzustellen, dass das neue Icon korrekt in das Projekt gepackt wird.
2025-04-16 14:23:59 +02:00
Developer 02
a4e4883d6b chore: Hinzufügen des Projekts "Assets" mit einer Symboldatei zur Projektmappe
Es wurde ein neues Projekt namens "Assets" eingeführt, das eine Symboldatei (`icon.png`) enthält. Dieses Projekt ist in der Struktur der Projektmappe unter "Projektmappenobjekte" organisiert, was die Verwaltung der Projektressourcen verbessert.
2025-04-16 14:19:22 +02:00
Developer 02
9f6acfb8d3 chore: Erhöhen der Projektversionen und Entfernen unbenutzter JS-Dateien
Aktualisierte Versionsnummern für API-, Anwendungs- und Infrastrukturprojekte:
- API: 6.0.0 auf 6.0.1
- Anwendung: 3.1.2 bis 3.1.3
- Infrastruktur: 3.0.1 bis 3.0.2

Außerdem wurden die Assembly- und Dateiversionen entsprechend aktualisiert. Zwei unbenutzte JavaScript-Dateien wurden aus dem API-Projekt entfernt.
2025-04-16 14:16:28 +02:00
Developer 02
be78947b48 Remove Windows service check and update package versions
Updated `Program.cs` to eliminate the Windows service conditional check.
Updated `DigitalData.Core.Abstractions` and `DigitalData.Core.Application`
to versions 3.4.1 and 3.2.1, respectively. Removed the
`DigitalData.Core.Infrastructure` package reference. In
`DigitalData.UserManager.Infrastructure.csproj`, updated
`DigitalData.Core.Infrastructure` to version 2.0.1 and added
`Microsoft.EntityFrameworkCore.Relational` for net7.0, net8.0,
and net9.0 with corresponding versions.
2025-04-16 14:13:04 +02:00
Developer 02
b2e64e794c Update package references for target frameworks
Added `DigitalData.Core.Infrastructure` version `2.0.0` and updated package references for `net7.0`, `net8.0`, and `net9.0` in `DigitalData.UserManager.Application.csproj`. Updated `AutoMapper` to version `14.0.0` for `net8.0` and `net9.0`, along with other related packages to their latest versions.
2025-04-16 13:16:07 +02:00
Developer 02
d6b82cf085 Update Entity Framework Core package references
Removed the fixed version for Microsoft.EntityFrameworkCore
and added conditional references for versions 7.0.20, 8.0.15,
and 9.0.4 based on target frameworks net7.0, net8.0, and
net9.0, respectively.
2025-04-16 13:04:40 +02:00
Developer 02
6cd72fe755 Überarbeitung der UserManager-Konfiguration und -Abhängigkeiten
Unnötige Paketverweise wurden aus dem API-Projekt entfernt, einschließlich Entity Framework Core und System.DirectoryServices. Ersetzte `AddDbContext` durch `AddUserManager` in `Program.cs`, um die UserManager-Dienstkonfiguration zu rationalisieren. Die Datei `Extensions.cs` wurde aktualisiert, um die Überladung der Verbindungszeichenfolge für `AddUserManager` zu entfernen, und `DependencyInjection.cs` wurde geändert, um die Einrichtung der UserManager-Infrastruktur zu vereinfachen.
2025-04-16 12:50:36 +02:00
Developer 02
8d0beab709 Refactoring der Projektabhängigkeiten und Aktualisierung von Program.cs
Verweise auf DigitalData.UserManager.Application und
DigitalData.UserManager.Domain in DigitalData.UserManager.API.csproj entfernt.
Ein Verweis auf DigitalData.UserManager.DependencyInjection
wurde hinzugefügt, um die Architektur zu rationalisieren und die Verwaltung von Abhängigkeiten zu verbessern.
Program.cs wurde aktualisiert, um den neuen Namespace für Dependency Injection
für ein verbessertes Service-Management aufzunehmen.
2025-04-16 11:45:50 +02:00
Developer 02
52871f006d Refactor UserManager dependency injection setup
Umbenennung der Methoden für mehr Klarheit: `AddUserManager` zu `AddUserManagerApplication` und `AddInfrastructureServices` zu `AddUserManagerInfrastructure`. Neue Projektreferenzen für `Application`, `Domain` und `Infrastructure` in der `DigitalData.UserManager.DependencyInjection.csproj` hinzugefügt. Einführung von Erweiterungsmethoden in `Extensions.cs`, um die Registrierung von UserManager-Diensten zu rationalisieren und die Kohärenz zwischen Infrastruktur- und Anwendungsdienstregistrierungen zu verbessern.
2025-04-16 11:42:48 +02:00
Developer 02
ac064f4671 refactor: UserManagerPack durch DependencyInjection-Projekt ersetzen
Das Projekt `DigitalData.UserManagerPack` wurde entfernt und `DigitalData.UserManager.DependencyInjection` hinzugefügt. Die Konfiguration der Projektmappe wurde aktualisiert, um diese Änderung widerzuspiegeln und die richtigen Build-Einstellungen für den Debug- und den Release-Modus sicherzustellen. Das neue Projekt behält die gleichen Eigenschaften und Einstellungen wie das alte Projekt und erfüllt unter einem neuen Namen einen ähnlichen Zweck.
2025-04-16 11:07:06 +02:00
Developer 02
2d792c8544 chore: Refactor project structure and update DI setup
Die Datei `DIExtensions.cs` wurde erheblich überarbeitet, um Abhängigkeiten von der Schicht `DigitalData.UserManager.Infrastructure` zu entfernen. Die Methode `AddUserManager` wurde vereinfacht und eine Methode `AddEncryptor` hinzugefügt. Die Projektverweise auf die Infrastrukturebene in der Anwendungsprojektdatei wurden entfernt. Aktualisierte Servicedateien zur Verwendung neuer Repository-Schnittstellen aus „DigitalData.UserManager.Application.Contracts.Repositories“. Repository-Schnittstellen wurden in den Namensraum für Anwendungsverträge verschoben und ihre Definitionen aktualisiert. Einführung von `DependencyInjection.cs` für die Handhabung von Infrastrukturdienstregistrierungen. Aktualisierte Repository-Implementierungen, um sie an die neue Struktur anzupassen, die Trennung von Belangen zu verbessern und die Injektion von Abhängigkeiten zu vereinfachen.
2025-04-16 11:02:44 +02:00
Developer 02
239a5708a7 Add DigitalData.UserManagerPack project to solution 2025-04-16 10:26:47 +02:00
Developer 02
23283a6846 Add DigitalData.UserManagerPack project file
Created and configured `DigitalData.UserManagerPack.csproj` to target .NET frameworks 7.0, 8.0, and 9.0. Added project metadata including PackageId, Version, Authors, and Description. Established references to `DigitalData.UserManager.Application`, `DigitalData.UserManager.Domain`, and `DigitalData.UserManager.Infrastructure`.
2025-04-16 10:25:11 +02:00
Developer 02
7d317308d5 chore: Aktualisierung der Projekte auf .NET 9.0 und Paketversion
Die Projektdateien für die Anwendung DigitalData.UserManager wurden aktualisiert, um .NET 9.0 neben .NET 7.0 und .NET 8.0 als Ziel zu verwenden. Diese Änderung betrifft die folgenden Projektdateien: `DigitalData.UserManager.API.csproj`, `DigitalData.UserManager.Application.csproj`, `DigitalData.UserManager.Domain.csproj` und `DigitalData.UserManager.Infrastructure.csproj`.

Außerdem wurde die Version des Pakets `DigitalData.EmailProfilerDispatcher.Abstraction` in der Datei `DigitalData.UserManager.Application.csproj` von 2.0.0 auf 3.0.0 aktualisiert.
2025-04-16 10:13:42 +02:00
Developer 02
2aab942563 refactor(PlaceholderAuthController): AuthController umbenennen 2025-03-25 15:34:34 +01:00
Developer 02
054c91609e feat(AuthController): Aktiviere GetUserWithClaims Endpunkt 2025-03-25 14:15:31 +01:00
Developer 02
5c097eda80 Aktivierter Logout-Endpunkt 2025-03-25 14:00:19 +01:00
Developer 02
d228a3cd50 Aktiviert Endpunkt prüfen 2025-03-25 13:56:17 +01:00
Developer 02
0786013bd0 fix(AuthTokenKey): Update default audiance 2025-03-25 13:50:30 +01:00
Developer 02
beabc3f4e0 fix(appsettings): AuthCLientParms.Url 2025-03-25 13:32:24 +01:00
Developer 02
44560e7057 feat(Programm): Konfiguriert für Auth.API 2025-03-25 13:19:29 +01:00
Developer 02
2098a7d48d feat(LazyServiceProvider): Erstellt als Callback des Service Providers 2025-03-25 13:09:39 +01:00
Developer 02
140f172369 Ansprüche über ModelExtensipons konfigurieren 2025-03-25 13:07:06 +01:00
Developer 02
b3e7c1aa99 chore(API): Aktualisierung DigitalData.Auth.Client 1.3.5 2025-03-25 12:33:29 +01:00
Developer 02
0d4436b061 chore: aktualisiert, um sowohl .net 7 als auch .net 8 zu unterstützen 2025-03-25 11:52:03 +01:00
Developer 02
b88fd78367 chore(API): Hinzufügen von DigitalData.Auth.Client 1.3.3 nuget-package. 2025-03-24 16:47:56 +01:00
Developer 02
7670f2119e refactor(AuthController): Konvertiert in einen Platzhalter-Controller für Swagger. 2025-03-24 16:40:54 +01:00
Developer 02
a142196d87 chore: aktualisierte DigitalData.Core-Pakete 2025-03-24 14:17:23 +01:00
Developer 02
59e8c6c0c6 fix(Anwendung): Standard StringLocalizer auf null setzen, um die Abhängigkeit zu entfernen.
- Hochgestuft auf 3.1.2
2025-01-20 14:41:29 +01:00
Developer 02
3cf1215a1c chore(Infrastruktur): Hochgestuft auf 3.0.1 2025-01-20 14:19:37 +01:00
Developer 02
81c00401b7 chore(Domain): Hochgestuft auf 3.0.1 2025-01-20 14:18:26 +01:00
Developer 02
e86b42d955 chore(Application): Hochgerüstet auf 3.1.1 2025-01-20 14:16:08 +01:00
Developer 02
80d28e12b9 refactor: Updated the Application, Domain and Infrastructure projects to support .net 8 in addition to .net 7. 2025-01-20 14:14:24 +01:00
Developer 02
7fc71f427b refactor(Application): made IStringLocalizer<Resource> 2025-01-20 14:10:31 +01:00
Developer 02
bd7d521c1e chore(Application): Hochgestuft auf 3.1 2025-01-15 12:47:11 +01:00
Developer 02
33326866f9 feat(DIExtensions): AddUserManager hinzugefügt, um mit db-Kontext hinzuzufügen 2025-01-15 12:45:59 +01:00
Developer 02
fbf9bbeba0 chore: Aktualisierte Nuget-Pakete auf 3 2025-01-15 11:45:00 +01:00
Developer 02
b7f8ea1e8e chore: Aktualisierte Core.Application 2025-01-15 11:43:18 +01:00
Developer 02
6fc8bdc964 chore: Aktualisierung der Version des Angular-Anwendungspakets auf 4.0.0 2024-11-12 14:46:29 +01:00
Developer 02
b3d46aaf30 Chore: Aktualisieren der Version von 3.0.0.0 auf 4.0.0.0. 2024-11-12 14:03:46 +01:00
Developer 02
2870f0e18e refactor(wwwroot): Angular-App aktualisieren 2024-11-12 13:59:20 +01:00
Developer 02
337a0b892e refactor(style.scss): Die Farben der Punktlinien wurden überarbeitet. 2024-11-12 13:49:08 +01:00
Developer 02
2e1bf69889 feat(base-table.component): Erstellt Klick-Ereignis.
- Klick-Ereignisse anstelle von OnSelectedRows-Ereignissen hinzugefügt
2024-11-12 13:46:10 +01:00
Developer 02
0657bbe2c4 feat(user-representation.component): Hinzufügen von Zeilenklassenfunktionalität für die Klassifizierung von Zeiträumen in der Benutzerdarstellungskomponente 2024-11-12 10:02:33 +01:00
Developer 02
acfd9b4fb8 feat(base-table.component): Attribute rowStyle und rowClass hinzugefügt 2024-11-11 16:42:22 +01:00
Developer 02
0f9ac0e637 refactor(user-representation.component): userReps.fetchData-Methode zum Refresh-Dienst hinzugefügt. 2024-11-11 15:56:30 +01:00
Developer 02
0a8a5208a0 refactor(environment.ts): if-Anweisung hinzugefügt, um einen leeren String zurückzugeben, wenn volidFrom oder validTo null ist 2024-11-11 15:36:30 +01:00
Developer 02
b1011c3ea2 refactor(style.css): Rückgängig gemacht.
- Spezifisches CSS zu rep-create-form.component.scss hinzugefügt
2024-11-11 15:29:55 +01:00
Developer 02
11913ea667 refactor(SerializerSettings.DateTimeZoneHandling): Aktualisiert, um über Appsettings konfiguriert zu werden.
- Standardmäßig auf „Lokal“ eingestellt.
2024-11-11 15:13:25 +01:00
Developer 02
ff6ebf300c refactor(user-representation.component): Aktualisiert, um als unbegrenzt zu speichern. 2024-11-11 14:09:10 +01:00
Developer 02
7e05123fbf feat(rep-create-form.component): Umschaltmöglichkeit für unbegrenzte Zeit hinzugefügt 2024-11-11 12:13:58 +01:00
Developer 02
712932a0e2 feat(rep-create-form.component): Eigenschaft zur Deaktivierung der Datumsbereichseingabe hinzugefügt 2024-11-11 10:05:09 +01:00
Developer 02
a946ba871d feat(UserRepService): Die Methode CreateAsync wurde überschrieben.
- XOR-Logik hinzugefügt, um zu prüfen, ob ValidFrom und ValidTo Null sind
 - Logik hinzugefügt, um zu kontrollieren, dass ValidFrom kleiner als ValidTo ist
2024-11-11 09:36:48 +01:00
Developer 02
c060cd9083 refactor(UserRep): ValidFrom- und ValidTo-Attribute in Entitäten und DTOs nullbar gemacht 2024-11-08 16:34:30 +01:00
Developer 02
371967380b refactor(rep-create-form.component): Erstellung gestoppt, wenn das Formular nicht gültig ist 2024-11-08 16:27:41 +01:00
Developer 02
7316343658 feat: Hinzufügen von Newtonsoft.Json Unterstützung und Entfernen von doppelten Controller-Konfigurationen
- Hinzugefügt: Newtonsoft.Json zur Projektdatei und konfiguriert, um UTC für DateTime-Serialisierung zu verwenden.
- Entfernt: Doppelte Controller-Konfiguration für das Hinzufügen von Conventions.
- Aktualisiert: Projektdatei mit neuen Paketreferenzen für Newtonsoft.Json und Microsoft.AspNetCore.Mvc.NewtonsoftJson.
2024-11-08 16:11:48 +01:00
Developer 02
31c8249516 feat(rep-create-form.component): Datumslokalisierung für Deutschland hinzugefügt 2024-11-08 14:28:22 +01:00
Developer 02
114995d274 feat(rep-create-form.component): Vorlage erstellt.
- Mat-Datumsbereich-Eingabe hinzugefügt.
 - Klick-Ereignis der Erstellungsschaltfläche arrangiert
2024-11-08 13:44:40 +01:00
Developer 02
e8376ccd21 feat(Benutzer-Darstellung): - openCreateSheet-Methoden in repUserOnSelectedRows-Events integriert
- create-Methode zur Komponente rep-create-form hinzugefügt
2024-11-08 11:36:53 +01:00
Developer 02
52e6eac71d feat(rep-create-form): Initialized and add as a pop-up menu in user-representation 2024-11-08 10:34:09 +01:00
Developer 02
36c55b6382 refactor(UserRepCreateDto): Die Eigenschaften validFrom und validTo wurden zu not-null. 2024-11-08 10:17:43 +01:00
Developer 02
c73b299e3e refactor(UserRep): Hinzufügen der Eigenschaften validFrom und validTo zum UserRep-Modell.
- Spalten 'validFrom' und 'validTo' zu Umgebungen hinzugefügt.
2024-11-08 10:12:46 +01:00
Developer 02
968ff8349f feat(UserRep): Required-Attribut für ValidFrom und ValidTo hinzugefügt. 2024-11-06 17:13:09 +01:00
Developer 02
770921011a feat: Füge die Spalten ValidFrom und ValidTo zur UserRep-DTO hinzu. 2024-11-06 17:11:38 +01:00
Developer 02
a9bc4f90ac feat: Füge die Spalten ValidFrom und ValidTo zur UserRep-Entität hinzu. 2024-11-06 16:32:47 +01:00
Developer 02
6e5ba82869 fix(user-representation): UserRep.addedWho nullable machen, um die Annahme des aktuellen Benutzers durch die API zu ermöglichen 2024-11-06 16:26:21 +01:00
Developer 02
fb3dedadc5 refactor: Ersetze fetchData-Aufrufe durch fetchByUser- und fetchByGroup-Methoden in UserRepresentationComponent, um Fehler zu vermeiden. 2024-11-06 15:46:27 +01:00
Developer 02
8cf2183cd6 refactor(user-representation): Umbenennung von 'slUserRepId' in 'slRepId' 2024-11-06 15:37:48 +01:00
Developer 02
881d2ccac8 refactor(user-representation): Umbenennung von 'userRepOnSelectedRows' in 'repOnSelectedRows' 2024-11-06 15:34:51 +01:00
Developer 02
deacd1a8c6 fix: Parameter in den ReadAllAsync-Methoden in UserRepController und UserRepService explizit benennen 2024-11-06 14:57:14 +01:00
Developer 02
616862391e feat: fetchByUser und fetchByGroup Methoden in UserRepTableComponent zur gezielten Datenabfrage hinzugefügt 2024-11-06 11:15:21 +01:00
Developer 02
296f29cf82 refactor: redundante Funktion entfernen und Logik zur Verarbeitung ausgewählter Zeilen in UserRepresentationComponent konsolidieren 2024-11-06 10:52:19 +01:00
Developer 02
5df5cc555a refactor(UserRep): nullable related propoerties gemacht.
- RepUserId von UserRepCreateDto löschbar gemacht.
 - ChangedWho von UserRepReadDto löschbar gemacht.
 - RepUserId von UserRepUpdateDto löschbar gemacht.
2024-11-06 10:03:10 +01:00
Developer 02
b3131637ab chore: npm-Build-Skript aktualisiert 2024-10-31 16:03:30 +01:00
Developer 02
4d9a766864 chore: Aktualisiert auf 3.0.0. 2024-10-31 15:57:57 +01:00
Developer 02
01bc5a4425 fix(user-rep.component): geordnete Assgiment-Ereignisse und -Anfragen 2024-10-31 15:54:53 +01:00
Developer 02
be07f16d63 feat(UserRep): UserId in DTOs und Entitäten löschbar gemacht 2024-10-31 14:59:01 +01:00
Developer 02
671500b3a5 feat(AuthController): aktualisiert, um zu prüfen, ob der eingeloggte Benutzer in der erlaubten Gruppe in appsettings ist. 2024-10-31 14:44:39 +01:00
Developer 02
1be71a42e5 refactor: vereinfache env-Spaltennamen für Gruppen
- Ersetzte das `complete`-Spaltenset der Gruppe durch ein vereinfachtes `detailed`-Set.
- Wesentliche Felder für die `detailed`-Ansicht beibehalten, Entfernen der Schalter für die Status 'Aktiv', 'AD Sync' und 'Intern'.
- Vereinfachte Anzeige durch Fokussierung auf Kernfelder, für effizientes Rendering und leichtere Wartung.
2024-10-31 13:28:44 +01:00
Developer 02
6319d22ba9 feat: aktualisiere das Template von GroupUpdateFormComponent mit Formularfeldern und Steuerungen
- Platzhaltertext durch eine strukturierte Formularanordnung ersetzt, einschließlich Felder für 'Id', 'Gruppe' und 'Kommentar' mit mat-form-field-Komponenten.
- Slide-Toggles für die Statussteuerungen 'Aktiv', 'Interne Gruppe' und 'Mit Active Directory' hinzugefügt.
- Schreibgeschützte Felder für 'Hinzugefügt wer', 'Hinzugefügt wann', 'Geändert wer' und 'Geändert wann' mit Datumsformatierung hinzugefügt.
- Speichern- und Löschen-Schaltflächen mit Icons für verbesserte Benutzerinteraktion integriert.
- Formularbenutzerfreundlichkeit und visuelles Layout für eine konsistente Benutzererfahrung verbessert.
2024-10-31 13:22:43 +01:00
Developer 02
5551610dff refactor(user-update-form.component.css): Nach style.scss verschoben, um es global zu machen 2024-10-31 12:41:43 +01:00
Developer 02
b997ea4cce feat: erweitere GroupUpdateFormComponent um Dialogintegration und Formularkontrollen
- Abhängigkeiten für Angular Material-Komponenten, Formularsteuerung und RxJS-Utilities hinzugefügt.
- MatDialogRef und MAT_DIALOG_DATA für die Dialoginteraktion innerhalb der Komponente injiziert.
- FormControl-Instanzen zur Verwaltung der Felder 'name' und 'comment' des Group-Modells integriert.
- Update-Funktionalität implementiert, die Änderungen über GroupService übermittelt und bei Erfolg ein Refresh auslöst.
- Löschfunktion mit Bestätigungsaufforderung über SweetAlert2 hinzugefügt, mit Verarbeitung erfolgreicher Löschungen und Fehlerfällen.
- Verbesserte Fehlerbehandlung mit aussagekräftigen Meldungen für eine bessere Benutzererfahrung.
2024-10-31 12:38:29 +01:00
Developer 02
1b5fa1f52c feat(group-update-form.component): Initialisiert
- Zur Gruppenkomponente als Popup-Seite nach Doppelklick auf Zeilenereignis hinzugefügt
2024-10-31 11:43:56 +01:00
Developer 02
5f4a8e373c refactor: Ändere die Variable sGroupId zu sGroup und passe die Methode groupsOnSelectedRows an, um das sGroup-Objekt zu verarbeiten. 2024-10-31 11:37:15 +01:00
Developer 02
91b78f4b59 refactor(user.component): Verwendung von einfachen Benutzer-Spalten-Namen anstelle von detaillierten Benutzer-Spalten-Namen 2024-10-31 11:02:12 +01:00
Developer 02
3749b5ee97 feat(user-update): readonly Eingabe für addedWho, addedWhen, changedWho und changedWhen hinzugefügt 2024-10-31 10:49:02 +01:00
Developer 02
ab6c843248 feat: aktualisiere UserReadDto zur Durchsetzung erforderlicher Eigenschaften
- Die Eigenschaften 'Username', 'Language', 'DateFormat', 'ChangedWho', 'ChangedWhen' und 'AddedWhen' wurden als erforderlich festgelegt, um sicherzustellen, dass notwendige Daten bereitgestellt werden.
- 'AddedWho' wurde zu einer nur-initialisierbaren Eigenschaft aktualisiert, um die Unveränderlichkeit nach der Objekterstellung zu fördern.
- Diese Änderung verbessert die Datenintegrität und Validierung innerhalb der UserReadDto-Klasse.
2024-10-31 10:39:50 +01:00
Developer 02
b6bc97df07 feat(user-update): Readonly-Eingabe für Id hinzugefügt
- Responsive CSS-Klassen für prozentuale Breiten hinzugefügt
2024-10-31 10:20:30 +01:00
Developer 02
44a017ad9e feat(user-update): Konstante Variablen erstellt, um die erlaubten Sprachen in den Umgebungen zu bestimmen.
- Combobox mit erlaubten Sprachen als Optionen mit Angular for-Schleife erstellt
2024-10-31 09:15:20 +01:00
Developer 02
faac31b3bb feat(user-update): Konstante Variablen zur Bestimmung der zulässigen Datumsformate in den Umgebungen erstellt.
- Zugelassene Datumsformate in Combobox als Optionen mit Angular for-Schleife hinzugefügt
2024-10-31 09:14:41 +01:00
Developer 02
2800392be3 feat(user-update-form): Eingabe des Datumsformats hinzugefügt 2024-10-31 07:45:30 +01:00
Developer 02
b7f4ed7597 feat(user-update-form): Eingabe von Kurznamen hinzugefügt 2024-10-31 07:19:46 +01:00
Developer 02
16cc729373 feat(user-update-form): Kommentareingabe hinzugefügt 2024-10-31 07:13:30 +01:00
Developer 02
4d38cce459 refactor(user-update-form.component.css): Angeordnete CSSS anstatt Bootstrap zu verwenden 2024-10-31 07:03:26 +01:00
Developer 02
80a3f96404 refactor: ClientUser-Repository-Abhängigkeit hinzugefügt und DeleteAsync in UserRepository verbessert 2024-10-30 21:02:59 +01:00
Developer 02
2a4358a7c7 feat: ReadAsync-Methode zur ClientUserRepository mit optionalem userId-Filter hinzugefügt 2024-10-30 20:41:31 +01:00
Developer 02
978d8aaa55 feat(ClientUser): Repository erstellt 2024-10-30 20:36:03 +01:00
Developer 02
ae729198b9 feat(ClientUser): Repository-Schnittstelle erstellt 2024-10-30 20:32:03 +01:00
Developer 02
76f57676b1 feat: ClientUser-Entität mit erforderlichen Attributen und Standardwerten erstellt 2024-10-30 20:26:48 +01:00
Developer 02
97cefb3fea feat: Abhängigkeit von IUserRepRepository hinzugefügt und Unterstützung für zugehörige Löschungen in UserRepository 2024-10-30 16:12:39 +01:00
Developer 02
1273b7ac46 refactor: repUserId-Parameter zur ReadAllAsync-Methode in UserRepRepository hinzugefügt 2024-10-30 16:09:35 +01:00
Developer 02
4c02607409 fix: zusätzlichen Löschfall in der GroupRepository-DeleteAsync-Methode behandeln. 2024-10-30 16:01:21 +01:00
Developer 02
9f99bb0bc9 feat: erweitere GroupRepository mit Unterstützung für das Löschen verwandter Entitäten
- Abhängigkeiten IGroupOfUserRepository und IUserRepRepository zum GroupRepository-Konstruktor hinzugefügt.
- DeleteAsync aktualisiert, um verwandte Entitäten in den GroupOfUser- und UserRep-Tabellen zu löschen, bevor die Gruppe entfernt wird.
2024-10-30 15:45:47 +01:00
Developer 02
e80ec2cf8d feat: ReadAsync-Methode zum GroupOfUserRepository für flexible Abfragen hinzufügen 2024-10-29 16:58:40 +01:00
Developer 02
25995e8d48 feat: Unterstützung für die Filterung nach RepGroupId in der ReadAllAsync-Methode hinzufügen 2024-10-29 16:33:41 +01:00
Developer 02
9e11463ef2 feat: readOnly-Parameter zur ReadAllAsync-Methode im UserRepRepository hinzufügen 2024-10-29 16:27:29 +01:00
Developer 02
622cb1f702 feat: Implementiere kaskadierende Löschung für die User-Entität im UserRepository
- Überriding der DeleteAsync-Methode hinzugefügt, um verwandte ModuleOfUser- und GroupOfUser-Entitäten zu behandeln.
- Sicherstellung der Entfernung verwandter Datensätze bei der Löschung eines Benutzers.
- TODO-Kommentar hinzugefügt, um zu empfehlen, .OnDelete(DeleteBehavior.ClientCascade) im DbContext für ein verbessertes Verhalten zu verwenden.
2024-10-29 16:13:58 +01:00
Developer 02
ae14f5842e feat(IGroupUserService): Read-By-Group-Id-Schnittstelle hinzugefügt 2024-10-17 11:44:23 +02:00
Developer 02
24726fc850 feat(GroupUserService): Async-Methode „Read-By-Group-Id“ hinzugefügt, die die Benutzergruppe als Liste zurückgibt, wobei die Methode „Read-By-Group-Id“ als IQueryable zurückkehrt 2024-10-17 11:26:52 +02:00
Developer 02
1605d0968b fix(user.component): Aktualisierung der Tabelle der zugewiesenen Gruppen und Module mit einem Klick. 2024-10-17 10:47:59 +02:00
Developer 02
67419df015 feat(user.component): update.component aktualisiert, um bei Doppelklick statt bei Einfachklick anzuzeigen.
- aktualisiert, um alle Daten der ausgewählten Zeile statt nur den Benutzernamen zu behalten.
2024-10-17 10:23:38 +02:00
375 changed files with 13898 additions and 17213 deletions

View File

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@@ -1,16 +0,0 @@
# Editor configuration, see https://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
[*.ts]
quote_type = single
[*.md]
max_line_length = off
trim_trailing_whitespace = false

View File

@@ -1,4 +0,0 @@
{
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846
"recommendations": ["angular.ng-template"]
}

View File

@@ -1,20 +0,0 @@
{
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "ng serve",
"type": "chrome",
"request": "launch",
"preLaunchTask": "npm: start",
"url": "http://localhost:4200/"
},
{
"name": "ng test",
"type": "chrome",
"request": "launch",
"preLaunchTask": "npm: test",
"url": "http://localhost:9876/debug.html"
}
]
}

View File

@@ -1,42 +0,0 @@
{
// For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "start",
"isBackground": true,
"problemMatcher": {
"owner": "typescript",
"pattern": "$tsc",
"background": {
"activeOnStart": true,
"beginsPattern": {
"regexp": "(.*?)"
},
"endsPattern": {
"regexp": "bundle generation complete"
}
}
}
},
{
"type": "npm",
"script": "test",
"isBackground": true,
"problemMatcher": {
"owner": "typescript",
"pattern": "$tsc",
"background": {
"activeOnStart": true,
"beginsPattern": {
"regexp": "(.*?)"
},
"endsPattern": {
"regexp": "bundle generation complete"
}
}
}
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +0,0 @@
{
"/api": {
"target": "https://localhost:7103",
"secure": false,
"changeOrigin": true
}
}

View File

@@ -1,72 +0,0 @@
<div class="container my-3">
<div class="row">
<div [ngClass]="formFieldBSClass">
<mat-form-field>
<mat-label>Benutzername</mat-label>
<input
matInput
[formControl]="username"
(blur)="updateErrorMessage()"
required />
@if (email.invalid) {
<mat-error>{{errorMessage()}}</mat-error>
}
</mat-form-field>
</div>
<div [ngClass]="formFieldBSClass">
<mat-form-field>
<mat-label>E-Mail</mat-label>
<input
matInput placeholder="user@example.com"
[formControl]="email"
(blur)="updateMailErrorMessage()"
required />
@if (email.invalid) {
<mat-error>{{mailErrorMessage()}}</mat-error>
}
</mat-form-field>
</div>
<div [ngClass]="formFieldBSClass">
<div [ngClass]="buttonBSClass">
<button mat-fab extended (click)="update()">
<mat-icon>save</mat-icon>
Speichern
</button>
</div>
</div>
</div>
<div class="row">
<div [ngClass]="formFieldBSClass">
<mat-form-field>
<mat-label>Vorname</mat-label>
<input
matInput
[formControl]="name"
(blur)="updateErrorMessage()"
required />
@if (email.invalid) {
<mat-error>{{errorMessage()}}</mat-error>
}
</mat-form-field>
</div>
<div [ngClass]="formFieldBSClass">
<mat-form-field>
<mat-label>Nachname</mat-label>
<input
matInput
[formControl]="surname"
(blur)="updateErrorMessage()"
required />
@if (email.invalid) {
<mat-error>{{errorMessage()}}</mat-error>
}
</mat-form-field>
</div>
<div [ngClass]="formFieldBSClass">
<button mat-fab extended (click)="delete()">
<mat-icon>delete</mat-icon>
Löschen
</button>
</div>
</div>
</div>

View File

@@ -1,12 +0,0 @@
import { Component } from '@angular/core';
@Component({
selector: 'app-info',
standalone: true,
imports: [],
templateUrl: './info.component.html',
styleUrl: './info.component.scss'
})
export class InfoComponent {
}

View File

@@ -1,203 +0,0 @@
import { AfterViewInit, Component, Inject, ViewChild } from '@angular/core';
import { GuiColumn, GuiSelectedRow } from '@generic-ui/ngx-grid/gui/grid/src/core/api/gui.grid.public-api';
import { UserTableComponent } from '../../components/tables/user-table/user-table.component';
import { UserRepTableComponent } from '../../components/tables/user-rep-table/user-rep-table.component';
import { GroupTableComponent } from '../../components/tables/group-table/group-table.component';
import { UserRepService } from '../../services/api/user-representation.service';
import Swal from 'sweetalert2';
import { MatTabsModule, MatTabGroup } from '@angular/material/tabs';
import { env } from '../../../environments/environment';
import { BasePageComponent } from '../base-page/base-page.component';
import { UserRep } from '../../models/user-management.api.models';
@Component({
standalone: true,
imports: [MatTabsModule, MatTabGroup, UserTableComponent, GroupTableComponent, UserRepTableComponent],
selector: 'app-user-representation',
templateUrl: './user-representation.component.html',
styleUrl: './user-representation.component.css'
})
export class UserRepresentationComponent extends BasePageComponent implements AfterViewInit {
useRepLabel: string = "";
groupColumns: Array<GuiColumn>;
groupRepCols: Array<GuiColumn>;
slUserId: null | number = null;
slRepUserId: null | number = null;
slRepGroupId: null | number = null;
slRightGroupId: null | number = null;
slUserRepId: null | number = null;
initWithoutData = () => { }
constructor(private userRepService: UserRepService) {
super()
this.groupRepCols = env.columnNames.group.representative;
this.groupColumns = env.columnNames.group.right;
this.userRepService = userRepService;
}
ngAfterViewInit(): void {
this.buttonVisibilityService.setVisibleOnly(this.refreshService, this.transferService)
this.refreshService.removeAll();
this.refreshService.add(() => {
this.users.fetchData();
this.repUsers.fetchData();
this.repGroups.fetchData();
this.groups.fetchData();
})
this.transferService.add(() => {
this.repUsers.safelyUnselectAll();
this.repGroups.safelyUnselectAll();
this.userReps.safelyUnselectAll();
})
}
@ViewChild("users") users!: UserTableComponent;
@ViewChild("groups") groups!: GroupTableComponent;
@ViewChild("repUsers") repUsers!: UserTableComponent;
@ViewChild("repGroups") repGroups!: GroupTableComponent;
@ViewChild("userReps") userReps!: UserRepTableComponent;
userGroupOnSelectedRows = (rows: GuiSelectedRow[], isUser: boolean = true) => {
if (rows.length > 0) {
this.users.safelyUnselectAll();
if (isUser) {
this.useRepLabel = `Vertretungen von ${rows[0].source?.username}`
this.userReps.fetchData(rows[0].source?.id)
this.slUserId = rows[0].source?.id
}
else {
this.useRepLabel = `Vertretungen von ${rows[0].source?.name}`
this.userReps.fetchData(undefined, rows[0].source?.id)
this.slUserId = rows[0].source?.id
}
}
}
userOnSelectedRows = (rows: GuiSelectedRow[]) => {
this.userGroupOnSelectedRows(rows, true);
}
groupOnSelectedRows = (rows: GuiSelectedRow[]) => {
this.userGroupOnSelectedRows(rows, false);
}
repUserOnSelectedRows = (rows: GuiSelectedRow[]) => {
if (rows.length == 0 && this.slRepUserId) {
if (!this.slUserId) {
Swal.fire({
icon: "error",
title: "Oops...",
text: "Bitte wählen Sie den Benutzer!",
});
}
else if (!this.slRepUserId) {
Swal.fire({
icon: "error",
title: "Oops...",
text: "Bitte wählen Sie die Vertretungen Benutzer!",
});
}
else {
var newUserRep: UserRep = {
userId: this.slUserId,
repUserId: this.slRepUserId,
addedWho: 'DEFAULT'
}
this.userRepService.create(newUserRep).subscribe({
next: (response) => {
this.slRepUserId = null;
this.repUsers.safelyUnselectAll()
if (this.slUserId != null)
this.userReps.fetchData(this.slUserId)
},
error: (error) => {
Swal.fire({
icon: "error",
title: "Oops...",
text: `Dieser Vorgang ist nicht möglich.`,
});
}
});
}
this.slRepUserId = null;
}
else if (rows.length > 0) {
this.slRepUserId = rows[0].source?.id;
}
}
repGroupOnSelectedRows = (rows: GuiSelectedRow[]) => {
if (rows.length == 0 && this.slRepGroupId) {
if (!this.slUserId) {
Swal.fire({
icon: "error",
title: "Oops...",
text: "Bitte wählen Sie den Benutzer!",
});
}
else if (!this.slRepGroupId) {
Swal.fire({
icon: "error",
title: "Oops...",
text: "Bitte wählen Sie die Vertretungen Gruppe!",
});
}
else {
var newUserRep = {
userId: this.slUserId,
repGroupId: this.slRepGroupId,
addedWho: 'DEFAULT'
}
this.userRepService.create(newUserRep).subscribe({
next: (res) => {
this.slRepGroupId = null;
this.repUsers.safelyUnselectAll()
if (this.slUserId != null)
this.userReps.fetchData(this.slUserId)
},
error: (error) => {
Swal.fire({
icon: "error",
title: "Oops...",
text: `Dieser Vorgang ist nicht möglich.`,
});
}
});
}
this.slRepGroupId = null;
}
else if (rows.length > 0) {
this.slRepGroupId = rows[0].source?.id;
}
}
userRepOnSelectedRows = (rows: GuiSelectedRow[]) => {
if (rows.length == 0 && this.slUserRepId) {
this.userRepService.delete(this.slUserRepId).subscribe({
next: (res) => {
this.slUserRepId = null;
this.userReps.safelyUnselectAll();
if (this.slUserId != null)
this.userReps.fetchData(this.slUserId)
},
error: (err) => {
this.slUserRepId = null;
this.repUsers.safelyUnselectAll()
Swal.fire({
icon: "error",
title: "Oops...",
text: `Dieser Vorgang ist nicht möglich.`,
});
}
})
}
else if (rows.length > 0) {
this.slUserRepId = rows[0].source?.id;
}
}
}

View File

@@ -1,50 +0,0 @@
@import "../node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css";
@import '../node_modules/@angular/cdk/overlay-prebuilt.css';
@import "../node_modules/bootstrap-icons/font/bootstrap-icons.css";
a {
color: #0366d6;
}
.btn:focus,
.btn:active:focus,
.btn-link.nav-link:focus,
.form-control:focus,
.form-check-input:focus {
box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
}
code {
color: #e01a76;
}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
.assignment-row {
height: 40vh;
}
.user-row {
height: 45vh;
}
.flex-col {
display: flex;
flex-direction: column;
}
.flex-col .card {
flex: 1;
}
.mat-color-scheme-light .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label {
color: rgb(100, 95, 95) !important;
}
.mdc-tab__text-label{
font-size: medium;
}

View File

@@ -1,154 +0,0 @@
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication;
using System.Security.Claims;
using Microsoft.AspNetCore.Mvc;
using DigitalData.UserManager.Application.Contracts;
using DigitalData.UserManager.Application.DTOs.User;
using Microsoft.AspNetCore.Authorization;
using DigitalData.UserManager.Application;
using DigitalData.UserManager.Application.DTOs.Auth;
using DigitalData.Core.Abstractions.Application;
using Microsoft.Extensions.Localization;
using DigitalData.Core.DTO;
namespace DigitalData.UserManager.API.Controllers
{
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly IUserService _userService;
private readonly IGroupOfUserService _gouService;
private readonly IDirectorySearchService _dirSearchService;
private readonly IStringLocalizer<Resource> _localizer;
private readonly ILogger<AuthController> _logger;
public AuthController(IUserService userService, IGroupOfUserService gouService, IDirectorySearchService directorySearchService, IStringLocalizer<Resource> localizer, ILogger<AuthController> logger)
{
_userService = userService;
_gouService = gouService;
_dirSearchService = directorySearchService;
_localizer = localizer;
_logger = logger;
}
[AllowAnonymous]
[HttpGet("check")]
public IActionResult CheckAuthentication()
{
try
{
return Ok(User.Identity?.IsAuthenticated ?? false);
}
catch(Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[AllowAnonymous]
[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] LogInDto login)
{
try
{
bool isValid = _dirSearchService.ValidateCredentials(login.Username, login.Password);
if (!isValid)
return Unauthorized(Result.Fail().Message(_localizer[Key.UserNotFound]));
var gouMsg = await _gouService.HasGroup(login.Username, "PM_USER", caseSensitive: false);
if (!gouMsg.IsSuccess)
return Unauthorized(Result.Fail().Message(_localizer[Key.UnauthorizedUser]));
//find the user
var uRes = await _userService.ReadByUsernameAsync(login.Username);
if (!uRes.IsSuccess || uRes.Data is null)
{
return Unauthorized(uRes);
}
UserReadDto user = uRes.Data;
// Create claims
var claims = new List<Claim>
{
new (ClaimTypes.NameIdentifier, user.Id.ToString()),
new (ClaimTypes.Name, user.Username),
new (ClaimTypes.Surname, user.Name ?? ""),
new (ClaimTypes.GivenName, user.Prename ?? ""),
new (ClaimTypes.Email, user.Email ?? ""),
new (ClaimTypes.Role, "PM_USER")
};
// Create claimsIdentity
var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
// Create authProperties
var authProperties = new AuthenticationProperties
{
IsPersistent = true,
AllowRefresh = true,
ExpiresUtc = DateTime.UtcNow.AddMinutes(60)
};
// Sign in
await HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
authProperties);
_dirSearchService.SetSearchRootCache(user.Username, login.Password);
return Ok();
}
catch(Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[Authorize]
[HttpGet("user")]
public async Task<IActionResult> GetUserWithClaims()
{
try
{
// Extract the username from the Name claim.
string? username = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name)?.Value;
if (string.IsNullOrEmpty(username))
return Unauthorized();
return await _userService.ReadByUsernameAsync(username)
.ThenAsync(Ok, IActionResult (m, n) =>
{
_logger.LogNotice(n);
return NotFound(Result.Fail().Message(_localizer[Key.UserNotFound]));
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[Authorize]
[HttpPost("logout")]
public async Task<IActionResult> Logout()
{
try
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return Ok();
}
catch(Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
}

View File

@@ -1,47 +0,0 @@
using DigitalData.Core.API;
using DigitalData.Core.DTO;
using DigitalData.UserManager.Application.Contracts;
using DigitalData.UserManager.Application.DTOs.Base;
using DigitalData.UserManager.Application.DTOs.User;
using DigitalData.UserManager.Domain.Entities;
using Microsoft.AspNetCore.Authorization;
using System.Security.Claims;
namespace DigitalData.UserManager.API.Controllers
{
[Authorize]
public class BaseAuthController<TCRUDService, TCreateDto, TReadDto, TUpdateDto, TBaseEntity> : CRUDControllerBaseWithErrorHandling<TCRUDService, TCreateDto, TReadDto, TUpdateDto, TBaseEntity, int>
where TCRUDService : IBaseService<TCreateDto, TReadDto, TUpdateDto, TBaseEntity>
where TCreateDto : BaseCreateDto
where TReadDto : class
where TUpdateDto : BaseUpdateDto
where TBaseEntity : BaseEntity
{
private readonly Lazy<int?> _lUserId;
public BaseAuthController(ILogger logger, TCRUDService service, IUserService userService) : base(logger, service)
{
_lUserId = new(() =>
{
var idSt = User.FindFirstValue(ClaimTypes.NameIdentifier);
bool hasId = int.TryParse(idSt, out int id);
return hasId ? id : null;
});
service.UserFactoryAsync = async () =>
{
var id = _lUserId.Value;
return id is int intId
? await userService.ReadByIdAsync(intId).ThenAsync(
Success: res => res,
Fail: UserReadDto? (m, n) =>
{
_logger.LogNotice(n);
return null;
})
: null;
};
}
}
}

View File

@@ -1,27 +0,0 @@
using DigitalData.UserManager.API.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
namespace DigitalData.UserManager.API.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ConstantsController : ControllerBase
{
private readonly Constants _constants;
public ConstantsController(IOptions<Constants> constantsOptions)
{
_constants = constantsOptions.Value;
}
[HttpGet]
public IActionResult GetConstant(string? name = null)
{
if(name is null)
return Ok(_constants);
return Ok(_constants[name]);
}
}
}

View File

@@ -1,235 +0,0 @@
using DigitalData.Core.Abstractions.Application;
using DigitalData.UserManager.Application.Contracts;
using DigitalData.UserManager.Application.DTOs;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using System.Diagnostics.CodeAnalysis;
using System.Security.Claims;
using DigitalData.UserManager.Application;
using Microsoft.Extensions.Localization;
using DigitalData.Core.DTO;
using Microsoft.AspNetCore.Authorization;
namespace DigitalData.UserManager.API.Controllers
{
[Route("api/[controller]")]
[SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>")]
[Authorize]
public class DirectoryController : ControllerBase
{
private readonly IUserService _userService;
private readonly IDirectorySearchService _dirSearchService;
private readonly Dictionary<string, string> _customSearchFilters;
private readonly IStringLocalizer<Resource> _localizer;
private readonly ILogger<DirectoryController> _logger;
public DirectoryController(IConfiguration configuration, IStringLocalizer<Resource> localizer, IUserService userService, IDirectorySearchService directorySearchService, ILogger<DirectoryController> logger)
{
_localizer = localizer;
_userService = userService;
_dirSearchService = directorySearchService;
var customSearchFiltersSection = configuration.GetSection("DirectorySearch:CustomSearchFilters");
_customSearchFilters = customSearchFiltersSection.Get<Dictionary<string, string>>() ?? new();
_logger = logger;
}
[HttpGet("Root/{username}")]
public IActionResult GetRootOf(string username)
{
try
{
var root = _dirSearchService.GetSearchRootCache(username);
return root is null ? NotFound() : Ok(new
{
guid = root.Guid,
nativeGuid = root.NativeGuid,
name = root.Name,
path = root.Path,
parentPath = root.Parent?.Path,
username = root.Username,
schemaClassName = root.SchemaClassName
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet("CustomSearchFilter")]
public IActionResult GetAllCustomFilters(string? filtername)
{
try
{
if (filtername is null)
{
return Ok(_customSearchFilters);
}
else
{
_dirSearchService.CustomSearchFilters.TryGetValue(filtername, out string? filter);
return filter is null ? NotFound() : Ok(filter);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpPost("CreateSearchRoot")]
public async Task<IActionResult> CreateSearchRoot([FromBody] SearchRootCreateDto searchRootCreateDto)
{
try
{
var dirEntryUsername = searchRootCreateDto.DirEntryUsername ?? CurrentUser;
if (dirEntryUsername is null)
return Unauthorized();
bool isValid = _dirSearchService.ValidateCredentials(dirEntryUsername, searchRootCreateDto.DirEntryPassword);
if (!isValid)
return Unauthorized(Result.Fail().Message(_localizer[Key.UserNotFound]));
var userResult = await _userService.ReadByUsernameAsync(dirEntryUsername);
if (!userResult.IsSuccess || userResult.Data is null)
return Unauthorized(Result.Fail().Message(_localizer[Key.UserNotFoundInLocalDB]));
_dirSearchService.SetSearchRootCache(userResult.Data.Username, searchRootCreateDto.DirEntryPassword);
return Ok();
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet("SearchByFilter/{filter}")]
public IActionResult SearchByFilter([FromRoute] string filter, string? dirEntryUsername, params string[] propName)
{
try
{
dirEntryUsername ??= CurrentUser;
if (dirEntryUsername is null)
return Unauthorized();
return _dirSearchService.FindAllByUserCache(dirEntryUsername, filter, properties: propName).Then(Ok, IActionResult (m, n) =>
{
_logger.LogNotice(n);
return StatusCode(StatusCodes.Status424FailedDependency);
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet("SearchByFilterName/{filterName}")]
public IActionResult SearchByFilterName([FromRoute] string filterName, string? dirEntryUsername, params string[] propName)
{
try
{
dirEntryUsername ??= CurrentUser;
if (dirEntryUsername is null)
return Unauthorized();
_dirSearchService.CustomSearchFilters.TryGetValue(filterName, out string? filter);
if (filter is null)
return NotFound($"The filter named {filterName} does not exist.");
return _dirSearchService.FindAllByUserCache(dirEntryUsername, filter, properties: propName).Then(Ok, IActionResult (m, n) =>
{
_logger.LogNotice(n);
return StatusCode(StatusCodes.Status424FailedDependency);
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet("Group")]
public IActionResult GetGroups(string? dirEntryUsername, params string[] propName)
{
try
{
dirEntryUsername ??= CurrentUser;
if (dirEntryUsername is null)
return Unauthorized();
_dirSearchService.CustomSearchFilters.TryGetValue("Group", out string? filter);
if (filter is null)
throw new InvalidOperationException("The LDAP Group Search filter configuration is missing in your appsettings. Please ensure it's added under DirectorySearch:CustomSearchFilters:Group to enable group searches.");
return _dirSearchService.FindAllByUserCache(username: dirEntryUsername, filter, properties: propName).Then(Ok, IActionResult (m, n) =>
{
_logger.LogNotice(n);
return StatusCode(StatusCodes.Status424FailedDependency);
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet("User")]
public IActionResult GetUsersByGroupName(string? dirEntryUsername, [FromQuery] string? groupName = null)
{
try
{
string[] propName = { "memberof", "samaccountname", "givenname", "sn", "mail" };
dirEntryUsername ??= CurrentUser;
if (dirEntryUsername is null)
return Unauthorized();
_dirSearchService.CustomSearchFilters.TryGetValue("User", out string? filter);
if (filter is null)
throw new InvalidOperationException("The LDAP User Search filter configuration is missing in your appsettings. Please ensure it's added under DirectorySearch:CustomSearchFilters:User to enable group searches.");
return _dirSearchService.FindAllByUserCache(username: dirEntryUsername, filter, properties: propName).Then(
Success: data =>
{
if (groupName is not null)
data = data
.Where(rp => rp.PropertyNames.Cast<string>().Contains("memberof") &&
rp["memberof"].Cast<string>().Any(ldapDir => ldapDir.Contains(groupName)))
.ToList();
return Ok(data);
},
Fail: IActionResult (m, n) =>
{
_logger.LogNotice(n);
return StatusCode(StatusCodes.Status424FailedDependency);
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
private string? CurrentUser
{
get => (HttpContext.User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name)?.Value);
}
}
}

View File

@@ -1,46 +0,0 @@
using DigitalData.UserManager.Application.Services;
using DigitalData.UserManager.Application.Services.Options;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
namespace DigitalData.UserManager.API.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class EncryptionController : ControllerBase
{
private readonly Encryptor _encryptor;
public EncryptionController(Encryptor encryptor)
{
_encryptor = encryptor;
}
[HttpPost("encrypt")]
public IActionResult Encrypt([FromQuery] string plainText, [FromBody] EncryptionParameters? options = null)
{
string cipherText = options is null
? _encryptor.Encrypt(plainText)
: Encryptor.Encrypt(plainText, options.Key, options.IV);
return Ok(cipherText);
}
[HttpPost("decrypt")]
public IActionResult Decrypt([FromQuery] string cipherText, [FromBody] EncryptionParameters? options = null)
{
var plainText = options is null
? _encryptor.Decrypt(cipherText)
: Encryptor.Decrypt(cipherText, options.Key, options.IV);
return Ok(plainText);
}
[HttpGet]
public IActionResult Generate()
{
var param = Encryptor.GenerateParameters();
return Ok(param);
}
}
}

View File

@@ -1,43 +0,0 @@
using DigitalData.Core.DTO;
using DigitalData.UserManager.Application.Contracts;
using DigitalData.UserManager.Application.DTOs.Group;
using DigitalData.UserManager.Domain.Entities;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace DigitalData.UserManager.API.Controllers
{
[Authorize]
public class GroupController : BaseAuthController<IGroupService, GroupCreateDto, GroupReadDto, GroupUpdateDto, Group>
{
public GroupController(ILogger<GroupController> logger, IGroupService service, IUserService userService) : base(logger, service, userService)
{
}
[HttpPost("ByDir")]
public async Task<IActionResult> CreateByDir(DirectoryGroupDto adGroup)
{
try
{
return await _service.CreateAsync(adGroup).ThenAsync(
Success: id =>
{
var createdResource = new { Id = id };
var actionName = nameof(GetById);
var routeValues = new { id = createdResource.Id };
return CreatedAtAction(actionName, routeValues, createdResource);
},
Fail: IActionResult (m, n) =>
{
_logger.LogNotice(n);
return BadRequest();
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
}

View File

@@ -1,81 +0,0 @@
using DigitalData.Core.DTO;
using DigitalData.UserManager.Application.Contracts;
using DigitalData.UserManager.Application.DTOs.GroupOfUser;
using DigitalData.UserManager.Domain.Entities;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace DigitalData.UserManager.API.Controllers
{
[Authorize]
public class GroupOfUserController : BaseAuthController<IGroupOfUserService, GroupOfUserCreateDto, GroupOfUserReadDto, GroupOfUserUpdateDto, GroupOfUser>
{
public GroupOfUserController(ILogger<GroupOfUserController> logger, IGroupOfUserService service, IUserService userService) : base(logger, service, userService)
{
}
[HttpDelete]
public async Task<IActionResult> Delete([FromQuery] int groupId, [FromQuery] int userId)
{
try
{
return await _service.DeleteAsyncByGroupUserId(groupId, userId).ThenAsync(Ok, IActionResult (m, n) =>
{
_logger.LogNotice(n);
return StatusCode(StatusCodes.Status500InternalServerError);
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[NonAction]
public override Task<IActionResult> GetAll() => base.GetAll();
[HttpGet]
public async Task<IActionResult> GetAll([FromQuery]bool withUser = false, [FromQuery]bool withGroup = false, [FromQuery] string? username = null)
{
try
{
if (username is not null)
return await _service.ReadByUsernameAsync(username).ThenAsync(Ok, IActionResult (m, n) =>
{
_logger.LogNotice(n);
return NotFound();
});
return await _service.ReadAllAsyncWith(withUser, withGroup).ThenAsync(Ok, IActionResult (m, n) =>
{
_logger.LogNotice(n);
return NotFound();
});
}
catch(Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet("Has")]
public async Task<IActionResult> HasGroup([FromQuery] string username, [FromQuery] string groupname)
{
try
{
return await _service.HasGroup(username, groupname).ThenAsync(Ok, (m, n) =>
{
_logger.LogNotice(n);
return StatusCode(StatusCodes.Status500InternalServerError);
});
}
catch(Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
}

View File

@@ -1,16 +0,0 @@
using DigitalData.Core.API;
using DigitalData.UserManager.Application.Contracts;
using DigitalData.UserManager.Application.DTOs.Module;
using DigitalData.UserManager.Domain.Entities;
using Microsoft.AspNetCore.Authorization;
namespace DigitalData.UserManager.API.Controllers
{
[Authorize]
public class ModuleController : ReadControllerBaseWithErrorHandling<IModuleService, ModuleDto, Module, int>
{
public ModuleController(ILogger<ModuleController> logger, IModuleService service) : base(logger, service)
{
}
}
}

View File

@@ -1,53 +0,0 @@
using DigitalData.Core.API;
using DigitalData.Core.DTO;
using DigitalData.UserManager.Application.Contracts;
using DigitalData.UserManager.Application.DTOs.ModuleOfUser;
using DigitalData.UserManager.Domain.Entities;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace DigitalData.UserManager.API.Controllers
{
[Authorize]
public class ModuleOfUserController : CRUDControllerBaseWithErrorHandling<IModuleOfUserService, ModuleOfUserCreateDto, ModuleOfUserReadDto, ModuleOfUserUpdateDto, ModuleOfUser, int>
{
public ModuleOfUserController(ILogger<ModuleOfUserController> logger, IModuleOfUserService service) : base(logger, service)
{
}
[NonAction]
public override Task<IActionResult> GetAll() => base.GetAll();
[HttpGet]
public async Task<IActionResult> GetAll(string? username = null)
{
if (username is not null)
return await _service.ReadByUserAsync(username).ThenAsync(Ok, IActionResult (m, n) =>
{
_logger.LogNotice(n);
return StatusCode(StatusCodes.Status500InternalServerError);
});
return await base.GetAll();
}
[HttpDelete]
public async Task<IActionResult> Delete([FromQuery] int moduleId, [FromQuery]int userId)
{
try
{
return await _service.DeleteAsyncByModuleUserId(moduleId, userId).ThenAsync(Ok, IActionResult (m, n) =>
{
_logger.LogNotice(n);
return BadRequest();
});
}
catch(Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
}

View File

@@ -1,100 +0,0 @@
using DigitalData.Core.API;
using DigitalData.Core.DTO;
using DigitalData.UserManager.Application.Contracts;
using DigitalData.UserManager.Application.DTOs.User;
using DigitalData.UserManager.Domain.Entities;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace DigitalData.UserManager.API.Controllers
{
[Authorize]
public class UserController : BaseAuthController<IUserService, UserCreateDto, UserReadDto, UserUpdateDto, User>
{
public UserController(ILogger<UserController> logger, IUserService service) : base(logger, service, service)
{
}
[HttpGet("ByModuleId/{moduleId}")]
public async Task<IActionResult> GetByModuleId([FromRoute] int moduleId, [FromQuery]bool assigned = true)
{
try
{
return await (assigned ? _service.ReadByModuleIdAsync(moduleId) : _service.ReadUnassignedByModuleIdAsync(moduleId))
.ThenAsync(Ok, IActionResult(m, n) =>
{
_logger.LogNotice(n);
return StatusCode(StatusCodes.Status500InternalServerError);
});
}
catch(Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet("ByGroupId/{groupId}")]
public async Task<IActionResult> GetByGroupId([FromRoute] int groupId, [FromQuery] bool assigned = true)
{
try
{
return await (assigned ? _service.ReadByGroupIdAsync(groupId) : _service.ReadUnassignedByGroupIdAsync(groupId))
.ThenAsync(Ok, IActionResult (m, n) =>
{
_logger.LogNotice(n);
return StatusCode(StatusCodes.Status500InternalServerError);
});
}
catch(Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpPost("ByDir")]
public async Task<IActionResult> CreateByDir(UserPrincipalDto upDto)
{
try
{
return await _service.CreateAsync(upDto).ThenAsync(
Success: id =>
{
var createdResource = new { Id = id };
var actionName = nameof(GetById);
var routeValues = new { id = createdResource.Id };
return CreatedAtAction(actionName, routeValues, createdResource);
},
Fail: IActionResult (m, n) =>
{
_logger.LogNotice(n);
return BadRequest();
});
}
catch(Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
[HttpGet("ByUsername/{username}")]
public virtual async Task<IActionResult> GetByUsername([FromRoute] string username)
{
try
{
return await _service.ReadByUsernameAsync(username).ThenAsync(Ok, IActionResult (m, n) =>
{
_logger.LogNotice(n);
return NotFound();
});
}
catch(Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
}

View File

@@ -1,42 +0,0 @@
using DigitalData.Core.DTO;
using DigitalData.UserManager.Application.Contracts;
using DigitalData.UserManager.Application.DTOs.UserRep;
using DigitalData.UserManager.Domain.Entities;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace DigitalData.UserManager.API.Controllers
{
[Authorize]
public class UserRepController : BaseAuthController<IUserRepService, UserRepCreateDto, UserRepReadDto, UserRepUpdateDto, UserRep>
{
public UserRepController(ILogger<UserRepController> logger, IUserRepService service, IUserService userService) : base(logger, service, userService)
{
}
[NonAction]
public override Task<IActionResult> GetAll()
{
return base.GetAll();
}
[HttpGet]
public async Task<IActionResult> GetAll(bool withUser = false, bool withRepGroup = false, bool withGroup = false, bool withRepUser = false, int? userId = null, int? groupId = null)
{
try
{
return await _service.ReadAllAsync(withUser, withRepGroup, withGroup, withRepUser, userId, groupId).ThenAsync(Ok, IActionResult (m, n) =>
{
_logger.LogNotice(n);
return NotFound();
});
}
catch (Exception ex)
{
_logger.LogError(ex, "{Message}", ex.Message);
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}
}

View File

@@ -1,97 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<Version>2.0.0.0</Version>
</PropertyGroup>
<ItemGroup>
<Content Remove="wwwroot\assets\img\DD_white.svg" />
<Content Remove="wwwroot\assets\img\digital_data.svg" />
<Content Remove="wwwroot\assets\img\digital_data_red_BG.svg" />
<Content Remove="wwwroot\assets\img\group.svg" />
<Content Remove="wwwroot\assets\img\Huhn_andersrum.webp" />
<Content Remove="wwwroot\assets\img\login_logo.svg" />
<Content Remove="wwwroot\assets\img\mode_logo.svg" />
<Content Remove="wwwroot\assets\img\thema_bttn.svg" />
<Content Remove="wwwroot\assets\img\user-plus-svgrepo-com.svg" />
<Content Remove="wwwroot\assets\img\user.svg" />
<Content Remove="wwwroot\chunk-A2L6DXQH.js" />
<Content Remove="wwwroot\chunk-ZC35XWOR.js" />
<Content Remove="wwwroot\favicon.ico" />
<Content Remove="wwwroot\group-table\index.html" />
<Content Remove="wwwroot\index.html" />
<Content Remove="wwwroot\main-QF3MRK45.js" />
<Content Remove="wwwroot\media\bootstrap-icons-OCU552PF.woff" />
<Content Remove="wwwroot\media\bootstrap-icons-X6UQXWUS.woff2" />
<Content Remove="wwwroot\module-table\index.html" />
<Content Remove="wwwroot\polyfills-6EAL64PA.js" />
<Content Remove="wwwroot\scripts-EEEIPNC3.js" />
<Content Remove="wwwroot\styles-ZC4KW2NT.css" />
<Content Remove="wwwroot\user-assignment\index.html" />
<Content Remove="wwwroot\user-representation\index.html" />
<Content Remove="wwwroot\user-table\index.html" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="DigitalData.Core.API" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.14" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.16" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.15">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.15" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="7.0.1" />
<PackageReference Include="NLog" Version="5.3.2" />
<PackageReference Include="NLog.Web.AspNetCore" Version="5.3.11" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
<PackageReference Include="System.DirectoryServices" Version="7.0.1" />
<PackageReference Include="System.DirectoryServices.AccountManagement" Version="7.0.1" />
<PackageReference Include="System.DirectoryServices.Protocols" Version="7.0.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DigitalData.UserManager.Application\DigitalData.UserManager.Application.csproj" />
<ProjectReference Include="..\DigitalData.UserManager.Domain\DigitalData.UserManager.Domain.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="ClientApp\" />
</ItemGroup>
<ItemGroup>
<None Include="wwwroot\assets\img\DD_white.svg" />
<None Include="wwwroot\assets\img\digital_data.svg" />
<None Include="wwwroot\assets\img\digital_data_red_BG.svg" />
<None Include="wwwroot\assets\img\group.svg" />
<None Include="wwwroot\assets\img\Huhn_andersrum.webp" />
<None Include="wwwroot\assets\img\login_logo.svg" />
<None Include="wwwroot\assets\img\mode_logo.svg" />
<None Include="wwwroot\assets\img\thema_bttn.svg" />
<None Include="wwwroot\assets\img\user-plus-svgrepo-com.svg" />
<None Include="wwwroot\assets\img\user.svg" />
<None Include="wwwroot\favicon.ico" />
<None Include="wwwroot\group-table\index.html" />
<None Include="wwwroot\index.html" />
<None Include="wwwroot\media\bootstrap-icons-OCU552PF.woff" />
<None Include="wwwroot\media\bootstrap-icons-X6UQXWUS.woff2" />
<None Include="wwwroot\module-table\index.html" />
<None Include="wwwroot\polyfills-6EAL64PA.js" />
<None Include="wwwroot\scripts-EEEIPNC3.js" />
<None Include="wwwroot\styles-ZC4KW2NT.css" />
<None Include="wwwroot\user-assignment\index.html" />
<None Include="wwwroot\user-representation\index.html" />
<None Include="wwwroot\user-table\index.html" />
</ItemGroup>
<ItemGroup>
<Content Update="wwwroot\assets\config.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

View File

@@ -1,13 +0,0 @@
using System.Reflection;
namespace DigitalData.UserManager.API.Models
{
public class Constants
{
public IEnumerable<string> UserLanguages { get; init; } = Array.Empty<string>();
public object? this[string propertyName] => GetType()
.GetProperty(propertyName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance)?
.GetValue(this, null);
}
}

View File

@@ -1,127 +0,0 @@
using Microsoft.EntityFrameworkCore;
using DigitalData.UserManager.Infrastructure.Repositories;
using DigitalData.UserManager.Application;
using DigitalData.Core.Application;
using Microsoft.AspNetCore.Authentication.Cookies;
using NLog.Web;
using NLog;
using DigitalData.Core.API;
using DigitalData.UserManager.API.Controllers;
using DigitalData.UserManager.Application.Services;
using Microsoft.Data.SqlClient;
using System.Reflection.Metadata;
using DigitalData.UserManager.API.Models;
var logger = LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
logger.Debug("init main");
try {
var builder = WebApplication.CreateBuilder(args);
var config = builder.Configuration;
builder.Services.AddEncryptor(builder.Configuration.GetSection("EncryptionParameters"));
if (builder.Configuration.GetValue<bool>("RunAsWindowsService"))
builder.Host.UseWindowsService();
builder.Logging.ClearProviders();
builder.Host.UseNLog();
builder.Services.AddControllers();
if (builder.Configuration.GetValue<bool>("UseSwagger"))
{
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
}
builder.Services.AddControllers(opt =>
{
opt.Conventions.Add(new RemoveIfControllerConvention()
.AndIf(c => c.ControllerName == nameof(EncryptionController).Replace("Controller", ""))
.AndIf(c => !config.GetValue<bool>("UseEncryptor")));
});
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.Cookie.HttpOnly = true; // Makes the cookie inaccessible to client-side scripts for security
options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; // Ensures cookies are sent over HTTPS only
options.Cookie.SameSite = SameSiteMode.Strict; // Protects against CSRF attacks by restricting how cookies are sent with requests from external sites
options.LoginPath = "/api/auth/login";
options.LogoutPath = "/api/auth/logout";
});
// Once the app is built, the password will be decrypted with Encryptor. lazy loading also acts as a call back method.
Lazy<string>? cnn_str = null;
builder.Services.AddDbContext<UserManagerDbContext>(options => options.UseSqlServer(cnn_str!.Value).EnableDetailedErrors());
var allowedOrigins = builder.Configuration.GetSection("AllowedOrigins").Get<string[]>() ?? throw new InvalidOperationException("In appsettings there is no allowed origin.");
builder.Services.AddCors(options =>
{
options.AddPolicy(name: "DefaultCorsPolicy",
builder =>
{
builder.WithOrigins(allowedOrigins)
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
});
//builder.Services.AddAutoMapper(typeof(DirectoryMappingProfile).Assembly);
builder.Services.AddUserManager<UserManagerDbContext>();
builder.ConfigureBySection<DirectorySearchOptions>();
builder.Services.AddDirectorySearchService();
builder.Services.AddCookieBasedLocalizer();
builder.ConfigureBySection<Constants>();
var app = builder.Build();
cnn_str = new(() =>
{
var encryptor = app.Services.GetRequiredService<Encryptor>();
var eCnnStr = config.GetConnectionString("UM_DEF") ?? throw new InvalidOperationException("Connection string 'DD_ECM_Connection' is missing from the configuration.");
SqlConnectionStringBuilder cnnStrBuilder = new(eCnnStr);
cnnStrBuilder.UserID = encryptor.Decrypt(cnnStrBuilder.UserID);
cnnStrBuilder.Password = encryptor.Decrypt(cnnStrBuilder.Password);
var dCnnStr = cnnStrBuilder.ConnectionString;
return dCnnStr;
});
app.UseCors("DefaultCorsPolicy");
if (builder.Configuration.GetValue<bool>("UseSwagger"))
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseCookieBasedLocalizer("de-DE", "en-US");
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseRouting();
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.MapDefaultControllerRoute();
app.Run();
}
catch (Exception exception)
{
logger.Error(exception, "Stopped program because of exception");
throw;
}

View File

@@ -1,83 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"ConnectionStrings": {
"UM_DEF": "Server=SDD-VMP04-SQL17\\DD_DEVELOP01;Database=DD_ECM;User Id=g+2edXEbMbujCUjh7INZRQ==;Password=Bz/n9pu8EyzlVqicaMRQGQ==;Encrypt=false;TrustServerCertificate=True;"
},
"AllowedOrigins": [ "https://localhost:7103", "http://172.24.12.39:85", "http://localhost:85", "http://localhost:4200", "http://localhost:5500", "https://localhost:7202" ],
"RunAsWindowsService": false,
"DirectorySearchOptions": {
"ServerName": "DD-VMP01-DC01",
"Root": "DC=dd-gan,DC=local,DC=digitaldata,DC=works",
"UserCacheExpirationDays": 1,
"CustomSearchFilters": {
"User": "(&(objectClass=user)(sAMAccountName=*))",
"Group": "(&(objectClass=group) (samAccountName=*))"
}
},
"Jwt": {
"Key": "pJBcBWZSjsWlhi1OlCcw6ERTMRNb7qsdvsfvdfbagdfbdfsSDGSDMhsjkfdhsdfbgkHKSDF",
"Issuer": "http://localhost:44316",
"Audience": "http://localhost:44316"
},
"NLog": {
"throwConfigExceptions": true,
"variables": {
"logDirectory": "E:\\LogFiles\\Digital Data\\WebUserManager",
"logFileNamePrefix": "${shortdate}-ECM.WebUserManager.Web"
},
"targets": {
"infoLogs": {
"type": "File",
"fileName": "${logDirectory}\\${logFileNamePrefix}-Info.log",
"maxArchiveDays": 30
},
"errorLogs": {
"type": "File",
"fileName": "${logDirectory}\\${logFileNamePrefix}-Error.log",
"maxArchiveDays": 30
},
"criticalLogs": {
"type": "File",
"fileName": "${logDirectory}\\${logFileNamePrefix}-Critical.log",
"maxArchiveDays": 30
}
},
// Trace, Debug, Info, Warn, Error and *Fatal*
"rules": [
{
"logger": "*",
"minLevel": "Info",
"maxLevel": "Warn",
"writeTo": "infoLogs"
},
{
"logger": "*",
"level": "Error",
"writeTo": "errorLogs"
},
{
"logger": "*",
"level": "Fatal",
"writeTo": "criticalLogs"
}
]
},
"EncryptionParameters": {
"Key": "JGPwHVD0BQmC7upi5OV11PzzIk47ugTJoqBV/et5w40=",
"IV": "gMuetIjlPvJnSzu+i7I3xg=="
},
// Delete below in production
"UseEncryptor": true,
"UseSwagger": true,
"Constants": {
"UserLanguages": [
"de-DE",
"en-US"
]
}
}

View File

@@ -1,3 +0,0 @@
{
"apiUrl": "/api"
}

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" id="Ebene_1" viewBox="0 0 850 121.32">
<defs>
<style>.cls-1{fill:#fff;}</style>
</defs>
<path class="cls-1" d="m809.77,76.62h-8.94l3.51-28.73c.32-3.19.64-6.38.8-9.58h.32c.16,3.19.48,6.39.8,9.58l3.51,28.73h0Zm40.23,41.51l-28.73-114.94h-31.93l-28.73,114.94h35.12l1.6-14.37h15.96l1.6,14.37h35.12Zm-81.41-86.2l-3.19-28.74h-65.45l-3.19,28.74h19.16v86.2h33.52V31.93h19.16Zm-104.07,44.7h-8.94l3.51-28.73c.32-3.19.64-6.38.8-9.58h.32c.16,3.19.48,6.39.8,9.58l3.51,28.73h0Zm40.23,41.51l-28.73-114.94h-31.93l-28.73,114.94h35.12l1.6-14.37h15.96l1.6,14.37h35.12Zm-123.69-57.47c0,19.16-1.6,28.73-15.96,28.73V31.93c14.37,0,15.96,12.77,15.96,28.73m33.52,0c0-35.12-12.77-57.47-41.51-57.47h-41.51v114.94h39.91c30.33,0,43.1-20.75,43.1-57.47m-121.32,28.73h-25.54V3.19h-33.52v114.94h55.87l3.19-28.73h0Zm-105.68-12.77h-8.94l3.51-28.73c.32-3.19.64-6.38.8-9.58h.32c.16,3.19.48,6.39.8,9.58l3.51,28.73h0Zm40.23,41.51L399.07,3.19h-31.93l-28.74,114.94h35.12l1.6-14.37h15.96l1.6,14.37h35.12Zm-81.41-86.2l-3.19-28.74h-65.45l-3.19,28.74h19.16v86.2h33.52V31.93h19.16ZM268.18,3.19h-33.52v114.94h33.52V3.19h0Zm-44.7,94.19v-46.29h-39.91l-1.6,23.95h12.77v9.58c-3.19,4.79-6.39,7.98-12.77,7.98-7.98,0-12.77-11.17-12.77-31.93s4.79-31.93,12.77-31.93c6.86,0,11.33,5.75,12.77,14.37l28.73-6.39C218.7,15.96,207.52,0,181.98,0c-33.52,0-46.3,28.73-46.3,60.66s12.77,60.66,46.3,60.66c17.56,0,31.93-7.98,41.5-23.94M126.11,3.19h-33.52v114.94h33.52V3.19h0ZM49.49,60.66c0,19.16-1.6,28.73-15.96,28.73V31.93c14.37,0,15.96,12.77,15.96,28.73m33.52,0c0-35.12-12.77-57.47-41.51-57.47H0v114.94h39.91c30.33,0,43.1-20.75,43.1-57.47"></path>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Ebene_1" data-name="Ebene 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 850 121.32">
<defs>
<style>
.cls-1 {
fill: #a52431;
stroke-width: 0px;
}
</style>
</defs>
<path class="cls-1" d="M83.01,60.66c0-35.12-12.77-57.47-41.51-57.47H0v114.94h39.91c30.33,0,43.1-20.75,43.1-57.47M49.49,60.66c0,19.16-1.6,28.73-15.96,28.73V31.93c14.37,0,15.96,12.77,15.96,28.73M126.11,3.19h-33.52v114.94h33.52V3.19ZM223.49,97.38v-46.29h-39.91l-1.6,23.95h12.77v9.58c-3.19,4.79-6.39,7.98-12.77,7.98-7.98,0-12.77-11.17-12.77-31.93s4.79-31.93,12.77-31.93c6.86,0,11.33,5.75,12.77,14.37l28.73-6.39C218.7,15.96,207.52,0,181.98,0c-33.52,0-46.29,28.73-46.29,60.66s12.77,60.66,46.29,60.66c17.56,0,31.93-7.98,41.51-23.94M268.18,3.19h-33.52v114.94h33.52V3.19ZM346.4,31.93l-3.19-28.74h-65.45l-3.19,28.74h19.16v86.2h33.52V31.93h19.16ZM427.81,118.13L399.07,3.19h-31.93l-28.73,114.94h35.12l1.6-14.37h15.96l1.6,14.37h35.12ZM387.58,76.62h-8.94l3.51-28.74c.32-3.19.64-6.38.8-9.58h.32c.16,3.19.48,6.38.8,9.58l3.51,28.74ZM493.26,89.4h-25.54V3.19h-33.52v114.94h55.87l3.19-28.74ZM614.58,60.66c0-35.12-12.77-57.47-41.51-57.47h-41.51v114.94h39.91c30.33,0,43.1-20.75,43.1-57.47M581.05,60.66c0,19.16-1.6,28.73-15.96,28.73V31.93c14.37,0,15.96,12.77,15.96,28.73M704.75,118.13l-28.73-114.94h-31.93l-28.74,114.94h35.12l1.6-14.37h15.96l1.6,14.37h35.12ZM664.52,76.62h-8.94l3.51-28.74c.32-3.19.64-6.38.8-9.58h.32c.16,3.19.48,6.38.8,9.58l3.51,28.74ZM768.59,31.93l-3.19-28.74h-65.45l-3.19,28.74h19.16v86.2h33.52V31.93h19.16ZM850,118.13l-28.73-114.94h-31.93l-28.73,114.94h35.12l1.6-14.37h15.96l1.6,14.37h35.12ZM809.77,76.62h-8.94l3.51-28.74c.32-3.19.64-6.38.8-9.58h.32c.16,3.19.48,6.38.8,9.58l3.51,28.74Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Ebene_1" data-name="Ebene 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1100 200">
<defs>
<style>
.cls-1 {
fill: #a52431;
}
.cls-1, .cls-2 {
stroke-width: 0px;
}
.cls-2 {
fill: #fff;
}
</style>
</defs>
<rect class="cls-1" width="1100" height="200"/>
<path class="cls-2" d="M929.81,115.71h-8.94l3.51-28.74c.32-3.19.64-6.39.8-9.58h.32c.16,3.19.48,6.39.8,9.58l3.51,28.74ZM970.04,157.22l-28.73-114.94h-31.93l-28.73,114.94h35.12l1.6-14.37h15.96l1.6,14.37h35.12ZM888.63,71.02l-3.19-28.74h-65.45l-3.19,28.74h19.16v86.2h33.52v-86.2h19.16ZM784.56,115.71h-8.94l3.51-28.74c.32-3.19.64-6.39.8-9.58h.32c.16,3.19.48,6.39.8,9.58l3.51,28.74ZM824.79,157.22l-28.73-114.94h-31.93l-28.74,114.94h35.12l1.6-14.37h15.96l1.6,14.37h35.12ZM701.09,99.75c0,19.16-1.6,28.73-15.96,28.73v-57.47c14.37,0,15.96,12.77,15.96,28.73M734.62,99.75c0-35.12-12.77-57.47-41.51-57.47h-41.51v114.94h39.91c30.33,0,43.1-20.75,43.1-57.47M613.3,128.48h-25.54V42.28h-33.52v114.94h55.87l3.19-28.74ZM507.62,115.71h-8.94l3.51-28.74c.32-3.19.64-6.39.8-9.58h.32c.16,3.19.48,6.39.8,9.58l3.51,28.74ZM547.85,157.22l-28.73-114.94h-31.93l-28.73,114.94h35.12l1.6-14.37h15.96l1.6,14.37h35.12ZM466.44,71.02l-3.19-28.74h-65.45l-3.19,28.74h19.16v86.2h33.52v-86.2h19.16ZM388.22,42.28h-33.52v114.94h33.52V42.28ZM343.53,136.47v-46.29h-39.91l-1.6,23.94h12.77v9.58c-3.19,4.79-6.38,7.98-12.77,7.98-7.98,0-12.77-11.17-12.77-31.93s4.79-31.93,12.77-31.93c6.86,0,11.33,5.75,12.77,14.37l28.74-6.39c-4.79-20.75-15.96-36.72-41.51-36.72-33.52,0-46.29,28.73-46.29,60.66s12.77,60.66,46.29,60.66c17.56,0,31.93-7.98,41.51-23.94M246.15,42.28h-33.52v114.94h33.52V42.28ZM169.53,99.75c0,19.16-1.6,28.73-15.96,28.73v-57.47c14.37,0,15.96,12.77,15.96,28.73M203.05,99.75c0-35.12-12.77-57.47-41.51-57.47h-41.5v114.94h39.91c30.33,0,43.1-20.75,43.1-57.47"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -1,17 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="bi" width="3em" height="2.5em" viewBox="0 0 488.6 488.6" stroke="#a9a8ad">
<style>
vertical-align: -.125em;
fill: currentColor;
</style>
<path opacity="0.4"
d="M480.9,333.2c-27.2-22.3-56.5-37.1-62.4-40c-0.7-0.3-1.1-1-1.1-1.8v-42.3c5.3-3.5,8.8-9.6,8.8-16.5v-43.9
c0-21.8-17.7-39.5-39.5-39.5H382h-4.7c-21.8,0-39.5,17.7-39.5,39.5v43.9c0,6.9,3.5,12.9,8.8,16.5v42.3c0,0.3-0.1,0.5-0.1,0.7
c8.3,5.7,17,12.1,25.5,19.1c9.9,8.2,15.6,20.2,15.6,33.2v35.3h101v-30.1C488.6,343.3,485.8,337.2,480.9,333.2z" />
<path opacity="0.5" d="M142,291.4v-42.3c5.3-3.5,8.8-9.6,8.8-16.5v-43.9c0-21.8-17.7-39.5-39.5-39.5h-4.7h-4.7c-21.8,0-39.5,17.7-39.5,39.5v43.9
c0,6.9,3.5,12.9,8.8,16.5v42.3c0,0.7-0.4,1.4-1.1,1.8c-6,2.9-35.3,17.7-62.4,40c-4.9,4-7.7,10.1-7.7,16.4v30.1h101v-35.3
c0-12.9,5.7-25,15.6-33.2c8.5-7,17.2-13.4,25.5-19.1C142.1,291.9,142,291.7,142,291.4z" />
<path opacity="0.5" d="M360.5,325.1c-31.9-26.2-66.3-43.6-73.4-47.1c-0.8-0.4-1.3-1.2-1.3-2.1v-49.7c6.2-4.2,10.4-11.3,10.4-19.3v-51.6
c0-25.6-20.8-46.4-46.4-46.4h-5.5h-5.5c-25.6,0-46.4,20.8-46.4,46.4v51.5c0,8.1,4.1,15.2,10.4,19.3v49.7c0,0.9-0.5,1.7-1.3,2.1
c-7,3.4-41.4,20.8-73.4,47.1c-5.8,4.7-9.1,11.8-9.1,19.3v35.3h108.9l10.8-49.3c-21.7-30.3,1.6-31.8,5.7-31.8l0,0l0,0
c4.1,0,27.4,1.5,5.7,31.8l10.8,49.3h108.9v-35.3C369.6,336.9,366.3,329.8,360.5,325.1z" />
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="3em" height="2.5em" viewBox="0 0 24 24" style="stroke: #a9a8ad;">
<path opacity="0.5" d="M15.9998 2L14.9998 2C12.1714 2 10.7576 2.00023 9.87891 2.87891C9.00023 3.75759 9.00023 5.1718 9.00023 8.00023L9.00023 16.0002C9.00023 18.8287 9.00023 20.2429 9.87891 21.1215C10.7574 22 12.1706 22 14.9976 22L14.9998 22L15.9998 22C18.8282 22 20.2424 22 21.1211 21.1213C21.9998 20.2426 21.9998 18.8284 21.9998 16L21.9998 8L21.9998 7.99998C21.9998 5.17157 21.9998 3.75736 21.1211 2.87868C20.2424 2 18.8282 2 15.9998 2Z" fill="#1C274C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.25098 11.999C1.25098 11.5848 1.58676 11.249 2.00098 11.249L13.9735 11.249L12.0129 9.56845C11.6984 9.29889 11.662 8.82541 11.9315 8.51092C12.2011 8.19642 12.6746 8.16 12.9891 8.42957L16.4891 11.4296C16.6553 11.5721 16.751 11.7801 16.751 11.999C16.751 12.218 16.6553 12.426 16.4891 12.5685L12.9891 15.5685C12.6746 15.838 12.2011 15.8016 11.9315 15.4871C11.662 15.1726 11.6984 14.6991 12.0129 14.4296L13.9735 12.749L2.00098 12.749C1.58676 12.749 1.25098 12.4132 1.25098 11.999Z" fill="#1C274C"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,19 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="check2" viewBox="0 0 16 16">
<path
d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z" />
</symbol>
<symbol id="circle-half" viewBox="0 0 16 16">
<path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z" />
</symbol>
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path
d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z" />
<path
d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l-.258-.774a1.156 1.156 0 0 0-.732-.732l-.774-.258a.145.145 0 0 1 0-.274l.774-.258c.346-.115.617-.386.732-.732L13.863.1z" />
</symbol>
<symbol id="sun-fill" viewBox="0 0 16 16">
<path
d="M8 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z" />
</symbol>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -1,19 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="check2" viewBox="0 0 16 16">
<path
d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z" />
</symbol>
<symbol id="circle-half" viewBox="0 0 16 16">
<path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z" />
</symbol>
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
<path
d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z" />
<path
d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l-.258-.774a1.156 1.156 0 0 0-.732-.732l-.774-.258a.145.145 0 0 1 0-.274l.774-.258c.346-.115.617-.386.732-.732L13.863.1z" />
</symbol>
<symbol id="sun-fill" viewBox="0 0 16 16">
<path
d="M8 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z" />
</symbol>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -1,5 +0,0 @@
<svg width="em" height="2em" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M16 6C16 8.20914 14.2091 10 12 10C9.79086 10 8 8.20914 8 6C8 3.79086 9.79086 2 12 2C14.2091 2 16 3.79086 16 6Z" fill="#1C274C"/>
<path opacity="0.5" d="M14.4774 21.9208C13.7513 21.9728 12.9296 22 12 22C4 22 4 19.9853 4 17.5C4 15.0147 7.58172 13 12 13C14.8806 13 17.4056 13.8564 18.8142 15.1412C18.298 15 17.5737 15 16.5 15C14.8501 15 14.0251 15 13.5126 15.5126C13 16.0251 13 16.8501 13 18.5C13 20.1499 13 20.9749 13.5126 21.4874C13.7501 21.725 14.0547 21.8524 14.4774 21.9208Z" fill="#1C274C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.5 22C14.8501 22 14.0251 22 13.5126 21.4874C13 20.9749 13 20.1499 13 18.5C13 16.8501 13 16.0251 13.5126 15.5126C14.0251 15 14.8501 15 16.5 15C18.1499 15 18.9749 15 19.4874 15.5126C20 16.0251 20 16.8501 20 18.5C20 20.1499 20 20.9749 19.4874 21.4874C18.9749 22 18.1499 22 16.5 22ZM17.0833 16.9444C17.0833 16.6223 16.8222 16.3611 16.5 16.3611C16.1778 16.3611 15.9167 16.6223 15.9167 16.9444V17.9167H14.9444C14.6223 17.9167 14.3611 18.1778 14.3611 18.5C14.3611 18.8222 14.6223 19.0833 14.9444 19.0833H15.9167V20.0556C15.9167 20.3777 16.1778 20.6389 16.5 20.6389C16.8222 20.6389 17.0833 20.3777 17.0833 20.0556V19.0833H18.0556C18.3777 19.0833 18.6389 18.8222 18.6389 18.5C18.6389 18.1778 18.3777 17.9167 18.0556 17.9167H17.0833V16.9444Z" fill="#1C274C"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,12 +0,0 @@
<svg class="bi my-1 theme-icon-active" width="3em" height="2em" viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg" style="stroke: #a9a8ad;">
<path
d="M16 6C16 8.20914 14.2091 10 12 10C9.79086 10 8 8.20914 8 6C8 3.79086 9.79086 2 12 2C14.2091 2 16 3.79086 16 6Z"
fill="#1C274C" />
<path opacity="0.5"
d="M14.4774 21.9208C13.7513 21.9728 12.9296 22 12 22C4 22 4 19.9853 4 17.5C4 15.0147 7.58172 13 12 13C14.8806 13 17.4056 13.8564 18.8142 15.1412C18.298 15 17.5737 15 16.5 15C14.8501 15 14.0251 15 13.5126 15.5126C13 16.0251 13 16.8501 13 18.5C13 20.1499 13 20.9749 13.5126 21.4874C13.7501 21.725 14.0547 21.8524 14.4774 21.9208Z"
fill="#1C274C" />
<path fill-rule="evenodd" clip-rule="evenodd"
d="M16.5 22C14.8501 22 14.0251 22 13.5126 21.4874C13 20.9749 13 20.1499 13 18.5C13 16.8501 13 16.0251 13.5126 15.5126C14.0251 15 14.8501 15 16.5 15C18.1499 15 18.9749 15 19.4874 15.5126C20 16.0251 20 16.8501 20 18.5C20 20.1499 20 20.9749 19.4874 21.4874C18.9749 22 18.1499 22 16.5 22ZM17.0833 16.9444C17.0833 16.6223 16.8222 16.3611 16.5 16.3611C16.1778 16.3611 15.9167 16.6223 15.9167 16.9444V17.9167H14.9444C14.6223 17.9167 14.3611 18.1778 14.3611 18.5C14.3611 18.8222 14.6223 19.0833 14.9444 19.0833H15.9167V20.0556C15.9167 20.3777 16.1778 20.6389 16.5 20.6389C16.8222 20.6389 17.0833 20.3777 17.0833 20.0556V19.0833H18.0556C18.3777 19.0833 18.6389 18.8222 18.6389 18.5C18.6389 18.1778 18.3777 17.9167 18.0556 17.9167H17.0833V16.9444Z"
fill="#1C274C" />
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,10 +0,0 @@
using DigitalData.Core.Abstractions;
namespace DigitalData.UserManager.Application.DTOs.Module
{
public record ModuleDto(
int Id,
string? Name,
string? ShortName
) : IUnique<int>;
}

View File

@@ -1,4 +0,0 @@
namespace DigitalData.UserManager.Application.DTOs
{
public record SearchRootCreateDto(string? DirEntryUsername, string DirEntryPassword);
}

View File

@@ -1,49 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PackageId>UserManager.Application</PackageId>
<Version>2.0.0.0</Version>
<Authors>Digital Data GmbH</Authors>
<Company>Digital Data GmbH</Company>
<Product>UserManager.Application</Product>
<Description>This package provides essential tools for managing user information and permissions. It offers comprehensive CRUD operations for user data and includes features for managing user roles and authentication.</Description>
<Copyright>Copyright 2024</Copyright>
<PackageIcon>icon.png</PackageIcon>
<RepositoryUrl>http://git.dd:3000/AppStd/WebUserManager.git</RepositoryUrl>
<PackageTags>digital data application user maanger</PackageTags>
</PropertyGroup>
<ItemGroup>
<None Include="..\DigitalData.UserManager.Domain\Assets\icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="DigitalData.Core.Application" Version="2.0.0" />
<PackageReference Include="DigitalData.EmailProfilerDispatcher.Abstraction" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="7.0.16" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0" />
<PackageReference Include="System.DirectoryServices" Version="7.0.1" />
<PackageReference Include="System.DirectoryServices.AccountManagement" Version="7.0.1" />
<PackageReference Include="System.DirectoryServices.Protocols" Version="7.0.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DigitalData.UserManager.Domain\DigitalData.UserManager.Domain.csproj" />
<ProjectReference Include="..\DigitalData.UserManager.Infrastructure\DigitalData.UserManager.Infrastructure.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="Assets\icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
</Project>

View File

@@ -1,37 +0,0 @@
using AutoMapper;
using DigitalData.Core.DTO;
using DigitalData.UserManager.Application.Contracts;
using DigitalData.UserManager.Application.DTOs.Group;
using DigitalData.UserManager.Domain.Entities;
using DigitalData.UserManager.Infrastructure.Contracts;
using Microsoft.Extensions.Localization;
namespace DigitalData.UserManager.Application.Services
{
public class GroupService : BaseService<IGroupRepository, GroupCreateDto, GroupReadDto, GroupUpdateDto, Group>, IGroupService
{
private readonly IStringLocalizer<Resource> _localizer;
public GroupService(IGroupRepository repository, IStringLocalizer<Resource> localizer, IMapper mapper) : base(repository, mapper)
{
_localizer = localizer;
}
public async Task<DataResult<int>> CreateAsync(DirectoryGroupDto adGroup)
{
var group = _mapper.Map<Group>(adGroup);
//set the user
var user = await GetUserAsync();
group.AddedWho = user?.AddedWho ?? "UNAUTHORIZED";
if (await HasEntity(group.Id))
return Result.Fail<int>().Message(_localizer[Key.GroupAlreadyExists.ToString()]);
var createdGroup = await _repository.CreateAsync(group);
if (createdGroup is null)
return Result.Fail<int>();
else
return Result.Success(createdGroup.Id);
}
}
}

View File

@@ -1,25 +0,0 @@
using AutoMapper;
using DigitalData.Core.Application;
using DigitalData.Core.DTO;
using DigitalData.UserManager.Application.Contracts;
using DigitalData.UserManager.Application.DTOs.UserRep;
using DigitalData.UserManager.Domain.Entities;
using DigitalData.UserManager.Infrastructure.Contracts;
using Microsoft.Extensions.Localization;
namespace DigitalData.UserManager.Application.Services
{
public class UserRepService : BaseService<IUserRepRepository, UserRepCreateDto, UserRepReadDto, UserRepUpdateDto, UserRep>, IUserRepService
{
public UserRepService(IUserRepRepository repository, IStringLocalizer<Resource> localizer, IMapper mapper) : base(repository, mapper)
{
}
public async Task<DataResult<IEnumerable<UserRepReadDto>>> ReadAllAsync(bool withUser = false, bool withRepGroup = false, bool withGroup = false, bool withRepUser = false, int? userId = null, int? groupId = null)
{
var urs = await _repository.ReadAllAsync(withUser, withRepGroup, withGroup, withRepUser, userId, groupId);
var urReadDTOs = _mapper.Map<IEnumerable<UserRepReadDto>>(urs);
return Result.Success(urReadDTOs);
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

View File

@@ -1,37 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PackageId>UserManager.Domain</PackageId>
<Version>2.0.0.0</Version>
<Authors>Digital Data GmbH</Authors>
<Company>Digital Data GmbH</Company>
<Product>UserManager.Domain</Product>
<Description>This package provides essential tools for managing user information and permissions. It offers comprehensive CRUD operations for user data and includes features for managing user roles and authentication.</Description>
<Copyright>Copyright 2024</Copyright>
<PackageIcon>icon.png</PackageIcon>
<RepositoryUrl>http://git.dd:3000/AppStd/WebUserManager.git</RepositoryUrl>
<PackageTags>digital data domain user maanger</PackageTags>
</PropertyGroup>
<ItemGroup>
<None Include="..\DigitalData.UserManager.Application\Assets\icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="DigitalData.Core.Abstractions" Version="2.0.0" />
</ItemGroup>
<ItemGroup>
<None Update="Assets\icon.png">
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
</ItemGroup>
</Project>

View File

@@ -1,30 +0,0 @@
using DigitalData.Core.Abstractions;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DigitalData.UserManager.Domain.Entities
{
public class BaseEntity : IUnique<int>
{
[Column("GUID")]
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[StringLength(50)]
[Column("ADDED_WHO")]
public string? AddedWho { get; set; }
[StringLength(50)]
[Column("CHANGED_WHO")]
public string? ChangedWho { get; set; }
[Column("ADDED_WHEN", TypeName = "datetime")]
[DefaultValue("GETDATE()")]
public DateTime AddedWhen { get; set; } = DateTime.Now;
[Column("CHANGED_WHEN", TypeName = "datetime")]
public DateTime? ChangedWhen { get; set; }
}
}

View File

@@ -1,77 +0,0 @@
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DigitalData.UserManager.Domain.Entities
{
[Table("TBDD_USER", Schema = "dbo")]
public class User : BaseEntity
{
[Column("PRENAME")]
[StringLength(50)]
public string? Prename { get; set; }
[Column("NAME")]
[StringLength(50)]
public string? Name { get; set; }
[Required]
[Column("USERNAME")]
[StringLength(50)]
public string Username { get; set; }
[Column("SHORTNAME")]
[StringLength(30)]
public string? Shortname { get; set; }
[Column("EMAIL")]
[StringLength(100)]
public string? Email { get; set; }
[Required]
[Column("LANGUAGE")]
[StringLength(5)]
[DefaultValue("de-DE")]
public string Language { get; set; }
[Column("COMMENT")]
[StringLength(500)]
public string? Comment { get; set; }
[Column("DELETED")]
public bool Deleted { get; set; }
[Required]
[Column("DATE_FORMAT")]
[StringLength(10)]
[DefaultValue("dd.MM.yyyy")]
public string DateFormat { get; set; }
[Required]
[Column("ACTIVE")]
public bool Active { get; set; }
#region IGNORED COLUMNS
//[Required]
//[Column("GENERAL_VIEWER")]
//[StringLength(30)]
//[DefaultValue("NONE")]
//public string GeneralViewer { get; set; }
//[Required]
//[Column("WAN_ENVIRONMENT")]
//public bool WanEnvironment { get; set; }
//[Required]
//[Column("USERID_FK_INT_ECM")]
//public int UseridFkIntEcm { get; set; }
//[Column("DELETED_WHEN")]
//public DateTime? DeletedWhen { get; set; }
//[Column("DELETED_WHO")]
//[StringLength(50)]
//public string? DeletedWho { get; set; }
#endregion
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

View File

@@ -1,20 +0,0 @@
using DigitalData.Core.Abstractions.Infrastructure;
using DigitalData.UserManager.Domain.Entities;
namespace DigitalData.UserManager.Infrastructure.Contracts
{
public interface IGroupOfUserRepository : ICRUDRepository<GroupOfUser, int>
{
IQueryable<GroupOfUser> ReadByGroupId(int groupId);
Task<IEnumerable<GroupOfUser>> ReadByGroupUserIdAsync(int groupId, int userId);
Task<IEnumerable<GroupOfUser>> ReadAllAsyncWithGroup();
Task<IEnumerable<GroupOfUser>> ReadAllAsyncWithUser();
Task<IEnumerable<GroupOfUser>> ReadAllAsyncWithGroupAndUser();
Task<IEnumerable<GroupOfUser>> ReadByUsernameAsync(string username);
}
}

View File

@@ -1,9 +0,0 @@
using DigitalData.Core.Abstractions.Infrastructure;
using DigitalData.UserManager.Domain.Entities;
namespace DigitalData.UserManager.Infrastructure.Contracts
{
public interface IGroupRepository : ICRUDRepository<Group, int>
{
}
}

View File

@@ -1,14 +0,0 @@
using DigitalData.Core.Abstractions.Infrastructure;
using DigitalData.UserManager.Domain.Entities;
namespace DigitalData.UserManager.Infrastructure.Contracts
{
public interface IModuleOfUserRepository : ICRUDRepository<ModuleOfUser, int>
{
IQueryable<ModuleOfUser> ReadByModuleId(int moduleId);
Task<IEnumerable<ModuleOfUser>> ReadByModelUserIdAsync(int moduleId, int userId);
Task<IEnumerable<ModuleOfUser>> ReadByUserAsync(string username);
}
}

View File

@@ -1,9 +0,0 @@
using DigitalData.Core.Abstractions.Infrastructure;
using DigitalData.UserManager.Domain.Entities;
namespace DigitalData.UserManager.Infrastructure.Contracts
{
public interface IModuleRepository : ICRUDRepository<Module, int>
{
}
}

View File

@@ -1,20 +0,0 @@
using DigitalData.UserManager.Domain.Entities;
using Microsoft.EntityFrameworkCore;
namespace DigitalData.UserManager.Infrastructure.Contracts
{
public interface IUserManagerDbContext
{
public DbSet<GroupOfUser> GroupOfUsers { get; }
public DbSet<Group> Groups { get; }
public DbSet<ModuleOfUser> ModuleOfUsers { get; }
public DbSet<Module> Modules { get; }
public DbSet<User> Users { get; }
public DbSet<UserRep> UserReps { get; }
}
}

View File

@@ -1,10 +0,0 @@
using DigitalData.Core.Abstractions.Infrastructure;
using DigitalData.UserManager.Domain.Entities;
namespace DigitalData.UserManager.Infrastructure.Contracts
{
public interface IUserRepRepository : ICRUDRepository<UserRep, int>
{
Task<IEnumerable<UserRep>> ReadAllAsync(bool withUser = false, bool withRepGroup = false, bool withGroup = false, bool withRepUser = false, int? userId = null, int? groupId = null);
}
}

View File

@@ -1,18 +0,0 @@
using DigitalData.Core.Abstractions.Infrastructure;
using DigitalData.UserManager.Domain.Entities;
namespace DigitalData.UserManager.Infrastructure.Contracts
{
public interface IUserRepository : ICRUDRepository<User, int>
{
Task<IEnumerable<User>> ReadByModuleIdAsync(int moduleId);
Task<IEnumerable<User>> ReadUnassignedByModuleIdAsync(int moduleId);
Task<IEnumerable<User>> ReadByGroupIdAsync(int groupId);
Task<IEnumerable<User>> ReadUnassignedByGroupIdAsync(int groupId);
Task<User?> ReadByUsernameAsync(string username);
}
}

View File

@@ -1,15 +0,0 @@
using DigitalData.Core.Infrastructure;
using DigitalData.UserManager.Domain.Entities;
using DigitalData.UserManager.Infrastructure.Contracts;
using Microsoft.EntityFrameworkCore;
namespace DigitalData.UserManager.Infrastructure.Repositories
{
public class GroupRepository<TDbContext> : CRUDRepository<Group, int, TDbContext>, IGroupRepository
where TDbContext : DbContext, IUserManagerDbContext
{
public GroupRepository(TDbContext dbContext) : base(dbContext, dbContext.Groups)
{
}
}
}

View File

@@ -1,32 +0,0 @@
using DigitalData.Core.Infrastructure;
using DigitalData.UserManager.Domain.Entities;
using DigitalData.UserManager.Infrastructure.Contracts;
using Microsoft.EntityFrameworkCore;
namespace DigitalData.UserManager.Infrastructure.Repositories
{
public class ModuleOfUserRepository<TDbContext> : CRUDRepository<ModuleOfUser, int, TDbContext>, IModuleOfUserRepository
where TDbContext : DbContext, IUserManagerDbContext
{
public ModuleOfUserRepository(TDbContext dbContext) : base(dbContext, dbContext.ModuleOfUsers)
{
}
private IQueryable<ModuleOfUser> ReadByUser(string username)
{
return _dbSet.Where(mou => mou.User!.Username == username).Include(mou => mou.Module);
}
public IQueryable<ModuleOfUser> ReadByModuleId(int moduleId)
{
return _dbSet.Where(mou => mou.ModuleId == moduleId);
}
public async Task<IEnumerable<ModuleOfUser>> ReadByModelUserIdAsync(int moduleId, int userId)
{
return await _dbSet.Where(mou => mou.ModuleId == moduleId && mou.UserId == userId).ToListAsync();
}
public async Task<IEnumerable<ModuleOfUser>> ReadByUserAsync(string username) => await ReadByUser(username).ToListAsync();
}
}

View File

@@ -1,15 +0,0 @@
using DigitalData.Core.Infrastructure;
using DigitalData.UserManager.Domain.Entities;
using DigitalData.UserManager.Infrastructure.Contracts;
using Microsoft.EntityFrameworkCore;
namespace DigitalData.UserManager.Infrastructure.Repositories
{
public class ModuleRepository<TDbContext> : CRUDRepository<Module, int, TDbContext>, IModuleRepository
where TDbContext : DbContext, IUserManagerDbContext
{
public ModuleRepository(TDbContext dbContext) : base(dbContext, dbContext.Modules)
{
}
}
}

View File

@@ -1,44 +0,0 @@
using DigitalData.Core.Infrastructure;
using DigitalData.UserManager.Domain.Entities;
using DigitalData.UserManager.Infrastructure.Contracts;
using Microsoft.EntityFrameworkCore;
namespace DigitalData.UserManager.Infrastructure.Repositories
{
public class UserRepRepository<TDbContext> : CRUDRepository<UserRep, int, TDbContext>, IUserRepRepository
where TDbContext : DbContext, IUserManagerDbContext
{
public UserRepRepository(TDbContext dbContext) : base(dbContext, dbContext.UserReps)
{
}
public async Task<IEnumerable<UserRep>> ReadAllAsync(bool withUser = false, bool withRepGroup = false, bool withGroup = false, bool withRepUser = false, int? userId = null, int? groupId = null)
{
var query = _dbSet.AsNoTracking();
if (withUser)
query = query.Include(ur => ur.User);
if (withRepGroup)
query = query.Include(ur => ur.RepGroup);
if (withGroup)
query = query.Include(ur => ur.Group);
if (withRepUser)
query = query.Include(ur => ur.RepUser);
if(userId is not null)
{
query = query.Where(ur => ur.UserId == userId);
}
if (groupId is not null)
{
query = query.Where(ur => ur.GroupId == groupId);
}
return await query.ToListAsync();
}
}
}

View File

@@ -3,13 +3,24 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33516.290
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DigitalData.UserManager.Domain", "DigitalData.UserManager.Domain\DigitalData.UserManager.Domain.csproj", "{BC8CEADC-F7D6-4469-8718-4B308C386B4D}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DigitalData.UserManager.Domain", "src\DigitalData.UserManager.Domain\DigitalData.UserManager.Domain.csproj", "{BC8CEADC-F7D6-4469-8718-4B308C386B4D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DigitalData.UserManager.Application", "DigitalData.UserManager.Application\DigitalData.UserManager.Application.csproj", "{0634853C-C515-48AF-8E27-E5CBF592BCE7}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DigitalData.UserManager.Application", "src\DigitalData.UserManager.Application\DigitalData.UserManager.Application.csproj", "{0634853C-C515-48AF-8E27-E5CBF592BCE7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DigitalData.UserManager.Infrastructure", "DigitalData.UserManager.Infrastructure\DigitalData.UserManager.Infrastructure.csproj", "{1DD81373-82F9-4872-95C6-888624DB1797}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DigitalData.UserManager.Infrastructure", "src\DigitalData.UserManager.Infrastructure\DigitalData.UserManager.Infrastructure.csproj", "{1DD81373-82F9-4872-95C6-888624DB1797}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DigitalData.UserManager.API", "DigitalData.UserManager.API\DigitalData.UserManager.API.csproj", "{07CCD651-647C-49F7-9715-30CEBC13710D}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DigitalData.UserManager.API", "src\DigitalData.UserManager.API\DigitalData.UserManager.API.csproj", "{07CCD651-647C-49F7-9715-30CEBC13710D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.UserManager.DependencyInjection", "src\DigitalData.UserManager.DependencyInjection\DigitalData.UserManager.DependencyInjection.csproj", "{7E5FD115-EE6D-48F2-ACF1-E951EC071073}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8EC462FD-D22E-90A8-E5CE-7E832BA40C5D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Assets", "Assets", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
ProjectSection(SolutionItems) = preProject
Assets\icon.png = Assets\icon.png
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{09BFD507-2536-4915-BECA-6E6C217C8E67}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -17,26 +28,38 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BC8CEADC-F7D6-4469-8718-4B308C386B4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BC8CEADC-F7D6-4469-8718-4B308C386B4D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BC8CEADC-F7D6-4469-8718-4B308C386B4D}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{BC8CEADC-F7D6-4469-8718-4B308C386B4D}.Debug|Any CPU.Build.0 = Release|Any CPU
{BC8CEADC-F7D6-4469-8718-4B308C386B4D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BC8CEADC-F7D6-4469-8718-4B308C386B4D}.Release|Any CPU.Build.0 = Release|Any CPU
{0634853C-C515-48AF-8E27-E5CBF592BCE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0634853C-C515-48AF-8E27-E5CBF592BCE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0634853C-C515-48AF-8E27-E5CBF592BCE7}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{0634853C-C515-48AF-8E27-E5CBF592BCE7}.Debug|Any CPU.Build.0 = Release|Any CPU
{0634853C-C515-48AF-8E27-E5CBF592BCE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0634853C-C515-48AF-8E27-E5CBF592BCE7}.Release|Any CPU.Build.0 = Release|Any CPU
{1DD81373-82F9-4872-95C6-888624DB1797}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1DD81373-82F9-4872-95C6-888624DB1797}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1DD81373-82F9-4872-95C6-888624DB1797}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{1DD81373-82F9-4872-95C6-888624DB1797}.Debug|Any CPU.Build.0 = Release|Any CPU
{1DD81373-82F9-4872-95C6-888624DB1797}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1DD81373-82F9-4872-95C6-888624DB1797}.Release|Any CPU.Build.0 = Release|Any CPU
{07CCD651-647C-49F7-9715-30CEBC13710D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{07CCD651-647C-49F7-9715-30CEBC13710D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{07CCD651-647C-49F7-9715-30CEBC13710D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{07CCD651-647C-49F7-9715-30CEBC13710D}.Release|Any CPU.Build.0 = Release|Any CPU
{7E5FD115-EE6D-48F2-ACF1-E951EC071073}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{7E5FD115-EE6D-48F2-ACF1-E951EC071073}.Debug|Any CPU.Build.0 = Release|Any CPU
{7E5FD115-EE6D-48F2-ACF1-E951EC071073}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7E5FD115-EE6D-48F2-ACF1-E951EC071073}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{BC8CEADC-F7D6-4469-8718-4B308C386B4D} = {09BFD507-2536-4915-BECA-6E6C217C8E67}
{0634853C-C515-48AF-8E27-E5CBF592BCE7} = {09BFD507-2536-4915-BECA-6E6C217C8E67}
{1DD81373-82F9-4872-95C6-888624DB1797} = {09BFD507-2536-4915-BECA-6E6C217C8E67}
{07CCD651-647C-49F7-9715-30CEBC13710D} = {09BFD507-2536-4915-BECA-6E6C217C8E67}
{7E5FD115-EE6D-48F2-ACF1-E951EC071073} = {09BFD507-2536-4915-BECA-6E6C217C8E67}
{02EA681E-C7D8-13C7-8484-4AC65E1B71E8} = {8EC462FD-D22E-90A8-E5CE-7E832BA40C5D}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6804DE1E-B257-4DC9-B9D4-08C8518C8282}
EndGlobalSection

View File

@@ -0,0 +1,12 @@
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "9.0.3",
"commands": [
"dotnet-ef"
]
}
}
}

View File

@@ -1,10 +1,12 @@
{
"name": "user-manager-ui",
"version": "0.0.0",
"version": "2.0.0",
"minApiVersion":"6.1.3",
"scripts": {
"ng": "ng",
"start": "ng serve --ssl -o",
"build": "ng build",
"start:ssl": "ng serve --ssl -o",
"start": "ng serve -o",
"build": "ng build --configuration production",
"watch": "ng build --watch --configuration development",
"test": "ng test",
"serve:ssr:user_manager_ui": "node dist/user_manager_ui/server/server.mjs"
@@ -18,6 +20,7 @@
"@angular/core": "^17.3.0",
"@angular/forms": "^17.3.0",
"@angular/material": "^17.3.10",
"@angular/material-moment-adapter": "^17.3.10",
"@angular/platform-browser": "^17.3.0",
"@angular/platform-browser-dynamic": "^17.3.0",
"@angular/platform-server": "^17.3.0",
@@ -29,9 +32,12 @@
"bootstrap": "^5.3.3",
"bootstrap-icons": "^1.11.3",
"express": "^4.18.2",
"moment": "^2.30.1",
"ng2-pdf-viewer": "^10.4.0",
"rxjs": "~7.8.0",
"sweetalert2": "^11.12.3",
"tslib": "^2.3.0",
"uuid": "^11.1.0",
"zone.js": "~0.14.3"
},
"devDependencies": {

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,12 @@
{
"/api": {
"target": "https://localhost:7103",
"secure": false,
"changeOrigin": true
},
"/docs": {
"target": "https://localhost:7103",
"secure": false,
"changeOrigin": true
}
}

View File

@@ -1,4 +1,5 @@
<app-nav-menu></app-nav-menu>
<main class="container-fluid">
<router-outlet></router-outlet>
</main>
</main>
<app-footer></app-footer>

View File

@@ -1,17 +1,19 @@
import { Component, HostListener, inject } from '@angular/core';
import { ChangeDetectionStrategy, Component, HostListener, inject } from '@angular/core';
import { RouterOutlet } from '@angular/router';
import {NavMenuComponent} from './components/nav-menu/nav-menu.component'
import { NavMenuComponent } from './components/nav-menu/nav-menu.component'
import { TransferService } from './services/button/transfer.service';
import { UpdateService } from './services/button/update.service';
import { RefreshService } from './services/button/refresh.service';
import { DeletionService } from './services/button/deletion.service';
import { FooterComponent } from './components/footer/footer.component';
@Component({
selector: 'app-root',
standalone: true,
imports: [RouterOutlet, NavMenuComponent],
imports: [RouterOutlet, NavMenuComponent, FooterComponent],
templateUrl: './app.component.html',
styleUrl: './app.component.scss'
styleUrl: './app.component.scss',
changeDetection: ChangeDetectionStrategy.Default
})
export class AppComponent {
title = 'app';

View File

@@ -6,6 +6,7 @@ import { GroupComponent } from './pages/group/group.component';
import { ModuleComponent } from './pages/module/module.component';
import { UserAssignmentComponent } from './pages/user-assignment/user-assignment.component';
import { UserRepresentationComponent } from './pages/user-representation/user-representation.component';
import { PrivacyPolicyComponent } from './pages/privacy-policy/privacy-policy.component';
export const routes: Routes = [
{ path: '', component: HomeComponent },
@@ -13,5 +14,6 @@ export const routes: Routes = [
{ path: 'group-table', component: GroupComponent, canActivate: [AuthGuard] },
{ path: 'module-table', component: ModuleComponent, canActivate: [AuthGuard] },
{ path: 'user-assignment', component: UserAssignmentComponent, canActivate: [AuthGuard] },
{ path: 'user-representation', component: UserRepresentationComponent, canActivate: [AuthGuard] }
{ path: 'user-representation', component: UserRepresentationComponent, canActivate: [AuthGuard] },
{ path: 'privacy-policy', component: PrivacyPolicyComponent }
];

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