Files
Hushian/Hushian.Application/Services/AuthService.cs

150 lines
5.8 KiB
C#
Raw Normal View History

2025-06-29 15:29:51 +03:30
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;
2025-07-03 16:05:44 +03:30
using Hushian.Application.Validation;
2025-06-29 15:29:51 +03:30
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<Company> _CompanyRepository;
private readonly IGenericRepository<User> _UserRepository;
private readonly IGenericRepository<Exper> _ExperRepository;
private readonly VerificationService _verificationService;
2025-07-07 22:04:07 +03:30
public AuthService(IOptions<JwtSettings> jwtSettings
, IGenericRepository<Company> companyRepository
, IGenericRepository<User> userRepository
, IGenericRepository<Exper> experRepository
, VerificationService verificationService)
2025-06-29 15:29:51 +03:30
{
_jwtSettings = jwtSettings.Value;
2025-06-29 16:14:42 +03:30
_CompanyRepository = companyRepository;
_UserRepository = userRepository;
_ExperRepository = experRepository;
_verificationService = verificationService;
2025-06-29 15:29:51 +03:30
}
public async Task<ResponseBase<AuthResponse>> AuthenticationFromCompanySide
(AuthRequestFromCompanySide auth)
{
ResponseBase<AuthResponse> Response = new();
2025-07-03 16:05:44 +03:30
if (!FixedValidation.CheckUsername(auth.Username))
2025-06-29 16:14:42 +03:30
{
2025-07-03 16:05:44 +03:30
Response.Errors.Add("نام کاربری اشتباه است");
2025-06-29 16:14:42 +03:30
}
else
{
2025-07-03 16:05:44 +03:30
if (auth.Username.StartsWith("09"))
2025-06-29 16:14:42 +03:30
{
2025-07-03 16:05:44 +03:30
// 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))
};
}
2025-06-29 16:14:42 +03:30
}
else
{
2025-07-03 16:05:44 +03:30
var exper = await _ExperRepository.Get().FirstOrDefaultAsync(f => f.UserName == auth.Username && f.Password == auth.Password.GetHash());
if (exper == null)
{
Response.Errors.Add("کاربری یافت نشد");
}
else
2025-06-29 16:14:42 +03:30
{
2025-07-03 16:05:44 +03:30
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))
};
}
2025-06-29 16:14:42 +03:30
}
}
2025-07-03 16:05:44 +03:30
2025-06-29 15:29:51 +03:30
return Response;
}
public async Task<ResponseBase<int>> AuthenticationFromUserSide
(AuthRequestFromUserSide auth)
{
ResponseBase<int> Response = new();
2025-07-03 16:05:44 +03:30
if (!FixedValidation.CheckUsername(auth.Mobile))
2025-06-29 15:29:51 +03:30
{
2025-07-03 16:05:44 +03:30
Response.Errors.Add("نام کاربری اشتباه است");
}
else
{
if (!await _UserRepository.Get().AnyAsync(a => a.Mobile == auth.Mobile))
2025-06-29 15:29:51 +03:30
{
2025-07-03 16:05:44 +03:30
if (!await _UserRepository.ADDBool(new User() { Mobile = auth.Mobile, FullName = auth.FullName }))
{
Response.Errors.Add("خطا در کاربری");
}
2025-06-29 15:29:51 +03:30
}
2025-07-03 16:05:44 +03:30
if (Response.Errors.Count == 0)
{
Response.Value = await _verificationService.GenerateCodeForLoginUser(auth.Mobile);
Response.Success = true;
}
2025-06-29 15:29:51 +03:30
}
2025-07-03 16:05:44 +03:30
2025-06-29 15:29:51 +03:30
return Response;
}
public async Task<JwtSecurityToken> 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;
}
}
}