using Common.Models.Auth; using Common.Models.Auth.CompanySide; using Common.Models.Auth.UserSide; using Hushian.Application.Constants; using Hushian.Application.Contracts.Persistence; using Hushian.Application.Models; using Hushian.Domain.Entites; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; namespace Hushian.Application.Services { public class AuthService { private readonly JwtSettings _jwtSettings; private readonly IGenericRepository _CompanyRepository; private readonly IGenericRepository _UserRepository; private readonly IGenericRepository _ExperRepository; private readonly VerificationService _verificationService; public AuthService(IOptions jwtSettings, IGenericRepository companyRepository, IGenericRepository userRepository, IGenericRepository experRepository, VerificationService verificationService) { _jwtSettings = jwtSettings.Value; _CompanyRepository = companyRepository; _UserRepository = userRepository; _ExperRepository = experRepository; _verificationService = verificationService; } public async Task> AuthenticationFromCompanySide (AuthRequestFromCompanySide auth) { ResponseBase Response = new(); if (auth.Username.StartsWith("09")) { // in Company Search var Company= await _CompanyRepository.Get().FirstOrDefaultAsync(f=>f.Mobile== auth.Username && f.Password==auth.Password.GetHash()); if (Company==null) { Response.Errors.Add("کاربری یافت نشد"); } else { Response.Success = true; Response.Value = new AuthResponse() { Fullname = Company.FullName, Id = Company.ID, MobileOrUserName = Company.Mobile, Token = new JwtSecurityTokenHandler().WriteToken(await GenerateToken(Company.Mobile, Company.ID)) }; } } else { var exper = await _ExperRepository.Get().FirstOrDefaultAsync(f => f.UserName == auth.Username && f.Password == auth.Password.GetHash()); if (exper == null) { Response.Errors.Add("کاربری یافت نشد"); } else { Response.Success = true; Response.Value = new AuthResponse() { Fullname = exper.FullName, Id = exper.ID, MobileOrUserName = exper.UserName, Token = new JwtSecurityTokenHandler().WriteToken(await GenerateToken(exper.UserName, exper.ID)) }; } } return Response; } public async Task> AuthenticationFromUserSide (AuthRequestFromUserSide auth) { ResponseBase Response = new(); if (!await _UserRepository.Get().AnyAsync(a => a.Mobile == auth.Mobile)) { if (!await _UserRepository.ADDBool(new User() { Mobile = auth.Mobile, FullName = auth.FullName })) { Response.Errors.Add("خطا در کاربری"); } } if (Response.Errors.Count==0) { Response.Value = await _verificationService.GenerateCodeForLoginUser(auth.Mobile); Response.Success = true; } return Response; } public async Task GenerateToken(string UserName, int userId) { var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub,UserName), new Claim(CustomClaimTypes.Uid,userId.ToString()) }; var symmetricSecurityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.Key)); var signingCredentials = new SigningCredentials(symmetricSecurityKey, SecurityAlgorithms.HmacSha256); var jwtSecurityToken = new JwtSecurityToken( issuer: _jwtSettings.Issuer, audience: _jwtSettings.Audience, claims: claims, expires: DateTime.UtcNow.AddMinutes(_jwtSettings.DurationInMinutes), signingCredentials: signingCredentials); //user.Token = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken); //var resultupdateuser = await _userManager.UpdateAsync(user); return jwtSecurityToken; } } }