Skip to content
This repository was archived by the owner on Dec 17, 2021. It is now read-only.

Commit ee6a53d

Browse files
committed
* Switch to RethinkDb.Driver
* Default Asp.net Sample Application added for usage demonstration
1 parent d166766 commit ee6a53d

File tree

79 files changed

+29510
-60
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+29510
-60
lines changed

src/AspNet.Identity.RethinkDB.sln

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio 2013
4-
VisualStudioVersion = 12.0.30501.0
3+
# Visual Studio 14
4+
VisualStudioVersion = 14.0.25123.0
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNet.Identity.RethinkDB", "AspNet.Identity.RethinkDB\AspNet.Identity.RethinkDB.csproj", "{AD64128A-6855-49F7-A846-1FCDAD368C55}"
77
EndProject
@@ -18,6 +18,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IntegrationTests", "Integra
1818
EndProject
1919
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "rethinkdb-net", "..\..\..\Libraries\rethinkdb-net\rethinkdb-net\rethinkdb-net.csproj", "{4632C7DA-1C4F-4DAB-B212-EF69059959C5}"
2020
EndProject
21+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleApplication", "SampleApplication\SampleApplication.csproj", "{1970DED4-8B44-4D39-899E-DDE1C854258C}"
22+
EndProject
2123
Global
2224
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2325
Debug|Any CPU = Debug|Any CPU
@@ -33,13 +35,16 @@ Global
3335
{62483144-11D8-4ECE-990D-17B4716AFF69}.Release|Any CPU.ActiveCfg = Release|Any CPU
3436
{62483144-11D8-4ECE-990D-17B4716AFF69}.Release|Any CPU.Build.0 = Release|Any CPU
3537
{2817B6BF-006D-415D-8CAB-34E14DCCBC3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
36-
{2817B6BF-006D-415D-8CAB-34E14DCCBC3C}.Debug|Any CPU.Build.0 = Debug|Any CPU
3738
{2817B6BF-006D-415D-8CAB-34E14DCCBC3C}.Release|Any CPU.ActiveCfg = Release|Any CPU
3839
{2817B6BF-006D-415D-8CAB-34E14DCCBC3C}.Release|Any CPU.Build.0 = Release|Any CPU
3940
{4632C7DA-1C4F-4DAB-B212-EF69059959C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
4041
{4632C7DA-1C4F-4DAB-B212-EF69059959C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
4142
{4632C7DA-1C4F-4DAB-B212-EF69059959C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
4243
{4632C7DA-1C4F-4DAB-B212-EF69059959C5}.Release|Any CPU.Build.0 = Release|Any CPU
44+
{1970DED4-8B44-4D39-899E-DDE1C854258C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
45+
{1970DED4-8B44-4D39-899E-DDE1C854258C}.Debug|Any CPU.Build.0 = Debug|Any CPU
46+
{1970DED4-8B44-4D39-899E-DDE1C854258C}.Release|Any CPU.ActiveCfg = Release|Any CPU
47+
{1970DED4-8B44-4D39-899E-DDE1C854258C}.Release|Any CPU.Build.0 = Release|Any CPU
4348
EndGlobalSection
4449
GlobalSection(SolutionProperties) = preSolution
4550
HideSolutionNode = FALSE

src/AspNet.Identity.RethinkDB/AspNet.Identity.RethinkDB.csproj

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,6 @@
6464
<None Include="AspNet.Identity.RethinkDB.nuspec" />
6565
<None Include="packages.config" />
6666
</ItemGroup>
67-
<ItemGroup>
68-
<ProjectReference Include="..\..\..\..\Libraries\rethinkdb-net\rethinkdb-net\rethinkdb-net.csproj">
69-
<Project>{4632c7da-1c4f-4dab-b212-ef69059959c5}</Project>
70-
<Name>rethinkdb-net</Name>
71-
</ProjectReference>
72-
</ItemGroup>
7367
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
7468
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
7569
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

src/AspNet.Identity.RethinkDB/IdentityContext.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
{
33
using System;
44
using global::RethinkDb;
5+
using RethinkDb.Driver.Ast;
6+
using RethinkDb.Driver.Net;
57

68
public class IdentityContext
79
{
810
public IConnection Connection { get; private set; }
9-
public IDatabaseQuery DB { get; private set; }
11+
public Db DB { get; private set; }
1012
//public ITableQuery<TUser> Users { get; set; }
1113
//public ITableQuery<TRole> Roles { get; set; }
1214

@@ -22,7 +24,7 @@ public class IdentityContext
2224
//{
2325
//}
2426

25-
public IdentityContext(IConnection conn, IDatabaseQuery db)
27+
public IdentityContext(IConnection conn, Db db)
2628
{
2729
Connection = conn;
2830
DB = db;

src/AspNet.Identity.RethinkDB/IndexChecks.cs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,30 @@
55
//using global::MongoDB.Driver.Builders;
66
using global::RethinkDb;
77

8-
public class IndexChecks
9-
{
10-
public static void EnsureUniqueIndexOnUserName(ITableQuery<IdentityUser> users)
11-
{
12-
throw new NotImplementedException();
13-
//var userName = new IndexKeysBuilder<IdentityUser>().Ascending(t => t.UserName);
14-
//var unique = new IndexOptionsBuilder().SetUnique(true);
15-
//users.CreateIndex(userName, unique);
16-
}
8+
//public class IndexChecks
9+
//{
10+
// public static void EnsureUniqueIndexOnUserName(ITableQuery<IdentityUser> users)
11+
// {
12+
// throw new NotImplementedException();
13+
// //var userName = new IndexKeysBuilder<IdentityUser>().Ascending(t => t.UserName);
14+
// //var unique = new IndexOptionsBuilder().SetUnique(true);
15+
// //users.CreateIndex(userName, unique);
16+
// }
1717

18-
public static void EnsureUniqueIndexOnRoleName(ITableQuery<IdentityRole> roles)
19-
{
20-
throw new NotImplementedException();
21-
//var roleName = new IndexKeysBuilder<IdentityRole>().Ascending(t => t.Name);
22-
//var unique = new IndexOptionsBuilder().SetUnique(true);
23-
//roles.CreateIndex(roleName, unique);
24-
}
18+
// public static void EnsureUniqueIndexOnRoleName(ITableQuery<IdentityRole> roles)
19+
// {
20+
// throw new NotImplementedException();
21+
// //var roleName = new IndexKeysBuilder<IdentityRole>().Ascending(t => t.Name);
22+
// //var unique = new IndexOptionsBuilder().SetUnique(true);
23+
// //roles.CreateIndex(roleName, unique);
24+
// }
2525

26-
public static void EnsureUniqueIndexOnEmail(ITableQuery<IdentityUser> users)
27-
{
28-
throw new NotImplementedException();
29-
//var email = new IndexKeysBuilder<IdentityUser>().Ascending(t => t.Email);
30-
//var unique = new IndexOptionsBuilder().SetUnique(true);
31-
//users.CreateIndex(email, unique);
32-
}
33-
}
26+
// public static void EnsureUniqueIndexOnEmail(ITableQuery<IdentityUser> users)
27+
// {
28+
// throw new NotImplementedException();
29+
// //var email = new IndexKeysBuilder<IdentityUser>().Ascending(t => t.Email);
30+
// //var unique = new IndexOptionsBuilder().SetUnique(true);
31+
// //users.CreateIndex(email, unique);
32+
// }
33+
//}
3434
}

src/AspNet.Identity.RethinkDB/RoleStore.cs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
//using global::MongoDB.Driver.Builders;
88
//using global::MongoDB.Driver.Linq;
99
using Microsoft.AspNet.Identity;
10-
using global::RethinkDb;
10+
using RethinkDb.Driver.Ast;
1111

1212
/// <summary>
1313
/// Note: Deleting and updating do not modify the roles stored on a user document. If you desire this dynamic
@@ -19,19 +19,24 @@ public class RoleStore<TRole> : IRoleStore<TRole>, IQueryableRoleStore<TRole>
1919
where TRole : IdentityRole
2020
{
2121
private readonly IdentityContext _Context;
22-
private readonly ITableQuery<TRole> TableRoles;
22+
//private readonly ITableQuery<TRole> TableRoles;
23+
private readonly Table TableRoles;
2324

2425
public RoleStore(IdentityContext context)
2526
{
2627
_Context = context;
27-
TableRoles = _Context.DB.Table<TRole>("IdentityRoles");
28+
TableRoles = _Context.DB.Table("IdentityRoles"); //. Table<TRole>("IdentityRoles");
2829
}
2930

3031
public virtual IQueryable<TRole> Roles
3132
{
3233
// TODO: Performance?!
3334
get
34-
{ return _Context.Connection.Run(TableRoles).AsQueryable<TRole>(); }
35+
{
36+
//return _Context.Connection.Run(TableRoles).AsQueryable<TRole>();
37+
IQueryable<TRole> result = TableRoles.Run<IQueryable<TRole>>(_Context.Connection);
38+
return result;
39+
}
3540
}
3641

3742
public virtual void Dispose()
@@ -41,28 +46,28 @@ public virtual void Dispose()
4146

4247
public virtual Task CreateAsync(TRole role)
4348
{
44-
return Task.Run(() => _Context.Connection.Run(TableRoles.Insert(role)));
49+
return Task.Run(() => TableRoles.Insert(role).Run(_Context.Connection)); // _Context.Connection.Run(TableRoles.Insert(role)));
4550
}
4651

4752
public virtual Task UpdateAsync(TRole role)
4853
{
49-
return Task.Run(() => _Context.Connection.Run(TableRoles.Insert(role, Conflict.Replace)));
54+
return Task.Run(() => TableRoles.Update(role).Run(_Context.Connection)); //_Context.Connection.Run(TableRoles.Insert(role, Conflict.Replace)));
5055
}
5156

5257
public virtual Task DeleteAsync(TRole role)
5358
{
54-
return Task.Run(() => _Context.Connection.Run(TableRoles.Get(role.Id).Delete())); // Select(r => r.Id == role.Id).Delete()));
59+
return Task.Run(() => TableRoles.Get(role.Id).Delete()); // _Context.Connection.Run(TableRoles.Get(role.Id).Delete())); // Select(r => r.Id == role.Id).Delete()));
5560
}
5661

5762
public virtual Task<TRole> FindByIdAsync(string roleId)
5863
{
59-
return Task.Run(() => _Context.Connection.Run(TableRoles.Filter(r => r.Id == roleId)).FirstOrDefault()); // FindOneByIdAs<TRole>(ObjectId.Parse(roleId)));
64+
return Task.Run(() => TableRoles.Get(roleId).RunAtom<TRole>(_Context.Connection)); // _Context.Connection.Run(TableRoles.Filter(r => r.Id == roleId)).FirstOrDefault()); // FindOneByIdAs<TRole>(ObjectId.Parse(roleId)));
6065
}
6166

6267
public virtual Task<TRole> FindByNameAsync(string roleName)
6368
{
6469
//var queryByName = Query.Filter<TRole>(r, Query<TRole>.EQ(r => r.Name, roleName);
65-
return Task.Run(() => _Context.Connection.Run(TableRoles.Filter<TRole>(r => r.Name == roleName)).FirstOrDefault());
70+
return Task.Run(() => TableRoles.Filter(role => role["Name"] == roleName).RunAtom<TRole>(_Context.Connection));// _Context.Connection.Run(TableRoles.Filter<TRole>(r => r.Name == roleName)).FirstOrDefault());
6671
}
6772
}
6873
}

src/AspNet.Identity.RethinkDB/UserStore.cs

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
using System.Security.Claims;
77
using System.Threading.Tasks;
88
using Microsoft.AspNet.Identity;
9-
using global::RethinkDb;
10-
using global::RethinkDb.DatumConverters;
11-
using global::RethinkDb.Expressions;
9+
using RethinkDb.Driver.Ast;
1210

1311
public class UserStore<TUser> : IUserStore<TUser>,
1412
IUserPasswordStore<TUser>,
@@ -24,12 +22,12 @@ public class UserStore<TUser> : IUserStore<TUser>,
2422
where TUser : IdentityUser
2523
{
2624
private readonly IdentityContext _Context;
27-
private readonly ITableQuery<TUser> TableUsers;
25+
private readonly Table TableUsers;
2826

2927
public UserStore(IdentityContext context)
3028
{
3129
_Context = context;
32-
TableUsers = _Context.DB.Table<TUser>("IdentityUsers");
30+
TableUsers = _Context.DB.Table("IdentityUsers");
3331
}
3432

3533
public virtual void Dispose()
@@ -39,29 +37,29 @@ public virtual void Dispose()
3937

4038
public virtual Task CreateAsync(TUser user)
4139
{
42-
return Task.Run(() => _Context.Connection.Run(TableUsers.Insert(user)));
40+
return Task.Run(() => TableUsers.Insert(user).Run(_Context.Connection)); // _Context.Connection.Run(TableUsers.Insert(user)));
4341
}
4442

4543
public virtual Task UpdateAsync(TUser user)
4644
{
4745
// todo should add an optimistic concurrency check
48-
return Task.Run(() => _Context.Connection.Run(TableUsers.Insert(user, Conflict.Replace)));
46+
return Task.Run(() => TableUsers.Update(user).Run(_Context.Connection)); // _Context.Connection.Run(TableUsers.Insert(user, Conflict.Replace)));
4947
}
5048

5149
public virtual Task DeleteAsync(TUser user)
5250
{
53-
return Task.Run(() => _Context.Connection.Run(TableUsers.Get(user.Id).Delete()));
51+
return Task.Run(() => TableUsers.Get(user.Id).Delete().Run(_Context.Connection)); // _Context.Connection.Run(TableUsers.Get(user.Id).Delete()));
5452
}
5553

5654
public virtual Task<TUser> FindByIdAsync(string userId)
5755
{
58-
return Task.Run(() => _Context.Connection.Run(TableUsers.Get(userId)));
56+
return Task.Run(() => TableUsers.Get(userId).RunAtom<TUser>(_Context.Connection)); // _Context.Connection.Run(TableUsers.Get(userId)));
5957
}
6058

6159
public virtual Task<TUser> FindByNameAsync(string userName)
6260
{
6361
// todo exception on duplicates? or better to enforce unique index to ensure this
64-
return Task.Run(() => _Context.Connection.Run(TableUsers.Filter(u => u.UserName == userName)).FirstOrDefault());
62+
return Task.Run(() => TableUsers.Filter(us => us["UserName"] == userName).RunCursor<TUser>(_Context.Connection).FirstOrDefault()); // _Context.Connection.Run(TableUsers.Filter(u => u.UserName == userName)).FirstOrDefault());
6563
}
6664

6765
public virtual Task SetPasswordHashAsync(TUser user, string passwordHash)
@@ -94,7 +92,7 @@ public virtual Task RemoveFromRoleAsync(TUser user, string roleName)
9492

9593
public virtual Task<IList<string>> GetRolesAsync(TUser user)
9694
{
97-
return Task.FromResult((IList<string>) user.Roles);
95+
return Task.FromResult((IList<string>)user.Roles);
9896
}
9997

10098
public virtual Task<bool> IsInRoleAsync(TUser user, string roleName)
@@ -117,13 +115,15 @@ public virtual Task RemoveLoginAsync(TUser user, UserLoginInfo login)
117115

118116
public virtual Task<IList<UserLoginInfo>> GetLoginsAsync(TUser user)
119117
{
120-
return Task.FromResult((IList<UserLoginInfo>) user.Logins);
118+
return Task.FromResult((IList<UserLoginInfo>)user.Logins);
121119
}
122120

123121
public virtual Task<TUser> FindAsync(UserLoginInfo login)
124122
{
125-
return Task.Factory.StartNew(() => _Context.Connection.Run(TableUsers.Filter(u => u.LoginsWrapper.Any(l => l.LoginProvider == login.LoginProvider && l.ProviderKey == login.ProviderKey))).FirstOrDefault());
123+
//return Task.Factory.StartNew(() => _Context.Connection.Run(TableUsers.Filter(u => u.LoginsWrapper.Any(l => l.LoginProvider == login.LoginProvider && l.ProviderKey == login.ProviderKey))).FirstOrDefault());
124+
//return Task.Factory.StartNew(() => TableUsers.Filter(linfo => linfo["LoginProvider"] == login.LoginProvider && linfo["ProviderKey"] == login.ProviderKey).RunCursor<TUser>(_Context.Connection).FirstOrDefault()); // GetAll().RunCursor<TUser>(_Context.Connection).Any(u => u.LoginsWrapper.Any(l => l.LoginProvider == login.LoginProvider && l.ProviderKey == login.ProviderKey).FirstOrDefault()));
126125
// Users.FirstOrDefault(u => u.Logins.Any(l => l.LoginProvider == login.LoginProvider && l.ProviderKey == login.ProviderKey)));
126+
return Task.Factory.StartNew(() => TableUsers.Filter(user => user["Logins"].Filter(linfo => linfo["LoginProvider"] == login.LoginProvider && linfo["ProviderKey"] == login.ProviderKey)).RunCursor<TUser>(_Context.Connection).FirstOrDefault()); // GetAll().RunCursor<TUser>(_Context.Connection).Any(u => u.LoginsWrapper.Any(l => l.LoginProvider == login.LoginProvider && l.ProviderKey == login.ProviderKey).FirstOrDefault()));
127127
}
128128

129129
public virtual Task SetSecurityStampAsync(TUser user, string stamp)
@@ -162,12 +162,13 @@ public virtual Task<string> GetEmailAsync(TUser user)
162162
public virtual Task<TUser> FindByEmailAsync(string email)
163163
{
164164
// todo what if a user can have multiple accounts with the same email?
165-
return Task.Run(() => _Context.Connection.Run(TableUsers.Filter(u => u.Email == email)).FirstOrDefault());
165+
//return Task.Run(() => _Context.Connection.Run(TableUsers.Filter(u => u.Email == email)).FirstOrDefault());
166+
return Task.Run(() => TableUsers.Filter(u => u["Email"] == email).RunCursor<TUser>(_Context.Connection).FirstOrDefault());
166167
}
167168

168169
public virtual Task<IList<Claim>> GetClaimsAsync(TUser user)
169170
{
170-
return Task.FromResult((IList<Claim>) user.Claims.Select(c => c.ToSecurityClaim()).ToList());
171+
return Task.FromResult((IList<Claim>)user.Claims.Select(c => c.ToSecurityClaim()).ToList());
171172
}
172173

173174
public virtual Task AddClaimAsync(TUser user, Claim claim)
@@ -185,7 +186,11 @@ public virtual Task RemoveClaimAsync(TUser user, Claim claim)
185186
public virtual IQueryable<TUser> Users
186187
{
187188
// TODO: Performance?!
188-
get { return _Context.Connection.Run(TableUsers).AsQueryable<TUser>(); }
189+
get
190+
{
191+
//return _Context.Connection.Run(TableUsers).AsQueryable<TUser>();
192+
return TableUsers.RunCursor<TUser>(_Context.Connection).AsQueryable();
193+
}
189194
}
190195

191196
public virtual Task SetPhoneNumberAsync(TUser user, string phoneNumber)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3+
<package id="Common.Logging" version="3.3.0" targetFramework="net45" />
4+
<package id="Common.Logging.Core" version="3.3.0" targetFramework="net45" />
35
<package id="Microsoft.AspNet.Identity.Core" version="2.0.1" targetFramework="net45" />
6+
<package id="Newtonsoft.Json" version="8.0.2" targetFramework="net45" />
47
<package id="protobuf-net" version="2.0.0.666" targetFramework="net45" />
8+
<package id="RethinkDb.Driver" version="2.2.8-beta-3" targetFramework="net45" />
59
</packages>
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Web;
5+
using AspNet.Identity.RethinkDB;
6+
using RethinkDb.Driver;
7+
using RethinkDb.Driver.Ast;
8+
using RethinkDb.Driver.Net;
9+
10+
namespace SampleApplication.App_Start
11+
{
12+
public class ApplicationIdentityContext : IdentityContext, IDisposable
13+
{
14+
private const string DB_NAME = "test";
15+
16+
public ApplicationIdentityContext(IConnection conn, Db db)
17+
: base(conn, db)
18+
{
19+
}
20+
21+
public static ApplicationIdentityContext Create()
22+
{
23+
// Load connection data from Web.config
24+
//IConnectionFactory connectionFactory = ConfigurationAssembler.CreateConnectionFactory("dbcluster");
25+
26+
// Get the connection to the database server(s)
27+
IConnection databaseConnection = RethinkDb.Driver.RethinkDB.R.Connection().Hostname("127.0.0.1").Port(RethinkDBConstants.DefaultPort).Timeout(60).Connect();
28+
// Get an object to use the database
29+
//IDatabaseQuery DB = Query.Db(DB_NAME);
30+
Db DB = RethinkDb.Driver.RethinkDB.R.Db(DB_NAME);
31+
32+
#if DEBUG
33+
// Create DB if it does not exist
34+
//if (!databaseConnection.Run(Query.DbList()).Contains(DB_NAME))
35+
// databaseConnection.Run(Query.DbCreate(DB_NAME));
36+
List<string> result = RethinkDB.R.DbList().RunResult<List<string>>(databaseConnection);
37+
if (!result.Contains(DB_NAME))
38+
{
39+
RethinkDB.R.DbCreate(DB_NAME).Run(databaseConnection);
40+
}
41+
42+
43+
44+
result = RethinkDB.R.Db(DB_NAME).TableList().RunResult<List<string>>(databaseConnection);
45+
if (!result.Contains("IdentityRoles"))
46+
RethinkDB.R.Db(DB_NAME).TableCreate("IdentityRoles").Run(databaseConnection);
47+
if (!result.Contains("IdentityUsers"))
48+
RethinkDB.R.Db(DB_NAME).TableCreate("IdentityUsers").Run(databaseConnection);
49+
50+
// CREATE ADDITIONAL TABLES ETC.
51+
#endif
52+
return new ApplicationIdentityContext(databaseConnection, DB);
53+
}
54+
55+
public void Dispose()
56+
{
57+
}
58+
}
59+
}

0 commit comments

Comments
 (0)