136 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Azure.Core;
 | |
| using Azure.Identity;
 | |
| using Core.Blueprint.DAL.Infrastructure.Contracts;
 | |
| using Core.Blueprint.Domain.Shared;
 | |
| using Microsoft.Extensions.Configuration;
 | |
| using MongoDB.Driver;
 | |
| using MongoDB.Driver.Authentication.Oidc;
 | |
| using System.Reflection;
 | |
| 
 | |
| namespace Core.Blueprint.DAL.Infrastructure.Context
 | |
| {
 | |
|     public interface IMongoDbSettings
 | |
|     {
 | |
|         string DatabaseName { get; set; }
 | |
|         string ConnectionString { get; set; }
 | |
|     }
 | |
| 
 | |
|     public class MongoDbSettings : IMongoDbSettings
 | |
|     {
 | |
|         public string DatabaseName { get; set; }
 | |
|         public string ConnectionString { get; set; }
 | |
| 
 | |
|     }
 | |
| 
 | |
|     public class HeathOidcCallback : IOidcCallback
 | |
|     {
 | |
|         private readonly string _audience;
 | |
|         public HeathOidcCallback(string audience)
 | |
|         {
 | |
|             _audience = audience;
 | |
|         }
 | |
| 
 | |
|         public OidcAccessToken GetOidcAccessToken(OidcCallbackParameters parameters, CancellationToken cancellationToken)
 | |
|         {
 | |
|             TokenRequestContext tokenRequestContext =
 | |
|                 new TokenRequestContext(
 | |
|                     new[] { _audience }
 | |
|                 );
 | |
| 
 | |
|             AccessToken token =
 | |
|                 new ChainedTokenCredential(
 | |
|                     new ManagedIdentityCredential(),
 | |
|                     new SharedTokenCacheCredential(),
 | |
|                     new VisualStudioCredential(),
 | |
|                     new VisualStudioCodeCredential()
 | |
|                 )
 | |
|                 .GetToken(
 | |
|                     tokenRequestContext
 | |
|                 );
 | |
| 
 | |
|             return new(token.Token, expiresIn: null);
 | |
|         }
 | |
| 
 | |
|         public async Task<OidcAccessToken> GetOidcAccessTokenAsync(OidcCallbackParameters parameters, CancellationToken cancellationToken)
 | |
|         {
 | |
|             TokenRequestContext tokenRequestContext =
 | |
|                 new TokenRequestContext(
 | |
|                     new[] { _audience }
 | |
|                 );
 | |
| 
 | |
|             AccessToken token =
 | |
|                 await new ChainedTokenCredential(
 | |
|                     new ManagedIdentityCredential(),
 | |
|                     new SharedTokenCacheCredential(),
 | |
|                     new VisualStudioCredential(),
 | |
|                     new VisualStudioCodeCredential()
 | |
|                 )
 | |
|                 .GetTokenAsync(
 | |
|                     tokenRequestContext, cancellationToken
 | |
|                 ).ConfigureAwait(false);
 | |
| 
 | |
|             return new(token.Token, expiresIn: null);
 | |
|         }
 | |
|     }
 | |
|     public sealed class MongoContext : IMongoContext
 | |
|     {
 | |
|         private IMongoDatabase _database;
 | |
|         public IMongoClient _client { get; private set; }
 | |
|         public IMongoDatabase Database { get { return _database; } }
 | |
|         public MongoUrl _mongoUrl { get; private set; }
 | |
| 
 | |
|         //Constructors
 | |
|         public MongoContext(IConfiguration configuration)
 | |
|         {
 | |
|             var mongoClientSettings = MongoClientSettings.FromConnectionString(configuration.GetConnectionString("MongoDBConnString"));
 | |
|             mongoClientSettings.Credential = MongoCredential.CreateOidcCredential(new HeathOidcCallback(configuration.GetValue<string>("MongoDb:Audience")));
 | |
|             _database = new MongoClient(mongoClientSettings).GetDatabase(configuration.GetValue<string>("MongoDb:DatabaseName")); //Mongo Database
 | |
|             _client = Database.Client;
 | |
|         }
 | |
|         public MongoContext(string connectionString, string audience, string databaseName)
 | |
|         {
 | |
|             var mongoClientSettings = MongoClientSettings.FromConnectionString(connectionString);
 | |
|             mongoClientSettings.Credential = MongoCredential.CreateOidcCredential(new HeathOidcCallback(audience));
 | |
|             _client = new MongoClient(mongoClientSettings);
 | |
|             _database = _client.GetDatabase(databaseName);
 | |
|         }
 | |
|         public MongoContext(MongoClient client, string databaseName)
 | |
|         {
 | |
|             _client = client;
 | |
|             _database = client.GetDatabase(databaseName);
 | |
|         }
 | |
|         public void SetUpDatabase(string database)
 | |
|         {
 | |
|             _database = new MongoClient(_mongoUrl).GetDatabase(database);
 | |
|             _client = Database.Client;
 | |
|         }
 | |
| 
 | |
| 
 | |
|         //Methods
 | |
|         public void DropCollection<TDocument>(string? partitionKey = null) where TDocument : class
 | |
|         {
 | |
|             Database.DropCollection(GetCollectionName<TDocument>(partitionKey));
 | |
|         }
 | |
|         public IMongoCollection<T> GetCollection<T>(string collection)
 | |
|         {
 | |
|             return _database.GetCollection<T>(collection);
 | |
|         }
 | |
| 
 | |
|         private string GetCollectionName<TDocument>(string partitionKey)
 | |
|         {
 | |
|             var collectionName = GetAttributeCollectionName<TDocument>();
 | |
|             if (string.IsNullOrEmpty(partitionKey))
 | |
|             {
 | |
|                 return collectionName;
 | |
|             }
 | |
|             return $"{partitionKey}-{collectionName}";
 | |
|         }
 | |
|         private string? GetAttributeCollectionName<TDocument>()
 | |
|         {
 | |
|             return (typeof(TDocument).GetTypeInfo()
 | |
|                 .GetCustomAttributes(typeof(CollectionAttributeName))
 | |
|                 .FirstOrDefault() as CollectionAttributeName)?.Name;
 | |
|         }
 | |
|     }
 | |
| }
 | 
