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