Resolved Id assignment problem for collections.

pull/81/head
Halil İbrahim Kalkan 9 years ago
parent bdb644b8df
commit e10b305fe0

@ -4,6 +4,7 @@ using System.Collections.ObjectModel;
using System.Security.Claims; using System.Security.Claims;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Entities;
using Volo.Abp.Guids;
using Volo.ExtensionMethods.Collections.Generic; using Volo.ExtensionMethods.Collections.Generic;
namespace Volo.Abp.Identity namespace Volo.Abp.Identity
@ -57,20 +58,22 @@ namespace Volo.Abp.Identity
ConcurrencyStamp = Guid.NewGuid().ToString(); ConcurrencyStamp = Guid.NewGuid().ToString();
} }
public void AddClaim([NotNull] Claim claim) public void AddClaim([NotNull] IGuidGenerator guidGenerator, [NotNull] Claim claim)
{ {
Check.NotNull(guidGenerator, nameof(guidGenerator));
Check.NotNull(claim, nameof(claim)); Check.NotNull(claim, nameof(claim));
Claims.Add(new IdentityRoleClaim(Id, claim)); Claims.Add(new IdentityRoleClaim(guidGenerator.Create(), Id, claim));
} }
public void AddClaims([NotNull] IEnumerable<Claim> claims) public void AddClaims([NotNull] IGuidGenerator guidGenerator, [NotNull] IEnumerable<Claim> claims)
{ {
Check.NotNull(guidGenerator, nameof(guidGenerator));
Check.NotNull(claims, nameof(claims)); Check.NotNull(claims, nameof(claims));
foreach (var claim in claims) foreach (var claim in claims)
{ {
AddClaim(claim); AddClaim(guidGenerator, claim);
} }
} }

