/// <summary> /// Write role permissions /// </summary> /// <param name="model"></param> /// <param name="value"></param> /// <returns></returns> private async Task WriteRolePermissionsAsync(BaseNodeVertexModel model, DataValue value) { var rolePermissions = value.GetValueOrDefault <RolePermissionTypeCollection>(); if (rolePermissions != null) { foreach (var permission in rolePermissions) { var roleId = permission.RoleId.AsString(_codec.Context); await _loader.AddEdgeAsync(model, new RolePermissionEdgeModel { Id = _source.CreateEdgeId(model.NodeId, roleId), SourceId = _source.Id, Revision = _revision, Permissions = ((PermissionType)permission.Permissions).ToServiceType() }, _source.CreateVertexId(roleId), AddressSpaceElementNames.Variable, roleId); } } }
/// <summary> /// Write reference. Since the stream contains forward and backward /// references we will write at least the reference vertex and /// reference type edge twice. /// </summary> /// <param name="vertex"></param> /// <param name="reference"></param> /// <returns></returns> private async Task WriteReferenceAsync(BaseNodeVertexModel vertex, IReference reference) { var originId = vertex.NodeId; var typeId = reference.ReferenceTypeId.AsString(_codec.Context); var targetId = reference.TargetId.AsString(_codec.Context); // Create address space reference node var rid = AddressSpaceEx.CreateAddressSpaceReferenceNodeId( reference.IsInverse, originId, typeId, targetId); var referenceVertex = new ReferenceNodeVertexModel { SourceId = _source.Id, OriginId = reference.IsInverse ? targetId : originId, ReferenceTypeId = typeId, TargetId = reference.IsInverse ? originId : targetId, Revision = _revision, NodeId = rid, Id = _source.CreateVertexId(rid) }; // 1. Add the edge to the vertex if (reference.IsInverse) { await _loader.AddEdgeAsync(referenceVertex, new TargetEdgeModel { Id = _source.CreateEdgeId(rid, targetId), Revision = _revision, SourceId = _source.Id }, vertex); } else { await _loader.AddEdgeAsync(referenceVertex, new OriginEdgeModel { Id = _source.CreateEdgeId(rid, originId), Revision = _revision, SourceId = _source.Id }, vertex); } // TODO: Should we? This could be dangling... // 2. Add reference type edge await _loader.AddEdgeAsync(referenceVertex, new ReferenceTypeEdgeModel { Id = _source.CreateEdgeId(rid, typeId), Revision = _revision, SourceId = _source.Id }, _source.CreateVertexId(typeId), AddressSpaceElementNames.ReferenceType, typeId); // 3. Add reference vertex await _loader.AddVertexAsync(referenceVertex); await _loader.AddEdgeAsync(referenceVertex, new AddressSpaceSourceEdgeModel { Id = _source.CreateEdgeId(rid, _source.Id), Revision = _revision, SourceId = _source.Id }, _source); }