< 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: 4_16869239191
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
 9069public class GenerateJWTService(AuthSettings settings, UserManager<SykiUser> userManager, SykiDbContext ctx) : ICrossSer
 10{
 11    public async Task<string> Generate(string email)
 12    {
 88413        var user = (await userManager.FindByEmailAsync(email))!;
 88414        var role = (await userManager.GetRolesAsync(user))[0];
 15
 88416        var claims = new List<Claim>
 88417        {
 88418            new("jti", Guid.CreateVersion7().ToString()),
 88419            new("sub", user.Id.ToString()),
 88420            new("role", role),
 88421            new("name", user.Name),
 88422            new("email", user.Email!),
 88423            new("institution", user.InstitutionId.ToString()),
 88424        };
 88425        claims.AddRange(await GetDbClaims(user.Id, role));
 26
 88427        var identityClaims = new ClaimsIdentity();
 88428        identityClaims.AddClaims(claims);
 29
 88430        var key = Encoding.ASCII.GetBytes(settings.SecurityKey);
 88431        var expirationTime = settings.ExpirationTimeInMinutes;
 88432        var signingCredentials = new SigningCredentials(
 88433            new SymmetricSecurityKey(key),
 88434            SecurityAlgorithms.HmacSha256Signature
 88435        );
 36
 88437        var tokenDescriptor = new SecurityTokenDescriptor
 88438        {
 88439            Issuer = settings.Issuer,
 88440            Subject = identityClaims,
 88441            Audience = settings.Audience,
 88442            SigningCredentials = signingCredentials,
 88443            Expires = DateTime.UtcNow.AddMinutes(expirationTime),
 88444        };
 45
 88446        var tokenHandler = new JwtSecurityTokenHandler();
 88447        var token = tokenHandler.CreateToken(tokenDescriptor);
 48
 88449        return tokenHandler.WriteToken(token);
 88450    }
 51
 52    private async Task<List<Claim>> GetDbClaims(Guid userId, string role)
 53    {
 88454        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
 68664        return [];
 88465    }
 66}