< Summary - MechanicsSoftware — Coverage Report

Information
Class: MechanicsSoftware.Infrastructure.Security.JwtProvider
Assembly: MechanicsSoftware.Infrastructure
File(s): /home/runner/work/mechanics-software/mechanics-software/src/MechanicsSoftware.Infrastructure/Security/JwtProvider.cs
Line coverage
100%
Covered lines: 33
Uncovered lines: 0
Coverable lines: 33
Total lines: 52
Line coverage: 100%
Branch coverage
100%
Covered branches: 12
Total branches: 12
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%66100%
.ctor(...)100%66100%
Generate(...)100%11100%
Generate(...)100%11100%

File(s)

/home/runner/work/mechanics-software/mechanics-software/src/MechanicsSoftware.Infrastructure/Security/JwtProvider.cs

#LineLine coverage
 1using System.IdentityModel.Tokens.Jwt;
 2using System.Security.Claims;
 3using System.Text;
 4using MechanicsSoftware.Application.Abstractions;
 5using Microsoft.Extensions.Configuration;
 6using Microsoft.IdentityModel.Tokens;
 7using MechanicsSoftware.Domain.Entities;
 8using MechanicsSoftware.Domain.ValueObjects;
 9using MechanicsSoftware.Domain.Enums;
 10using MechanicsSoftware.Domain.Exceptions;
 11
 12namespace MechanicsSoftware.Infrastructure.Security;
 13
 14public sealed class JwtProvider : IJwtProvider
 15{
 516    private readonly string _secret;
 517    private readonly int _expirationMinutes;
 518
 1719    public JwtProvider(IConfiguration configuration)
 1720    {
 1221        _secret = configuration["JWT_SECRET"]
 1622            ?? throw new InvalidOperationException(
 1623                "JWT secret not configured. Set the 'JWT_SECRET' environment variable.");
 424
 1425        _expirationMinutes = int.TryParse(configuration["JWT_EXPIRATION_MINUTES"], out var minutes) && minutes > 0
 1026            ? minutes
 1027            : 60;
 1428    }
 429
 30    public JwtToken Generate(User user)
 1431    {
 1432        var expiresAt = DateTime.UtcNow.AddMinutes(_expirationMinutes);
 433
 1434        var claims = new[]
 1435        {
 1436            new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
 1437            new Claim(JwtRegisteredClaimNames.Email, user.Email.Value),
 1038            new Claim(ClaimTypes.Role, user.Role),
 1439            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
 1440        };
 41
 1442        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_secret));
 1443        var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
 444
 1445        var token = new JwtSecurityToken(
 1046            claims: claims,
 1447            expires: expiresAt,
 1448            signingCredentials: credentials);
 49
 1050        return new JwtToken(new JwtSecurityTokenHandler().WriteToken(token), expiresAt);
 1051    }
 52}