@ -33,21 +33,17 @@ namespace Volo.Abp.Identity
} }
public IdentityRoleClaim(Guid roleId, [NotNull] Claim claim) public IdentityRoleClaim(Guid id, Guid roleId, [NotNull] Claim claim)
: this(id, roleId, claim.Type, claim.Value)
{ {
//TODO: Where to set Id?
Check.NotNull(claim, nameof(claim));
RoleId = roleId;
ClaimType = claim.Type;
ClaimValue = claim.Value;
} }
public IdentityRoleClaim(Guid roleId, [NotNull] string claimType, string claimValue) public IdentityRoleClaim(Guid id, Guid roleId, [NotNull] string claimType, string claimValue)
{ {
Check.NotNull(claimType, nameof(claimType)); Check.NotNull(claimType, nameof(claimType));
Id = id;
RoleId = roleId; RoleId = roleId;
ClaimType = claimType; ClaimType = claimType;
ClaimValue = claimValue; ClaimValue = claimValue;

@ -6,13 +6,14 @@ using System.Security.Claims;
using JetBrains.Annotations; using JetBrains.Annotations;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Entities;
using Volo.Abp.Guids;
using Volo.ExtensionMethods.Collections.Generic; using Volo.ExtensionMethods.Collections.Generic;
namespace Volo.Abp.Identity namespace Volo.Abp.Identity
{ {
//TODO: Properties should not be public! //TODO: Properties should not be public!
//TODO: Add Name/Surname/FullName? //TODO: Add Name/Surname/FullName?
public class IdentityUser : AggregateRoot, IHasConcurrencyStamp public class IdentityUser : AggregateRoot, IHasConcurrencyStamp
{ {
public const int MaxUserNameLength = 256; public const int MaxUserNameLength = 256;
@ -133,7 +134,7 @@ namespace Volo.Abp.Identity
ConcurrencyStamp = Guid.NewGuid().ToString(); ConcurrencyStamp = Guid.NewGuid().ToString();
} }
public void AddRole(Guid roleId) public void AddRole(IGuidGenerator guidGenerator, Guid roleId)
{ {
Check.NotNull(roleId, nameof(roleId)); Check.NotNull(roleId, nameof(roleId));
@ -142,19 +143,19 @@ namespace Volo.Abp.Identity
return; return;
} }
Roles.Add(new IdentityUserRole(Id, roleId)); Roles.Add(new IdentityUserRole(guidGenerator.Create(), Id, roleId));
} }
public void RemoveRole(Guid roleId) public void RemoveRole(Guid roleId)
{ {
Check.NotNull(roleId, nameof(roleId)); Check.NotNull(roleId, nameof(roleId));
if (Roles.All(r => r.RoleId != roleId)) if (!IsInRole(roleId))
{ {
return; return;
} }
Roles.Add(new IdentityUserRole(Id, roleId)); Roles.RemoveAll(r => r.RoleId == roleId);
} }
public bool IsInRole(Guid roleId) public bool IsInRole(Guid roleId)
@ -164,20 +165,22 @@ namespace Volo.Abp.Identity
return Roles.Any(r => r.RoleId == roleId); return Roles.Any(r => r.RoleId == roleId);
} }
public void AddClaim([NotNull] Claim claim) public void AddClaim([NotNull] IGuidGenerator guidGenerator, [NotNull] Claim claim)
{ {
Check.NotNull(guidGenerator, nameof(guidGenerator));
Check.NotNull(claim, nameof(claim)); Check.NotNull(claim, nameof(claim));
Claims.Add(new IdentityUserClaim(Id, claim)); Claims.Add(new IdentityUserClaim(guidGenerator.Create(), Id, claim));
} }
public void AddClaims([NotNull] IEnumerable<Claim> claims) public void AddClaims([NotNull] IGuidGenerator guidGenerator, [NotNull] IEnumerable<Claim> claims)
{ {
Check.NotNull(guidGenerator, nameof(guidGenerator));
Check.NotNull(claims, nameof(claims)); Check.NotNull(claims, nameof(claims));
foreach (var claim in claims) foreach (var claim in claims)
{ {
AddClaim(claim); AddClaim(guidGenerator, claim);
} }
} }
@ -210,11 +213,12 @@ namespace Volo.Abp.Identity
Claims.RemoveAll(c => c.ClaimValue == claim.Value && c.ClaimType == claim.Type); Claims.RemoveAll(c => c.ClaimValue == claim.Value && c.ClaimType == claim.Type);
} }
public void AddLogin([NotNull] UserLoginInfo login) public void AddLogin([NotNull] IGuidGenerator guidGenerator, [NotNull] UserLoginInfo login)
{ {
Check.NotNull(guidGenerator, nameof(guidGenerator));
Check.NotNull(login, nameof(login)); Check.NotNull(login, nameof(login));
Logins.Add(new IdentityUserLogin(Id, login)); Logins.Add(new IdentityUserLogin(guidGenerator.Create(), Id, login));
} }
public void RemoveLogin([NotNull] string loginProvider, [NotNull] string providerKey) public void RemoveLogin([NotNull] string loginProvider, [NotNull] string providerKey)
@ -231,13 +235,12 @@ namespace Volo.Abp.Identity
return Tokens.FirstOrDefault(t => t.LoginProvider == loginProvider && t.Name == name); return Tokens.FirstOrDefault(t => t.LoginProvider == loginProvider && t.Name == name);
} }
public void SetToken(string loginProvider, string name, string value) public void SetToken(IGuidGenerator guidGenerator, string loginProvider, string name, string value)
{ {
var token = FindToken(loginProvider, name); var token = FindToken(loginProvider, name);
if (token == null) if (token == null)
{ {
Tokens.Add(new IdentityUserToken(guidGenerator.Create(), Id, loginProvider, name, value));
Tokens.Add(new IdentityUserToken(Id, loginProvider, name, value));
} }
else else
{ {

@ -33,21 +33,17 @@ namespace Volo.Abp.Identity
} }
public IdentityUserClaim(Guid userId, [NotNull] Claim claim) public IdentityUserClaim(Guid id, Guid userId, [NotNull] Claim claim)
: this(id, userId, claim.Type, claim.Value)
{ {
//TODO: Where to set Id?
Check.NotNull(claim, nameof(claim));
UserId = userId;
ClaimType = claim.Type;
ClaimValue = claim.Value;
} }
public IdentityUserClaim(Guid userId, [NotNull] string claimType, string claimValue) public IdentityUserClaim(Guid id, Guid userId, [NotNull] string claimType, string claimValue)
{ {
Check.NotNull(claimType, nameof(claimType)); Check.NotNull(claimType, nameof(claimType));
Id = id;
UserId = userId; UserId = userId;
ClaimType = claimType; ClaimType = claimType;
ClaimValue = claimValue; ClaimValue = claimValue;

@ -41,27 +41,22 @@ namespace Volo.Abp.Identity
} }
public IdentityUserLogin(Guid userId, [NotNull] string loginProvider, [NotNull] string providerKey, string providerDisplayName) public IdentityUserLogin(Guid id, Guid userId, [NotNull] string loginProvider, [NotNull] string providerKey, string providerDisplayName)
{ {
Check.NotNull(loginProvider, nameof(loginProvider)); Check.NotNull(loginProvider, nameof(loginProvider));
Check.NotNull(providerKey, nameof(providerKey)); Check.NotNull(providerKey, nameof(providerKey));
//TODO: Where to set Id? Id = id;
UserId = userId; UserId = userId;
LoginProvider = loginProvider; LoginProvider = loginProvider;
ProviderKey = providerKey; ProviderKey = providerKey;
ProviderDisplayName = providerDisplayName; ProviderDisplayName = providerDisplayName;
} }
public IdentityUserLogin(Guid userId, UserLoginInfo login) public IdentityUserLogin(Guid id, Guid userId, [NotNull] UserLoginInfo login)
: this(id, userId, login.LoginProvider, login.ProviderKey, login.ProviderDisplayName)
{ {
Check.NotNull(login, nameof(login));
UserId = userId;
LoginProvider = login.LoginProvider;
ProviderKey = login.ProviderKey;
ProviderDisplayName = login.ProviderDisplayName;
} }
public UserLoginInfo ToUserLoginInfo() public UserLoginInfo ToUserLoginInfo()

@ -23,10 +23,9 @@ namespace Volo.Abp.Identity
} }
public IdentityUserRole(Guid userId, Guid roleId) public IdentityUserRole(Guid id, Guid userId, Guid roleId)
{ {
//TODO: Where to set Id? Id = id;
UserId = userId; UserId = userId;
RoleId = roleId; RoleId = roleId;
} }

