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}