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 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 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 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}