diff --git a/Webshop.Api/Controllers/Admin/AdminUsersController.cs b/Webshop.Api/Controllers/Admin/AdminUsersController.cs index 1b80ba8..2c3ce1b 100644 --- a/Webshop.Api/Controllers/Admin/AdminUsersController.cs +++ b/Webshop.Api/Controllers/Admin/AdminUsersController.cs @@ -1,12 +1,13 @@ -// Auto-generiert von CreateWebshopFiles.ps1 +// src/Webshop.Api/Controllers/Admin/AdminUsersController.cs using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Authorization; using Webshop.Application.DTOs.Users; - using System; using System.Collections.Generic; using System.Threading.Tasks; +using Webshop.Application; using Webshop.Application.Services.Admin.Interfaces; +using Microsoft.AspNetCore.Http; namespace Webshop.Api.Controllers.Admin { @@ -23,18 +24,72 @@ namespace Webshop.Api.Controllers.Admin } [HttpGet] - public async Task>> GetAllUsers() + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + public async Task GetAllUsers() { - var users = await _adminUserService.GetAllUsersAsync(); - return Ok(users); + var result = await _adminUserService.GetAllUsersAsync(); + return Ok(result.Value); } + + [HttpGet("{userId}")] - public async Task> GetUserById(string userId) + [ProducesResponseType(typeof(UserDto), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] + public async Task GetUserById(string userId) { - var user = await _adminUserService.GetUserByIdAsync(userId); - if (user == null) return NotFound(); - return Ok(user); + var result = await _adminUserService.GetUserByIdAsync(userId); + + return result.Type switch + { + ServiceResultType.Success => Ok(result.Value), + ServiceResultType.NotFound => NotFound(new { Message = result.ErrorMessage }), + _ => StatusCode(StatusCodes.Status500InternalServerError, new { Message = result.ErrorMessage ?? "Ein unerwarteter Fehler ist aufgetreten." }) + }; + } + + [HttpPut("{userId}/roles")] + [ProducesResponseType(StatusCodes.Status204NoContent)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] + public async Task UpdateUserRoles(string userId, [FromBody] UpdateUserRolesRequest request) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + var result = await _adminUserService.UpdateUserRolesAsync(userId, request.NewRoles); + + return result.Type switch + { + ServiceResultType.Success => NoContent(), + ServiceResultType.NotFound => NotFound(new { Message = result.ErrorMessage }), + ServiceResultType.Failure => BadRequest(new { Message = result.ErrorMessage }), // Identity errors are often validation-like + _ => StatusCode(StatusCodes.Status500InternalServerError, new { Message = result.ErrorMessage ?? "Ein unerwarteter Fehler ist aufgetreten." }) + }; + } + + [HttpDelete("{userId}")] + [ProducesResponseType(StatusCodes.Status204NoContent)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] + public async Task DeleteUser(string userId) + { + var result = await _adminUserService.DeleteUserAsync(userId); + + return result.Type switch + { + ServiceResultType.Success => NoContent(), + ServiceResultType.NotFound => NotFound(new { Message = result.ErrorMessage }), + ServiceResultType.Failure => BadRequest(new { Message = result.ErrorMessage }), + _ => StatusCode(StatusCodes.Status500InternalServerError, new { Message = result.ErrorMessage ?? "Ein unerwarteter Fehler ist aufgetreten." }) + }; + } + + // Kleines DTO für die Anfrage zum Rollen-Update + public class UpdateUserRolesRequest + { + public List NewRoles { get; set; } = new List(); } } -} +} \ No newline at end of file diff --git a/Webshop.Application/Services/Admin/AdminUserService.cs b/Webshop.Application/Services/Admin/AdminUserService.cs index d0290f4..fa0e31a 100644 --- a/Webshop.Application/Services/Admin/AdminUserService.cs +++ b/Webshop.Application/Services/Admin/AdminUserService.cs @@ -4,30 +4,26 @@ using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Webshop.Application; using Webshop.Application.DTOs.Users; using Webshop.Application.Services.Admin.Interfaces; -using Webshop.Domain.Entities; -using Webshop.Infrastructure.Data; // WICHTIG: Stellt sicher, dass ApplicationDbContext gefunden wird. using Webshop.Domain.Identity; +using Webshop.Infrastructure.Data; namespace Webshop.Application.Services.Admin { - // --- SCHRITT 1: Die fehlende Klassendeklaration --- public class AdminUserService : IAdminUserService { - // --- SCHRITT 2: Die fehlenden Feld-Deklarationen --- private readonly UserManager _userManager; private readonly ApplicationDbContext _context; - // --- SCHRITT 3: Der Konstruktor, der die Felder zuweist --- public AdminUserService(UserManager userManager, ApplicationDbContext context) { _userManager = userManager; _context = context; } - // --- AB HIER: Alle Ihre Methoden, unverĂ€ndert --- - public async Task> GetAllUsersAsync() + public async Task>> GetAllUsersAsync() { var users = await _userManager.Users .Include(u => u.Customer) @@ -49,10 +45,10 @@ namespace Webshop.Application.Services.Admin LastName = user.Customer?.LastName ?? string.Empty }); } - return userDtos; + return ServiceResult.Ok>(userDtos); } - public async Task GetUserByIdAsync(string userId) + public async Task> GetUserByIdAsync(string userId) { var user = await _userManager.Users .Include(u => u.Customer) @@ -60,10 +56,10 @@ namespace Webshop.Application.Services.Admin if (user == null) { - return null; + return ServiceResult.Fail(ServiceResultType.NotFound, $"Benutzer mit ID '{userId}' nicht gefunden."); } - return new UserDto + var userDto = new UserDto { Id = user.Id, Email = user.Email ?? string.Empty, @@ -75,33 +71,42 @@ namespace Webshop.Application.Services.Admin FirstName = user.Customer?.FirstName ?? string.Empty, LastName = user.Customer?.LastName ?? string.Empty }; + + return ServiceResult.Ok(userDto); } - public async Task UpdateUserRolesAsync(string userId, List newRoles) + public async Task UpdateUserRolesAsync(string userId, List newRoles) { var user = await _userManager.FindByIdAsync(userId); if (user == null) { - return false; + return ServiceResult.Fail(ServiceResultType.NotFound, $"Benutzer mit ID '{userId}' nicht gefunden."); } var existingRoles = await _userManager.GetRolesAsync(user); var removeResult = await _userManager.RemoveFromRolesAsync(user, existingRoles); if (!removeResult.Succeeded) { - return false; + string errors = string.Join(", ", removeResult.Errors.Select(e => e.Description)); + return ServiceResult.Fail(ServiceResultType.Failure, $"Fehler beim Entfernen alter Rollen: {errors}"); } var addResult = await _userManager.AddToRolesAsync(user, newRoles); - return addResult.Succeeded; + if (!addResult.Succeeded) + { + string errors = string.Join(", ", addResult.Errors.Select(e => e.Description)); + return ServiceResult.Fail(ServiceResultType.Failure, $"Fehler beim HinzufĂŒgen neuer Rollen: {errors}"); + } + + return ServiceResult.Ok(); } - public async Task DeleteUserAsync(string userId) + public async Task DeleteUserAsync(string userId) { var user = await _userManager.FindByIdAsync(userId); if (user == null) { - return false; + return ServiceResult.Fail(ServiceResultType.NotFound, $"Benutzer mit ID '{userId}' nicht gefunden."); } // Kaskadierendes Löschen der abhĂ€ngigen Daten @@ -122,8 +127,13 @@ namespace Webshop.Application.Services.Admin // Zum Schluss den Identity-Benutzer löschen var result = await _userManager.DeleteAsync(user); - return result.Succeeded; - } + if (!result.Succeeded) + { + string errors = string.Join(", ", result.Errors.Select(e => e.Description)); + return ServiceResult.Fail(ServiceResultType.Failure, $"Fehler beim Löschen des Benutzers: {errors}"); + } - } // <-- Schließende Klammer fĂŒr die Klasse -} // <-- Schließende Klammer fĂŒr den Namespace \ No newline at end of file + return ServiceResult.Ok(); + } + } +} \ No newline at end of file diff --git a/Webshop.Application/Services/Admin/Interfaces/IAdminUserService.cs b/Webshop.Application/Services/Admin/Interfaces/IAdminUserService.cs index 7c434ed..45551ed 100644 --- a/Webshop.Application/Services/Admin/Interfaces/IAdminUserService.cs +++ b/Webshop.Application/Services/Admin/Interfaces/IAdminUserService.cs @@ -1,6 +1,7 @@ ï»ż// src/Webshop.Application/Services/Admin/Interfaces/IAdminUserService.cs using System.Collections.Generic; using System.Threading.Tasks; +using Webshop.Application; using Webshop.Application.DTOs.Users; namespace Webshop.Application.Services.Admin.Interfaces @@ -13,21 +14,21 @@ namespace Webshop.Application.Services.Admin.Interfaces /// /// Ruft eine Liste aller Benutzer mit ihren zugehörigen Daten ab. /// - Task> GetAllUsersAsync(); + Task>> GetAllUsersAsync(); /// /// Ruft einen einzelnen Benutzer anhand seiner ID ab. /// - Task GetUserByIdAsync(string userId); + Task> GetUserByIdAsync(string userId); /// /// Aktualisiert die Rollen eines bestimmten Benutzers. /// - Task UpdateUserRolesAsync(string userId, List newRoles); + Task UpdateUserRolesAsync(string userId, List newRoles); /// /// Löscht einen Benutzer und alle seine abhĂ€ngigen Daten (Kundenprofil, Bestellungen etc.). /// - Task DeleteUserAsync(string userId); + Task DeleteUserAsync(string userId); } } \ No newline at end of file