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