notes and unit test, just wanted to see if this query could be improved but it can't

This commit is contained in:
Shannon
2020-08-19 13:33:49 +10:00
parent 9fc3699a48
commit 9a1de6468b
2 changed files with 50 additions and 19 deletions

View File

@@ -168,10 +168,7 @@ ORDER BY colName";
}
public Guid CreateLoginSession(int userId, string requestingIpAddress, bool cleanStaleSessions = true)
{
// TODO: I know this doesn't follow the normal repository conventions which would require us to create a UserSessionRepository
//and also business logic models for these objects but that's just so overkill for what we are doing
//and now that everything is properly in a transaction (Scope) there doesn't seem to be much reason for using that anymore
{
var now = DateTime.UtcNow;
var dto = new UserLoginDto
{
@@ -201,13 +198,14 @@ ORDER BY colName";
// that query is going to run a *lot*, make it a template
var t = SqlContext.Templates.Get("Umbraco.Core.UserRepository.ValidateLoginSession", s => s
.Select<UserLoginDto>()
.SelectTop(1)
.From<UserLoginDto>()
.Where<UserLoginDto>(x => x.SessionId == SqlTemplate.Arg<Guid>("sessionId"))
.ForUpdate());
var sql = t.Sql(sessionId);
var found = Database.Query<UserLoginDto>(sql).FirstOrDefault();
var found = Database.FirstOrDefault<UserLoginDto>(sql);
if (found == null || found.UserId != userId || found.LoggedOutUtc.HasValue)
return false;

View File

@@ -16,6 +16,7 @@ using Umbraco.Tests.Testing;
using Umbraco.Core.Persistence;
using Umbraco.Core.PropertyEditors;
using System;
using Umbraco.Core.Persistence.Dtos;
namespace Umbraco.Tests.Persistence.Repositories
{
@@ -76,12 +77,44 @@ namespace Umbraco.Tests.Persistence.Repositories
return new UserGroupRepository(accessor, AppCaches.Disabled, Logger);
}
[Test]
public void Validate_Login_Session()
{
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
var user = MockedUser.CreateUser();
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
repository.Save(user);
}
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
var sessionId = repository.CreateLoginSession(user.Id, "1.2.3.4");
// manually update this record to be in the past
scope.Database.Execute(SqlContext.Sql()
.Update<UserLoginDto>(u => u.Set(x => x.LoggedOutUtc, DateTime.UtcNow.AddDays(-100)))
.Where<UserLoginDto>(x => x.SessionId == sessionId));
var isValid = repository.ValidateLoginSession(user.Id, sessionId);
Assert.IsFalse(isValid);
// create a new one
sessionId = repository.CreateLoginSession(user.Id, "1.2.3.4");
isValid = repository.ValidateLoginSession(user.Id, sessionId);
Assert.IsTrue(isValid);
}
}
[Test]
public void Can_Perform_Add_On_UserRepository()
{
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
@@ -101,7 +134,7 @@ namespace Umbraco.Tests.Persistence.Repositories
{
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
@@ -125,7 +158,7 @@ namespace Umbraco.Tests.Persistence.Repositories
{
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
@@ -150,7 +183,7 @@ namespace Umbraco.Tests.Persistence.Repositories
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
using (var scope = provider.CreateScope(autoComplete: true))
{
var userRepository = CreateRepository(provider);
var contentRepository = CreateContentRepository(provider, out var contentTypeRepo);
@@ -209,7 +242,7 @@ namespace Umbraco.Tests.Persistence.Repositories
{
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
@@ -237,7 +270,7 @@ namespace Umbraco.Tests.Persistence.Repositories
{
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
var userGroupRepository = CreateUserGroupRepository(provider);
@@ -260,7 +293,7 @@ namespace Umbraco.Tests.Persistence.Repositories
{
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
@@ -280,7 +313,7 @@ namespace Umbraco.Tests.Persistence.Repositories
{
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
@@ -301,7 +334,7 @@ namespace Umbraco.Tests.Persistence.Repositories
{
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
@@ -322,7 +355,7 @@ namespace Umbraco.Tests.Persistence.Repositories
{
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
@@ -341,7 +374,7 @@ namespace Umbraco.Tests.Persistence.Repositories
{
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
@@ -360,7 +393,7 @@ namespace Umbraco.Tests.Persistence.Repositories
public void Can_Get_Paged_Results_By_Query_And_Filter_And_Groups()
{
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
@@ -393,7 +426,7 @@ namespace Umbraco.Tests.Persistence.Repositories
public void Can_Get_Paged_Results_With_Filter_And_Groups()
{
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
@@ -426,7 +459,7 @@ namespace Umbraco.Tests.Persistence.Repositories
{
// Arrange
var provider = TestObjects.GetScopeProvider(Logger);
using (var scope = provider.CreateScope())
using (var scope = provider.CreateScope(autoComplete: true))
{
var repository = CreateRepository(provider);
var userGroupRepository = CreateUserGroupRepository(provider);