001/*-
002 * #%L
003 * Smile CDR - CDR
004 * %%
005 * Copyright (C) 2016 - 2026 Smile CDR, Inc.
006 * %%
007 * All rights reserved.
008 * #L%
009 */
010package ca.cdr.api.model.json;
011
012import ca.uhn.fhir.model.api.IModelJson;
013import ca.uhn.fhir.model.api.annotation.ExampleSupplier;
014import com.fasterxml.jackson.annotation.JsonProperty;
015import io.swagger.v3.oas.annotations.media.Schema;
016import jakarta.annotation.Nonnull;
017import org.apache.commons.lang3.Validate;
018
019import java.util.ArrayList;
020import java.util.List;
021import java.util.function.Supplier;
022
023/**
024 * This class implements the rules used for data tokenization in the
025 * FHIR Storage module.
026 */
027@Schema(
028                name = "TokenizationRules",
029                description =
030                                "Defines a collection of rules for [FHIR Repository Tokenization](/docs/fhir_repository/tokenization.md)")
031@ExampleSupplier(TokenizationRulesJson.ExampleSupplier.class)
032public class TokenizationRulesJson implements IModelJson {
033
034        @JsonProperty("rules")
035        private List<TokenizationRuleJson> myRules;
036
037        public List<TokenizationRuleJson> getRules() {
038                if (myRules == null) {
039                        myRules = new ArrayList<>();
040                }
041                return myRules;
042        }
043
044        public void setRules(List<TokenizationRuleJson> theRules) {
045                myRules = theRules;
046        }
047
048        public TokenizationRuleJson addRule() {
049                TokenizationRuleJson rule = new TokenizationRuleJson();
050                addRule(rule);
051                return rule;
052        }
053
054        public TokenizationRulesJson addRule(@Nonnull TokenizationRuleJson theRule) {
055                Validate.notNull(theRule, "theRule must not be null");
056                getRules().add(theRule);
057                return this;
058        }
059
060        public static class ExampleSupplier implements Supplier<TokenizationRulesJson> {
061                @Override
062                public TokenizationRulesJson get() {
063                        TokenizationRulesJson rules = new TokenizationRulesJson();
064
065                        rules.addRule()
066                                        .setDescription("Rule for a path including a search parameter")
067                                        .setPath("Patient.identifier")
068                                        .setSearchParameter("identifier")
069                                        .setStatus(TokenizationRuleJson.RuleStatusEnum.ACTIVE)
070                                        .setSearchValueNormalization(TokenizationValueNormalizationEnum.IDENTIFIER);
071
072                        rules.addRule()
073                                        .setDescription("Rule for a path containing a code with required terminology binding")
074                                        .setPath("Patient.gender")
075                                        .setSearchParameter("gender")
076                                        .setStatus(TokenizationRuleJson.RuleStatusEnum.ACTIVE)
077                                        .setSearchValueNormalization(TokenizationValueNormalizationEnum.CODE);
078
079                        rules.addRule()
080                                        .setDescription("Another rule for a path including a search parameter")
081                                        .setPath("Patient.name.family")
082                                        .setSearchParameter("family")
083                                        .setStatus(TokenizationRuleJson.RuleStatusEnum.ACTIVE)
084                                        .setSearchValueNormalization(TokenizationValueNormalizationEnum.STRING);
085
086                        rules.addRule()
087                                        .setDescription("This rule is in 'QUIESCE' status, so it will not be applied to any new data")
088                                        .setPath("Patient.name.given")
089                                        .setSearchParameter("given")
090                                        .setStatus(TokenizationRuleJson.RuleStatusEnum.QUIESCE)
091                                        .setSearchValueNormalization(TokenizationValueNormalizationEnum.STRING);
092
093                        rules.addRule()
094                                        .setDescription("Rule for a path with no associated search parameter")
095                                        .setPath("Patient.maritalStatus")
096                                        .setStatus(TokenizationRuleJson.RuleStatusEnum.ACTIVE)
097                                        .setSearchValueNormalization(TokenizationValueNormalizationEnum.NONE);
098
099                        return rules;
100                }
101        }
102}