دلوقتي محتاجين نعملهم Refactor عشان لو حد جه يعمل Login او Register نرجعله الـ Token

نروح على الـ AccountController نعمل Inject ل Object من Class الـ AuthService

public class AccountController : BaseApiController
{
    private readonly UserManager<AppUser> _userManager;
    private readonly SignInManager<AppUser> _signInManager;
    private readonly IAuthService _authService;
    
    public AccountController(
	    UserManager<AppUser> userManager, 
	    SignInManager<AppUser> signInManager,
	    IAuthService authService)
    {
        _userManager = userManager;
        _signInManager = signInManager;
        _authService = authService;
    }
}

ونروح في الـ Project API ونضيف في الـ Main ممكن نفصل الجزء الخاص بالـ Security Module هروح على الـ Extensions ونعمل Class اسمه IdentityServicesExtension وهنعمل جواها Extension Method

public static class IdentityServicesExtension
{
	public static IServiceCollection AddIdentityServices(this IServiceCollection services)
	{
		services.AddScoped(typeof(IAuthService), typeof(AuthService))
		services.AddIdentity<AppUser, IdentityRole().AddEntityFrameworkStores<AppIdentityDbContext>();
		return services;
	}
}
 
// Main
builder.Services.AddIdentityServices();

نبدأ نستخدمه بقا عشان نعمل Generate للـ Token

[HttpPost("login")] // POST: /api/account/login
public async Task<ActionResult<UserDto>> Login(LoginDto model)
{
    var user = await _userManager.FindByEmailAsync(model.Email);
    if(user == null)
        return Unauthorized(new ApiResponse(401));
    
    var result = await _signInManager.CheckPasswordSignInAsync(user, model.Password, false);
    if (!result.Succeeded)
        return Unauthorized(new ApiResponse(401));
    
    return Ok(new UserDto
    {
        DisplayName = user.DisplayName,
        Email = user.Email,
        Token = await _authService.CreateTokenAsync(user, _userManager)
    });
}
 
[HttpPost("register")] // POST: /api/account/register
public async Task<ActionResult<UserDto>> Register(RegisterDto model)
{
    var user = new AppUser
    {
        DisplayName = model.DisplayName,
        Email = model.Email,
        UserName = model.Email.Split("@")[0],
        PhoneNumber = model.PhoneNumber
    };
    
    var result = await _userManager.CreateAsync(user, model.Password);
    if(!result.Succeeded) 
        return BadRequest(new ApiResponse(400));
    
    return Ok(new UserDto
    {
        DisplayName = user.DisplayName,
        Email = user.Email,
        Token = await _authService.CreateTokenAsync(user, _userManager)
    });
}