using adas_core.Application.Repositories.Interfaces; using adas_core.Domain.Models; using adas_core.Domain.Models.AppSettings; using adas_core.Domain.Models.MongoModels; using Microsoft.Extensions.Options; using MongoDB.Bson; using MongoDB.Driver; using Serilog; using MongoUtils = adas_core.Infrastructure.Utils.MongoUtils; namespace adas_core.Infrastructure.Repositories; public class PoCSettingsRepository : MongoRepository, IPoCSettingsRepository { private readonly ApiSettings _apiSettings; public PoCSettingsRepository(IOptions apiSettings, IMongoDatabase database) : base(database) { if (apiSettings == null) throw new ArgumentNullException(nameof(apiSettings)); _apiSettings = apiSettings.Value; } public override string GetCollectionName() { return _apiSettings.PoCSettings ?? "poc_settings"; } public async Task Delete(ObjectId id) { try { var filter = Builders.Filter.Eq(x => x.Id, id); await Collection.DeleteOneAsync(filter, null); } catch (Exception ex) { Log.Error("Error deleting PoCSettings by id: {id}. Exception: {ex}", id, ex); throw; } } public async Task> FindAll() { try { return (await Collection.FindAsync(Builders.Filter.Empty)).ToList(); } catch (Exception ex) { Log.Error("Error searching PoCSettings. Exception: {ex}", ex); return []; } } public async Task FindById(ObjectId id) { try { var filter = Builders.Filter.Eq(p => p.Id, id); var result = await Collection.FindAsync(filter); return await result.FirstOrDefaultAsync(); } catch (Exception ex) { Log.Error("Error searching PoCSettings by id: {id}. Exception: {ex}", id, ex); return null; } } public async Task FindByLocation(PatientLocation location) { try { var filterBuilder = Builders.Filter; var filter = filterBuilder.Ne(p => p.PatientLocation, null); // TODO // if (!string.IsNullOrEmpty(location.PointOfCare) && !string.IsNullOrEmpty(location.Bed)) // { // filter = filterBuilder.And( // filter, // filterBuilder.Eq(p => p.PatientLocation!.PointOfCare, location.PointOfCare), // filterBuilder.Eq(p => p.PatientLocation!.Bed, location.Bed) // ); // } var result = await Collection.Find(filter).Limit(1).FirstOrDefaultAsync(); return result; } catch (Exception ex) { Log.Debug("Error searching by location. Exception: {ex}", ex); throw; } } public async Task Update(PoCSettings pocSettings) { try { await UpdateOneAsync(pocSettings.Id, pocSettings); } catch (Exception ex) { Log.Debug("Error updating PoC Settings: {pocS}. Exception: {ex}", pocSettings.ToString(), ex); throw; } } public override async Task CreateIndexes() { var options = new CreateIndexOptions { Background = true, Unique = false }; //var optionsUq = new CreateIndexOptions() //{ // Background = true, // Unique = true, // PartialFilterExpression = Builders.Filter.Exists(p => p.PatientLocation) & // Builders.Filter.Exists(p => p.ManualRelayStatus) //}; var indexes = new List> { new("{ patientLocation: 1 }", options) //new("{ relayStatus: 1, bed: 1 }", optionsUq) }; await MongoUtils.EnsureIndexes(Collection, indexes); } }