Skip to main content

ahri_tre_protocol/
lifecycle.rs

1use crate::{
2    PublicName,
3    asset::AssetSelector,
4    datafile::DataFileSelector,
5    dataset::DatasetSelector,
6    domain::DomainSelector,
7    model::{EntitySelector, RelationSelector},
8    refs::{SessionSelector, VersionRef},
9    study::StudySelector,
10};
11use serde::{Deserialize, Serialize};
12
13#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
14pub struct DestructiveIntent {
15    pub reason: String,
16    #[serde(default, skip_serializing_if = "Option::is_none")]
17    pub actor: Option<String>,
18    #[serde(default)]
19    pub dry_run: bool,
20    #[serde(default)]
21    pub confirmed: bool,
22}
23
24#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
25pub struct ArchiveDeletePolicy {
26    #[serde(default)]
27    pub archive: bool,
28    #[serde(default)]
29    pub cascade: bool,
30    #[serde(default)]
31    pub force: bool,
32}
33
34#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
35pub struct DeletePreconditions {
36    #[serde(default, skip_serializing_if = "Option::is_none")]
37    pub version: Option<String>,
38    #[serde(default)]
39    pub all_versions: bool,
40}
41
42#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
43pub struct StudyDeleteRequest {
44    #[serde(default, skip_serializing_if = "Option::is_none")]
45    pub session: Option<SessionSelector>,
46    pub study: StudySelector,
47    pub intent: DestructiveIntent,
48    pub policy: ArchiveDeletePolicy,
49}
50
51#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
52pub struct AssetDeleteRequest {
53    #[serde(default, skip_serializing_if = "Option::is_none")]
54    pub session: Option<SessionSelector>,
55    pub asset: AssetSelector,
56    pub intent: DestructiveIntent,
57    pub policy: ArchiveDeletePolicy,
58}
59
60#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
61pub struct DataFileDeleteRequest {
62    #[serde(default, skip_serializing_if = "Option::is_none")]
63    pub session: Option<SessionSelector>,
64    pub datafile: DataFileSelector,
65    pub preconditions: DeletePreconditions,
66    pub intent: DestructiveIntent,
67    pub policy: ArchiveDeletePolicy,
68}
69
70#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
71pub struct DatasetDeleteRequest {
72    #[serde(default, skip_serializing_if = "Option::is_none")]
73    pub session: Option<SessionSelector>,
74    pub dataset: DatasetSelector,
75    pub preconditions: DeletePreconditions,
76    pub intent: DestructiveIntent,
77    pub policy: ArchiveDeletePolicy,
78}
79
80#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
81pub struct DatasetWithdrawRequest {
82    #[serde(default, skip_serializing_if = "Option::is_none")]
83    pub session: Option<SessionSelector>,
84    pub dataset: DatasetSelector,
85    #[serde(default, skip_serializing_if = "Option::is_none")]
86    pub version: Option<String>,
87    pub intent: DestructiveIntent,
88    #[serde(default)]
89    pub force: bool,
90    #[serde(default)]
91    pub drop_lake_table: bool,
92}
93
94#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
95pub struct SemanticDeleteRequest {
96    #[serde(default, skip_serializing_if = "Option::is_none")]
97    pub session: Option<SessionSelector>,
98    pub target: SemanticDeleteSelector,
99    pub intent: DestructiveIntent,
100}
101
102#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
103#[serde(tag = "kind", rename_all = "snake_case")]
104pub enum SemanticDeleteSelector {
105    Reference {
106        reference: crate::refs::ObjectRef,
107        #[serde(default, skip_serializing_if = "Option::is_none")]
108        domain: Option<DomainSelector>,
109    },
110    Domain {
111        domain: DomainSelector,
112    },
113    Variable {
114        domain: DomainSelector,
115        name: PublicName,
116    },
117    Vocabulary {
118        domain: DomainSelector,
119        name: PublicName,
120    },
121    Entity {
122        entity: EntitySelector,
123    },
124    Relation {
125        relation: RelationSelector,
126    },
127}
128
129#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
130pub struct DeleteWorkflowResponse {
131    pub session: crate::session::SessionStatusPayload,
132    pub status: DeleteWorkflowStatus,
133    #[serde(default, skip_serializing_if = "is_false")]
134    pub blocked: bool,
135    #[serde(default, skip_serializing_if = "Option::is_none")]
136    pub blocked_reason: Option<String>,
137    #[serde(default, skip_serializing_if = "Option::is_none")]
138    pub dependency_summary: Option<serde_json::Value>,
139    #[serde(default, skip_serializing_if = "Option::is_none")]
140    pub next_step: Option<String>,
141    #[serde(default, skip_serializing_if = "Option::is_none")]
142    pub planning: Option<serde_json::Value>,
143    #[serde(default, skip_serializing_if = "Option::is_none")]
144    pub result: Option<DeleteWorkflowResultSummary>,
145    #[serde(default, skip_serializing_if = "Vec::is_empty")]
146    pub warnings: Vec<String>,
147}
148
149#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
150#[serde(rename_all = "snake_case")]
151pub enum DeleteWorkflowStatus {
152    Planned,
153    Blocked,
154    Deleted,
155    Withdrawn,
156}
157
158const fn is_false(value: &bool) -> bool {
159    !*value
160}
161
162#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
163pub struct DeleteWorkflowResultSummary {
164    pub kind: DeleteWorkflowResultKind,
165    #[serde(default, skip_serializing_if = "Option::is_none")]
166    pub asset_name: Option<String>,
167    #[serde(default, skip_serializing_if = "Option::is_none")]
168    pub reason: Option<String>,
169    #[serde(default, skip_serializing_if = "Option::is_none")]
170    pub withdrawn_version: Option<serde_json::Value>,
171    #[serde(default, skip_serializing_if = "Option::is_none")]
172    pub lake_table_drop: Option<String>,
173    #[serde(default, skip_serializing_if = "Option::is_none")]
174    pub archive: Option<ArchiveSummary>,
175    #[serde(default, skip_serializing_if = "Option::is_none")]
176    pub tombstone: Option<TombstoneSummary>,
177    #[serde(default, skip_serializing_if = "Option::is_none")]
178    pub dependency_summary: Option<serde_json::Value>,
179    #[serde(default, skip_serializing_if = "Option::is_none")]
180    pub provenance: Option<serde_json::Value>,
181    #[serde(default, skip_serializing_if = "Option::is_none")]
182    pub removed_link_count: Option<usize>,
183    #[serde(default, skip_serializing_if = "Option::is_none")]
184    pub promoted_latest_version: Option<serde_json::Value>,
185    #[serde(default)]
186    pub deleted_assets: usize,
187    #[serde(default)]
188    pub deleted_versions: usize,
189    #[serde(default)]
190    pub skipped_versions: usize,
191    #[serde(default)]
192    pub failed_versions: usize,
193    #[serde(default)]
194    pub already_withdrawn: bool,
195}
196
197#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
198#[serde(rename_all = "snake_case")]
199pub enum DeleteWorkflowResultKind {
200    Study,
201    Asset,
202    DataFile,
203    Dataset,
204    DatasetWithdrawal,
205    Semantic,
206}
207
208#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
209pub struct ArchiveSummary {
210    pub archived: bool,
211    #[serde(default, skip_serializing_if = "Option::is_none")]
212    pub asset_name: Option<String>,
213    #[serde(default, skip_serializing_if = "Option::is_none")]
214    pub version: Option<VersionRef>,
215    #[serde(default, skip_serializing_if = "Option::is_none")]
216    pub summary: Option<serde_json::Value>,
217}
218
219#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
220pub struct TombstoneSummary {
221    #[serde(default)]
222    pub metadata_removed: bool,
223    #[serde(default)]
224    pub lake_removed: bool,
225    #[serde(default, skip_serializing_if = "Option::is_none")]
226    pub retry_state: Option<serde_json::Value>,
227}