예제 #1
0
        private (Entities.ValueSet ValueSetFromRepo, Entities.ValueSetVersion ValueSetVersionFromRepo) GetValueSetEntities(string id, string vid)
        {
            Entities.ValueSet        valueSetFromRepo        = new Entities.ValueSet();
            Entities.ValueSetVersion valueSetVersionFromRepo = new Entities.ValueSetVersion();

            bool isIdValidGuid = Guid.TryParse(id, out Guid valueSetGuid);

            if (isIdValidGuid)
            {
                valueSetFromRepo = _valueSetRepository.GetValueSet(valueSetGuid);
            }
            else
            {
                valueSetFromRepo = _valueSetRepository.GetValueSet(id);
            }

            bool isVidValidGuid = Guid.TryParse(vid, out Guid valueSetVersionGuid);

            if (isVidValidGuid)
            {
                valueSetVersionFromRepo = _valueSetVersionRepository.GetValueSetVersion(valueSetVersionGuid);
            }
            else
            {
                ValueSetVersionPaginationParameters parameters = new ValueSetVersionPaginationParameters()
                {
                    ValueSetCode = valueSetFromRepo.ValueSetCode,
                    ValueSetOid  = valueSetFromRepo.ValueSetOID,
                };
                var valueSetVersionsFromRepo = _valueSetVersionRepository.GetValueSetVersions(parameters);

                if (vid.Equals("latest", StringComparison.OrdinalIgnoreCase))
                {
                    valueSetVersionFromRepo = valueSetVersionsFromRepo.OrderBy(v => v.ValueSetVersionNumber).LastOrDefault();
                }
                else
                {
                    bool success = int.TryParse(vid, out int vidInt);
                    if (success)
                    {
                        valueSetVersionFromRepo = valueSetVersionsFromRepo.FirstOrDefault(v => v.ValueSetVersionNumber == vidInt);
                    }
                    else
                    {
                        throw new InvalidOperationException("vid must be a valid UUID, integer, or the string literal 'latest'");
                    }
                }
            }

            return(valueSetFromRepo, valueSetVersionFromRepo);
        }
예제 #2
0
        private ValueSet BuildValueSet(Entities.ValueSetVersion valueSetVersionFromRepo, Entities.ValueSet valueSetFromRepo, bool includeConcepts = true)
        {
            var valueSet = new Hl7.Fhir.Model.ValueSet();

            valueSet.Url = Url.Link(
                nameof(GetVersionedValueSetById),
                new
            {
                type = "ValueSet",
                id   = valueSetFromRepo.ValueSetCode,
                vid  = valueSetVersionFromRepo.ValueSetVersionNumber.ToString()
            });
            valueSet.Identifier = new List <Identifier>()
            {
                new Identifier()
                {
                    Use    = Identifier.IdentifierUse.Official,
                    Value  = valueSetVersionFromRepo.ValueSetVersionID.ToString(),
                    System = "urn:ietf:rfc:3986"
                },
                new Identifier()
                {
                    Use   = Identifier.IdentifierUse.Secondary,
                    Value = valueSetVersionFromRepo.ValueSetOID
                },
                new Identifier()
                {
                    Use   = Identifier.IdentifierUse.Secondary,
                    Value = valueSetVersionFromRepo.ValueSetCode
                }
            };
            valueSet.Name        = valueSetFromRepo.ValueSetCode;
            valueSet.Title       = valueSetFromRepo.ValueSetName;
            valueSet.Description = new Markdown(valueSetFromRepo.DefinitionText);
            valueSet.Publisher   = "PHIN_VADS";
            valueSet.DateElement = new FhirDateTime(valueSetVersionFromRepo.StatusDate);
            valueSet.Version     = valueSetVersionFromRepo.ValueSetVersionNumber.ToString();
            valueSet.VersionId   = valueSetVersionFromRepo.ValueSetVersionID.ToString();
            valueSet.Status      = PublicationStatus.Active;

            if (includeConcepts)
            {
                valueSet.Expansion = new ValueSet.ExpansionComponent()
                {
                    Identifier       = Guid.NewGuid().ToString(),
                    TimestampElement = new FhirDateTime(DateTimeOffset.Now),
                    Contains         = new List <ValueSet.ContainsComponent>()
                };

                var paginationParameters = new ValueSetConceptPaginationParameters()
                {
                    ValueSetVersionId     = valueSetVersionFromRepo.ValueSetVersionID,
                    ValueSetVersionNumber = valueSetVersionFromRepo.ValueSetVersionNumber.ToString(),
                    PageSize = 1000
                };

                var valueSetConceptEntities = _valueSetConceptRepository.GetValueSetConcepts(paginationParameters);
                foreach (var conceptFromRepo in valueSetConceptEntities)
                {
                    var component = new ValueSet.ContainsComponent()
                    {
                        Code      = conceptFromRepo.ConceptCode,
                        Display   = conceptFromRepo.CDCPreferredDesignation,
                        System    = $"urn:oid:{conceptFromRepo.CodeSystemOID}",
                        Extension = new List <Extension>()
                        {
                            new Extension()
                            {
                                Value = new FhirString(conceptFromRepo.HL70396Identifier)
                            }
                        }
                    };
                    valueSet.Expansion.Contains.Add(component);
                }

                valueSet.Expansion.Total  = valueSet.Expansion.Contains.Count;
                valueSet.Expansion.Offset = (paginationParameters.PageNumber - 1) * paginationParameters.PageSize;
            }

            return(valueSet);
        }