Beispiel #1
0
 /// <summary>
 /// Execute the AfterReceive function allowing the behavior pipeline to inspect the message
 /// </summary>
 /// <param name="interaction">The interaction being called</param>
 /// <param name="resource">The resource being actioned</param>
 /// <returns>The updated resource</returns>
 /// <exception cref="SanteDB.Core.Exceptions.DetectedIssueException">If there is a detected/validation issue</exception>
 public static Resource ExecuteAfterReceiveRequestBehavior(TypeRestfulInteraction interaction, ResourceType resourceType, Resource resource)
 {
     foreach (var behavior in s_behaviorModifiers.Where(o => o.CanApply(interaction, resource)))
     {
         resource = behavior.AfterReceiveRequest(interaction, resourceType, resource);
     }
     return(resource);
 }
Beispiel #2
0
 /// <summary>
 /// Execute the BeforeSendResponse function allowing the behavior pipeline to inspect the message
 /// </summary>
 /// <param name="interaction">The interaction being called</param>
 /// <param name="resource">The resource being actioned</param>
 /// <returns>The updated resource</returns>
 /// <exception cref="SanteDB.Core.Exceptions.DetectedIssueException">If there is a detected/validation issue</exception>
 public static Resource ExecuteBeforeSendResponseBehavior(TypeRestfulInteraction interaction, ResourceType resourceType, Resource resource)
 {
     foreach (var behavior in s_behaviorModifiers.Where(o => o.CanApply(interaction, resource)))
     {
         resource = behavior.BeforeSendResponse(interaction, resourceType, resource);
     }
     return(resource);
 }
Beispiel #3
0
        /// <summary>
        /// Audit data action on FHIR interface
        /// </summary>
        private void AuditDataAction(TypeRestfulInteraction type, OutcomeIndicator outcome, params Resource[] objects)
        {
            AuditData audit = new AuditData(DateTime.Now, ActionType.Execute, outcome, EventIdentifierType.ApplicationActivity, new AuditCode(Hl7.Fhir.Utility.EnumUtility.GetLiteral(type), "http://hl7.org/fhir/ValueSet/type-restful-interaction"));
            AuditableObjectLifecycle lifecycle = AuditableObjectLifecycle.NotSet;

            switch (type)
            {
            case TypeRestfulInteraction.Create:
                audit.ActionCode      = ActionType.Create;
                audit.EventIdentifier = EventIdentifierType.Import;
                lifecycle             = AuditableObjectLifecycle.Creation;
                break;

            case TypeRestfulInteraction.Delete:
                audit.ActionCode      = ActionType.Delete;
                audit.EventIdentifier = EventIdentifierType.Import;
                lifecycle             = AuditableObjectLifecycle.LogicalDeletion;
                break;

            case TypeRestfulInteraction.HistoryInstance:
            case TypeRestfulInteraction.HistoryType:
            case TypeRestfulInteraction.SearchType:
                audit.ActionCode      = ActionType.Execute;
                audit.EventIdentifier = EventIdentifierType.Query;
                lifecycle             = AuditableObjectLifecycle.Disclosure;
                audit.AuditableObjects.Add(new AuditableObject()
                {
                    QueryData  = RestOperationContext.Current?.IncomingRequest.Url.ToString(),
                    Role       = AuditableObjectRole.Query,
                    Type       = AuditableObjectType.SystemObject,
                    ObjectData = RestOperationContext.Current?.IncomingRequest.Headers.AllKeys.Where(o => o.Equals("accept", StringComparison.OrdinalIgnoreCase)).Select(o => new ObjectDataExtension(o, RestOperationContext.Current.IncomingRequest.Headers.Get(o))).ToList()
                });
                break;

            case TypeRestfulInteraction.Update:
            case TypeRestfulInteraction.Patch:
                audit.ActionCode      = ActionType.Update;
                audit.EventIdentifier = EventIdentifierType.Import;
                lifecycle             = AuditableObjectLifecycle.Amendment;
                break;

            case TypeRestfulInteraction.Vread:
            case TypeRestfulInteraction.Read:
                audit.ActionCode      = ActionType.Read;
                audit.EventIdentifier = EventIdentifierType.Query;
                lifecycle             = AuditableObjectLifecycle.Disclosure;
                audit.AuditableObjects.Add(new AuditableObject()
                {
                    QueryData  = RestOperationContext.Current?.IncomingRequest.Url.ToString(),
                    Role       = AuditableObjectRole.Query,
                    Type       = AuditableObjectType.SystemObject,
                    ObjectData = RestOperationContext.Current?.IncomingRequest.Headers.AllKeys.Where(o => o.Equals("accept", StringComparison.OrdinalIgnoreCase)).Select(o => new ObjectDataExtension(o, RestOperationContext.Current.IncomingRequest.Headers.Get(o))).ToList()
                });
                break;
            }

            AuditUtil.AddLocalDeviceActor(audit);
            AuditUtil.AddUserActor(audit);

            audit.AuditableObjects.AddRange(objects.SelectMany(o => this.CreateAuditObjects(o, lifecycle)));

            AuditUtil.SendAudit(audit);
        }