Skip to content

Add filters for id and displayName #89

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 49 additions & 53 deletions Microsoft.SCIM.WebHostSample/Provider/InMemoryUserProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,25 +27,23 @@ public override Task<Resource> CreateAsync(Resource resource, string correlation
throw new HttpResponseException(HttpStatusCode.BadRequest);
}

Core2EnterpriseUser user = resource as Core2EnterpriseUser;
if (string.IsNullOrWhiteSpace(user.UserName))
var user = resource as Core2EnterpriseUser;
if (string.IsNullOrWhiteSpace(user?.UserName))
{
throw new HttpResponseException(HttpStatusCode.BadRequest);
}

IEnumerable<Core2EnterpriseUser> exisitingUsers = this.storage.Users.Values;
IEnumerable<Core2EnterpriseUser> existingUsers = this.storage.Users.Values;
if
(
exisitingUsers.Any(
(Core2EnterpriseUser exisitingUser) =>
string.Equals(exisitingUser.UserName, user.UserName, StringComparison.Ordinal))
existingUsers.Any(existingUser => string.Equals(existingUser.UserName, user.UserName, StringComparison.Ordinal))
)
{
throw new HttpResponseException(HttpStatusCode.Conflict);
}

// Update metadata
DateTime created = DateTime.UtcNow;
var created = DateTime.UtcNow;
user.Metadata.Created = created;
user.Metadata.LastModified = created;

Expand All @@ -64,7 +62,6 @@ public override Task DeleteAsync(IResourceIdentifier resourceIdentifier, string
}

string identifier = resourceIdentifier.Identifier;

