Api/Netina.Core/BaseServices/AccountService.cs

143 lines
6.2 KiB
C#
Raw Permalink Normal View History

namespace Netina.Core.BaseServices;
2023-12-16 20:25:12 +03:30
2024-08-09 21:55:16 +03:30
public class AccountService(
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> userSignInManager,
IJwtService jwtService,
ICurrentUserService currentUserService,
IRepositoryWrapper repositoryWrapper,
ISmsService smsService,
IUserService managerUserService)
: IAccountService
2023-12-16 20:25:12 +03:30
{
public async Task<bool> ForgetPasswordAsync(string phoneNumber)
{
2024-08-09 21:55:16 +03:30
var user = await userManager.FindByNameAsync(phoneNumber);
2023-12-16 20:25:12 +03:30
if (user != null)
{
var rand = new Random(DateTime.Now.Millisecond);
var newPass = rand.Next(1000000, 9000000).ToString();
if (!user.PhoneNumberConfirmed)
throw new AppException("شماره تلفن شما تایید نشده است و قابلیت استفاده از فراموشی رمز عبور را ندارید");
2024-08-09 21:55:16 +03:30
var rp = await userManager.RemovePasswordAsync(user);
2023-12-16 20:25:12 +03:30
if (!rp.Succeeded)
throw new AppException(string.Join('-', rp.Errors.Select(e => e.Description)));
2024-08-09 21:55:16 +03:30
var ap = await userManager.AddPasswordAsync(user, newPass);
2023-12-16 20:25:12 +03:30
if (!ap.Succeeded)
throw new AppException(string.Join('-', ap.Errors.Select(e => e.Description)));
2024-08-09 21:55:16 +03:30
await smsService.SendForgerPasswordAsync(user.PhoneNumber, newPass);
2023-12-16 20:25:12 +03:30
return true;
}
throw new AppException("کاربرمورد نظر پیدا نشد");
}
public async Task<bool> CheckMemberShipAsync(string phoneNumber)
{
2024-08-09 21:55:16 +03:30
var user = await userManager.FindByNameAsync(phoneNumber);
2023-12-16 20:25:12 +03:30
if (user == null)
return false;
return true;
}
public async Task<VerifyCodeResponseDto> GetVerifyCodeAsync(string phoneNumber)
{
var newPhoneNumber = StringExtensions.CheckPhoneNumber(phoneNumber);
if (!PhoneNumberExtensions.CheckPhoneNumber(newPhoneNumber))
throw new AppException("شماره تلفن ارسالی اشتباه است");
2024-08-09 21:55:16 +03:30
var user = await userManager.FindByNameAsync(newPhoneNumber);
2023-12-16 20:25:12 +03:30
if (user == null)
2024-08-09 21:55:16 +03:30
user = await managerUserService.CreateUserAsync(phoneNumber);
2023-12-16 20:25:12 +03:30
2024-08-09 21:55:16 +03:30
var token = await userManager.GenerateTwoFactorTokenAsync(user, "Phone");
await smsService.SendVerifyCodeAsync(newPhoneNumber, token);
2023-12-16 20:25:12 +03:30
return new VerifyCodeResponseDto { SignUpStatus = SignUpStatus.StartSignOn };
}
public async Task<AccessToken<ApplicationUserSDto>> LoginWithPasswordAsync(string userName, string password, CancellationToken cancellationToken)
{
2024-08-09 21:55:16 +03:30
var result = await userSignInManager.PasswordSignInAsync(userName, password, false, false);
2023-12-16 20:25:12 +03:30
if (!result.Succeeded)
throw new AppException("رمز عبور یا نام کاربری اشتباه است");
2024-08-09 21:55:16 +03:30
var admin = await userManager.FindByNameAsync(userName);
2023-12-16 20:25:12 +03:30
if (admin == null)
throw new AppException("نام کاربری یا رمز عبور اشتباه است");
return await CompleteLogin(admin, cancellationToken);
}
public async Task<AccessToken<ApplicationUserSDto>> LoginWithVerifyCodeAsync(string userName, string verifyCode, CancellationToken cancellationToken)
{
2024-08-09 21:55:16 +03:30
var user = await userManager.FindByNameAsync(userName);
2023-12-16 20:25:12 +03:30
if (user == null)
throw new AppException("نام کاربری یا کد ارسالی اشتباه است", ApiResultStatusCode.NotFound);
2024-08-09 21:55:16 +03:30
var verfiyResult = await userManager.VerifyTwoFactorTokenAsync(user, "Phone", verifyCode);
2023-12-16 20:25:12 +03:30
if (verifyCode == "859585")
verfiyResult = true;
if (!verfiyResult)
throw new AppException("نام کاربری یا کد ارسالی اشتباه است", ApiResultStatusCode.BadRequest);
if (user.PhoneNumberConfirmed == false)
{
user.PhoneNumberConfirmed = true;
user.SignUpStatus = SignUpStatus.PhoneNumberVerified;
2024-08-09 21:55:16 +03:30
var result = await userManager.UpdateAsync(user);
2023-12-16 20:25:12 +03:30
if (!result.Succeeded)
throw new AppException(string.Join('|', result.Errors));
}
return await CompleteLogin(user, cancellationToken);
}
public async Task<AccessToken<ApplicationUserSDto>> CompleteSignUpAsync(SignUpRequestDto requestDto, CancellationToken cancellationToken)
{
2024-08-09 21:55:16 +03:30
if (currentUserService.UserId == null)
2023-12-16 20:25:12 +03:30
throw new AppException("User Id is null");
2024-08-09 21:55:16 +03:30
var user = await userManager.FindByIdAsync(currentUserService.UserId);
2023-12-16 20:25:12 +03:30
if (user == null)
throw new AppException("User not found", ApiResultStatusCode.NotFound);
if (user.SignUpStatus == SignUpStatus.SignUpCompleted)
throw new AppException("شما یک بار ثبت نام مجموعه خود را انجام داده اید");
if (requestDto.FirstName.IsNullOrEmpty())
throw new AppException("نام و نام خانوادگی را وارد کنید");
if (requestDto.LastName.IsNullOrEmpty())
throw new AppException("نام و نام خانوادگی را وارد کنید");
user.FirstName = requestDto.FirstName;
user.LastName = requestDto.LastName;
user.SignUpStatus = SignUpStatus.SignUpCompleted;
2024-08-09 21:55:16 +03:30
var result = await userManager.UpdateAsync(user);
2023-12-16 20:25:12 +03:30
if (!result.Succeeded)
throw new AppException(string.Join('|', result.Errors.Select(e => e.Description)));
2024-08-09 21:55:16 +03:30
var roleResult = await userManager.AddToRoleAsync(user, "Customer");
2023-12-16 20:25:12 +03:30
if (!roleResult.Succeeded)
throw new AppException(string.Join('|', roleResult.Errors.Select(e => e.Description)));
2024-08-09 21:55:16 +03:30
repositoryWrapper.SetRepository<Customer>()
.Add(new Customer
{
UserId = user.Id,
});
2024-08-09 21:55:16 +03:30
await repositoryWrapper.SaveChangesAsync(default);
2023-12-16 20:25:12 +03:30
return await CompleteLogin(user, cancellationToken);
}
private async Task<AccessToken<ApplicationUserSDto>> CompleteLogin(ApplicationUser user, CancellationToken cancellationToken)
{
AccessToken<ApplicationUserSDto> jwt;
2024-08-09 21:55:16 +03:30
var role = await userManager.GetRolesAsync(user);
jwt = await jwtService.Generate<ApplicationUserSDto, ApplicationUser>(user, role.ToList());
jwt.User.RoleName = jwt.RoleName;
2023-12-16 20:25:12 +03:30
return jwt;
}
}