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