initial
This commit is contained in:
		
						commit
						b789b367c2
					
				
							
								
								
									
										41
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | ||||
| # Autosave files | ||||
| *~ | ||||
| 
 | ||||
| # build | ||||
| [Oo]bj/ | ||||
| [Bb]in/ | ||||
| packages/ | ||||
| TestResults/ | ||||
| 
 | ||||
| # globs | ||||
| Makefile.in | ||||
| *.DS_Store | ||||
| *.sln.cache | ||||
| *.suo | ||||
| *.cache | ||||
| *.pidb | ||||
| *.userprefs | ||||
| *.usertasks | ||||
| config.log | ||||
| config.make | ||||
| config.status | ||||
| aclocal.m4 | ||||
| install-sh | ||||
| autom4te.cache/ | ||||
| *.user | ||||
| *.tar.gz | ||||
| tarballs/ | ||||
| test-results/ | ||||
| Thumbs.db | ||||
| .vs/ | ||||
| 
 | ||||
| # Mac bundle stuff | ||||
| *.dmg | ||||
| *.app | ||||
| 
 | ||||
| # resharper | ||||
| *_Resharper.* | ||||
| *.Resharper | ||||
| 
 | ||||
| # dotCover | ||||
| *.dotCover | ||||
							
								
								
									
										29
									
								
								ObjectStorage.sln
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								ObjectStorage.sln
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| 
 | ||||
| Microsoft Visual Studio Solution File, Format Version 12.00 | ||||
| # Visual Studio 15 | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoweredSoft.ObjectStorage.Core", "PoweredSoft.ObjectStorage.Core\PoweredSoft.ObjectStorage.Core.csproj", "{81070762-4F21-402D-B10E-6285A46F0572}" | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoweredSoft.ObjectStorage.MongoDB", "PoweredSoft.ObjectStorage.MongoDB\PoweredSoft.ObjectStorage.MongoDB.csproj", "{D430A3A6-5D41-4B4D-9379-5761FB691619}" | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoweredSoft.ObjectStorage.MongoDB.Tests", "PoweredSoft.ObjectStorage.MongoDB.Tests\PoweredSoft.ObjectStorage.MongoDB.Tests.csproj", "{D8CB2E20-7298-4EEB-9694-C54654B1BD1C}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|x86 = Debug|x86 | ||||
| 		Release|x86 = Release|x86 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
| 		{81070762-4F21-402D-B10E-6285A46F0572}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||
| 		{81070762-4F21-402D-B10E-6285A46F0572}.Debug|x86.Build.0 = Debug|Any CPU | ||||
| 		{81070762-4F21-402D-B10E-6285A46F0572}.Release|x86.ActiveCfg = Release|Any CPU | ||||
| 		{81070762-4F21-402D-B10E-6285A46F0572}.Release|x86.Build.0 = Release|Any CPU | ||||
| 		{D430A3A6-5D41-4B4D-9379-5761FB691619}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||
| 		{D430A3A6-5D41-4B4D-9379-5761FB691619}.Debug|x86.Build.0 = Debug|Any CPU | ||||
| 		{D430A3A6-5D41-4B4D-9379-5761FB691619}.Release|x86.ActiveCfg = Release|Any CPU | ||||
| 		{D430A3A6-5D41-4B4D-9379-5761FB691619}.Release|x86.Build.0 = Release|Any CPU | ||||
| 		{D8CB2E20-7298-4EEB-9694-C54654B1BD1C}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||
| 		{D8CB2E20-7298-4EEB-9694-C54654B1BD1C}.Debug|x86.Build.0 = Debug|Any CPU | ||||
| 		{D8CB2E20-7298-4EEB-9694-C54654B1BD1C}.Release|x86.ActiveCfg = Release|Any CPU | ||||
| 		{D8CB2E20-7298-4EEB-9694-C54654B1BD1C}.Release|x86.Build.0 = Release|Any CPU | ||||
| 	EndGlobalSection | ||||
| EndGlobal | ||||
							
								
								
									
										9
									
								
								PoweredSoft.ObjectStorage.Core/IObjectStorageClient.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								PoweredSoft.ObjectStorage.Core/IObjectStorageClient.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| using System; | ||||
| 
 | ||||
