< Summary - Syki

Information
Class: Syki.Back.Features.Cross.SignIn.SignInService
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Features/Identity/SignIn/SignInService.cs
Tag: 97_27801654829
Line coverage
100%
Covered lines: 40
Uncovered lines: 0
Coverable lines: 40
Total lines: 60
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

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

File(s)

/home/runner/work/syki/syki/Back/Features/Identity/SignIn/SignInService.cs

#LineLine coverage
 1using System.Text;
 2using Syki.Back.Auth.Claims;
 3using System.Security.Claims;
 4using Microsoft.IdentityModel.Tokens;
 5using System.IdentityModel.Tokens.Jwt;
 6using Syki.Back.Features.Identity.SignIn;
 7
 8namespace Syki.Back.Features.Cross.SignIn;
 9
 37410public class SignInService(
 37411    SykiDbContext ctx,
 37412    AuthSettings settings,
 37413    IHttpContextAccessor httpCtx) : ISykiService
 14{
 15    public async Task<SignInOut> SignIn(string email)
 16    {
 28217        var user = await ctx.Users.Where(u => u.Email == email).Select(x => new { x.Id, x.InstitutionId }).FirstAsync();
 28218        var role = await ctx.GetUserRole(user.Id, user.InstitutionId);
 28219        var permissions = role.Permissions.Serialize();
 20
 28221        var claims = new List<Claim>
 28222        {
 28223            new(SykiClaims.UserId, user.Id.ToString()),
 28224            new(SykiClaims.UserPermissions, permissions),
 28225            new(SykiClaims.Jti, Guid.NewGuid().ToString()),
 28226            new(SykiClaims.UserType, role.BaseType.ToInt().ToString()),
 28227            new(SykiClaims.UserInstitutionId, user.InstitutionId.ToString()),
 28228        };
 29
 28230        var identityClaims = new ClaimsIdentity();
 28231        identityClaims.AddClaims(claims);
 32
 28233        var key = Encoding.ASCII.GetBytes(settings.SecurityKey);
 28234        var expirationTime = settings.ExpirationTimeInMinutes;
 28235        var signingCredentials = new SigningCredentials(
 28236            new SymmetricSecurityKey(key),
 28237            SecurityAlgorithms.HmacSha256Signature
 28238        );
 39
 28240        var tokenDescriptor = new SecurityTokenDescriptor
 28241        {
 28242            Issuer = settings.Issuer,
 28243            Subject = identityClaims,
 28244            Audience = settings.Audience,
 28245            SigningCredentials = signingCredentials,
 28246            Expires = DateTime.UtcNow.AddMinutes(expirationTime),
 28247        };
 48
 28249        var tokenHandler = new JwtSecurityTokenHandler();
 28250        var securityToken = tokenHandler.CreateToken(tokenDescriptor);
 51
 28252        httpCtx.HttpContext.Response.AppendJWTCookie(tokenHandler.WriteToken(securityToken), settings);
 53
 28254        return new SignInOut
 28255        {
 28256            UserId = user.Id,
 28257            InstitutionId = user.InstitutionId,
 28258        };
 28259    }
 60}