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