if (this.storage.Users.ContainsKey(identifier))
{
this.storage.Users.Remove(identifier);
Expand Down Expand Up @@ -97,20 +94,18 @@ public override Task<Resource[]> QueryAsync(IQueryParameters parameters, string

IEnumerable<Resource> results;
var predicate = PredicateBuilder.False<Core2EnterpriseUser>();
Expression<Func<Core2EnterpriseUser, bool>> predicateAnd;


if (parameters.AlternateFilters.Count <= 0)
{
results = this.storage.Users.Values.Select(
(Core2EnterpriseUser user) => user as Resource);
results = this.storage.Users.Values.Select(user => user as Resource);
}
else
{

foreach (IFilter queryFilter in parameters.AlternateFilters)
{
predicateAnd = PredicateBuilder.True<Core2EnterpriseUser>();
var predicateAnd = PredicateBuilder.True<Core2EnterpriseUser>();

IFilter andFilter = queryFilter;
IFilter currentFilter = andFilter;
Expand All @@ -120,12 +115,24 @@ public override Task<Resource[]> QueryAsync(IQueryParameters parameters, string
{
throw new ArgumentException(SystemForCrossDomainIdentityManagementServiceResources.ExceptionInvalidParameters);
}

else if (string.IsNullOrWhiteSpace(andFilter.ComparisonValue))
{
throw new ArgumentException(SystemForCrossDomainIdentityManagementServiceResources.ExceptionInvalidParameters);
}

// ID filter
else if (andFilter.AttributePath.Equals(AttributeNames.Identifier, StringComparison.OrdinalIgnoreCase))
{
if (andFilter.FilterOperator != ComparisonOperator.Equals)
{
throw new NotSupportedException(
string.Format(SystemForCrossDomainIdentityManagementServiceResources.ExceptionFilterOperatorNotSupportedTemplate, andFilter.FilterOperator));
}

var id = andFilter.ComparisonValue;
predicateAnd = predicateAnd.And(p => string.Equals(p.Identifier, id, StringComparison.OrdinalIgnoreCase));
}

// UserName filter
else if (andFilter.AttributePath.Equals(AttributeNames.UserName, StringComparison.OrdinalIgnoreCase))
{
Expand All @@ -137,8 +144,6 @@ public override Task<Resource[]> QueryAsync(IQueryParameters parameters, string

string userName = andFilter.ComparisonValue;
predicateAnd = predicateAnd.And(p => string.Equals(p.UserName, userName, StringComparison.OrdinalIgnoreCase));


}

// ExternalId filter
Expand All @@ -152,11 +157,9 @@ public override Task<Resource[]> QueryAsync(IQueryParameters parameters, string

string externalIdentifier = andFilter.ComparisonValue;
predicateAnd = predicateAnd.And(p => string.Equals(p.ExternalIdentifier, externalIdentifier, StringComparison.OrdinalIgnoreCase));


}

//Active Filter
// Active Filter
else if (andFilter.AttributePath.Equals(AttributeNames.Active, StringComparison.OrdinalIgnoreCase))
{
if (andFilter.FilterOperator != ComparisonOperator.Equals)
Expand All @@ -167,32 +170,37 @@ public override Task<Resource[]> QueryAsync(IQueryParameters parameters, string

bool active = bool.Parse(andFilter.ComparisonValue);
predicateAnd = predicateAnd.And(p => p.Active == active);
}

// DisplayName Filter
else if (andFilter.AttributePath.Equals(AttributeNames.DisplayName, StringComparison.OrdinalIgnoreCase))
{
if (andFilter.FilterOperator != ComparisonOperator.Equals)
{
throw new NotSupportedException(
string.Format(SystemForCrossDomainIdentityManagementServiceResources.ExceptionFilterOperatorNotSupportedTemplate, andFilter.FilterOperator));
}

var displayName = andFilter.ComparisonValue;
predicateAnd = predicateAnd.And(p => p.DisplayName == displayName);
}

//LastModified filter
// LastModified filter
else if (andFilter.AttributePath.Equals($"{AttributeNames.Metadata}.{AttributeNames.LastModified}", StringComparison.OrdinalIgnoreCase))
{
if (andFilter.FilterOperator == ComparisonOperator.EqualOrGreaterThan)
{
DateTime comparisonValue = DateTime.Parse(andFilter.ComparisonValue).ToUniversalTime();
predicateAnd = predicateAnd.And(p => p.Metadata.LastModified >= comparisonValue);


}
else if (andFilter.FilterOperator == ComparisonOperator.EqualOrLessThan)
{
DateTime comparisonValue = DateTime.Parse(andFilter.ComparisonValue).ToUniversalTime();
predicateAnd = predicateAnd.And(p => p.Metadata.LastModified <= comparisonValue);


}
else
throw new NotSupportedException(
string.Format(SystemForCrossDomainIdentityManagementServiceResources.ExceptionFilterOperatorNotSupportedTemplate, andFilter.FilterOperator));



}
else
throw new NotSupportedException(
Expand All @@ -204,15 +212,14 @@ public override Task<Resource[]> QueryAsync(IQueryParameters parameters, string
} while (currentFilter.AdditionalFilter != null);

predicate = predicate.Or(predicateAnd);

}

results = this.storage.Users.Values.Where(predicate.Compile());
}

if (parameters.PaginationParameters != null)
{
int count = parameters.PaginationParameters.Count.HasValue ? parameters.PaginationParameters.Count.Value : 0;
int count = parameters.PaginationParameters.Count ?? 0;
return Task.FromResult(results.Take(count).ToArray());
}
else
Expand All @@ -226,40 +233,33 @@ public override Task<Resource> ReplaceAsync(Resource resource, string correlatio
throw new HttpResponseException(HttpStatusCode.BadRequest);
}

Core2EnterpriseUser user = resource as Core2EnterpriseUser;

if (string.IsNullOrWhiteSpace(user.UserName))
var user = resource as Core2EnterpriseUser;
if (string.IsNullOrWhiteSpace(user?.UserName))
{
throw new HttpResponseException(HttpStatusCode.BadRequest);
}

if
(
this.storage.Users.Values.Any(
(Core2EnterpriseUser exisitingUser) =>
string.Equals(exisitingUser.UserName, user.UserName, StringComparison.Ordinal) &&
!string.Equals(exisitingUser.Identifier, user.Identifier, StringComparison.OrdinalIgnoreCase))
)
if (this.storage.Users.Values.Any(existingUser =>
string.Equals(existingUser.UserName, user.UserName, StringComparison.Ordinal) &&
!string.Equals(existingUser.Identifier, user.Identifier, StringComparison.OrdinalIgnoreCase)))
{
throw new HttpResponseException(HttpStatusCode.Conflict);
}

Core2EnterpriseUser exisitingUser = this.storage.Users.Values
.FirstOrDefault(
(Core2EnterpriseUser exisitingUser) =>
string.Equals(exisitingUser.Identifier, user.Identifier, StringComparison.OrdinalIgnoreCase)
);
if (exisitingUser == null)
Core2EnterpriseUser existingUser = this.storage.Users.Values
.FirstOrDefault(existingUser =>
string.Equals(existingUser.Identifier, user.Identifier, StringComparison.OrdinalIgnoreCase));
if (existingUser == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}

// Update metadata
user.Metadata.Created = exisitingUser.Metadata.Created;
user.Metadata.Created = existingUser.Metadata.Created;
user.Metadata.LastModified = DateTime.UtcNow;

this.storage.Users[user.Identifier] = user;
Resource result = user as Resource;
var result = user as Resource;
return Task.FromResult(result);
}

Expand All @@ -280,14 +280,12 @@ public override Task<Resource> RetrieveAsync(IResourceRetrievalParameters parame
throw new ArgumentNullException(nameof(parameters));
}

Resource result = null;
string identifier = parameters.ResourceIdentifier.Identifier;

if (this.storage.Users.ContainsKey(identifier))
{
if (this.storage.Users.TryGetValue(identifier, out Core2EnterpriseUser user))
if (this.storage.Users.TryGetValue(identifier, out var user))
{
result = user as Resource;
var result = user as Resource;
return Task.FromResult(result);
}
}
Expand Down Expand Up @@ -317,9 +315,7 @@ public override Task UpdateAsync(IPatch patch, string correlationIdentifier)
throw new ArgumentException(SystemForCrossDomainIdentityManagementServiceResources.ExceptionInvalidOperation);
}

PatchRequest2 patchRequest =
patch.PatchRequest as PatchRequest2;

PatchRequest2 patchRequest = patch.PatchRequest as PatchRequest2;
if (null == patchRequest)
{
string unsupportedPatchTypeName = patch.GetType().FullName;
Expand Down
Loading