Skip to main content

haste_fhir_search/
lib.rs

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}