< Summary - Syki

Information
Class: Syki.Back.Features.Cross.GenerateJWT.GenerateJWTService
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Features/Cross/GenerateJWT/GenerateJWTService.cs
Tag: 21_17346963026
Line coverage
100%
Covered lines: 41
Uncovered lines: 0
Coverable lines: 41
Total lines: 66
Line coverage: 100%
Branch coverage
100%
Covered branches: 2
Total branches: 2
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%11100%
Generate()100%11100%
GetDbClaims()100%22100%

File(s)

/home/runner/work/syki/syki/Back/Features/Cross/GenerateJWT/GenerateJWTService.cs

#LineLine coverage
 1using System.Text;
 2using System.Security.Claims;
 3using Microsoft.IdentityModel.Tokens;
 4using System.IdentityModel.Tokens.Jwt;
 5using Syki.Back.Features.Cross.CreateUser;
 6
 7namespace Syki.Back.Features.Cross.GenerateJWT;
 8
 9709public class GenerateJWTService(AuthSettings settings, UserManager<SykiUser> userManager, SykiDbContext ctx) : ICrossSer
 10{
 11    public async Task<string> Generate(string email)
 12    {
 94813        var user = (await userManager.FindByEmailAsync(email))!;
 94814        var role = (await userManager.GetRolesAsync(user))[0];
 15
 94816        var claims = new List<Claim>
 94817        {
 94818            new("jti", Guid.CreateVersion7().ToString()),
 94819            new("sub", user.Id.ToString()),
 94820            new("role", role),
 94821            new("name", user.Name),
 94822            new("email", user.Email!),
 94823            new("institution", user.InstitutionId.ToString()),
 94824        };
 94825        claims.AddRange(await GetDbClaims(user.Id, role));
 26
 94827        var identityClaims = new ClaimsIdentity();
 94828        identityClaims.AddClaims(claims);
 29
 94830        var key = Encoding.ASCII.GetBytes(settings.SecurityKey);
 94831        var expirationTime = settings.ExpirationTimeInMinutes;
 94832        var signingCredentials = new SigningCredentials(
 94833            new SymmetricSecurityKey(key),
 94834            SecurityAlgorithms.HmacSha256Signature
 94835        );
 36
 94837        var tokenDescriptor = new SecurityTokenDescriptor
 94838        {
 94839            Issuer = settings.Issuer,
 94840            Subject = identityClaims,
 94841            Audience = settings.Audience,
 94842            SigningCredentials = signingCredentials,
 94843            Expires = DateTime.UtcNow.AddMinutes(expirationTime),
 94844        };
 45
 94846        var tokenHandler = new JwtSecurityTokenHandler();
 94847        var token = tokenHandler.CreateToken(tokenDescriptor);
 48
 94849        return tokenHandler.WriteToken(token);
 94850    }
 51
 52    private async Task<List<Claim>> GetDbClaims(Guid userId, string role)
 53    {
 94854        if (role.ToEnum<UserRole>() is UserRole.Student)
 55        {
 19856            var courseOfferingId = await ctx.Students.Where(a => a.Id == userId)
 19857                .Select(a => a.CourseOfferingId).FirstAsync();
 19858            var courseCurriculumId = await ctx.CourseOfferings.Where(o => o.Id == courseOfferingId)
 19859                .Select(o => o.CourseCurriculumId).FirstAsync();
 60
 19861            return [ new("CourseCurriculumId", courseCurriculumId.ToString()) ];
 62        }
 63
 75064        return [];
 94865    }
 66}