Api-PWA/DocuMed.Core/EntityServices/UserService.cs

226 lines
8.7 KiB
C#
Raw Permalink Normal View History

using DocuMed.Domain.Entities.Staffs;
namespace DocuMed.Core.EntityServices;
2023-10-19 21:28:09 +03:30
2024-09-28 12:34:36 +03:30
public class UserService(
ICurrentUserService currentUserService,
UserManager<ApplicationUser> userManager,
RoleManager<ApplicationRole> roleManager,
IRepositoryWrapper repositoryWrapper)
: IUserService
2023-10-19 21:28:09 +03:30
{
2024-09-28 12:34:36 +03:30
private readonly IRepositoryWrapper _repositoryWrapper = repositoryWrapper;
2023-10-19 21:28:09 +03:30
public async Task<List<ApplicationUserSDto>> GetUsersAsync(int page = 0, CancellationToken cancellationToken = default)
{
2024-09-28 12:34:36 +03:30
var users = await userManager.Users.Select(ApplicationUserMapper.ProjectToSDto).ToListAsync(cancellationToken);
2023-10-19 21:28:09 +03:30
return users;
}
public async Task<ApplicationUserSDto> GetUserAsync(Guid userId)
2024-09-28 12:34:36 +03:30
=> (await userManager.FindByIdAsync(userId.ToString())).AdaptToSDto();
2023-10-19 21:28:09 +03:30
public async Task<ApplicationUser> CreateUserAsync(string phoneNumber)
{
var user = new ApplicationUser
{
UserName = phoneNumber,
PhoneNumber = phoneNumber,
SignUpStatus = SignUpStatus.StartSignUp
};
2024-09-28 12:34:36 +03:30
var result = await userManager.CreateAsync(user);
2023-10-19 21:28:09 +03:30
if (!result.Succeeded)
throw new AppException(string.Join('|', result.Errors));
return user;
}
public async Task<ApplicationUser> CreateUserAsync(UserActionRequestDto request, CancellationToken cancellationToken)
{
var user = new ApplicationUser
{
UserName = request.PhoneNumber,
PhoneNumber = request.PhoneNumber,
FirstName = request.FirstName,
LastName = request.LastName,
NationalId = request.NationalId,
BirthDate = request.BirthDate,
Gender = request.Gender,
SignUpStatus = SignUpStatus.PhoneNumberVerified,
2023-10-19 21:28:09 +03:30
};
if (!request.Password.IsNullOrEmpty())
{
2024-09-28 12:34:36 +03:30
var result = await userManager.CreateAsync(user, request.Password);
2023-10-19 21:28:09 +03:30
if (!result.Succeeded)
throw new AppException(string.Join('|', result.Errors));
}
else
{
2024-09-28 12:34:36 +03:30
var result = await userManager.CreateAsync(user);
2023-10-19 21:28:09 +03:30
if (!result.Succeeded)
throw new AppException(string.Join('|', result.Errors));
}
2024-09-28 12:34:36 +03:30
var roleResult = await userManager.AddToRoleAsync(user, RoleNames.Student);
2023-10-19 21:28:09 +03:30
if (!roleResult.Succeeded)
throw new AppException(string.Join('|', roleResult.Errors));
2023-10-22 15:51:11 +03:30
2023-10-19 21:28:09 +03:30
return user;
}
public async Task<bool> EditUserAsync(UserActionRequestDto request, CancellationToken cancellationToken)
{
2024-09-28 12:34:36 +03:30
if (currentUserService.UserId == null)
2023-10-19 21:28:09 +03:30
throw new AppException("Wrong authorize token , UserId needed");
2024-09-28 12:34:36 +03:30
var user = await userManager.FindByIdAsync(currentUserService.UserId);
2023-10-19 21:28:09 +03:30
if (user == null)
throw new AppException("User not found", ApiResultStatusCode.NotFound);
user.LastName = request.LastName;
user.FirstName = request.FirstName;
user.UserName = request.PhoneNumber;
user.PhoneNumber = request.PhoneNumber;
user.FirstName = request.FirstName;
user.LastName = request.LastName;
user.NationalId = request.NationalId;
user.BirthDate = request.BirthDate;
user.Gender = request.Gender;
switch (request.ProfileType)
{
case ProfileType.Student:
var student = await repositoryWrapper.SetRepository<Student>().TableNoTracking
.FirstOrDefaultAsync(s => s.UserId == user.Id, cancellationToken);
if (student == null)
throw new AppException("Student not found", ApiResultStatusCode.NotFound);
student.SetSection(request.SectionId);
repositoryWrapper.SetRepository<Student>().Update(student);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
break;
case ProfileType.Patient:
break;
default:
throw new ArgumentOutOfRangeException();
}
2024-09-28 12:34:36 +03:30
var result = await userManager.UpdateAsync(user);
2023-10-19 21:28:09 +03:30
if (!result.Succeeded)
throw new AppException(string.Join('|', result.Errors));
if (!request.Password.IsNullOrEmpty())
{
2024-09-28 12:34:36 +03:30
if (await userManager.HasPasswordAsync(user))
await userManager.RemovePasswordAsync(user);
2023-10-19 21:28:09 +03:30
2024-09-28 12:34:36 +03:30
var addPassResult = await userManager.AddPasswordAsync(user, request.Password);
2023-10-19 21:28:09 +03:30
if (!addPassResult.Succeeded)
throw new AppException(string.Join('|', addPassResult.Errors));
}
return true;
}
public async Task<bool> RemoveUserAsync(Guid userId, CancellationToken cancellationToken)
{
2024-09-28 12:34:36 +03:30
var user = await userManager.FindByIdAsync(userId.ToString());
2023-10-19 21:28:09 +03:30
if (user == null)
throw new AppException("User not found", ApiResultStatusCode.NotFound);
2024-09-28 12:34:36 +03:30
var removeResult = await userManager.DeleteAsync(user);
2023-10-19 21:28:09 +03:30
if (!removeResult.Succeeded)
throw new AppException(string.Join('|', removeResult.Errors));
return true;
}
public async Task<List<ApplicationRole>> GetRolesAsync(int page = 0, CancellationToken cancellationToken = default)
{
2024-09-28 12:34:36 +03:30
var roles = await roleManager.Roles
2023-10-19 21:28:09 +03:30
.Skip(page * 15)
.Take(15)
.ToListAsync(cancellationToken);
return roles;
}
public async Task<RoleActionRequestDto> GetRoleAsync(Guid roleId)
{
2024-09-28 12:34:36 +03:30
var role = (await roleManager.FindByIdAsync(roleId.ToString()));
2023-10-19 21:28:09 +03:30
if (role == null)
throw new AppException("نقش پیدا نشد", ApiResultStatusCode.NotFound);
var roleDto = role.Adapt<RoleActionRequestDto>();
2024-09-28 12:34:36 +03:30
roleDto.Permissions = (await roleManager.GetClaimsAsync(role))
2023-10-19 21:28:09 +03:30
.Where(c => c.Type == CustomClaimType.Permission)
.Select(c => c.Value)
.ToList();
return roleDto;
}
public async Task<ApplicationRole> CreateRoleAsync(RoleActionRequestDto request)
{
if (request.EnglishName.IsNullOrEmpty())
throw new AppException("لطفا نام انگلیسی را وارد کنید");
var applicationRole = new ApplicationRole
{
EnglishName = request.EnglishName,
PersianName = request.PersianName,
Description = request.Description,
Name = $"{request.EnglishName}"
};
2024-09-28 12:34:36 +03:30
var createRoleResult = await roleManager.CreateAsync(applicationRole);
2023-10-19 21:28:09 +03:30
if (!createRoleResult.Succeeded)
throw new AppException(string.Join('|', createRoleResult.Errors));
foreach (var claim in request.Permissions)
2024-09-28 12:34:36 +03:30
await roleManager.AddClaimAsync(applicationRole, new Claim(CustomClaimType.Permission, claim));
2023-10-19 21:28:09 +03:30
return applicationRole;
}
public async Task<bool> EditRoleAsync(RoleActionRequestDto request)
{
if (request.EnglishName.IsNullOrEmpty())
throw new AppException("لطفا نام انگلیسی را وارد کنید");
2024-09-28 12:34:36 +03:30
var applicationRole = await roleManager.FindByIdAsync(request.RoleId.ToString());
2023-10-19 21:28:09 +03:30
if (applicationRole == null)
throw new AppException("نقش پیدا نشد");
applicationRole.EnglishName = request.EnglishName;
applicationRole.PersianName = request.PersianName;
applicationRole.Description = request.Description;
applicationRole.Name = $"{request.EnglishName}";
2024-09-28 12:34:36 +03:30
var createRoleResult = await roleManager.UpdateAsync(applicationRole);
2023-10-19 21:28:09 +03:30
if (!createRoleResult.Succeeded)
throw new AppException(string.Join('|', createRoleResult.Errors));
2024-09-28 12:34:36 +03:30
var roleClaims = (await roleManager.GetClaimsAsync(applicationRole)).Where(c => c.Type == CustomClaimType.Permission).ToList();
2023-10-19 21:28:09 +03:30
foreach (var roleClaim in roleClaims.ToList())
{
if (request.Permissions.Contains(roleClaim.Value))
{
roleClaims.Remove(roleClaim);
request.Permissions.Remove(roleClaim.Value);
}
}
foreach (var claim in request.Permissions)
2024-09-28 12:34:36 +03:30
await roleManager.AddClaimAsync(applicationRole, new Claim(CustomClaimType.Permission, claim));
2023-10-19 21:28:09 +03:30
foreach (var claim in roleClaims)
2024-09-28 12:34:36 +03:30
await roleManager.RemoveClaimAsync(applicationRole, claim);
2023-10-19 21:28:09 +03:30
return true;
}
public async Task<bool> RemoveRoleAsync(Guid roleId)
{
2024-09-28 12:34:36 +03:30
var applicationRole = await roleManager.FindByIdAsync(roleId.ToString());
2023-10-19 21:28:09 +03:30
if (applicationRole == null)
throw new AppException("User not found", ApiResultStatusCode.NotFound);
2024-09-28 12:34:36 +03:30
var removeResult = await roleManager.DeleteAsync(applicationRole);
2023-10-19 21:28:09 +03:30
if (!removeResult.Succeeded)
throw new AppException(string.Join('|', removeResult.Errors));
return true;
}
}