/// <summary> /// Searches a resource from the client registry datastore /// </summary> public Bundle SearchResource(string resourceType) { this.ThrowIfNotReady(); // Get the services from the service registry var auditService = ApplicationContext.Current.GetService(typeof(IAuditorService)) as IAuditorService; // Stuff for auditing and exception handling AuditData audit = null; List <IResultDetail> details = new List <IResultDetail>(); FhirQueryResult result = null; try { // Get query parameters var queryParameters = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters; var resourceProcessor = FhirResourceHandlerUtil.GetResourceHandler(resourceType); // Setup outgoing content WebOperationContext.Current.OutgoingRequest.Headers.Add("Last-Modified", DateTime.Now.ToString("ddd, dd MMM yyyy HH:mm:ss zzz")); if (resourceProcessor == null) // Unsupported resource { throw new FileNotFoundException(); } // TODO: Appropriately format response // Process incoming request result = resourceProcessor.Query(WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters); if (result == null || result.Outcome == ResultCode.Rejected) { throw new InvalidDataException("Message was rejected"); } else if (result.Outcome != ResultCode.Accepted) { throw new DataException("Query failed"); } audit = AuditUtil.CreateAuditData(result.Results); // Create the Atom feed return(MessageUtil.CreateBundle(result)); } catch (Exception e) { audit = AuditUtil.CreateAuditData(null); audit.Outcome = OutcomeIndicator.EpicFail; return(this.ErrorHelper(e, result, true) as Bundle); } finally { if (auditService != null) { auditService.SendAudit(audit); } } }
/// <summary> /// Delete a resource /// </summary> public DomainResourceBase DeleteResource(string resourceType, string id, string mimeType) { this.ThrowIfNotReady(); FhirOperationResult result = null; AuditData audit = null; IAuditorService auditService = ApplicationContext.Current.GetService(typeof(IAuditorService)) as IAuditorService; try { // Setup outgoing content/ WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NoContent; // Create or update? var handler = FhirResourceHandlerUtil.GetResourceHandler(resourceType); if (handler == null) { throw new FileNotFoundException(); // endpoint not found! } result = handler.Delete(id, TransactionMode.Commit); if (result == null || result.Outcome == ResultCode.Rejected) { throw new NotSupportedException(); } else if (result.Outcome == ResultCode.TypeNotAvailable) { throw new FileNotFoundException(String.Format("Resource {0} not found", WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri)); } else if (result.Outcome != ResultCode.Accepted) { throw new DataException("Delete failed"); } audit = AuditUtil.CreateAuditData(result.Results); return(null); } catch (Exception e) { audit = AuditUtil.CreateAuditData(null); audit.Outcome = OutcomeIndicator.EpicFail; return(this.ErrorHelper(e, result, false) as DomainResourceBase); } finally { if (auditService != null) { auditService.SendAudit(audit); } } }
/// <summary> /// Perform a read against the underlying IFhirResourceHandler /// </summary> private FhirOperationResult PerformRead(string resourceType, string id, string vid) { this.ThrowIfNotReady(); // Get the services from the service registry var auditService = ApplicationContext.Current.GetService(typeof(IAuditorService)) as IAuditorService; // Stuff for auditing and exception handling AuditData audit = null; List <IResultDetail> details = new List <IResultDetail>(); FhirOperationResult result = null; try { // Get query parameters var queryParameters = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters; var resourceProcessor = FhirResourceHandlerUtil.GetResourceHandler(resourceType); if (resourceProcessor == null) // Unsupported resource { throw new FileNotFoundException("Specified resource type is not found"); } // TODO: Appropriately format response // Process incoming request result = resourceProcessor.Read(id, vid); if (result.Outcome == ResultCode.Rejected) { throw new InvalidDataException("Message was rejected"); } else if (result.Outcome == (ResultCode.NotAvailable | ResultCode.Rejected)) { throw new FileLoadException(String.Format("Resource {0} is no longer available", WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri)); } else if (result.Outcome == ResultCode.TypeNotAvailable || result.Results == null || result.Results.Count == 0) { throw new FileNotFoundException(String.Format("Resource {0} not found", WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri)); } else if (result.Outcome != ResultCode.Accepted) { throw new DataException("Read failed"); } audit = AuditUtil.CreateAuditData(result.Results); // Create the result if (result.Results != null && result.Results.Count > 0) { WebOperationContext.Current.OutgoingResponse.LastModified = result.Results[0].Timestamp; WebOperationContext.Current.OutgoingResponse.Headers.Add("Content-Disposition", String.Format("filename=\"{0}-{1}-{2}.xml\"", resourceType, result.Results[0].Id, result.Results[0].VersionId)); WebOperationContext.Current.OutgoingResponse.ETag = result.Results[0].VersionId; } return(result); } catch (Exception e) { audit = AuditUtil.CreateAuditData(null); audit.Outcome = OutcomeIndicator.EpicFail; throw; } finally { if (auditService != null) { auditService.SendAudit(audit); } } }
/// <summary> /// Create a resource /// </summary> public DomainResourceBase CreateResource(string resourceType, string mimeType, DomainResourceBase target) { this.ThrowIfNotReady(); FhirOperationResult result = null; AuditData audit = null; IAuditorService auditService = ApplicationContext.Current.GetService(typeof(IAuditorService)) as IAuditorService; try { // Setup outgoing content // Create or update? var handler = FhirResourceHandlerUtil.GetResourceHandler(resourceType); if (handler == null) { throw new FileNotFoundException(); // endpoint not found! } result = handler.Create(target, TransactionMode.Commit); WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Created; if (result == null || result.Outcome == ResultCode.Rejected) { throw new InvalidDataException("Resource structure is not valid"); } else if (result.Outcome == ResultCode.AcceptedNonConformant) { throw new ConstraintException("Resource not conformant"); } else if (result.Outcome == ResultCode.TypeNotAvailable) { throw new FileNotFoundException(String.Format("Resource {0} not found", WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri)); } else if (result.Outcome != ResultCode.Accepted) { throw new DataException("Create failed"); } audit = AuditUtil.CreateAuditData(result.Results); String baseUri = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri.AbsoluteUri; WebOperationContext.Current.OutgoingResponse.Headers.Add("Content-Location", String.Format("{0}{1}/{2}/_history/{3}", baseUri, resourceType, result.Results[0].Id, result.Results[0].VersionId)); WebOperationContext.Current.OutgoingResponse.LastModified = result.Results[0].Timestamp; WebOperationContext.Current.OutgoingResponse.ETag = result.Results[0].VersionId; return(result.Results[0]); } catch (Exception e) { audit = AuditUtil.CreateAuditData(null); audit.Outcome = OutcomeIndicator.EpicFail; return(this.ErrorHelper(e, result, false) as DomainResourceBase); } finally { if (auditService != null) { auditService.SendAudit(audit); } } }