Skip to main content

haste_fhir_search/
lib.rs

1use std::sync::Arc;
2
3use haste_fhir_client::request::SearchRequest;
4use haste_fhir_model::r4::generated::resources::{Resource, ResourceType, SearchParameter};
5use haste_fhir_operation_error::OperationOutcomeError;
6use haste_jwt::{ProjectId, ResourceId, TenantId, VersionId};
7use haste_repository::types::{FHIRMethod, SupportedFHIRVersions};
8use serde::Deserialize;
9
10pub mod elastic_search;
11pub mod indexing_conversion;
12pub mod memory;
13pub mod pg_search;
14
15#[derive(Clone)]
16pub struct IndexResource {
17    pub id: ResourceId,
18    pub version_id: VersionId,
19
20    pub tenant: TenantId,
21    pub project: ProjectId,
22
23    pub fhir_method: FHIRMethod,
24    pub resource_type: ResourceType,
25    pub resource: Resource,
26}
27
28#[derive(Deserialize, Debug)]
29pub struct SearchEntry {
30    pub id: ResourceId,
31    pub resource_type: ResourceType,
32    pub version_id: VersionId,
33    pub project: ProjectId,
34}
35
36pub struct SearchReturn {
37    pub total: Option<i64>,
38    pub entries: Vec<SearchEntry>,
39}
40
41pub struct SearchOptions {
42    pub count_limit: Option<u64>,
43}
44
45#[derive(Clone, Debug)]
46pub enum ParameterLevel {
47    Project,
48    System,
49}
50
51#[derive(Clone, Debug)]
52pub struct ResolvedParameter {
53    #[allow(dead_code)]
54    pub level: ParameterLevel,
55    pub search_parameter: Arc<SearchParameter>,
56}
57impl ResolvedParameter {
58    pub fn new(level: ParameterLevel, search_parameter: Arc<SearchParameter>) -> Self {
59        ResolvedParameter {
60            level,
61            search_parameter,
62        }
63    }
64}
65
66pub trait SearchParameterResolve: Send + Sync {
67    // Returns all search parameters for the given resource type, if any exist.
68    fn by_resource_type(
69        &self,
70        tenant: &TenantId,
71        project: &ProjectId,
72        resource_type: &ResourceType,
73    ) -> impl Future<Output = Result<Vec<ResolvedParameter>, OperationOutcomeError>> + Send;
74    // Returns the search parameter for the given resource type and code, if it exists.
75    fn by_name(
76        &self,
77        tenant: &TenantId,
78        project: &ProjectId,
79        resource_type: Option<&ResourceType>,
80        code: &str,
81    ) -> impl Future<Output = Result<Option<ResolvedParameter>, OperationOutcomeError>> + Send;
82    // Returns all search parameters, regardless of resource type.
83    fn all(
84        &self,
85        tenant: &TenantId,
86        project: &ProjectId,
87    ) -> impl Future<Output = Result<Vec<ResolvedParameter>, OperationOutcomeError>> + Send;
88}
89
90pub struct IndexFailure {
91    pub resource: IndexResource,
92    pub error: OperationOutcomeError,
93}
94
95pub struct IndexOutcome {
96    pub succeeded: usize,
97    pub failed: Vec<IndexFailure>,
98}
99
100pub trait SearchEngine: Send + Sync {
101    fn search(
102        &self,
103        fhir_version: &SupportedFHIRVersions,
104        tenant: &TenantId,
105        projects: &ProjectId,
106        search_request: &SearchRequest,
107        options: Option<SearchOptions>,
108    ) -> impl Future<Output = Result<SearchReturn, OperationOutcomeError>> + Send;
109
110    fn index(
111        &self,
112        fhir_version: SupportedFHIRVersions,
113        resource: Vec<IndexResource>,
114    ) -> impl Future<Output = Result<IndexOutcome, OperationOutcomeError>> + Send;
115
116    fn migrate(
117        &self,
118        fhir_version: &SupportedFHIRVersions,
119    ) -> impl Future<Output = Result<(), haste_fhir_operation_error::OperationOutcomeError>> + Send;
120}