@ -36,13 +36,12 @@ namespace Volo.Abp.Identity
} }
public IdentityUserToken(Guid userId, [NotNull] string loginProvider, [NotNull] string name, string value) public IdentityUserToken(Guid id, Guid userId, [NotNull] string loginProvider, [NotNull] string name, string value)
{ {
Check.NotNull(loginProvider, nameof(loginProvider)); Check.NotNull(loginProvider, nameof(loginProvider));
Check.NotNull(name, nameof(name)); Check.NotNull(name, nameof(name));
//TODO: Where to set Id? Id = id;
UserId = userId; UserId = userId;
LoginProvider = loginProvider; LoginProvider = loginProvider;
Name = name; Name = name;

@ -7,6 +7,7 @@ using System.Threading.Tasks;
using JetBrains.Annotations; using JetBrains.Annotations;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Volo.Abp.Guids;
using Volo.Abp.Uow; using Volo.Abp.Uow;
using Volo.DependencyInjection; using Volo.DependencyInjection;
@ -23,19 +24,22 @@ namespace Volo.Abp.Identity
private readonly IIdentityRoleRepository _roleRepository; private readonly IIdentityRoleRepository _roleRepository;
private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly ILogger<RoleStore> _logger; private readonly ILogger<RoleStore> _logger;
private readonly IGuidGenerator _guidGenerator;
/// <summary> /// <summary>
/// Constructs a new instance of <see cref="RoleStore"/>. /// Constructs a new instance of <see cref="RoleStore"/>.
/// </summary> /// </summary>
public RoleStore( public RoleStore(
IIdentityRoleRepository roleRepository,
IUnitOfWorkManager unitOfWorkManager, IUnitOfWorkManager unitOfWorkManager,
IIdentityRoleRepository roleRepository,
ILogger<RoleStore> logger, ILogger<RoleStore> logger,
IGuidGenerator guidGenerator,
IdentityErrorDescriber describer = null) IdentityErrorDescriber describer = null)
{ {
_roleRepository = roleRepository;
_unitOfWorkManager = unitOfWorkManager; _unitOfWorkManager = unitOfWorkManager;
_roleRepository = roleRepository;
_logger = logger; _logger = logger;
_guidGenerator = guidGenerator;
ErrorDescriber = describer ?? new IdentityErrorDescriber(); ErrorDescriber = describer ?? new IdentityErrorDescriber();
} }
@ -281,7 +285,7 @@ namespace Volo.Abp.Identity
Check.NotNull(role, nameof(role)); Check.NotNull(role, nameof(role));
Check.NotNull(claim, nameof(claim)); Check.NotNull(claim, nameof(claim));
role.AddClaim(claim); role.AddClaim(_guidGenerator, claim);
return Task.FromResult(false); return Task.FromResult(false);
} }

