public ActionResult <List <OCRResult> > Recognize(IFormFile file, [FromForm] string templateId)
        {
            try
            {
                if (templateId == null)
                {
                    return(BadRequest("No template id was found."));
                }
                if (file == null || file.Length == 0)
                {
                    return(BadRequest("No image was found."));
                }

                var template = _uow.TemplateRepository.GetById(templateId);

                var result = TemplateExtension.RecogizeAreas(file, template);

                return(Ok(result));
            }
            catch (InvalidOperationException ex)
            {
                return(StatusCode(500, new { error = ex.Message }));
            }
        }
        public Extension Convert(TemplateExtension extension)
        {
            var fhirExtension = new Extension()
            {
                Url = extension.Identifier
            };

            switch (extension.Type)
            {
            case "String":
                fhirExtension.Value = new FhirString(extension.Value);
                break;

            case "Integer":
                try
                {
                    fhirExtension.Value = new Integer(Int32.Parse(extension.Value));
                }
                catch { }
                break;

            case "Boolean":
                try
                {
                    fhirExtension.Value = new FhirBoolean(Boolean.Parse(extension.Value));
                }
                catch { }
                break;

            case "Date":
                fhirExtension.Value = new Date(extension.Value);
                break;

            case "DateTime":
                fhirExtension.Value = new FhirDateTime(extension.Value);
                break;

            case "Code":
                fhirExtension.Value = new Code(extension.Value);
                break;

            case "Coding":
            case "CodeableConcept":
                string[] valueSplit = extension.Value.Split('|');

                if (valueSplit.Length == 3)
                {
                    var coding = new Coding();
                    coding.Code    = valueSplit[0];
                    coding.Display = valueSplit[1];
                    coding.System  = valueSplit[2];

                    if (extension.Type == "Coding")
                    {
                        fhirExtension.Value = coding;
                    }
                    else
                    {
                        var codeableConcept = new CodeableConcept();
                        codeableConcept.Coding.Add(coding);
                        fhirExtension.Value = codeableConcept;
                    }
                }
                break;
            }

            if (fhirExtension.Value != null)
            {
                return(fhirExtension);
            }

            return(null);
        }
        /// <summary>
        /// Converts the TemplateMetaDataModel into the Template (EF) model.
        /// </summary>
        /// <remarks>
        /// Each property is checked to determine if it is different before updating the property, otherwise
        /// it registers as a change event when auditing, regardless if the value is different.
        /// </remarks>
        private Template SaveTemplate(IObjectRepository tdb, TemplateMetaDataModel model)
        {
            Template template = null;
            bool     isNew    = false;

            // Create the initial template object and add it to the appropriate list (if it is new)
            if (model.Id != null)
            {
                template = tdb.Templates.Single(y => y.Id == model.Id);
            }
            else
            {
                template = new Template();
                tdb.Templates.Add(template);
                isNew = true;
            }

            // Set the properties
            if (template.Author == null)
            {
                User currentUser = CheckPoint.Instance.GetUser(tdb);
                template.AuthorId = currentUser.Id;
            }
            else if (template.AuthorId != model.AuthorId)
            {
                template.AuthorId = model.AuthorId;
            }

            ImplementationGuide ig = tdb.ImplementationGuides.Single(y => y.Id == model.OwningImplementationGuideId);

            if (template.ImplementationGuideTypeId != ig.ImplementationGuideTypeId)
            {
                template.ImplementationGuideTypeId = ig.ImplementationGuideTypeId;
            }



            if (template.Name != model.Name)
            {
                template.Name = model.Name;
            }

            if (template.Oid != model.Oid)
            {
                // If it is not a new template, there may be refernces to the template
                // in the TemplateConstraintReferences table representing the plain-string
                // identifier of this template. Update those references.
                if (!isNew)
                {
                    var references = tdb.TemplateConstraintReferences.Where(y => y.ReferenceIdentifier == template.Oid && y.ReferenceType == ConstraintReferenceTypes.Template);

                    foreach (var reference in references)
                    {
                        reference.ReferenceIdentifier = model.Oid;
                    }
                }

                template.Oid = model.Oid;
            }

            if (template.Bookmark != model.Bookmark)
            {
                template.Bookmark = model.Bookmark;
            }

            if (template.OwningImplementationGuideId != model.OwningImplementationGuideId)
            {
                template.OwningImplementationGuideId = model.OwningImplementationGuideId;
            }

            if (template.TemplateTypeId != model.TemplateTypeId)
            {
                template.TemplateTypeId = model.TemplateTypeId;
            }

            if (template.PrimaryContext != model.PrimaryContext)
            {
                template.PrimaryContext = model.PrimaryContext;
            }

            if (template.PrimaryContextType != model.PrimaryContextType)
            {
                template.PrimaryContextType = model.PrimaryContextType;
            }

            if (template.ImpliedTemplateId != model.ImpliedTemplateId)
            {
                template.ImpliedTemplateId = model.ImpliedTemplateId;
            }

            if (template.Description != model.Description)
            {
                template.Description = model.Description;
            }

            if (template.Notes != model.Notes)
            {
                template.Notes = model.Notes;
            }

            if (template.StatusId != model.StatusId)
            {
                template.StatusId = model.StatusId;
            }

            if (template.IsOpen != model.IsOpen)
            {
                template.IsOpen = model.IsOpen;
            }

            // Remove Extensions
            var extensions = template.Extensions.ToList();

            foreach (var extension in extensions)
            {
                var foundExtension = model.Extensions.SingleOrDefault(y => y.Identifier == extension.Identifier);

                if (foundExtension == null)
                {
                    tdb.TemplateExtensions.Remove(extension);
                }
            }

            // Add/Update Extensions
            foreach (var extensionModel in model.Extensions)
            {
                var extension = template.Extensions.SingleOrDefault(y => y.Identifier == extensionModel.Identifier);

                if (extension == null)
                {
                    extension            = new TemplateExtension();
                    extension.Identifier = extensionModel.Identifier;
                    template.Extensions.Add(extension);
                }

                if (extension.Type != extensionModel.Type)
                {
                    extension.Type = extensionModel.Type;
                }

                if (extension.Value != extensionModel.Value)
                {
                    extension.Value = extensionModel.Value;
                }
            }

            return(template);
        }
