using MediatR; using Mws.Application.Auth; using Mws.Application.Common; using Mws.Application.Permissions; namespace Mws.Application.Accounts; public record ResetPasswordCommand(Guid ActorUserId, Guid Id, ResetPasswordRequest Request) : IRequest; public class ResetPasswordHandler(IUnitOfWork uow, IPasswordHasher passwordHasher, IPermissionService permissions) : IRequestHandler { private const string Screen = "accounts"; public async Task Handle(ResetPasswordCommand command, CancellationToken ct) { await permissions.EnsureAsync(command.ActorUserId, Screen, PermissionAction.Edit, ct); if (string.IsNullOrWhiteSpace(command.Request.NewPassword)) { throw new BadRequestException("New password is required"); } var user = await uow.Users.GetByIdAsync(command.Id, ct) ?? throw new NotFoundException("Account not found"); user.PasswordHash = passwordHasher.Hash(command.Request.NewPassword); user.UpdatedAt = DateTime.UtcNow; await uow.SaveChangesAsync(ct); } }