Skip to main content

haste_repository/
fhir.rs

1/// FHIR Access
2use crate::types::{FHIRMethod, SupportedFHIRVersions};
3use haste_fhir_client::request::HistoryRequest;
4use haste_fhir_model::r4::generated::resources::{Resource, ResourceType};
5use haste_fhir_model::r4::sqlx::FHIRJson;
6use haste_fhir_operation_error::OperationOutcomeError;
7use haste_jwt::{ProjectId, ResourceId, TenantId, VersionId, claims::UserTokenClaims};
8
9#[derive(Clone)]
10pub struct ResourcePollingValue {
11    pub id: ResourceId,
12    pub resource_type: ResourceType,
13    pub version_id: String,
14    pub project: ProjectId,
15    pub tenant: TenantId,
16    pub resource: FHIRJson<Resource>,
17    pub sequence: i64,
18    pub fhir_method: FHIRMethod,
19}
20
21#[derive(PartialEq, Eq)]
22pub enum CachePolicy {
23    NoCache,
24    Cache,
25}
26
27pub trait FHIRRepository: Sized {
28    fn create(
29        &self,
30        tenant: &TenantId,
31        project: &ProjectId,
32        user: &UserTokenClaims,
33        fhir_version: &SupportedFHIRVersions,
34        resource: &mut Resource,
35    ) -> impl Future<Output = Result<Resource, OperationOutcomeError>> + Send;
36
37    fn update(
38        &self,
39        tenant: &TenantId,
40        project: &ProjectId,
41        user: &UserTokenClaims,
42        fhir_version: &SupportedFHIRVersions,
43        resource: &mut Resource,
44        id: &str,
45    ) -> impl Future<Output = Result<Resource, OperationOutcomeError>> + Send;
46
47    fn delete(
48        &self,
49        tenant: &TenantId,
50        project: &ProjectId,
51        user: &UserTokenClaims,
52        fhir_version: &SupportedFHIRVersions,
53        resource: &mut Resource,
54        id: &str,
55    ) -> impl Future<Output = Result<Resource, OperationOutcomeError>> + Send;
56
57    fn read_by_version_ids(
58        &self,
59        tenant_id: &TenantId,
60        project_id: &ProjectId,
61        version_id: &[&VersionId],
62        cache_policy: CachePolicy,
63    ) -> impl Future<Output = Result<Vec<Resource>, OperationOutcomeError>> + Send;
64    fn read_latest(
65        &self,
66        tenant_id: &TenantId,
67        project_id: &ProjectId,
68        resource_type: &ResourceType,
69        resource_id: &ResourceId,
70    ) -> impl Future<Output = Result<Option<Resource>, OperationOutcomeError>> + Send;
71    fn history(
72        &self,
73        tenant_id: &TenantId,
74        project_id: &ProjectId,
75        request: &HistoryRequest,
76    ) -> impl Future<Output = Result<Vec<Resource>, OperationOutcomeError>> + Send;
77    fn get_sequence(
78        &self,
79        tenant_id: &TenantId,
80        sequence_id: u64,
81        count: Option<u64>,
82    ) -> impl Future<Output = Result<Vec<ResourcePollingValue>, OperationOutcomeError>> + Send;
83    fn transaction<'a>(
84        &'a self,
85        register: bool,
86    ) -> impl Future<Output = Result<Self, OperationOutcomeError>> + Send;
87    fn in_transaction(&self) -> bool;
88    fn commit(self) -> impl Future<Output = Result<(), OperationOutcomeError>> + Send;
89    fn rollback(self) -> impl Future<Output = Result<(), OperationOutcomeError>> + Send;
90}