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