1use haste_fhir_client::request::SearchRequest;
2use haste_fhir_model::r4::generated::resources::{Resource, ResourceType};
3use haste_fhir_operation_error::OperationOutcomeError;
4use haste_jwt::{ProjectId, ResourceId, TenantId, VersionId};
5use haste_repository::types::{FHIRMethod, SupportedFHIRVersions};
6use serde::Deserialize;
7
8pub mod elastic_search;
9mod indexing_conversion;
10
11pub struct RemoveIndex {
12 }
15
16pub struct IndexResource<'a> {
17 pub id: &'a ResourceId,
18 pub version_id: &'a String,
19
20 pub project: &'a ProjectId,
21
22 pub fhir_method: &'a FHIRMethod,
23
24 pub resource_type: &'a ResourceType,
25 pub resource: &'a 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}
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
44pub struct SuccessfullyIndexedCount(pub usize);
45
46pub trait SearchEngine: Send + Sync {
47 fn search(
48 &self,
49 fhir_version: &SupportedFHIRVersions,
50 tenant: &TenantId,
51 project: &ProjectId,
52 search_request: &SearchRequest,
53 options: Option<SearchOptions>,
54 ) -> impl Future<Output = Result<SearchReturn, OperationOutcomeError>> + Send + Sync;
55
56 fn index(
57 &self,
58 fhir_version: &SupportedFHIRVersions,
59 tenant: &TenantId,
60 resource: Vec<IndexResource>,
61 ) -> impl Future<Output = Result<SuccessfullyIndexedCount, OperationOutcomeError>> + Send + Sync;
62
63 fn migrate(
64 &self,
65 fhir_version: &SupportedFHIRVersions,
66 ) -> impl Future<Output = Result<(), haste_fhir_operation_error::OperationOutcomeError>> + Send + Sync;
67}