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
16#[derive(Clone)]
17pub struct IndexResource {
18 pub id: ResourceId,
19 pub version_id: String,
20
21 pub project: ProjectId,
22 pub fhir_method: FHIRMethod,
23
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}
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}