Refactor services and add MediatR for medical histories

- Updated MedicalHistoryController to use MediatR for commands/queries
- Refactored methods in MedicalHistoryController to use expression-bodied members
- Added HospitalId property to CurrentUserService
- Removed UniversityId claims handling from JwtService
- Updated AccountService to handle Student entities with UniversityId and SectionId
- Removed IMedicalHistoryService interface and its implementation
- Removed UniversityId and SectionId handling from UserService
- Added SectionId property to SignUpRequestDto
- Refactored MedicalHistory entity to remove personal information properties
- Added CreateMedicalHistoryCommand, UpdateMedicalHistoryCommand, and DeleteMedicalHistoryCommand
- Added command handlers for medical history commands
master
Amir Hossein Khademi 2024-12-27 09:53:55 +03:30
parent ae1e8859c0
commit b3ca3c51ea
14 changed files with 177 additions and 152 deletions

View File

@ -1,4 +1,6 @@
using DocuMed.Domain.Entities.MedicalHistory; using DocuMed.Domain.CommandQueries.Commands;
using DocuMed.Domain.Entities.MedicalHistory;
using MediatR;
namespace DocuMed.Api.Controllers; namespace DocuMed.Api.Controllers;
public class MedicalHistoryController : ICarterModule public class MedicalHistoryController : ICarterModule
@ -34,41 +36,25 @@ public class MedicalHistoryController : ICarterModule
// GET:Get All Entity // GET:Get All Entity
public virtual async Task<IResult> GetAllByFilterAsync([FromQuery]DayQueryFilter dayQuery,[FromQuery] int page, IMedicalHistoryRepository repository, CancellationToken cancellationToken) public virtual async Task<IResult> GetAllByFilterAsync([FromQuery]DayQueryFilter dayQuery,[FromQuery] int page, IMedicalHistoryRepository repository, CancellationToken cancellationToken)
{ => TypedResults.Ok(await repository.GetMedicalHistoriesByFilterAsync(dayQuery, page, cancellationToken));
return TypedResults.Ok(await repository.GetMedicalHistoriesByFilterAsync(dayQuery , page, cancellationToken));
}
// GET:Get All Entity // GET:Get All Entity
public virtual async Task<IResult> GetAllAsync([FromQuery] int page, IMedicalHistoryRepository repository, CancellationToken cancellationToken) public virtual async Task<IResult> GetAllAsync([FromQuery] int page, IMedicalHistoryRepository repository, CancellationToken cancellationToken)
{ => TypedResults.Ok(await repository.GetMedicalHistoriesAsync(page, cancellationToken));
return TypedResults.Ok(await repository.GetMedicalHistoriesAsync(page, cancellationToken));
}
// GET:Get An Entity By Id // GET:Get An Entity By Id
public async Task<IResult> GetAsync(Guid id, IMedicalHistoryRepository repository, CancellationToken cancellationToken) public async Task<IResult> GetAsync(Guid id, IMedicalHistoryRepository repository, CancellationToken cancellationToken)
{ => TypedResults.Ok(await repository.GetMedicalHistoryAsync(id, cancellationToken));
return TypedResults.Ok(await repository.GetMedicalHistoryAsync(id, cancellationToken));
}
// POST:Add New Entity // POST:Add New Entity
public virtual async Task<IResult> Post([FromBody] MedicalHistoryLDto dto, IMedicalHistoryService service, ICurrentUserService currentUserService, CancellationToken cancellationToken) public virtual async Task<IResult> Post([FromBody] CreateMedicalHistoryCommand dto, IMediator service, ICurrentUserService currentUserService, CancellationToken cancellationToken)
{ => TypedResults.Ok(await service.Send(dto, cancellationToken));
return TypedResults.Ok(await service.AddAsync(dto, cancellationToken));
}
// PUT:Update Entity // PUT:Update Entity
public virtual async Task<IResult> Put([FromBody] MedicalHistoryLDto dto, IMedicalHistoryService service, ICurrentUserService currentUserService, CancellationToken cancellationToken) public virtual async Task<IResult> Put([FromBody] UpdateMedicalHistoryCommand dto, IMediator service, ICurrentUserService currentUserService, CancellationToken cancellationToken)
{ => TypedResults.Ok(await service.Send(dto, cancellationToken));
return TypedResults.Ok(await service.EditAsync(dto, cancellationToken));
}
// DELETE:Delete Entity // DELETE:Delete Entity
public virtual async Task<IResult> Delete(Guid id, IRepositoryWrapper repositoryWrapper, CancellationToken cancellationToken) public virtual async Task<IResult> Delete(Guid id, IMediator mediator, CancellationToken cancellationToken)
{ => TypedResults.Ok(await mediator.Send(new DeleteMedicalHistoryCommand(id), cancellationToken));
var ent = await repositoryWrapper.SetRepository<MedicalHistory>().GetByIdAsync(cancellationToken, id);
repositoryWrapper.SetRepository<MedicalHistory>().Delete(ent);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
return TypedResults.Ok();
}
} }

