1use 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}