using adas_core.Application.Repositories.Interfaces; using adas_core.Domain.Models.AppSettings; using adas_core.Domain.Models.MongoModels; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; using MongoUtils = adas_core.Infrastructure.Utils.MongoUtils; namespace adas_core.Infrastructure.Repositories; public class ArchivePatientCarePlanRepository : MongoRepository, IArchivePatientCarePlanRepository { #region Properties private readonly ApiSettings _apiSettings; private readonly ILogger _logger; #endregion #region Constructor public ArchivePatientCarePlanRepository( IOptions apiSettings, IMongoDatabase database, ILogger logger) : base(database) { _logger = logger; _apiSettings = apiSettings.Value; } public override async Task CreateIndexes() { var options = new CreateIndexOptions { Background = true, Unique = false }; var indexes = new List> { new("{ patientId: 1 }", options) }; await MongoUtils.EnsureIndexes(Collection, indexes); } #endregion #region Create public override async Task InsertOneAsync(PatientCarePlan patient) { try { await base.InsertOneAsync(patient); } catch (Exception e) { _logger.LogError( "Exception trying to insert patient: {patient}. on archive patient procedure Exception {e}", patient, e); throw; } } public override async Task InsertManyAsync(List patient) { try { await base.InsertManyAsync(patient); } catch (Exception e) { _logger.LogError( "Exception trying to insert many PatientCarePlan. on archive patient procedure Exception {e}", e); throw; } } #endregion #region Read public override string GetCollectionName() { return _apiSettings.ArchivePatientProcedure ?? "archive_patients_care_plan"; } public async Task?> FindByPatientId(ObjectId patientId) { var result = await Collection.FindAsync(Builders.Filter.Eq(p => p.PatientId, patientId)); return result.ToList(); } public async Task?> FindByPatientId(string patientId) { var isParsed = ObjectId.TryParse(patientId, out var patientIdParsed); if (!isParsed) return []; var result = await Collection.FindAsync(Builders.Filter.Eq(p => p.PatientId, patientIdParsed)); return result.ToList(); } public async Task?> FindByPatientNumber(string patientId) { var result = await Collection.FindAsync(Builders.Filter.Eq(p => p.PatientNumber, patientId)); return result.ToList(); } public async Task> FindAll() { var result = await Collection.Find(Builders.Filter.Empty).ToListAsync(); return result; } public async Task?> FindByIds(ObjectId oldPatientId, string? oldPatientPatientId, string? oldPatientPatientNumber) { var patientFound = await FindByPatientId(oldPatientId); if (patientFound != null) return patientFound; if (oldPatientPatientId != null) { patientFound = await FindByPatientId(oldPatientPatientId); if (patientFound is { Count: > 0 }) return patientFound; } if (oldPatientPatientNumber != null) { patientFound = await FindByPatientNumber(oldPatientPatientNumber); if (patientFound is { Count: > 0 }) return patientFound; } return []; } #endregion #region Update // public async Task Update(Patient patient) // { // patient.UpdateDate = DateTime.UtcNow; // await UpdateOneAsync(patient.Id, patient); // } // // public async void UpdatePatientData(Patient oldPatient, Patient newPatient) // { // var filterBuilder = Builders.Filter; // var updateBuilder = Builders.Update // .Set(p => p.Person, newPatient.Person) // .Set(p => p.UpdateDate, DateTime.UtcNow) // .Set(p => p.Location, newPatient.Location) // .Set(p => p.PatientNumber, newPatient.PatientNumber) // .Set(p => p.UnitString, newPatient.UnitString) // .Set(p => p.Room, newPatient.Room) // .Set(p => p.PatientId, newPatient.PatientId); // var filter = filterBuilder.Eq(p => p.Id, oldPatient.Id); // var update = updateBuilder; // // await Collection.UpdateOneAsync(filter, update); // } // public async void UpdateProcedure(Patient patientFound) // { // var filterBuilder = Builders.Filter; // var updateBuilder = Builders.Update // .Set(p => p.Procedures, patientFound.Procedures); // var filter = filterBuilder.Eq(p => p.Id, patientFound.Id); // var update = updateBuilder; // // await Collection.UpdateOneAsync(filter, update); // } // // public async void UpdateTreatment(Patient patientFound) // { // var filterBuilder = Builders.Filter; // var updateBuilder = Builders.Update // .Set(p => p.Treatment, patientFound.Treatment); // var filter = filterBuilder.Eq(p => p.Id, patientFound.Id); // var update = updateBuilder; // // await Collection.UpdateOneAsync(filter, update); // } #endregion }