InitEshop+ddd+ca

This commit is contained in:
Matěj Kubíček
2026-07-16 18:33:05 +02:00
parent ffd8a087c8
commit 7e080eaef9
144 changed files with 972 additions and 1339 deletions
@@ -0,0 +1,112 @@
using Eshop.Application.Auth;
using Eshop.Application.Common;
using Eshop.Infrastructure.Persistence;
using Microsoft.AspNetCore.Identity;
namespace Eshop.Infrastructure.Identity;
public class AspNetIdentityUserAccountService(
UserManager<UserEntity> users,
SignInManager<UserEntity> signIn) : IUserAccountService
{
public async Task<ServiceResult> RegisterAsync(
string userName,
string email,
string password,
CancellationToken cancellationToken)
{
var user = new UserEntity
{
UserName = userName.Trim(),
Email = email.Trim().ToLower(),
};
var result = await users.CreateAsync(user, password);
if (!result.Succeeded)
return ServiceResult.Failure(result.Errors.Select(e => e.Description));
await users.AddToRoleAsync(user, "User");
return ServiceResult.Ok();
}
public async Task<UserProfileDto?> GetProfileAsync(string userId, CancellationToken cancellationToken)
{
var user = await users.FindByIdAsync(userId);
if (user is null) return null;
return new UserProfileDto(user.UserName!, user.Email!);
}
public async Task<ServiceResult> UpdateProfileAsync(
string userId,
UpdateProfileRequest request,
CancellationToken cancellationToken)
{
var user = await users.FindByIdAsync(userId);
if (user is null)
return ServiceResult.Failure("User not found.");
var errors = new List<string>();
if (user.UserName != request.UserName.Trim())
{
var setName = await users.SetUserNameAsync(user, request.UserName.Trim());
if (!setName.Succeeded)
errors.AddRange(setName.Errors.Select(e => e.Description));
}
var normalizedEmail = request.Email.Trim().ToLower();
if (user.Email != normalizedEmail)
{
var setEmail = await users.SetEmailAsync(user, normalizedEmail);
if (!setEmail.Succeeded)
errors.AddRange(setEmail.Errors.Select(e => e.Description));
}
if (!string.IsNullOrWhiteSpace(request.NewPassword))
{
if (string.IsNullOrWhiteSpace(request.CurrentPassword))
return ServiceResult.Failure("Current password is required to set a new password.");
var changePassword = await users.ChangePasswordAsync(
user, request.CurrentPassword, request.NewPassword);
if (!changePassword.Succeeded)
errors.AddRange(changePassword.Errors.Select(e => e.Description));
}
if (errors.Count > 0)
return ServiceResult.Failure(errors);
await signIn.RefreshSignInAsync(user);
return ServiceResult.Ok();
}
public async Task<ServiceResult> DeleteAccountAsync(string userId, CancellationToken cancellationToken)
{
var user = await users.FindByIdAsync(userId);
if (user is null)
return ServiceResult.Failure("User not found.");
await signIn.SignOutAsync();
var result = await users.DeleteAsync(user);
return result.Succeeded
? ServiceResult.Ok()
: ServiceResult.Failure(result.Errors.Select(e => e.Description));
}
public async Task<UserDataExportDto?> ExportUserDataAsync(string userId, CancellationToken cancellationToken)
{
var user = await users.FindByIdAsync(userId);
if (user is null)
return null;
var roles = await users.GetRolesAsync(user);
return new UserDataExportDto(
user.Id,
user.UserName!,
user.Email!,
roles.ToList(),
DateTime.UtcNow);
}
}