示例#4
0
        private TDBTemplate AddImportTemplate(Trifolia.Shared.ImportExport.Model.TrifoliaTemplate importTemplate)
        {
            var alreadyBuildTemplate = this.importedTemplates.SingleOrDefault(y => y.Oid == importTemplate.identifier);

            if (alreadyBuildTemplate != null)
            {
                return(alreadyBuildTemplate);
            }

            TDBTemplate foundTemplate = this.tdb.Templates.SingleOrDefault(y => y.Oid == importTemplate.identifier);

            if (string.IsNullOrEmpty(importTemplate.identifier) || importTemplate.identifier.Length > 255)
            {
                errors.Add("Template OID is not specified.");
                return(null);
            }

            if (string.IsNullOrEmpty(importTemplate.title) || importTemplate.title.Length > 255)
            {
                errors.Add("Template name is not specified.");
                return(null);
            }

            var template = this.tdb.Templates.SingleOrDefaultInclAdded(y => y.Oid.ToLower() == importTemplate.identifier.ToLower());

            if (!shouldUpdate && template != null)
            {
                errors.Add("Template already exists and should not be updating");
                return(template);
            }

            if (template == null)
            {
                template     = new TDBTemplate();
                template.Oid = importTemplate.identifier;

                if (!template.IsIdentifierII() && !template.IsIdentifierOID() && !template.IsIdentifierURL())
                {
                    errors.Add("Template identifier " + template.Oid + " is not properly formatted. Must be urn:hl7ii:XXX:YYY or urn:oid:XXX or http(s)://XXX");
                    return(null);
                }

                if (this.DefaultAuthorUser != null)
                {
                    template.Author = this.DefaultAuthorUser;
                }
                else
                {
                    template.Author = CheckPoint.Instance.GetUser(this.tdb);
                }

                this.tdb.Templates.Add(template);
            }

            // Find implementation guide type
            ImplementationGuideType igType = this.tdb.ImplementationGuideTypes.SingleOrDefault(y => y.Name.ToLower() == importTemplate.implementationGuideType.ToLower());

            if (igType == null)
            {
                this.errors.Add(string.Format(
                                    "Could not find implementation guide type \"{0}\" for template with identifier \"{1}\"",
                                    importTemplate.implementationGuideType,
                                    importTemplate.identifier));
                return(null);
            }

            template.ImplementationGuideType = igType;

            if (importTemplate.ImplementationGuide != null && !string.IsNullOrEmpty(importTemplate.ImplementationGuide.name))
            {
                ImplementationGuide ig = this.tdb.ImplementationGuides.SingleOrDefaultInclAdded(y =>
                                                                                                y.Name.ToLower() == importTemplate.ImplementationGuide.name.ToLower() &&
                                                                                                (
                                                                                                    (y.Version == null && importTemplate.ImplementationGuide.version == 1) ||
                                                                                                    (y.Version != null && y.Version.Value == importTemplate.ImplementationGuide.version)
                                                                                                ));

                if (ig == null)
                {
                    this.errors.Add(string.Format(
                                        "Could not find implementation guide \"{0}\" for template with identifier \"{1}\"",
                                        importTemplate.ImplementationGuide.name,
                                        importTemplate.identifier));
                    return(null);
                }
                else if (ig.ImplementationGuideType != igType)
                {
                    this.errors.Add(string.Format(
                                        "The implementation guide type for the implementation guide \"{0}\" is not the same as the import.",
                                        importTemplate.ImplementationGuide.name));
                    return(null);
                }

                if (template.OwningImplementationGuide != ig)
                {
                    template.OwningImplementationGuide = ig;
                }

                if (!ig.ChildTemplates.Contains(template))
                {
                    ig.ChildTemplates.Add(template);
                }
            }
            else if (this.DefaultImplementationGuide != null)
            {
                template.OwningImplementationGuide = this.DefaultImplementationGuide;
            }
            else
            {
                errors.Add("No implementation guide specified for template/profile: " + importTemplate.identifier);
                return(null);
            }

            // Find the template type
            TemplateType templateType = igType.TemplateTypes.SingleOrDefault(y => y.Name.ToLower() == importTemplate.templateType.ToLower());

            if (templateType == null)
            {
                this.errors.Add(string.Format(
                                    "Could not find template type \"{0}\" for template with identifier \"{1}\"",
                                    importTemplate.templateType,
                                    importTemplate.identifier));
                return(null);
            }
            else if (template.TemplateType != templateType)
            {
                template.TemplateType = templateType;
            }

            // Find or build the implied template
            if (!string.IsNullOrEmpty(importTemplate.impliedTemplateOid))
            {
                if (importTemplate.impliedTemplateOid.ToLower() == importTemplate.identifier.ToLower())
                {
                    this.errors.Add(string.Format(
                                        "Template with identifier \"{0}\" implies itself. Cannot import template.",
                                        importTemplate.identifier));
                    return(null);
                }

                TDBTemplate impliedTemplate = FindOrBuildTemplate(importTemplate.impliedTemplateOid);

                // If we didn't find the template in the database or in the import, create an error for the template and don't add it
                if (impliedTemplate == null)
                {
                    this.errors.Add(string.Format(
                                        "Couldn't find implied template \"{0}\" in either the system or the import, for template with identifier \"{1}\"",
                                        importTemplate.impliedTemplateOid,
                                        importTemplate.identifier));
                    return(null);
                }
                else
                {
                    if (template.ImpliedTemplate != impliedTemplate)
                    {
                        template.ImpliedTemplate = impliedTemplate;
                    }

                    if (!impliedTemplate.ImplyingTemplates.Contains(template))
                    {
                        impliedTemplate.ImplyingTemplates.Add(template);
                    }
                }
            }

            this.UpdateTemplateProperties(template, importTemplate);

            this.UpdateTemplateSamples(template, importTemplate);

            // Extensions
            foreach (var existingExtension in template.Extensions.ToList())
            {
                if (importTemplate.Extension.Count(y => y.identifier == existingExtension.Identifier) == 0)
                {
                    this.tdb.TemplateExtensions.Remove(existingExtension);
                }
            }

            foreach (var importExtension in importTemplate.Extension)
            {
                var foundExtension = template.Extensions.SingleOrDefault(y => y.Identifier == importExtension.identifier);

                if (foundExtension == null)
                {
                    foundExtension = new TemplateExtension();
                    template.Extensions.Add(foundExtension);
                }

                foundExtension.Type  = importExtension.type;
                foundExtension.Value = importExtension.value;
            }

            try
            {
                // Add each of the template's constraints
                if (importTemplate.Constraint != null)
                {
                    importTemplate.Constraint.ToList().ForEach(y => AddImportConstraint(template, null, y));
                }
            }
            catch (Exception ex)
            {
                Log.For(this).Error("Error importing constraints for template.", ex);
                return(null);
            }

            // If the object is changed, make sure the user has permissions to the implementation guide
            if (this.tdb is TrifoliaDatabase)
            {
                var dataSource    = this.tdb as TrifoliaDatabase;
                var templateState = dataSource.Entry(template).State;

                if (templateState == System.Data.Entity.EntityState.Unchanged)
                {
                    var constraintStates = (from c in template.ChildConstraints
                                            where dataSource.Entry(c).State != System.Data.Entity.EntityState.Unchanged
                                            select c);
                    var constraintSampleStates = (from c in template.ChildConstraints
                                                  join cs in this.tdb.TemplateConstraintSamples on c equals cs.Constraint
                                                  where dataSource.Entry(cs).State != System.Data.Entity.EntityState.Unchanged
                                                  select cs);
                    var templateSampleStates = (from s in template.TemplateSamples
                                                where dataSource.Entry(s).State != System.Data.Entity.EntityState.Unchanged
                                                select s);

                    if (constraintStates.Count() > 0 || constraintSampleStates.Count() > 0 || templateSampleStates.Count() > 0)
                    {
                        templateState = System.Data.Entity.EntityState.Modified;
                    }
                }

                if (templateState != System.Data.Entity.EntityState.Unchanged && !CheckPoint.Instance.GrantEditImplementationGuide(template.OwningImplementationGuide.Id) && !CheckPoint.Instance.IsDataAdmin)
                {
                    this.Errors.Add("You do not have permission to modify template \"" + template.Name + "\" with identifier " + template.Oid);
                    return(null);
                }
            }

            this.importedTemplates.Add(template);

            return(template);
        }
