using System; using System.Collections.Generic; using System.IO; using System.Linq; using MongoDB.Bson; using MongoDB.Driver; using Serilog; using Landmark.OLA.Application.Common.Domain; namespace Landmark.OLA.Application.DataAccess { public class ConfigurationAccess : IDisposable, IConfigurationAccess { private bool disposed = false; private readonly IDataClient _client; private readonly string _collectionName = "AppConfiguration"; public ConfigurationAccess( IDataClient dataClient) { _client = dataClient; } private IMongoCollection GetConfigurationContainersCollection() { return _client.GetDatabase().GetCollection(_collectionName); } public StoredSettings GetStoredSettings() { try { var collection = GetConfigurationContainersCollection(); var result = collection.Find(new BsonDocument()).ToList().FirstOrDefault(); if( result == null ) { throw new Exception("Could not find app configuration."); } return result; } catch (MongoConnectionException ex) { Log.Error(ex.Message); throw new InvalidDataException("Could not load app configuration."); } } public void CreateStoredSettings(StoredSettings storedSettings) { try { var collection = GetConfigurationContainersCollection(); if (collection.Find(new BsonDocument()).ToList().Count > 0) { throw new Exception("Can only insert 1 configuration"); } collection.InsertOne(storedSettings); } catch (Exception e) { Log.Error(e.Message); throw new InvalidDataException("Error occured while creating app configuration"); } } public void UpdateStoredSettings(StoredSettings storedSettings) { try { var collection = GetConfigurationContainersCollection(); ReplaceOneResult result = collection.ReplaceOne(eachConfig => eachConfig.Id == storedSettings.Id, storedSettings); if (result.MatchedCount == 0 || result.ModifiedCount == 0) { throw new KeyNotFoundException("Item not found"); } } catch (KeyNotFoundException en) { Log.Error(en.Message); throw new KeyNotFoundException(en.Message); } catch (Exception e) { Log.Error(e.Message); throw new InvalidDataException("Error occured while updating app configuration"); } } #region IDisposable public void Dispose() { this.Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { } } this.disposed = true; } #endregion } }