< Summary

Information
Class: KT.Application.LoginService
Assembly: KT.Modules.Security
File(s): G:\NetProjects\KeepTrack\src\Modules\KT.Modules.Security\Core\Application\LoginService.cs
Line coverage
100%
Covered lines: 16
Uncovered lines: 0
Coverable lines: 16
Total lines: 27
Line coverage: 100%
Branch coverage
100%
Covered branches: 8
Total branches: 8
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%
LoginAsync()100%88100%

File(s)

G:\NetProjects\KeepTrack\src\Modules\KT.Modules.Security\Core\Application\LoginService.cs

#LineLine coverage
 1using KT.Domain.Ports;
 2using KT.Modules.Security.Core.Application.Contracts;
 3using KT.Modules.Security.Presentation.Contracts;
 4using KT.Modules.Security.Presentation.Dto;
 5
 6namespace KT.Application
 7{
 68    internal class LoginService(IUserRepository userRepository, IAccessTokenService accessTokenService) : ILoginService
 9    {
 10        public async Task<TokenResponseDto> LoginAsync(string userName, string password)
 611        {
 612            if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password))
 313                throw new ArgumentException("Not all data was completed");
 314            var userList = await userRepository.SearchUsersAsync(userName, null);
 315            var user = userList.FirstOrDefault();
 316            if (user == null || !BCrypt.Net.BCrypt.Verify(password, user.PasswordHash))
 217                throw new UnauthorizedAccessException("Invalid username or password");
 118            var accessToken = accessTokenService.GenerateAccessToken(user);
 119            var refreshToken = await accessTokenService.GenerateRefreshTokenAsync(user);
 120            return new TokenResponseDto
 121            {
 122                AccessToken = accessToken,
 123                RefreshToken = refreshToken.Token
 124            };
 125        }
 26    }
 27}