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;
9pub mod indexing_conversion;
10
11#[derive(Clone)]
12pub struct IndexResource {
13 pub id: ResourceId,
14 pub version_id: VersionId,
15
16 pub tenant: TenantId,
17 pub project: ProjectId,
18
19 pub fhir_method: FHIRMethod,
20 pub resource_type: ResourceType,
21 pub resource: Resource,
22}
23
24#[derive(Deserialize, Debug)]
25pub struct SearchEntry {
26 pub id: ResourceId,
27 pub resource_type: ResourceType,
28 pub version_id: VersionId,
29}
30
31pub struct SearchReturn {
32 pub total: Option<i64>,
33 pub entries: Vec<SearchEntry>,
34}
35
36pub struct SearchOptions {
37 pub count_limit: bool,
38}
39
40pub struct SuccessfullyIndexedCount(pub usize);
41
42pub trait SearchEngine: Send + Sync {
43 fn search(
44 &self,
45 fhir_version: &SupportedFHIRVersions,
46 tenant: &TenantId,
47 project: &ProjectId,
48 search_request: &SearchRequest,
49 options: Option<SearchOptions>,
50 ) -> impl Future<Output = Result<SearchReturn, OperationOutcomeError>> + Send + Sync;
51
52 fn index(
53 &self,
54 fhir_version: SupportedFHIRVersions,
55 resource: Vec<IndexResource>,
56 ) -> impl Future<Output = Result<SuccessfullyIndexedCount, OperationOutcomeError>> + Send + Sync;
57
58 fn migrate(
59 &self,
60 fhir_version: &SupportedFHIRVersions,
61 ) -> impl Future<Output = Result<(), haste_fhir_operation_error::OperationOutcomeError>> + Send + Sync;
62}