feat: implement JWT token generation in VerifyOtpTokenCommandHandler and update related configurations
This commit is contained in:
+12
-3
@@ -5,10 +5,12 @@ namespace CMSMicroservice.Application.UserCQ.Commands.VerifyOtpToken;
|
|||||||
public class VerifyOtpTokenCommandHandler : IRequestHandler<VerifyOtpTokenCommand, VerifyOtpTokenResponseDto>
|
public class VerifyOtpTokenCommandHandler : IRequestHandler<VerifyOtpTokenCommand, VerifyOtpTokenResponseDto>
|
||||||
{
|
{
|
||||||
private readonly IApplicationDbContext _context;
|
private readonly IApplicationDbContext _context;
|
||||||
|
private readonly IGenerateJwtToken _generateJwt;
|
||||||
|
|
||||||
public VerifyOtpTokenCommandHandler(IApplicationDbContext context)
|
public VerifyOtpTokenCommandHandler(IApplicationDbContext context, IGenerateJwtToken generateJwt)
|
||||||
{
|
{
|
||||||
_context = context;
|
_context = context;
|
||||||
|
_generateJwt = generateJwt;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<VerifyOtpTokenResponseDto> Handle(VerifyOtpTokenCommand request, CancellationToken cancellationToken)
|
public async Task<VerifyOtpTokenResponseDto> Handle(VerifyOtpTokenCommand request, CancellationToken cancellationToken)
|
||||||
@@ -22,6 +24,11 @@ public class VerifyOtpTokenCommandHandler : IRequestHandler<VerifyOtpTokenComman
|
|||||||
return new VerifyOtpTokenResponseDto { IsSuccess = false, Message = "کد تایید نامعتبر است" };
|
return new VerifyOtpTokenResponseDto { IsSuccess = false, Message = "کد تایید نامعتبر است" };
|
||||||
|
|
||||||
var user = await _context.Users
|
var user = await _context.Users
|
||||||
|
.Include(u => u.UserContracts)
|
||||||
|
.ThenInclude(uc => uc.Contract)
|
||||||
|
.Include(u => u.UserRoles)
|
||||||
|
.ThenInclude(ur => ur.Role)
|
||||||
|
.Include(u => u.ClubMembership)
|
||||||
.Where(x => x.Mobile == request.Mobile)
|
.Where(x => x.Mobile == request.Mobile)
|
||||||
.FirstOrDefaultAsync(cancellationToken);
|
.FirstOrDefaultAsync(cancellationToken);
|
||||||
|
|
||||||
@@ -32,12 +39,14 @@ public class VerifyOtpTokenCommandHandler : IRequestHandler<VerifyOtpTokenComman
|
|||||||
otpToken.IsUsed = true;
|
otpToken.IsUsed = true;
|
||||||
await _context.SaveChangesAsync(cancellationToken);
|
await _context.SaveChangesAsync(cancellationToken);
|
||||||
|
|
||||||
// TODO: Implement JWT token generation
|
// Generate JWT token
|
||||||
|
var token = await _generateJwt.GenerateJwtToken(user);
|
||||||
|
|
||||||
return new VerifyOtpTokenResponseDto
|
return new VerifyOtpTokenResponseDto
|
||||||
{
|
{
|
||||||
IsSuccess = true,
|
IsSuccess = true,
|
||||||
Message = "کد تایید با موفقیت تایید شد",
|
Message = "کد تایید با موفقیت تایید شد",
|
||||||
Token = "TODO_IMPLEMENT_JWT_GENERATION"
|
Token = token
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -14,9 +14,9 @@ public class GetJwtTokenQueryHandler : IRequestHandler<GetJwtTokenQuery, GetJwtT
|
|||||||
{
|
{
|
||||||
var user = await _context.Users
|
var user = await _context.Users
|
||||||
.Include(u => u.UserContracts)
|
.Include(u => u.UserContracts)
|
||||||
.ThenInclude(u => u.Contract)
|
.ThenInclude(uc => uc.Contract)
|
||||||
.Include(u => u.UserRoles)
|
.Include(u => u.UserRoles)
|
||||||
.ThenInclude(ur => ur.Role)
|
.ThenInclude(ur => ur.Role)
|
||||||
.Include(u => u.ClubMembership)
|
.Include(u => u.ClubMembership)
|
||||||
.FirstOrDefaultAsync(x => x.Id == request.Id, cancellationToken) ?? throw new NotFoundException(nameof(User), request.Id);
|
.FirstOrDefaultAsync(x => x.Id == request.Id, cancellationToken) ?? throw new NotFoundException(nameof(User), request.Id);
|
||||||
return new GetJwtTokenResponseDto()
|
return new GetJwtTokenResponseDto()
|
||||||
|
|||||||
+3
-1
@@ -15,6 +15,8 @@ public class ContractConfiguration : IEntityTypeConfiguration<Contract>
|
|||||||
builder.Property(entity => entity.Description).IsRequired(true);
|
builder.Property(entity => entity.Description).IsRequired(true);
|
||||||
builder.Property(entity => entity.HtmlContent).IsRequired(true);
|
builder.Property(entity => entity.HtmlContent).IsRequired(true);
|
||||||
builder.Property(entity => entity.Type).IsRequired(true);
|
builder.Property(entity => entity.Type).IsRequired(true);
|
||||||
|
|
||||||
|
// Map legacy Code column from database as shadow property (not used in C# code)
|
||||||
|
builder.Property<string>("Code").IsRequired(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,10 @@ public class OtpTokenConfiguration : IEntityTypeConfiguration<OtpToken>
|
|||||||
builder.Property(entity => entity.Id).UseIdentityColumn();
|
builder.Property(entity => entity.Id).UseIdentityColumn();
|
||||||
builder.Property(entity => entity.Mobile).IsRequired(true);
|
builder.Property(entity => entity.Mobile).IsRequired(true);
|
||||||
builder.Property(entity => entity.Purpose).IsRequired(true);
|
builder.Property(entity => entity.Purpose).IsRequired(true);
|
||||||
|
|
||||||
|
// Code is not persisted to database, only used in-memory before hashing
|
||||||
|
builder.Ignore(entity => entity.Code);
|
||||||
|
|
||||||
builder.Property(entity => entity.CodeHash).IsRequired(true);
|
builder.Property(entity => entity.CodeHash).IsRequired(true);
|
||||||
builder.Property(entity => entity.ExpiresAt).IsRequired(true);
|
builder.Property(entity => entity.ExpiresAt).IsRequired(true);
|
||||||
builder.Property(entity => entity.Attempts).IsRequired(true);
|
builder.Property(entity => entity.Attempts).IsRequired(true);
|
||||||
|
|||||||
Reference in New Issue
Block a user