| namespace PoweredSoft.ObjectStorage.Core | ||||
| { | ||||
|     public interface IObjectStorageClient | ||||
|     { | ||||
|         IObjectStorageCollection<TEntity> GetCollection<TEntity>(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										16
									
								
								PoweredSoft.ObjectStorage.Core/IObjectStorageCollection.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								PoweredSoft.ObjectStorage.Core/IObjectStorageCollection.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| using System.Linq; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
| 
 | ||||
| namespace PoweredSoft.ObjectStorage.Core | ||||
| { | ||||
|     public interface IObjectStorageCollection<TEntity> | ||||
|     { | ||||
|         string CollectionName { get; } | ||||
| 
 | ||||
|         Task<TEntity> AddAsync(TEntity entity, CancellationToken cancellationToken = default(CancellationToken)); | ||||
|         Task DeleteAsync(TEntity entity, CancellationToken cancellationToken = default(CancellationToken)); | ||||
|         Task<TEntity> UpdateAsync(TEntity entity, CancellationToken cancellationToken = default(CancellationToken)); | ||||
|         IQueryable<TEntity> AsQueryable(); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,10 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
| 
 | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>netstandard2.0</TargetFramework> | ||||
|   </PropertyGroup> | ||||
| 
 | ||||
|   <ItemGroup> | ||||
|     <Compile Remove="Class1.cs" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @ -0,0 +1,20 @@ | ||||
| using System; | ||||
| using MongoDB.Driver; | ||||
| using PoweredSoft.ObjectStorage.MongoDB.Tests.Mock; | ||||
| using PoweredSoft.ObjectStorage.MongoDB.Tests.Mock.Dal; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace PoweredSoft.ObjectStorage.MongoDB.Tests | ||||
| { | ||||
|     public class CollectionNameAttributeTests | ||||
|     { | ||||
|         [Fact] | ||||
|         public void TestingGetCollection() | ||||
|         { | ||||
|             var objectStorageClient = MongoDatabaseFactory.GetObjectStorageClient(); | ||||
|             var collection = objectStorageClient.GetCollection<Contact>(); | ||||
|             Assert.NotNull(collection); | ||||
|             Assert.NotNull(collection.CollectionName); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										37
									
								
								PoweredSoft.ObjectStorage.MongoDB.Tests/CrudTests.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								PoweredSoft.ObjectStorage.MongoDB.Tests/CrudTests.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | ||||
| using System; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| using PoweredSoft.ObjectStorage.MongoDB.Tests.Mock; | ||||
| using PoweredSoft.ObjectStorage.MongoDB.Tests.Mock.Dal; | ||||
| using Xunit; | ||||
| 
 | ||||
| namespace PoweredSoft.ObjectStorage.MongoDB.Tests | ||||
| { | ||||
|     public class CrudTests | ||||
|     { | ||||
|         [Fact] | ||||
|         public async Task CreateUpdateThenDelete() | ||||
|         { | ||||
|             var osc = MongoDatabaseFactory.GetObjectStorageClient(); | ||||
|             var collection = osc.GetCollection<Contact>(); | ||||
|             var contact = await collection.AddAsync(new Contact | ||||
|             { | ||||
|                 FirstName = "Chuck", | ||||
|                 LastName = "Not Norris" | ||||
|             }); | ||||
|             Assert.NotNull(contact); | ||||
| 
 | ||||
| 
 | ||||
|             contact.LastName = "Norris"; | ||||
|             var updatedContact = await collection.UpdateAsync(contact); | ||||
|             Assert.Equal("Norris", updatedContact.LastName); | ||||
| 
 | ||||
|             // delete the test. | ||||
|             await collection.DeleteAsync(updatedContact); | ||||
| 
 | ||||
|             // check that it was deleted. | ||||
|             var shouldBeNull = collection.AsQueryable().FirstOrDefault(t => t.Id == updatedContact.Id); | ||||
|             Assert.Null(shouldBeNull); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										17
									
								
								PoweredSoft.ObjectStorage.MongoDB.Tests/Mock/Dal/Contact.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								PoweredSoft.ObjectStorage.MongoDB.Tests/Mock/Dal/Contact.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| using System; | ||||
| using MongoDB.Bson; | ||||
| using MongoDB.Bson.Serialization.Attributes; | ||||
| 
 | ||||
| namespace PoweredSoft.ObjectStorage.MongoDB.Tests.Mock.Dal | ||||
| { | ||||
|     [MongoCollection("contacts")] | ||||
|     public class Contact | ||||
|     { | ||||
|         [BsonId, BsonElement("id")] | ||||
|         public ObjectId Id { get; set; } | ||||
|         [BsonElement("firstName")] | ||||
|         public string FirstName { get; set; } | ||||
|         [BsonElement("lastName")] | ||||
|         public string LastName { get; set; } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										14
									
								
								PoweredSoft.ObjectStorage.MongoDB.Tests/Mock/Dal/Tag.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								PoweredSoft.ObjectStorage.MongoDB.Tests/Mock/Dal/Tag.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| using MongoDB.Bson; | ||||
| using MongoDB.Bson.Serialization.Attributes; | ||||
| 
 | ||||
| namespace PoweredSoft.ObjectStorage.MongoDB.Tests.Mock.Dal | ||||
| { | ||||
|     [MongoCollection("tags")] | ||||
|     public class Tag | ||||
|     { | ||||
|         [BsonId, BsonElement("id")] | ||||
|         public ObjectId Id { get; set; } | ||||
|         [BsonElement("name")] | ||||
|         public string Name { get; set; } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,26 @@ | ||||
| using System; | ||||
| using MongoDB.Driver; | ||||
| 
 | ||||
| namespace PoweredSoft.ObjectStorage.MongoDB.Tests.Mock | ||||
| { | ||||
|     public class MongoDatabaseFactory | ||||
|     { | ||||
|         public static IMongoDatabase GetDatabase() | ||||
|         { | ||||
|             var client = GetClient(); | ||||
|             var db = client.GetDatabase("acme"); | ||||
|             return db; | ||||
|         } | ||||
| 
 | ||||
|         public static MongoObjectStorageClient GetObjectStorageClient() | ||||
|         { | ||||
|             return new MongoObjectStorageClient(GetDatabase()); | ||||
|         } | ||||
| 
 | ||||
|         public static IMongoClient GetClient() | ||||
|         { | ||||
|             var mongoClient = new MongoClient(); | ||||
|             return mongoClient; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,24 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
| 
 | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>netcoreapp2.2</TargetFramework> | ||||
| 
 | ||||
|     <IsPackable>false</IsPackable> | ||||
|   </PropertyGroup> | ||||
| 
 | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" /> | ||||
|     <PackageReference Include="xunit" Version="2.4.0" /> | ||||
|     <PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" /> | ||||
|     <PackageReference Include="PoweredSoft.DynamicLinq" Version="1.1.7" /> | ||||
|   </ItemGroup> | ||||
| 
 | ||||
|   <ItemGroup> | ||||
|     <Folder Include="Mock\" /> | ||||
|     <Folder Include="Mock\Dal\" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="..\PoweredSoft.ObjectStorage.Core\PoweredSoft.ObjectStorage.Core.csproj" /> | ||||
|     <ProjectReference Include="..\PoweredSoft.ObjectStorage.MongoDB\PoweredSoft.ObjectStorage.MongoDB.csproj" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @ -0,0 +1,14 @@ | ||||
| using System; | ||||
| namespace PoweredSoft.ObjectStorage.MongoDB | ||||
| { | ||||
|     [AttributeUsage(AttributeTargets.Class)] | ||||
|     public class MongoCollectionAttribute : Attribute | ||||
|     { | ||||
|         public MongoCollectionAttribute(string name) | ||||
|         { | ||||
|             Name = name; | ||||
|         } | ||||
| 
 | ||||
|         public string Name { get; } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,28 @@ | ||||
| using System; | ||||
| using System.Reflection; | ||||
| using MongoDB.Driver; | ||||
| using PoweredSoft.ObjectStorage.Core; | ||||
| 
 | ||||
| namespace PoweredSoft.ObjectStorage.MongoDB | ||||
| { | ||||
|     public class MongoObjectStorageClient : IObjectStorageClient | ||||
|     { | ||||
|         public MongoObjectStorageClient(IMongoDatabase database) | ||||
|         { | ||||
|             Database = database; | ||||
|         } | ||||
| 
 | ||||
|         public IMongoDatabase Database { get; } | ||||
| 
 | ||||
|         public IObjectStorageCollection<TEntity> GetCollection<TEntity>() | ||||
|         { | ||||
|             var attribute = typeof(TEntity).GetCustomAttribute<MongoCollectionAttribute>(); | ||||
|             if (attribute == null) | ||||
|                 throw new Exception("Must add MongoCollectionAttribute on entity class to use this method."); | ||||
| 
 | ||||
|             var mongoCollection = Database.GetCollection<TEntity>(attribute.Name); | ||||
|             var ret = new MongoObjectStorageCollection<TEntity>(mongoCollection); | ||||
|             return ret; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,67 @@ | ||||
| using System; | ||||
| using System.Linq; | ||||
| using System.Linq.Expressions; | ||||
| using System.Reflection; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
| using MongoDB.Bson.Serialization.Attributes; | ||||
| using MongoDB.Driver; | ||||
| using PoweredSoft.DynamicLinq.Helpers; | ||||
| using PoweredSoft.ObjectStorage.Core; | ||||
| 
 | ||||
| namespace PoweredSoft.ObjectStorage.MongoDB | ||||
| { | ||||
|     public class MongoObjectStorageCollection<TEntity> : IObjectStorageCollection<TEntity> | ||||
|     { | ||||
|         public MongoObjectStorageCollection(IMongoCollection<TEntity> collection) | ||||
|         { | ||||
|             if (collection == null) | ||||
|                 throw new ArgumentNullException("collection"); | ||||
| 
 | ||||
|             Collection = collection; | ||||
|         } | ||||
| 
 | ||||
|         public string CollectionName => Collection.CollectionNamespace.CollectionName; | ||||
| 
 | ||||
|         public IMongoCollection<TEntity> Collection { get; } | ||||
| 
 | ||||
|         public async Task<TEntity> AddAsync(TEntity entity, CancellationToken cancellationToken = default(CancellationToken)) | ||||
|         { | ||||
|             await Collection.InsertOneAsync(entity, cancellationToken: cancellationToken); | ||||
|             return entity; | ||||
|         } | ||||
| 
 | ||||
|         public IQueryable<TEntity> AsQueryable() | ||||
|         { | ||||
|             return Collection.AsQueryable(); | ||||
|         } | ||||
| 
 | ||||
|         protected virtual Expression<Func<TEntity, bool>> CreateEntityExpression(TEntity entity) | ||||
|         { | ||||
|             var objectKey = typeof(TEntity) | ||||
|                             .GetProperties(BindingFlags.Public | BindingFlags.Instance) | ||||
|                             .FirstOrDefault(t => t.GetCustomAttribute<BsonIdAttribute>() != null); | ||||
|             if (objectKey == null) | ||||
|                 throw new Exception("Must have a BsonIdAttribute on one of the properties.");  | ||||
|                  | ||||
|             var constant = objectKey.GetValue(entity); | ||||
|             var expression = QueryableHelpers.CreateConditionExpression<TEntity>(objectKey.Name, | ||||
|                 DynamicLinq.ConditionOperators.Equal, constant, DynamicLinq.QueryConvertStrategy.LeaveAsIs); | ||||
| 
 | ||||
|             return expression; | ||||
|         } | ||||
| 
 | ||||
|         public async Task DeleteAsync(TEntity entity, CancellationToken cancellationToken = default(CancellationToken)) | ||||
|         { | ||||
|             var expression = CreateEntityExpression(entity); | ||||
|             await Collection.DeleteOneAsync(expression); | ||||
|         } | ||||
| 
 | ||||
|         public async Task<TEntity> UpdateAsync(TEntity entity, CancellationToken cancellationToken = default(CancellationToken)) | ||||
|         { | ||||
|             var expression = CreateEntityExpression(entity); | ||||
|             await Collection.ReplaceOneAsync(expression, entity); | ||||
|             return entity; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,12 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>netstandard2.0</TargetFramework> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="..\PoweredSoft.ObjectStorage.Core\PoweredSoft.ObjectStorage.Core.csproj" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="MongoDB.Driver" Version="2.7.3" /> | ||||
|     <PackageReference Include="PoweredSoft.DynamicLinq" Version="1.1.7" /> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user