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