Creado apartir del commit b888de6c92056de294456f581a56e25e734d4ab7 de develop
This commit is contained in:
@@ -0,0 +1,402 @@
|
||||
using adas_core.Application.Repositories.Interfaces;
|
||||
using adas_core.Domain.Enums;
|
||||
using adas_core.Domain.Models.AppSettings;
|
||||
using adas_core.Domain.Models.DTO;
|
||||
using adas_core.Domain.Models.Filter;
|
||||
using adas_core.Domain.Models.MongoModels;
|
||||
using Microsoft.Extensions.Options;
|
||||
using MongoDB.Bson;
|
||||
using MongoDB.Driver;
|
||||
using Newtonsoft.Json;
|
||||
using Serilog;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace adas_core.Infrastructure.Repositories;
|
||||
|
||||
public class UnitRepository : MongoRepository<Unit>, IUnitRepository
|
||||
{
|
||||
#region Properties
|
||||
|
||||
private readonly ApiSettings _apiSettings;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructor
|
||||
|
||||
|
||||
|
||||
public UnitRepository(IOptions<ApiSettings> apiSettings, IMongoDatabase database) : base(database)
|
||||
{
|
||||
_apiSettings = apiSettings.Value;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
#region Create
|
||||
|
||||
public async Task<Unit?> InsertOneUnit(Unit unit)
|
||||
{
|
||||
try
|
||||
{
|
||||
await Collection.InsertOneAsync(unit);
|
||||
return await FindById(unit.Id);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error("Error inserting Unit: {unit}. Exception: {ex}",
|
||||
JsonConvert.SerializeObject(unit, Formatting.Indented), ex);
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Read
|
||||
|
||||
public override string GetCollectionName()
|
||||
{
|
||||
return _apiSettings.Units ?? "units";
|
||||
}
|
||||
|
||||
// public async Task<Unit?> FindByLocation(PatientLocation location)
|
||||
// {
|
||||
// var filter = Builders<Unit>.Filter.ElemMatch(x => x.PointOfCares, poc => poc.Bed == location.Bed && poc.UnitName == location.UnitName);
|
||||
// var result = await Collection.Find(filter).FirstOrDefaultAsync();
|
||||
//
|
||||
// return result;
|
||||
// }
|
||||
|
||||
public async Task<Unit?> FindById(object id)
|
||||
{
|
||||
var result = await Collection.FindAsync(Builders<Unit>.Filter.Eq(x => x.Id, id));
|
||||
return await result.FirstOrDefaultAsync();
|
||||
}
|
||||
|
||||
public Task<Unit?> FindById(string id)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<Unit>> FindByMasterListId(ObjectId id, MasterListType masterListType)
|
||||
{
|
||||
try
|
||||
{
|
||||
var propertyName = $"{masterListType}Id"; // nombre de la propiedad dinámicamente
|
||||
var filter = Builders<Unit>.Filter.Eq(propertyName, id);
|
||||
|
||||
|
||||
var result = await Collection.Find(filter).ToListAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error("Error searching unit by {masterlisttype} Id {id}. Exception: {ex}", masterListType.ToString(),
|
||||
id, ex);
|
||||
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<Unit>> FindByMasterListId(ObjectId id)
|
||||
{
|
||||
try
|
||||
{
|
||||
var filterBuilder = Builders<Unit>.Filter;
|
||||
var filters = new List<FilterDefinition<Unit>>
|
||||
{
|
||||
filterBuilder.Or(
|
||||
filterBuilder.Eq(p => p.DoctorListId, id),
|
||||
filterBuilder.Eq(p => p.AllergyListId, id),
|
||||
filterBuilder.Eq(p => p.DestinationListId, id),
|
||||
filterBuilder.Eq(p => p.DiagnosisListId, id),
|
||||
filterBuilder.Eq(p => p.InsulationListId, id),
|
||||
filterBuilder.Eq(p => p.OriginListId, id),
|
||||
filterBuilder.Eq(p => p.ProcedureListId, id),
|
||||
filterBuilder.Eq(p => p.TestListId, id),
|
||||
filterBuilder.Eq(p => p.ServiceListId, id),
|
||||
filterBuilder.Eq(p => p.TreatmentListId, id),
|
||||
filterBuilder.Eq(p => p.LanguageBarrierListId, id),
|
||||
filterBuilder.Eq(p => p.AltableOptionListId, id),
|
||||
filterBuilder.Eq(p => p.DischargeStatusListId, id),
|
||||
filterBuilder.Eq(p => p.DoctorTypeListId, id),
|
||||
filterBuilder.Eq(p => p.InternalDestinationListId, id),
|
||||
filterBuilder.Eq(p => p.PassiveSittingListId, id),
|
||||
filterBuilder.Eq(p => p.GenericListId, id),
|
||||
filterBuilder.Eq(p => p.VisitOptionListId, id),
|
||||
filterBuilder.Eq(p => p.AccessControlListId, id),
|
||||
filterBuilder.Eq(p => p.TherapeuticCeilingListId, id),
|
||||
filterBuilder.Eq(p => p.MobilityOptionListId, id)
|
||||
)
|
||||
};
|
||||
|
||||
|
||||
var result = await Collection.Find(Builders<Unit>.Filter.And(filters)).ToListAsync();
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error("Error searching unit by masterlist Id {id}. Exception: {ex}", id.ToString(), ex);
|
||||
|
||||
return new List<Unit>();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<long> CountUnitsByMasterListId(ObjectId id, MasterListType masterListType)
|
||||
{
|
||||
var propertyName = $"{masterListType}Id";
|
||||
var filter = Builders<Unit>.Filter.Eq(propertyName, id);
|
||||
var result = await Collection.CountDocumentsAsync(filter);
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Unit?> FindByName(string unitName)
|
||||
{
|
||||
var result = await Collection.FindAsync(Builders<Unit>.Filter.Eq(x => x.Name, unitName));
|
||||
|
||||
return await result.FirstOrDefaultAsync();
|
||||
}
|
||||
|
||||
// public async Task<List<Unit>> FindByPointOfCare(PointOfCare pointOfCare)
|
||||
// {
|
||||
// var filter = Builders<Unit>.Filter.ElemMatch(x => x.PointOfCares, poc => poc.Bed == pointOfCare.Bed && poc.Room == pointOfCare.Room && pointOfCare.unitName == poc.unitName);
|
||||
// var result = await Collection.Find(filter).ToListAsync();
|
||||
//
|
||||
// return result;
|
||||
// }
|
||||
// public async Task<Unit?> FindByPointOfCare(PointOfCare pointOfCare)
|
||||
// {
|
||||
// var filter = Builders<Unit>.Filter.ElemMatch(x => x.PointOfCares, poc => poc.Bed == pointOfCare.Bed && poc.Room == pointOfCare.Room && pointOfCare.UnitName == poc.UnitName);
|
||||
// var result = await Collection.Find(filter).FirstOrDefaultAsync();
|
||||
//
|
||||
// return result;
|
||||
// }
|
||||
// public async Task<List<Unit>> FindByUnitName(string unitName)
|
||||
// {
|
||||
// var filter = Builders<Unit>.Filter.ElemMatch(x => x.PointOfCares, poc => poc.UnitName == unitName);
|
||||
// var result = await Collection.Find(filter).ToListAsync();
|
||||
//
|
||||
// return result;
|
||||
// }
|
||||
public async Task<List<Unit>> GetAll()
|
||||
{
|
||||
var result = await Collection.FindAsync(Builders<Unit>.Filter.Empty);
|
||||
|
||||
return result.ToList();
|
||||
}
|
||||
|
||||
|
||||
public IFindFluent<Unit, Unit> GetPaginatedUnits(PaginationFilter filter)
|
||||
{
|
||||
var filterBuilder = Builders<Unit>.Filter;
|
||||
var sort = Builders<Unit>.Sort.Ascending("title");
|
||||
var filters = new List<FilterDefinition<Unit>>();
|
||||
|
||||
if (filter.FilteredRequest == null) return CreateFindFluent(filters, sort);
|
||||
|
||||
if (!string.IsNullOrEmpty(filter.FilteredRequest?.Text))
|
||||
{
|
||||
var textFilter = filter.FilteredRequest.Text;
|
||||
var textFilterEscaped = Regex.Escape(textFilter);
|
||||
|
||||
filters.Add(
|
||||
filterBuilder.Or(
|
||||
filterBuilder.Regex(p => p.Name,
|
||||
new BsonRegularExpression(textFilterEscaped, "i")), // Case-insensitive regex match for name
|
||||
filterBuilder.Regex(p => p.Title,
|
||||
new BsonRegularExpression(textFilterEscaped, "i")) // Case-insensitive regex match for title
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return CreateFindFluent(filters, sort);
|
||||
}
|
||||
|
||||
private IFindFluent<Unit, Unit> CreateFindFluent(List<FilterDefinition<Unit>> filters, SortDefinition<Unit> sort)
|
||||
{
|
||||
var combinedFilter = filters.Any()
|
||||
? Builders<Unit>.Filter.And(filters)
|
||||
: Builders<Unit>.Filter.Empty;
|
||||
return Collection.Find(combinedFilter).Sort(sort);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Update
|
||||
|
||||
public async Task<Unit?> UpdateUnit(Unit unit)
|
||||
{
|
||||
var filter = Builders<Unit>.Filter.Eq("_id", unit.Id);
|
||||
var update = Builders<Unit>.Update
|
||||
//.Set(c => c.Id, unit.Id)
|
||||
.Set(c => c.Title, unit.Title)
|
||||
.Set(c => c.Name, unit.Name)
|
||||
.Set(c => c.Configuration, unit.Configuration)
|
||||
.Set(c => c.AllergyListId, unit.AllergyListId)
|
||||
.Set(c => c.DestinationListId, unit.DestinationListId)
|
||||
.Set(c => c.InternalDestinationListId, unit.InternalDestinationListId)
|
||||
.Set(c => c.DiagnosisListId, unit.DiagnosisListId)
|
||||
.Set(c => c.DoctorListId, unit.DoctorListId)
|
||||
.Set(c => c.DoctorTypeListId, unit.DoctorTypeListId)
|
||||
.Set(c => c.InsulationListId, unit.InsulationListId)
|
||||
.Set(c => c.MobilityOptionListId, unit.MobilityOptionListId)
|
||||
.Set(c => c.OriginListId, unit.OriginListId)
|
||||
.Set(c => c.PatientStatusListId, unit.PatientStatusListId)
|
||||
.Set(c => c.ProcedureListId, unit.ProcedureListId)
|
||||
.Set(c => c.TestListId, unit.TestListId)
|
||||
.Set(c => c.ServiceListId, unit.ServiceListId)
|
||||
.Set(c => c.TherapeuticCeilingListId, unit.TherapeuticCeilingListId)
|
||||
.Set(c => c.TreatmentListId, unit.TreatmentListId)
|
||||
.Set(c => c.VisitOptionListId, unit.VisitOptionListId)
|
||||
.Set(c => c.AccessControlListId, unit.AccessControlListId)
|
||||
.Set(c => c.DischargeStatusListId, unit.DischargeStatusListId);
|
||||
|
||||
return await Collection.FindOneAndUpdateAsync(filter, update,
|
||||
new FindOneAndUpdateOptions<Unit, Unit> { ReturnDocument = ReturnDocument.After });
|
||||
}
|
||||
|
||||
public async Task<Unit?> UpdateUnitInfo(ObjectId unitId, string name, string title)
|
||||
{
|
||||
var filter = Builders<Unit>.Filter.Eq("_id", unitId);
|
||||
var update = Builders<Unit>.Update
|
||||
//.Set(c => c.Id, unit.Id)
|
||||
.Set(c => c.Title, title)
|
||||
.Set(c => c.Name, name);
|
||||
|
||||
|
||||
return await Collection.FindOneAndUpdateAsync(filter, update,
|
||||
new FindOneAndUpdateOptions<Unit, Unit> { ReturnDocument = ReturnDocument.After });
|
||||
}
|
||||
|
||||
public async Task<Unit?> UpdateUnitMasterList(UpdateUnitIdListDto updateUnitListDto)
|
||||
{
|
||||
var filter = Builders<Unit>.Filter.Eq("_id", updateUnitListDto.UnitId);
|
||||
var update = Builders<Unit>.Update;
|
||||
var updates = new List<UpdateDefinition<Unit>>();
|
||||
|
||||
foreach (var masterListData in updateUnitListDto.MasterListData)
|
||||
if (masterListData.MasterListType.HasValue)
|
||||
switch (masterListData.MasterListType.Value)
|
||||
{
|
||||
case MasterListType.AltableOptionList:
|
||||
updates.Add(update.Set(u => u.AltableOptionListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.AllergyList:
|
||||
updates.Add(update.Set(u => u.AllergyListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.DestinationList:
|
||||
updates.Add(update.Set(u => u.DestinationListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.DiagnosisList:
|
||||
updates.Add(update.Set(u => u.DiagnosisListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.DischargeStatusList:
|
||||
updates.Add(update.Set(u => u.DischargeStatusListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.DoctorList:
|
||||
updates.Add(update.Set(u => u.DoctorListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.DoctorTypeList:
|
||||
updates.Add(update.Set(u => u.DoctorTypeListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.InternalDestinationList:
|
||||
updates.Add(update.Set(u => u.InternalDestinationListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.InsulationList:
|
||||
updates.Add(update.Set(u => u.InsulationListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.LanguageBarrierList:
|
||||
updates.Add(update.Set(u => u.LanguageBarrierListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.PassiveSittingList:
|
||||
updates.Add(update.Set(u => u.PassiveSittingListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.GenericList:
|
||||
updates.Add(update.Set(u => u.GenericListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.MobilityOptionList:
|
||||
updates.Add(update.Set(u => u.MobilityOptionListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.OriginList:
|
||||
updates.Add(update.Set(u => u.OriginListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.PatientStatusList:
|
||||
updates.Add(update.Set(u => u.PatientStatusListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.ProcedureList:
|
||||
updates.Add(update.Set(u => u.ProcedureListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.TestList:
|
||||
updates.Add(update.Set(u => u.TestListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.ServiceList:
|
||||
updates.Add(update.Set(u => u.ServiceListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.TherapeuticCeilingList:
|
||||
updates.Add(update.Set(u => u.TherapeuticCeilingListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.TreatmentList:
|
||||
updates.Add(update.Set(u => u.TreatmentListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.VisitOptionList:
|
||||
updates.Add(update.Set(u => u.VisitOptionListId, masterListData.MasterListId));
|
||||
break;
|
||||
case MasterListType.AccessControlList:
|
||||
updates.Add(update.Set(u => u.AccessControlListId, masterListData.MasterListId));
|
||||
break;
|
||||
}
|
||||
|
||||
if (updates.Any())
|
||||
{
|
||||
var combinedUpdate = update.Combine(updates);
|
||||
return await Collection.FindOneAndUpdateAsync(filter, combinedUpdate,
|
||||
new FindOneAndUpdateOptions<Unit, Unit> { ReturnDocument = ReturnDocument.After });
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public async Task<bool> UpdateConfiguration(ObjectId unitIdParsed, UnitConfiguration unitConfiguration)
|
||||
{
|
||||
var filter = Builders<Unit>.Filter.Eq("_id", unitIdParsed);
|
||||
var update = Builders<Unit>.Update
|
||||
.Set(c => c.Configuration, unitConfiguration);
|
||||
try
|
||||
{
|
||||
var result = await Collection.UpdateOneAsync(filter, update);
|
||||
return result.ModifiedCount > 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error("Error UpdateConfiguration from unit: {name}. Exception: {ex}", unitIdParsed, ex);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Delete
|
||||
|
||||
public new async Task<Unit?> DeleteAsync(ObjectId id)
|
||||
{
|
||||
var filter = Builders<Unit>.Filter.Eq(unit => unit.Id, id);
|
||||
|
||||
try
|
||||
{
|
||||
return await Collection.FindOneAndDeleteAsync(filter);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Error(e.Message);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
}
|
||||
Reference in New Issue
Block a user