@ -8,9 +8,9 @@ using System.Threading.Tasks;
using JetBrains.Annotations; using JetBrains.Annotations;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Volo.Abp.Guids;
using Volo.Abp.Uow; using Volo.Abp.Uow;
using Volo.DependencyInjection; using Volo.DependencyInjection;
using Volo.ExtensionMethods;
namespace Volo.Abp.Identity namespace Volo.Abp.Identity
{ {
@ -44,6 +44,7 @@ namespace Volo.Abp.Identity
public bool AutoSaveChanges { get; set; } = true; public bool AutoSaveChanges { get; set; } = true;
private readonly IIdentityRoleRepository _roleRepository; private readonly IIdentityRoleRepository _roleRepository;
private readonly IGuidGenerator _guidGenerator;
private readonly ILogger<RoleStore> _logger; private readonly ILogger<RoleStore> _logger;
private readonly IIdentityUserRepository _userRepository; private readonly IIdentityUserRepository _userRepository;
private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IUnitOfWorkManager _unitOfWorkManager;
@ -52,12 +53,14 @@ namespace Volo.Abp.Identity
IUnitOfWorkManager unitOfWorkManager, IUnitOfWorkManager unitOfWorkManager,
IIdentityUserRepository userRepository, IIdentityUserRepository userRepository,
IIdentityRoleRepository roleRepository, IIdentityRoleRepository roleRepository,
IGuidGenerator guidGenerator,
ILogger<RoleStore> logger, ILogger<RoleStore> logger,
IdentityErrorDescriber describer = null) //TODO: describer? TODO: Test if DI supports optional injection IdentityErrorDescriber describer = null) //TODO: describer? TODO: Test if DI supports optional injection
{ {
_unitOfWorkManager = unitOfWorkManager; _unitOfWorkManager = unitOfWorkManager;
_userRepository = userRepository; _userRepository = userRepository;
_roleRepository = roleRepository; _roleRepository = roleRepository;
_guidGenerator = guidGenerator;
_logger = logger; _logger = logger;
ErrorDescriber = describer ?? new IdentityErrorDescriber(); ErrorDescriber = describer ?? new IdentityErrorDescriber();
@ -320,11 +323,7 @@ namespace Volo.Abp.Identity
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
Check.NotNull(user, nameof(user)); Check.NotNull(user, nameof(user));
Check.NotNull(normalizedRoleName, nameof(normalizedRoleName));
if (normalizedRoleName.IsNullOrWhiteSpace()) //TODO: Create a Check.NotNullOrWhiteSpace()?
{
throw new ArgumentException(nameof(normalizedRoleName) + " can not be null or whitespace");
}
var role = await _roleRepository.FindByNormalizedNameAsync(normalizedRoleName, cancellationToken); var role = await _roleRepository.FindByNormalizedNameAsync(normalizedRoleName, cancellationToken);
@ -333,7 +332,7 @@ namespace Volo.Abp.Identity
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "Role {0} does not exist.", normalizedRoleName)); //TODO: Localize throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, "Role {0} does not exist.", normalizedRoleName)); //TODO: Localize
} }
user.AddRole(role.Id); user.AddRole(_guidGenerator, role.Id);
} }
/// <summary> /// <summary>
@ -443,7 +442,7 @@ namespace Volo.Abp.Identity
Check.NotNull(user, nameof(user)); Check.NotNull(user, nameof(user));
Check.NotNull(claims, nameof(claims)); Check.NotNull(claims, nameof(claims));
user.AddClaims(claims); user.AddClaims(_guidGenerator, claims);
return Task.CompletedTask; return Task.CompletedTask;
} }
@ -502,7 +501,7 @@ namespace Volo.Abp.Identity
Check.NotNull(user, nameof(user)); Check.NotNull(user, nameof(user));
Check.NotNull(login, nameof(login)); Check.NotNull(login, nameof(login));
user.AddLogin(login); user.AddLogin(_guidGenerator, login);
return Task.CompletedTask; return Task.CompletedTask;
} }
@ -998,7 +997,7 @@ namespace Volo.Abp.Identity
Check.NotNull(user, nameof(user)); Check.NotNull(user, nameof(user));
user.SetToken(loginProvider, name, value); user.SetToken(_guidGenerator, loginProvider, name, value);
return Task.CompletedTask; return Task.CompletedTask;
} }

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.ExtensionMethods;
using Volo.ExtensionMethods.Collections.Generic; using Volo.ExtensionMethods.Collections.Generic;
namespace Volo namespace Volo
@ -20,6 +21,17 @@ namespace Volo
return value; return value;
} }
[ContractAnnotation("value:null => halt")]
public static string NotNullOrWhiteSpace(string value, [InvokerParameterName] [NotNull] string parameterName)
{
if (value.IsNullOrWhiteSpace())
{
throw new ArgumentException($"{parameterName} can not be null, empty or white space!", parameterName);
}
return value;
}
[ContractAnnotation("value:null => halt")] [ContractAnnotation("value:null => halt")]
public static ICollection<T> NotNullOrEmpty<T>(ICollection<T> value, [InvokerParameterName] [NotNull] string parameterName) public static ICollection<T> NotNullOrEmpty<T>(ICollection<T> value, [InvokerParameterName] [NotNull] string parameterName)
{ {

Loading…
Cancel
Save