using adas_core.Domain.Enums; using adas_core.Domain.Models; using adas_core.Domain.Models.MongoModels; using adas_core.Infrastructure.Utils.MongoMaps.Interfaz; using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Options; using MongoDB.Bson.Serialization.Serializers; namespace adas_core.Infrastructure.Utils.MongoMaps; /// /// Represents a contributor that participates in the mapping configuration of the entity by implementing the interface. /// public class PatientMapContributor : IEntityMapContributor { /// /// Registers BSON class maps for the domain model types (Patient, Person, PatientLocation, and related entities) to configure their MongoDB serialization, including auto-mapping, null-value handling, enum string serialization, dictionary serialization, and ID member mapping. Skips registration for types that already have a registered class map. /// public void RegisterMaps() { if (!BsonClassMap.IsClassMapRegistered(typeof(HistoricalLocation))) { BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapMember(c => c.AdmTime); cm.MapMember(c => c.PatientLocation); }); } if (!BsonClassMap.IsClassMapRegistered(typeof(Patient))) BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapIdMember(c => c.Id).SetElementName("_id"); cm.GetMemberMap(c => c.PatientNumber).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.PatientId).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.AdmTime).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.DischargeStatus).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.Altable).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.Origin).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.OriginAux).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.Diagnosis).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.DiagnosisAux).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.Visits).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.AccessControl).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.Insulation).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.PatientStatus).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.Mobility).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.TherapeuticCeiling).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.Procedures).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.Tests).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.Treatment).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.Doctors).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.Allergies).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.LanguageBarrier).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.PassiveSitting).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.DisTime).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.Person).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.AttendingDoctor).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.LastObservationDate).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.CreationDate).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.UpdateDate).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.ArchiveDate).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.PointOfCareId).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.UnitId).SetIgnoreIfNull(true); cm.GetMemberMap(c => c.HistoricalLocations).SetIgnoreIfNull(true); // No mapear estos campos cm.UnmapMember(c => c.Bed); cm.UnmapMember(c => c.UnitString); cm.UnmapMember(c => c.Room); cm.UnmapMember(c => c.PointOfCare); cm.UnmapMember(c => c.Location); }); if (!BsonClassMap.IsClassMapRegistered(typeof(Person))) { BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapMember(c => c.LastName).SetIgnoreIfNull(true); cm.MapMember(c => c.FirstName).SetIgnoreIfNull(true); cm.MapMember(c => c.SecondName).SetIgnoreIfNull(true); cm.MapMember(c => c.BirthDate).SetIgnoreIfNull(true); cm.MapMember(c => c.Language).SetIgnoreIfNull(true); cm.MapMember(c => c.Gender) .SetDefaultValue(PatientEnum.Gender.Unknown) .SetSerializer(new EnumSerializer(BsonType.String)); cm.MapMember(c => c.Ids).SetIgnoreIfNull(true); cm.MapMember(c => c.HistoricalIds) .SetIgnoreIfNull(true); }); BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapMember(c => c.Time).SetIgnoreIfNull(true); cm.MapMember(c => c.PatientIds) .SetSerializer( new DictionaryInterfaceImplementerSerializer, string, string>( DictionaryRepresentation.Document)) .SetIgnoreIfNull(true); }); } if (!BsonClassMap.IsClassMapRegistered(typeof(PatientLocation))) BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapMember(c => c.UnitName).SetIgnoreIfNull(true); cm.MapMember(c => c.Bed).SetIgnoreIfNull(true); cm.MapMember(c => c.Room).SetIgnoreIfNull(true); }); if (!BsonClassMap.IsClassMapRegistered(typeof(PatientLocationAction))) BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapMember(c => c.Location).SetIgnoreIfNull(true); cm.MapMember(c => c.Action) .SetIgnoreIfNull(true) .SetSerializer( new NullableSerializer( new EnumSerializer(BsonType.String))); }); if (!BsonClassMap.IsClassMapRegistered(typeof(PatientIncomeData))) BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapMember(c => c.Diagnosis).SetIgnoreIfNull(true); cm.MapMember(c => c.DiagnosisAux).SetIgnoreIfNull(true); cm.MapMember(c => c.Origin).SetIgnoreIfNull(true); cm.MapMember(c => c.OriginAux).SetIgnoreIfNull(true); cm.MapMember(c => c.AdmTime).SetIgnoreIfNull(true); }); if (!BsonClassMap.IsClassMapRegistered(typeof(PatientIcca))) BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapMember(c => c.Location).SetDefaultValue(new PatientLocation(string.Empty, string.Empty)); cm.MapMember(c => c.PatientNumber).SetIgnoreIfNull(true); cm.MapMember(c => c.PatientId).SetIgnoreIfNull(true); cm.MapMember(c => c.AdmitTime).SetIgnoreIfNull(true); }); if (!BsonClassMap.IsClassMapRegistered(typeof(PatientAllergiesValue))) BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapMember(c => c.Notes).SetIgnoreIfNull(true); cm.MapMember(c => c.Type).SetIgnoreIfNull(true); cm.MapMember(c => c.Value).SetIgnoreIfNull(true); }); if (!BsonClassMap.IsClassMapRegistered(typeof(PatientIntravenousLinesValue))) BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapMember(c => c.Type).SetIgnoreIfNull(true); cm.MapMember(c => c.Duration).SetIgnoreIfNull(true); cm.MapMember(c => c.Action).SetIgnoreIfNull(true); cm.MapMember(c => c.Location).SetIgnoreIfNull(true); cm.MapMember(c => c.InsertTime).SetIgnoreIfNull(true); cm.MapMember(c => c.RemoveTime).SetIgnoreIfNull(true); }); if (!BsonClassMap.IsClassMapRegistered(typeof(PatientDiagnosis))) BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.SetIgnoreExtraElements(true); cm.MapIdMember(c => c.Id).SetElementName("_id"); cm.MapMember(c => c.PatientId); cm.MapMember(c => c.Time); cm.MapMember(c => c.UpdateDate).SetIgnoreIfNull(true); cm.UnmapMember(c => c.MessageTime); cm.MapMember(c => c.CodingSystem).SetIgnoreIfNull(true); cm.MapMember(c => c.Description).SetIgnoreIfNull(true); cm.MapMember(c => c.Label).SetIgnoreIfNull(true); cm.MapMember(c => c.Code).SetIgnoreIfNull(true); cm.MapMember(c => c.State).SetIgnoreIfNull(true); cm.MapMember(c => c.Category).SetIgnoreIfNull(true); cm.MapMember(c => c.StartTime).SetIgnoreIfNull(true); cm.MapMember(c => c.EndTime).SetIgnoreIfNull(true); cm.UnmapMember(c => c.DiagnosisCode); cm.UnmapMember(c => c.DiagnosisSystem); }); if (!BsonClassMap.IsClassMapRegistered(typeof(PatientDrainagesValue))) BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapMember(c => c.Type).SetIgnoreIfNull(true); cm.MapMember(c => c.Location).SetIgnoreIfNull(true); cm.MapMember(c => c.Volume).SetIgnoreIfNull(true); cm.MapMember(c => c.Height).SetIgnoreIfNull(true); }); if (!BsonClassMap.IsClassMapRegistered(typeof(PatientCarePlan))) BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapIdMember(c => c.Id).SetElementName("_id"); cm.MapMember(c => c.PatientId); cm.MapMember(c => c.PointOfCareId).SetIgnoreIfNull(true); cm.MapMember(c => c.PatientNumber).SetIgnoreIfNull(true); cm.MapMember(c => c.UserId).SetIgnoreIfNull(true); cm.MapMember(c => c.CarePlan).SetIgnoreIfNull(true); cm.MapMember(c => c.Description).SetIgnoreIfNull(true); cm.MapMember(c => c.Time).SetIgnoreIfNull(true); cm.MapMember(c => c.Action) .SetIgnoreIfNull(true) .SetSerializer( new NullableSerializer( new EnumSerializer(BsonType.String))); }); if (!BsonClassMap.IsClassMapRegistered(typeof(Admission))) BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapIdMember(c => c.Id).SetElementName("_id"); cm.UnmapMember(c => c.PatientLocation); }); if (!BsonClassMap.IsClassMapRegistered(typeof(Discharge))) BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); cm.MapIdMember(c => c.Id).SetElementName("_id"); cm.UnmapMember(c => c.Patient); cm.UnmapMember(c => c.PatientLocation); cm.MapMember(c => c.MedicalDischarge).SetIgnoreIfNull(true); cm.MapMember(c => c.AdminDischarge).SetIgnoreIfNull(true); cm.MapMember(c => c.NurseDischarge).SetIgnoreIfNull(true); }); } }