1use serde::{Deserialize, Serialize};
2use serde_with::skip_serializing_none;
3use std::collections::HashMap;
4
5use crate::{
6 models::instances::InstanceId, CogniteExternalId, EqIdentity, Identity, IdentityOrInstance,
7 IntoPatch, IntoPatchItem, Patch, UpdateList, UpdateMap, UpdateSetNull, UpsertOptions,
8};
9
10#[skip_serializing_none]
11#[derive(Serialize, Deserialize, Debug, Default, Clone)]
12#[serde(rename_all = "camelCase")]
13pub struct FileMetadata {
15 pub external_id: Option<String>,
17 pub name: String,
19 pub directory: Option<String>,
21 pub source: Option<String>,
23 pub mime_type: Option<String>,
25 pub metadata: Option<HashMap<String, String>>,
29 pub asset_ids: Option<Vec<i64>>,
31 pub data_set_id: Option<i64>,
33 pub source_created_time: Option<i64>,
35 pub source_modified_time: Option<i64>,
37 pub security_categories: Option<Vec<i64>>,
39 pub labels: Option<Vec<CogniteExternalId>>,
41 pub id: i64,
43 pub uploaded: bool,
45 pub uploaded_time: Option<i64>,
47 pub created_time: i64,
49 pub last_updated_time: i64,
51}
52
53#[derive(Serialize, Deserialize, Debug, Default, Clone)]
54#[serde(rename_all = "camelCase")]
55pub struct UploadUrl {
57 pub upload_url: String,
60 pub instance_id: Option<InstanceId>,
62}
63
64#[derive(Serialize, Deserialize, Debug, Default, Clone)]
65#[serde(rename_all = "camelCase")]
66pub struct MultiUploadUrls {
68 pub upload_id: String,
70 pub upload_urls: Vec<String>,
72 pub instance_id: Option<InstanceId>,
74}
75
76#[derive(Serialize, Deserialize, Debug, Default, Clone)]
77#[serde(rename_all = "camelCase")]
78pub struct FileUploadResult<T> {
80 #[serde(flatten)]
81 pub metadata: FileMetadata,
83 #[serde(flatten)]
84 pub extra: T,
86}
87
88#[skip_serializing_none]
89#[derive(Serialize, Deserialize, Debug, Default, Clone)]
90#[serde(rename_all = "camelCase")]
91pub struct AddFile {
93 pub external_id: Option<String>,
95 pub name: String,
97 pub directory: Option<String>,
99 pub source: Option<String>,
101 pub mime_type: Option<String>,
103 pub metadata: Option<HashMap<String, String>>,
107 pub asset_ids: Option<Vec<i64>>,
109 pub data_set_id: Option<i64>,
111 pub source_created_time: Option<i64>,
113 pub source_modified_time: Option<i64>,
115 pub security_categories: Option<Vec<i64>>,
117 pub labels: Option<Vec<CogniteExternalId>>,
119}
120
121impl From<FileMetadata> for AddFile {
122 fn from(file: FileMetadata) -> AddFile {
123 AddFile {
124 external_id: file.external_id,
125 name: file.name,
126 directory: file.directory,
127 source: file.source,
128 mime_type: file.mime_type,
129 metadata: file.metadata,
130 asset_ids: file.asset_ids,
131 data_set_id: file.data_set_id,
132 source_created_time: file.source_created_time,
133 source_modified_time: file.source_modified_time,
134 security_categories: file.security_categories,
135 labels: file.labels,
136 }
137 }
138}
139
140impl EqIdentity for AddFile {
141 fn eq(&self, id: &Identity) -> bool {
142 match id {
143 Identity::Id { id: _ } => false,
144 Identity::ExternalId { external_id } => self.external_id.as_ref() == Some(external_id),
145 }
146 }
147}
148
149#[skip_serializing_none]
150#[derive(Serialize, Deserialize, Debug, Default, Clone)]
151#[serde(rename_all = "camelCase")]
152pub struct PatchFile {
154 pub external_id: Option<UpdateSetNull<String>>,
156 pub directory: Option<UpdateSetNull<String>>,
158 pub source: Option<UpdateSetNull<String>>,
160 pub mime_type: Option<UpdateSetNull<String>>,
162 pub metadata: Option<UpdateMap<String, String>>,
166 pub asset_ids: Option<UpdateList<i64, i64>>,
168 pub source_created_time: Option<UpdateSetNull<i64>>,
170 pub source_modified_time: Option<UpdateSetNull<i64>>,
172 pub data_set_id: Option<UpdateSetNull<i64>>,
174 pub security_categories: Option<UpdateList<i64, i64>>,
176 pub labels: Option<UpdateList<CogniteExternalId, CogniteExternalId>>,
178}
179
180impl IntoPatch<Patch<PatchFile>> for FileMetadata {
181 fn patch(self, options: &UpsertOptions) -> Patch<PatchFile> {
182 Patch::<PatchFile> {
183 id: to_idt!(self),
184 update: PatchFile {
185 external_id: self.external_id.patch(options),
186 directory: self.directory.patch(options),
187 source: self.source.patch(options),
188 mime_type: self.mime_type.patch(options),
189 metadata: self.metadata.patch(options),
190 asset_ids: self.asset_ids.patch(options),
191 source_created_time: self.source_created_time.patch(options),
192 source_modified_time: self.source_modified_time.patch(options),
193 data_set_id: self.data_set_id.patch(options),
194 security_categories: self.security_categories.patch(options),
195 labels: self.labels.patch(options),
196 },
197 }
198 }
199}
200
201impl IntoPatch<PatchFile> for AddFile {
202 fn patch(self, options: &UpsertOptions) -> PatchFile {
203 PatchFile {
204 external_id: self.external_id.patch(options),
205 directory: self.directory.patch(options),
206 source: self.source.patch(options),
207 mime_type: self.mime_type.patch(options),
208 metadata: self.metadata.patch(options),
209 asset_ids: self.asset_ids.patch(options),
210 source_created_time: self.source_created_time.patch(options),
211 source_modified_time: self.source_modified_time.patch(options),
212 data_set_id: self.data_set_id.patch(options),
213 security_categories: self.security_categories.patch(options),
214 labels: self.labels.patch(options),
215 }
216 }
217}
218
219impl From<FileMetadata> for Patch<PatchFile> {
220 fn from(file: FileMetadata) -> Self {
221 IntoPatch::<Patch<PatchFile>>::patch(file, &Default::default())
222 }
223}
224
225#[derive(Serialize, Deserialize, Debug)]
226#[serde(rename_all = "camelCase")]
227pub struct FileDownloadUrl {
229 #[serde(flatten)]
230 pub id: IdentityOrInstance,
232 pub download_url: String,
234}
235
236#[derive(Serialize, Deserialize, Debug)]
237#[serde(rename_all = "camelCase")]
238pub struct FileAggregates {
240 pub count: i64,
242}
243
244#[derive(Serialize, Deserialize, Debug)]
245#[serde(rename_all = "camelCase")]
246pub struct CompleteMultipartUpload {
248 #[serde(flatten)]
249 pub id: IdentityOrInstance,
251 pub upload_id: String,
253}