示例#5
0
        /// <summary>
        /// Converts the TemplateMetaDataModel into the Template (EF) model.
        /// </summary>
        /// <remarks>
        /// Each property is checked to determine if it is different before updating the property, otherwise
        /// it registers as a change event when auditing, regardless if the value is different.
        /// </remarks>
        private Template SaveTemplate(IObjectRepository tdb, TemplateMetaDataModel model)
        {
            Template template = null;

            // Create the initial template object and add it to the appropriate list (if it is new)
            if (model.Id != null)
            {
                template = tdb.Templates.Single(y => y.Id == model.Id);
            }
            else
            {
                template = new Template();
                tdb.Templates.AddObject(template);
            }

            // Set the properties
            if (template.Author == null)
            {
                User currentUser = CheckPoint.Instance.GetUser(tdb);
                template.AuthorId = currentUser.Id;
            }

            ImplementationGuide ig = tdb.ImplementationGuides.Single(y => y.Id == model.OwningImplementationGuideId);

            if (template.ImplementationGuideTypeId != ig.ImplementationGuideTypeId)
            {
                template.ImplementationGuideTypeId = ig.ImplementationGuideTypeId;
            }

            if (template.Name != model.Name)
            {
                template.Name = model.Name;
            }

            if (template.Oid != model.Oid)
            {
                template.Oid = model.Oid;
            }

            if (template.Bookmark != model.Bookmark)
            {
                template.Bookmark = model.Bookmark;
            }

            if (template.OwningImplementationGuideId != model.OwningImplementationGuideId)
            {
                template.OwningImplementationGuideId = model.OwningImplementationGuideId;
            }

            if (template.TemplateTypeId != model.TemplateTypeId)
            {
                template.TemplateTypeId = model.TemplateTypeId;
            }

            if (template.PrimaryContext != model.PrimaryContext)
            {
                template.PrimaryContext = model.PrimaryContext;
            }

            if (template.PrimaryContextType != model.PrimaryContextType)
            {
                template.PrimaryContextType = model.PrimaryContextType;
            }

            if (template.ImpliedTemplateId != model.ImpliedTemplateId)
            {
                template.ImpliedTemplateId = model.ImpliedTemplateId;
            }

            if (template.Description != model.Description)
            {
                template.Description = model.Description;
            }

            if (template.Notes != model.Notes)
            {
                template.Notes = model.Notes;
            }

            if (template.StatusId != model.StatusId)
            {
                template.StatusId = model.StatusId;
            }

            if (template.IsOpen != model.IsOpen)
            {
                template.IsOpen = model.IsOpen;
            }

            // Remove Extensions
            var extensions = template.Extensions.ToList();

            foreach (var extension in extensions)
            {
                var foundExtension = model.Extensions.SingleOrDefault(y => y.Identifier == extension.Identifier);

                if (foundExtension == null)
                {
                    tdb.TemplateExtensions.DeleteObject(extension);
                }
            }

            // Add/Update Extensions
            foreach (var extensionModel in model.Extensions)
            {
                var extension = template.Extensions.SingleOrDefault(y => y.Identifier == extensionModel.Identifier);

                if (extension == null)
                {
                    extension            = new TemplateExtension();
                    extension.Identifier = extensionModel.Identifier;
                    template.Extensions.Add(extension);
                }

                if (extension.Type != extensionModel.Type)
                {
                    extension.Type = extensionModel.Type;
                }

                if (extension.Value != extensionModel.Value)
                {
                    extension.Value = extensionModel.Value;
                }
            }

            return(template);
        }