protected virtual async Task UpdateReferenceAttributes(RepresentationSyncResult result, IEnumerable <string> ids, SCIMAttributeMapping attributeMapping, SCIMRepresentation sourceScimRepresentation, string location) { var targetRepresentations = await _scimRepresentationQueryRepository.FindSCIMRepresentationByIds(ids, attributeMapping.TargetResourceType); var missingIds = ids.Where(i => !targetRepresentations.Any(r => r.Id == i)); if (missingIds.Any()) { throw new SCIMNotFoundException(string.Format(Global.ReferencesDontExist, string.Join(",", missingIds))); } if (targetRepresentations.Any()) { foreach (var targetRepresentation in targetRepresentations) { bool isAttrUpdated; UpdateScimRepresentation(targetRepresentation, sourceScimRepresentation, attributeMapping.TargetAttributeId, attributeMapping.SourceResourceType, out isAttrUpdated); UpdateScimRepresentation(sourceScimRepresentation, targetRepresentation, attributeMapping.SourceAttributeId, attributeMapping.TargetResourceType, out bool b); if (!isAttrUpdated) { result.AddReferenceAttr(targetRepresentation, attributeMapping.TargetAttributeId, targetRepresentation.GetSchemaAttributeById(attributeMapping.TargetAttributeId).FullPath, sourceScimRepresentation.Id, location); } result.AddRepresentation(targetRepresentation); } } }
protected virtual async Task RemoveReferenceAttributes(RepresentationSyncResult result, IEnumerable <string> ids, SCIMAttributeMapping attributeMapping, SCIMRepresentation sourceScimRepresentation, string location) { var targetRepresentations = await _scimRepresentationQueryRepository.FindSCIMRepresentationByIds(ids, attributeMapping.TargetResourceType); if (targetRepresentations.Any()) { var firstTargetRepresentation = targetRepresentations.First(); var targetSchemaAttribute = firstTargetRepresentation.GetRootSchema().GetAttributeById(attributeMapping.TargetAttributeId); foreach (var targetRepresentation in targetRepresentations) { var attr = targetRepresentation.GetAttributesByAttrSchemaId(targetSchemaAttribute.Id).FirstOrDefault(v => targetRepresentation.GetChildren(v).Any(c => c.ValueString == sourceScimRepresentation.Id)); if (attr != null) { targetRepresentation.RemoveAttributeById(attr); result.RemoveReferenceAttr(targetRepresentation, attr.SchemaAttribute.Id, attr.SchemaAttribute.FullPath, sourceScimRepresentation.Id, location); } result.AddRepresentation(targetRepresentation); } } }