using Indotalent.Data.Entities; using MediatR; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.WebUtilities; using System.Text; namespace Indotalent.Features.Setting.SystemUser.Cqrs; public class AdminForgotPasswordResponse { public bool IsSuccess { get; set; } public string Message { get; set; } = string.Empty; } public record AdminForgotPasswordCommand(string UserId) : IRequest; public class AdminForgotPasswordHandler : IRequestHandler { private readonly UserManager _userManager; private readonly IEmailSender _emailSender; private readonly IHttpContextAccessor _httpContextAccessor; public AdminForgotPasswordHandler( UserManager userManager, IEmailSender emailSender, IHttpContextAccessor httpContextAccessor) { _userManager = userManager; _emailSender = emailSender; _httpContextAccessor = httpContextAccessor; } public async Task Handle(AdminForgotPasswordCommand request, CancellationToken cancellationToken) { var user = await _userManager.FindByIdAsync(request.UserId); if (user == null) return new AdminForgotPasswordResponse { IsSuccess = false, Message = "User not found" }; var code = await _userManager.GeneratePasswordResetTokenAsync(user); code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); var requestHttp = _httpContextAccessor.HttpContext?.Request; var scheme = requestHttp?.Scheme ?? "https"; var host = requestHttp?.Host.Value ?? "localhost:8080"; var callbackUrl = $"{scheme}://{host}/account/reset-password?userId={user.Id}&code={code}"; var message = $@"

System Administrator Password Reset

Hello, {user.FullName}!

An administrator has initiated a password reset for your account. Please click the link below to set your new password:

Reset My Password


If you believe this is an error, please contact your IT support.

"; await _emailSender.SendPasswordResetLinkAsync(user, user.Email!, message); return new AdminForgotPasswordResponse { IsSuccess = true, Message = "Reset link sent successfully" }; } }