private async Task <IActionResult> InternalAdd(RepresentationParameter jobj) { _logger.LogInformation(string.Format(Global.AddResource, jobj.ToString())); try { var command = new AddRepresentationCommand(_resourceType, jobj); var scimRepresentation = await _addRepresentationCommandHandler.Handle(command); return(BuildHTTPResult(scimRepresentation, HttpStatusCode.Created, false)); } catch (SCIMSchemaViolatedException ex) { _logger.LogError(ex, ex.Message); return(this.BuildError(HttpStatusCode.BadRequest, ex.Message, SCIMConstants.ErrorSCIMTypes.SchemaViolated)); } catch (SCIMBadSyntaxException ex) { _logger.LogError(ex, ex.Message); return(this.BuildError(HttpStatusCode.BadRequest, ex.Message, SCIMConstants.ErrorSCIMTypes.InvalidSyntax)); } catch (SCIMUniquenessAttributeException ex) { _logger.LogError(ex, ex.Message); return(this.BuildError(HttpStatusCode.Conflict, ex.Message, SCIMConstants.ErrorSCIMTypes.Uniqueness)); } catch (Exception ex) { _logger.LogError(ex, ex.Message); return(this.BuildError(HttpStatusCode.InternalServerError, ex.ToString(), SCIMConstants.ErrorSCIMTypes.InternalServerError)); } }
public async Task <SCIMRepresentation> Handle(AddRepresentationCommand addRepresentationCommand) { var requestedSchemas = addRepresentationCommand.Representation.Schemas; if (!requestedSchemas.Any()) { throw new SCIMBadSyntaxException(string.Format(Global.AttributeMissing, SCIMConstants.StandardSCIMRepresentationAttributes.Schemas)); } var schema = await _scimSchemaQueryRepository.FindRootSCIMSchemaByResourceType(addRepresentationCommand.ResourceType); var allSchemas = new List <string> { schema.Id }; var requiredSchemas = new List <string> { schema.Id }; allSchemas.AddRange(schema.SchemaExtensions.Select(s => s.Schema)); requiredSchemas.AddRange(schema.SchemaExtensions.Where(s => s.Required).Select(s => s.Schema)); var missingRequiredSchemas = requiredSchemas.Where(s => !requestedSchemas.Contains(s)); if (missingRequiredSchemas.Any()) { throw new SCIMBadSyntaxException(string.Format(Global.RequiredSchemasAreMissing, string.Join(",", missingRequiredSchemas))); } var unsupportedSchemas = requestedSchemas.Where(s => !allSchemas.Contains(s)); if (unsupportedSchemas.Any()) { throw new SCIMBadSyntaxException(string.Format(Global.SchemasAreUnknown, string.Join(",", unsupportedSchemas))); } var schemas = await _scimSchemaQueryRepository.FindSCIMSchemaByIdentifiers(requestedSchemas); var version = Guid.NewGuid().ToString(); var scimRepresentation = _scimRepresentationHelper.ExtractSCIMRepresentationFromJSON(addRepresentationCommand.Representation.Attributes, addRepresentationCommand.Representation.ExternalId, schema, schemas.Where(s => s.Id != schema.Id).ToList()); scimRepresentation.Id = Guid.NewGuid().ToString(); scimRepresentation.SetCreated(DateTime.UtcNow); scimRepresentation.SetUpdated(DateTime.UtcNow); scimRepresentation.SetVersion(version); scimRepresentation.SetResourceType(addRepresentationCommand.ResourceType); var uniqueServerAttributeIds = scimRepresentation.Attributes.Where(a => a.SchemaAttribute.MultiValued == false && a.SchemaAttribute.Uniqueness == SCIMSchemaAttributeUniqueness.SERVER); var uniqueGlobalAttributes = scimRepresentation.Attributes.Where(a => a.SchemaAttribute.MultiValued == false && a.SchemaAttribute.Uniqueness == SCIMSchemaAttributeUniqueness.GLOBAL); await CheckSCIMRepresentationExistsForGivenUniqueAttributes(uniqueServerAttributeIds, addRepresentationCommand.ResourceType); await CheckSCIMRepresentationExistsForGivenUniqueAttributes(uniqueGlobalAttributes); using (var transaction = await _scimRepresentationCommandRepository.StartTransaction()) { await _scimRepresentationCommandRepository.Add(scimRepresentation); await transaction.Commit(); } scimRepresentation.ApplyEmptyArray(); return(scimRepresentation); }
private async Task <IActionResult> InternalAdd([FromBody] JObject jobj) { try { var command = new AddRepresentationCommand(_scimEndpoint, _schemas.Select(s => s.Id).ToList(), jobj); var scimRepresentation = await _addRepresentationCommandHandler.Handle(command); return(BuildHTTPResult(scimRepresentation, HttpStatusCode.Created, false)); } catch (SCIMBadRequestException) { return(this.BuildError(HttpStatusCode.BadRequest, "Request is unparsable, syntactically incorrect, or violates schema.", "invalidSyntax")); } catch (SCIMUniquenessAttributeException) { return(this.BuildError(HttpStatusCode.Conflict, "One or more of the attribute values are already in use or are reserved.", "uniqueness")); } }
protected async Task <IActionResult> InternalAdd(RepresentationParameter jobj) { if (jobj == null) { return(this.BuildError(HttpStatusCode.BadRequest, Global.HttpPostNotWellFormatted, SCIMConstants.ErrorSCIMTypes.InvalidSyntax)); } _logger.LogInformation(Global.AddResource); try { var command = new AddRepresentationCommand(_resourceType, jobj, Request.GetAbsoluteUriWithVirtualPath()); var scimRepresentation = await _addRepresentationCommandHandler.Handle(command); var location = GetLocation(scimRepresentation); var content = scimRepresentation.ToResponse(location, false); if (SCIMConstants.MappingScimResourceTypeToCommonType.ContainsKey(scimRepresentation.ResourceType)) { await _busControl.Publish(new RepresentationAddedEvent(scimRepresentation.Id, scimRepresentation.Version, SCIMConstants.MappingScimResourceTypeToCommonType[scimRepresentation.ResourceType], content, _options.IncludeToken ? Request.GetToken() : string.Empty)); } return(BuildHTTPResult(HttpStatusCode.Created, location, scimRepresentation.Version, content)); } catch (SCIMSchemaViolatedException ex) { _logger.LogError(ex, ex.Message); return(this.BuildError(HttpStatusCode.BadRequest, ex.Message, SCIMConstants.ErrorSCIMTypes.SchemaViolated)); } catch (SCIMBadSyntaxException ex) { _logger.LogError(ex, ex.Message); return(this.BuildError(HttpStatusCode.BadRequest, ex.Message, SCIMConstants.ErrorSCIMTypes.InvalidSyntax)); } catch (SCIMUniquenessAttributeException ex) { _logger.LogError(ex, ex.Message); return(this.BuildError(HttpStatusCode.Conflict, ex.Message, SCIMConstants.ErrorSCIMTypes.Uniqueness)); } catch (Exception ex) { _logger.LogError(ex, ex.Message); return(this.BuildError(HttpStatusCode.InternalServerError, ex.ToString(), SCIMConstants.ErrorSCIMTypes.InternalServerError)); } }
public async Task <SCIMRepresentation> Handle(AddRepresentationCommand addRepresentationCommand) { var requestedSchemas = addRepresentationCommand.Representation.GetSchemas(); if (!requestedSchemas.Any()) { throw new SCIMBadRequestException("invalidRequest", $"{SCIMConstants.StandardSCIMRepresentationAttributes.Schemas} attribute is missing"); } if (!addRepresentationCommand.SchemaIds.Any(s => requestedSchemas.Contains(s))) { throw new SCIMBadRequestException("invalidRequest", $"some schemas are not recognized by the endpoint"); } var schemas = await _scimSchemaQueryRepository.FindSCIMSchemaByIdentifiers(requestedSchemas); var unsupportedSchemas = requestedSchemas.Where(s => !schemas.Any(sh => sh.Id == s)); if (unsupportedSchemas.Any()) { throw new SCIMBadRequestException("invalidRequest", $"{string.Join(",", unsupportedSchemas)} schemas are unknown"); } var version = Guid.NewGuid().ToString(); var scimRepresentation = _scimRepresentationHelper.ExtractSCIMRepresentationFromJSON(addRepresentationCommand.Representation, schemas.ToList()); scimRepresentation.Id = Guid.NewGuid().ToString(); scimRepresentation.SetCreated(DateTime.UtcNow); scimRepresentation.SetUpdated(DateTime.UtcNow); scimRepresentation.SetVersion(version); scimRepresentation.SetResourceType(addRepresentationCommand.ResourceType); var uniqueServerAttributeIds = scimRepresentation.Attributes.Where(a => a.SchemaAttribute.MultiValued == false && a.SchemaAttribute.Uniqueness == SCIMSchemaAttributeUniqueness.SERVER); var uniqueGlobalAttributes = scimRepresentation.Attributes.Where(a => a.SchemaAttribute.MultiValued == false && a.SchemaAttribute.Uniqueness == SCIMSchemaAttributeUniqueness.GLOBAL); await CheckSCIMRepresentationExistsForGivenUniqueAttributes(uniqueServerAttributeIds, addRepresentationCommand.ResourceType); await CheckSCIMRepresentationExistsForGivenUniqueAttributes(uniqueGlobalAttributes); _scimRepresentationCommandRepository.Add(scimRepresentation); await _scimRepresentationCommandRepository.SaveChanges(); return(scimRepresentation); }
protected async Task <IActionResult> InternalAdd(RepresentationParameter jobj) { if (jobj == null) { return(this.BuildError(HttpStatusCode.BadRequest, Global.HttpPostNotWellFormatted, SCIMConstants.ErrorSCIMTypes.InvalidSyntax)); } _logger.LogInformation(string.Format(Global.AddResource, jobj.ToString())); try { var command = new AddRepresentationCommand(_resourceType, jobj); var scimRepresentation = await _addRepresentationCommandHandler.Handle(command); var location = GetLocation(scimRepresentation); var content = scimRepresentation.ToResponse(location, false); await _busControl.Publish(new RepresentationAddedEvent(scimRepresentation.Id, scimRepresentation.VersionNumber, _resourceType, content)); return(BuildHTTPResult(HttpStatusCode.Created, location, scimRepresentation.Version, content)); } catch (SCIMSchemaViolatedException ex) { _logger.LogError(ex, ex.Message); return(this.BuildError(HttpStatusCode.BadRequest, ex.Message, SCIMConstants.ErrorSCIMTypes.SchemaViolated)); } catch (SCIMBadSyntaxException ex) { _logger.LogError(ex, ex.Message); return(this.BuildError(HttpStatusCode.BadRequest, ex.Message, SCIMConstants.ErrorSCIMTypes.InvalidSyntax)); } catch (SCIMUniquenessAttributeException ex) { _logger.LogError(ex, ex.Message); return(this.BuildError(HttpStatusCode.Conflict, ex.Message, SCIMConstants.ErrorSCIMTypes.Uniqueness)); } catch (Exception ex) { _logger.LogError(ex, ex.Message); return(this.BuildError(HttpStatusCode.InternalServerError, ex.ToString(), SCIMConstants.ErrorSCIMTypes.InternalServerError)); } }