View File

@ -6,4 +6,5 @@ public class CurrentUserService(IHttpContextAccessor httpContextAccessor) : ICur
public string? RoleName => httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.Role); public string? RoleName => httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.Role);
public string? UserName => httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.Name); public string? UserName => httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.Name);
public string? UniversityId => httpContextAccessor.HttpContext?.User?.FindFirstValue("UniversityId"); public string? UniversityId => httpContextAccessor.HttpContext?.User?.FindFirstValue("UniversityId");
public string? HospitalId => httpContextAccessor.HttpContext?.User?.FindFirstValue("HospitalId");
} }

View File

@ -82,8 +82,6 @@ public class JwtService(
claims.Add(new Claim(ClaimTypes.NameIdentifier, baseUser.Id.ToString())); claims.Add(new Claim(ClaimTypes.NameIdentifier, baseUser.Id.ToString()));
if (baseUser.Email != null) if (baseUser.Email != null)
claims.Add(new Claim(ClaimTypes.Email, baseUser.Email)); claims.Add(new Claim(ClaimTypes.Email, baseUser.Email));
if(baseUser.UniversityId != null)
claims.Add(new Claim("UniversityId",baseUser.UniversityId.ToString() ?? string.Empty ));
claims.Add(new Claim(ClaimTypes.Gender, baseUser.Gender == 0 ? "Female" : "Mail")); claims.Add(new Claim(ClaimTypes.Gender, baseUser.Gender == 0 ? "Female" : "Mail"));
return claims; return claims;
@ -99,8 +97,6 @@ public class JwtService(
claims.Add(new Claim(ClaimTypes.Role, applicationRole.EnglishName)); claims.Add(new Claim(ClaimTypes.Role, applicationRole.EnglishName));
if (baseUser.Email != null) if (baseUser.Email != null)
claims.Add(new Claim(ClaimTypes.Email, baseUser.Email)); claims.Add(new Claim(ClaimTypes.Email, baseUser.Email));
if (baseUser.UniversityId != null)
claims.Add(new Claim("UniversityId", baseUser.UniversityId.ToString() ?? string.Empty));
claims.AddRange(roleClaims); claims.AddRange(roleClaims);
claims.Add(new Claim("JwtID", jwtId)); claims.Add(new Claim("JwtID", jwtId));
claims.Add(new Claim(ClaimTypes.Gender, baseUser.Gender == 0 ? "Female" : "Mail")); claims.Add(new Claim(ClaimTypes.Gender, baseUser.Gender == 0 ? "Female" : "Mail"));

View File

@ -1,4 +1,4 @@
using DocuMed.Domain.Entities.City; using DocuMed.Domain.Entities.Staffs;
using Section = DocuMed.Domain.Entities.Hospitals.Section; using Section = DocuMed.Domain.Entities.Hospitals.Section;
namespace DocuMed.Core.CoreServices; namespace DocuMed.Core.CoreServices;
@ -10,8 +10,7 @@ public class AccountService(
ICurrentUserService currentUserService, ICurrentUserService currentUserService,
IUserService userService, IUserService userService,
ISmsService smsService, ISmsService smsService,
IRepositoryWrapper repositoryWrapper) IRepositoryWrapper repositoryWrapper) : IAccountService
: IAccountService
{ {
public async Task<bool> ForgetPasswordAsync(string phoneNumber) public async Task<bool> ForgetPasswordAsync(string phoneNumber)
{ {
@ -109,7 +108,17 @@ public class AccountService(
user.FirstName = requestDto.FirstName; user.FirstName = requestDto.FirstName;
user.LastName = requestDto.LastName; user.LastName = requestDto.LastName;
user.SignUpStatus = SignUpStatus.SignUpCompleted; user.SignUpStatus = SignUpStatus.SignUpCompleted;
user.UniversityId = requestDto.UniversityId;
var student = await repositoryWrapper.SetRepository<Student>()
.TableNoTracking
.FirstOrDefaultAsync(f => f.UserId == user.Id, cancellationToken);
if (student == null)
{
student = Student.Create(requestDto.UniversityId,requestDto.SectionId,user.Id);
repositoryWrapper.SetRepository<Student>().Add(student);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
}
var result = await userManager.UpdateAsync(user); var result = await userManager.UpdateAsync(user);
if (!result.Succeeded) if (!result.Succeeded)
throw new AppException(string.Join('|', result.Errors)); throw new AppException(string.Join('|', result.Errors));
@ -121,11 +130,13 @@ public class AccountService(
private async Task<AccessToken<ApplicationUserSDto>> CompleteLogin(ApplicationUser user, CancellationToken cancellationToken) private async Task<AccessToken<ApplicationUserSDto>> CompleteLogin(ApplicationUser user, CancellationToken cancellationToken)
{ {
var token = await jwtService.Generate<ApplicationUserSDto, ApplicationUser>(user); var token = await jwtService.Generate<ApplicationUserSDto, ApplicationUser>(user);
var student = await repositoryWrapper.SetRepository<Student>().TableNoTracking
.FirstOrDefaultAsync(s => s.UserId == user.Id, cancellationToken);
if (token.User.SectionId != Guid.Empty) if (student != null)
{ {
var section = await repositoryWrapper.SetRepository<Section>().TableNoTracking var section = await repositoryWrapper.SetRepository<Section>().TableNoTracking
.FirstOrDefaultAsync(s => s.Id == user.SectionId, cancellationToken); .FirstOrDefaultAsync(s => s.Id == student.SectionId, cancellationToken);
if (section != null) if (section != null)
{ {
token.User.SectionName = section.Name; token.User.SectionName = section.Name;

View File

@ -1,8 +0,0 @@
namespace DocuMed.Core.EntityServices.Abstracts;
public interface IMedicalHistoryService : IScopedDependency
{
public Task<bool> EditAsync(MedicalHistoryLDto template, CancellationToken cancellationToken);
public Task<bool> AddAsync(MedicalHistoryLDto template, CancellationToken cancellationToken);
}

View File

@ -1,70 +0,0 @@
namespace DocuMed.Core.EntityServices;
public class MedicalHistoryService(
IRepositoryWrapper repositoryWrapper,
ICurrentUserService currentUserService,
IMedicalHistoryRepository medicalHistoryRepository)
: IMedicalHistoryService
{
public async Task<bool> EditAsync(MedicalHistoryLDto template, CancellationToken cancellationToken)
{
if (!Guid.TryParse(currentUserService.UserId, out Guid userId))
throw new AppException("دسترسی غیرمجاز", ApiResultStatusCode.UnAuthorized);
if (template.Id == Guid.Empty)
throw new AppException("شرح حال پیدا نشد", ApiResultStatusCode.NotFound);
var ent = MedicalHistory.Create(template.ChiefComplaint, template.SectionId, template.FirstName,
template.LastName, template.FatherName, template.NationalId, template.Age, template.BirthDate,
template.PresentIllnessDetail, template.PastDiseasesHistoryDetail, template.PastSurgeryHistoryDetail,
template.FamilyHistoryDetail, template.AllergyDetail, template.DrugHistoryDetail,
template.AddictionHistoryDetail, template.SystemReviewDetail, template.VitalSignDetail, template.GeneralAppearanceDetail,
template.SystolicBloodPressure, template.DiastolicBloodPressure, template.PulseRate, template.SPO2,
template.Temperature, template.ApplicationUserId, template.MedicalHistoryTemplateId);
ent.Id = template.Id;
ent.CreatedAt = template.CreatedAt;
foreach (var answer in template.Answers.Where(a=>a.Id == Guid.Empty))
ent.AddAnswer(answer.Answer, answer.Question, answer.Part, answer.QuestionType);
foreach (var answer in template.Answers.Where(a => a.Id != Guid.Empty))
{
var dbAnswer = await repositoryWrapper.SetRepository<MedicalHistoryAnswer>().TableNoTracking
.FirstOrDefaultAsync(a => a.Id == answer.Id, cancellationToken);
if (dbAnswer != null && dbAnswer.Answer != answer.Answer && answer.Answer != null)
{
dbAnswer = MedicalHistoryAnswer.Create(answer.Answer, answer.Question, answer.Part, answer.QuestionType,
dbAnswer.MedicalHistoryId);
dbAnswer.Id = answer.Id;
repositoryWrapper.SetRepository<MedicalHistoryAnswer>().Update(dbAnswer);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
}
}
medicalHistoryRepository.Update(ent);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
return true;
}
public async Task<bool> AddAsync(MedicalHistoryLDto template, CancellationToken cancellationToken)
{
if (!Guid.TryParse(currentUserService.UserId, out Guid userId))
throw new AppException("دسترسی غیرمجاز", ApiResultStatusCode.UnAuthorized);
var ent = MedicalHistory.Create(template.ChiefComplaint, template.SectionId, template.FirstName,
template.LastName, template.FatherName, template.NationalId, template.Age, template.BirthDate,
template.PresentIllnessDetail, template.PastDiseasesHistoryDetail, template.PastSurgeryHistoryDetail,
template.FamilyHistoryDetail, template.AllergyDetail, template.DrugHistoryDetail,
template.AddictionHistoryDetail, template.SystemReviewDetail, template.VitalSignDetail, template.GeneralAppearanceDetail,
template.SystolicBloodPressure, template.DiastolicBloodPressure, template.PulseRate, template.SPO2,
template.Temperature, userId,template.MedicalHistoryTemplateId);
foreach (var answer in template.Answers)
ent.AddAnswer(answer.Answer, answer.Question, answer.Part, answer.QuestionType);
medicalHistoryRepository.Add(ent);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
return true;
}
}

View File

@ -45,8 +45,7 @@ public class UserService(
NationalId = request.NationalId, NationalId = request.NationalId,
BirthDate = request.BirthDate, BirthDate = request.BirthDate,
Gender = request.Gender, Gender = request.Gender,
SignUpStatus = SignUpStatus.SignUpCompleted, SignUpStatus = SignUpStatus.PhoneNumberVerified,
UniversityId = request.UniversityId
}; };
if (!request.Password.IsNullOrEmpty()) if (!request.Password.IsNullOrEmpty())
{ {
@ -80,16 +79,11 @@ public class UserService(
user.FirstName = request.FirstName; user.FirstName = request.FirstName;
user.UserName = request.PhoneNumber; user.UserName = request.PhoneNumber;
user.PhoneNumber = request.PhoneNumber; user.PhoneNumber = request.PhoneNumber;
user.StudentId = request.StudentId;
user.FirstName = request.FirstName; user.FirstName = request.FirstName;
user.LastName = request.LastName; user.LastName = request.LastName;
user.NationalId = request.NationalId; user.NationalId = request.NationalId;
user.BirthDate = request.BirthDate; user.BirthDate = request.BirthDate;
user.Gender = request.Gender; user.Gender = request.Gender;
if (request.UniversityId != Guid.Empty)
user.UniversityId = request.UniversityId;
if (request.SectionId != Guid.Empty)
user.SectionId = request.SectionId;
var result = await userManager.UpdateAsync(user); var result = await userManager.UpdateAsync(user);
if (!result.Succeeded) if (!result.Succeeded)

View File

@ -0,0 +1,58 @@
namespace DocuMed.Domain.CommandQueries.Commands;
public sealed record CreateMedicalHistoryCommand(
string ChiefComplaint,
Guid SectionId,
string FirstName,
string LastName,
string FatherName,
string NationalId,
DateTime BirthDate,
string PresentIllnessDetail,
string PastDiseasesHistoryDetail,
string PastSurgeryHistoryDetail,
string FamilyHistoryDetail,
string AllergyDetail,
string DrugHistoryDetail,
string AddictionHistoryDetail,
string SystemReviewDetail,
string VitalSignDetail,
string GeneralAppearanceDetail,
double SystolicBloodPressure,
double DiastolicBloodPressure,
double PulseRate,
double SPO2,
double Temperature,
Guid ApplicationUserId,
Guid MedicalHistoryTemplateId,
List<MedicalHistoryAnswerSDto> Answers) : IRequest<Guid>;
public sealed record UpdateMedicalHistoryCommand(
Guid Id,
string ChiefComplaint,
Guid SectionId,
string FirstName,
string LastName,
string FatherName,
string NationalId,
DateTime BirthDate,
string PresentIllnessDetail,
string PastDiseasesHistoryDetail,
string PastSurgeryHistoryDetail,
string FamilyHistoryDetail,
string AllergyDetail,
string DrugHistoryDetail,
string AddictionHistoryDetail,
string SystemReviewDetail,
string VitalSignDetail,
string GeneralAppearanceDetail,
double SystolicBloodPressure,
double DiastolicBloodPressure,
double PulseRate,
double SPO2,
double Temperature,
Guid ApplicationUserId,
Guid MedicalHistoryTemplateId,
List<MedicalHistoryAnswerSDto> Answers) : IRequest<Guid>;
public sealed record DeleteMedicalHistoryCommand(Guid Id) : IRequest<Guid>;

View File

@ -5,5 +5,6 @@ public class SignUpRequestDto
public string FirstName { get; set; } = string.Empty; public string FirstName { get; set; } = string.Empty;
public string LastName { get; set; } = string.Empty; public string LastName { get; set; } = string.Empty;
public Guid UniversityId { get; set; } public Guid UniversityId { get; set; }
public Guid SectionId { get; set; }
public Guid CityId { get; set; } public Guid CityId { get; set; }
} }

View File

@ -26,12 +26,6 @@ public partial class MedicalHistory
public static MedicalHistory Create( public static MedicalHistory Create(
string chiefComplaint, string chiefComplaint,
Guid sectionId, Guid sectionId,
string firstName,
string lastName,
string fatherName,
string nationalId,
int age,
DateTime birthDate,
string presentIllnessDetail, string presentIllnessDetail,
string pastDiseasesHistoryDetail, string pastDiseasesHistoryDetail,
string pastSurgeryHistoryDetail, string pastSurgeryHistoryDetail,
@ -63,12 +57,6 @@ public partial class MedicalHistory
generalAppearanceDetail, generalAppearanceDetail,
chiefComplaint, chiefComplaint,
sectionId, sectionId,
firstName,
lastName,
fatherName,
nationalId,
age,
birthDate,
systolicBloodPressure, systolicBloodPressure,
diastolicBloodPressure, diastolicBloodPressure,
pulseRate, pulseRate,

View File

@ -25,12 +25,6 @@ public partial class MedicalHistory : ApiEntity
string generalAppearanceDetail, string generalAppearanceDetail,
string chiefComplaint, string chiefComplaint,
Guid sectionId, Guid sectionId,
string firstName,
string lastName,
string fatherName,
string nationalId,
int age,
DateTime birthDate,
double systolicBloodPressure, double systolicBloodPressure,
double diastolicBloodPressure, double diastolicBloodPressure,
double pulseRate, double pulseRate,
@ -52,12 +46,6 @@ public partial class MedicalHistory : ApiEntity
GeneralAppearanceDetail = generalAppearanceDetail; GeneralAppearanceDetail = generalAppearanceDetail;
ChiefComplaint = chiefComplaint; ChiefComplaint = chiefComplaint;
SectionId = sectionId; SectionId = sectionId;
FirstName = firstName;
LastName = lastName;
FatherName = fatherName;
NationalId = nationalId;
Age = age;
BirthDate = birthDate;
SystolicBloodPressure = systolicBloodPressure; SystolicBloodPressure = systolicBloodPressure;
DiastolicBloodPressure = diastolicBloodPressure; DiastolicBloodPressure = diastolicBloodPressure;
PulseRate = pulseRate; PulseRate = pulseRate;
@ -71,13 +59,6 @@ public partial class MedicalHistory : ApiEntity
public Guid SectionId { get; internal set; } public Guid SectionId { get; internal set; }
public Section? Section { get; internal set; } public Section? Section { get; internal set; }
public string FirstName { get; internal set; } = string.Empty;
public string LastName { get; internal set; } = string.Empty;
public string FatherName { get; internal set; } = string.Empty;
public string NationalId { get; internal set; } = string.Empty;
public int Age { get; internal set; }
public DateTime BirthDate { get; internal set; }
public string PresentIllnessDetail { get; internal set; } = string.Empty; public string PresentIllnessDetail { get; internal set; } = string.Empty;
public string PastDiseasesHistoryDetail { get; internal set; } = string.Empty; public string PastDiseasesHistoryDetail { get; internal set; } = string.Empty;
public string PastSurgeryHistoryDetail { get; internal set; } = string.Empty; public string PastSurgeryHistoryDetail { get; internal set; } = string.Empty;

View File

@ -0,0 +1,24 @@
namespace DocuMed.Repository.Handlers.MedicalHistories;
public class CreateMedicalHistoryCommandHandler(IRepositoryWrapper repositoryWrapper,ICurrentUserService currentUserService) : IRequestHandler<CreateMedicalHistoryCommand,Guid>
{
public async Task<Guid> Handle(CreateMedicalHistoryCommand template, CancellationToken cancellationToken)
{
if (!Guid.TryParse(currentUserService.UserId, out Guid userId))
throw new AppException("دسترسی غیرمجاز", ApiResultStatusCode.UnAuthorized);
var ent = MedicalHistory.Create(template.ChiefComplaint, template.SectionId,
template.PresentIllnessDetail, template.PastDiseasesHistoryDetail, template.PastSurgeryHistoryDetail,
template.FamilyHistoryDetail, template.AllergyDetail, template.DrugHistoryDetail,
template.AddictionHistoryDetail, template.SystemReviewDetail, template.VitalSignDetail, template.GeneralAppearanceDetail,
template.SystolicBloodPressure, template.DiastolicBloodPressure, template.PulseRate, template.SPO2,
template.Temperature, userId, template.MedicalHistoryTemplateId);
foreach (var answer in template.Answers)
ent.AddAnswer(answer.Answer, answer.Question, answer.Part, answer.QuestionType);
repositoryWrapper.SetRepository<MedicalHistory>().Add(ent);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
return ent.Id;
}
}

View File

@ -0,0 +1,16 @@
namespace DocuMed.Repository.Handlers.MedicalHistories;
public class DeleteMedicalHistoryCommandHandler(IRepositoryWrapper repositoryWrapper) : IRequestHandler<DeleteMedicalHistoryCommand, Guid>
{
public async Task<Guid> Handle(DeleteMedicalHistoryCommand template, CancellationToken cancellationToken)
{
var ent = await repositoryWrapper.SetRepository<MedicalHistory>().TableNoTracking
.FirstOrDefaultAsync(m => m.Id == template.Id, cancellationToken);
if (ent == null)
throw new AppException("شرح حال پیدا نشد", ApiResultStatusCode.NotFound);
repositoryWrapper.SetRepository<MedicalHistory>().Delete(ent);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
return ent.Id;
}
}

View File

@ -0,0 +1,47 @@
namespace DocuMed.Repository.Handlers.MedicalHistories;
public class UpdateMedicalHistoryCommandHandler(IRepositoryWrapper repositoryWrapper, ICurrentUserService currentUserService) : IRequestHandler<UpdateMedicalHistoryCommand, Guid>
{
public async Task<Guid> Handle(UpdateMedicalHistoryCommand template, CancellationToken cancellationToken)
{
if (!Guid.TryParse(currentUserService.UserId, out Guid userId))
throw new AppException("دسترسی غیرمجاز", ApiResultStatusCode.UnAuthorized);
var ent = await repositoryWrapper.SetRepository<MedicalHistory>().TableNoTracking
.FirstOrDefaultAsync(m => m.Id == template.Id, cancellationToken);
if(ent==null)
throw new AppException("شرح حال پیدا نشد", ApiResultStatusCode.NotFound);
var newEnt = MedicalHistory.Create(template.ChiefComplaint, template.SectionId,
template.PresentIllnessDetail, template.PastDiseasesHistoryDetail, template.PastSurgeryHistoryDetail,
template.FamilyHistoryDetail, template.AllergyDetail, template.DrugHistoryDetail,
template.AddictionHistoryDetail, template.SystemReviewDetail, template.VitalSignDetail, template.GeneralAppearanceDetail,
template.SystolicBloodPressure, template.DiastolicBloodPressure, template.PulseRate, template.SPO2,
template.Temperature, template.ApplicationUserId, template.MedicalHistoryTemplateId);
newEnt.Id = ent.Id;
newEnt.CreatedAt = ent.CreatedAt;
foreach (var answer in template.Answers.Where(a => a.Id == Guid.Empty))
newEnt.AddAnswer(answer.Answer, answer.Question, answer.Part, answer.QuestionType);
foreach (var answer in template.Answers.Where(a => a.Id != Guid.Empty))
{
var dbAnswer = await repositoryWrapper.SetRepository<MedicalHistoryAnswer>().TableNoTracking
.FirstOrDefaultAsync(a => a.Id == answer.Id, cancellationToken);
if (dbAnswer != null && dbAnswer.Answer != answer.Answer && answer.Answer != null)
{
dbAnswer = MedicalHistoryAnswer.Create(answer.Answer, answer.Question, answer.Part, answer.QuestionType,
dbAnswer.MedicalHistoryId);
dbAnswer.Id = answer.Id;
repositoryWrapper.SetRepository<MedicalHistoryAnswer>().Update(dbAnswer);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
}
}
repositoryWrapper.SetRepository<MedicalHistory>().Update(newEnt);
await repositoryWrapper.SaveChangesAsync(cancellationToken);
return newEnt.Id;
}
}