1use crate::db::safe_document_path;
2use crate::{FirestoreDb, FirestoreResult, FirestoreWritePrecondition};
3use async_trait::async_trait;
4use chrono::{DateTime, Utc};
5use gcloud_sdk::google::firestore::v1::*;
6use tracing::*;
7
8#[async_trait]
9pub trait FirestoreDeleteSupport {
10 async fn delete_by_id<S>(
11 &self,
12 collection_id: &str,
13 document_id: S,
14 precondition: Option<FirestoreWritePrecondition>,
15 ) -> FirestoreResult<()>
16 where
17 S: AsRef<str> + Send;
18
19 async fn delete_by_id_at<S>(
20 &self,
21 parent: &str,
22 collection_id: &str,
23 document_id: S,
24 precondition: Option<FirestoreWritePrecondition>,
25 ) -> FirestoreResult<()>
26 where
27 S: AsRef<str> + Send;
28}
29
30#[async_trait]
31impl FirestoreDeleteSupport for FirestoreDb {
32 async fn delete_by_id<S>(
33 &self,
34 collection_id: &str,
35 document_id: S,
36 precondition: Option<FirestoreWritePrecondition>,
37 ) -> FirestoreResult<()>
38 where
39 S: AsRef<str> + Send,
40 {
41 self.delete_by_id_at(
42 self.get_documents_path().as_str(),
43 collection_id,
44 document_id,
45 precondition,
46 )
47 .await
48 }
49
50 async fn delete_by_id_at<S>(
51 &self,
52 parent: &str,
53 collection_id: &str,
54 document_id: S,
55 precondition: Option<FirestoreWritePrecondition>,
56 ) -> FirestoreResult<()>
57 where
58 S: AsRef<str> + Send,
59 {
60 let document_path = safe_document_path(parent, collection_id, document_id.as_ref())?;
61
62 let span = span!(
63 Level::DEBUG,
64 "Firestore Delete Document",
65 "/firestore/collection_name" = collection_id,
66 "/firestore/response_time" = field::Empty,
67 "/firestore/document_name" = document_path.as_str(),
68 );
69
70 let request = gcloud_sdk::tonic::Request::new(DeleteDocumentRequest {
71 name: document_path,
72 current_document: precondition.map(|cond| cond.try_into()).transpose()?,
73 });
74
75 let begin_query_utc: DateTime<Utc> = Utc::now();
76 self.client().get().delete_document(request).await?;
77 let end_query_utc: DateTime<Utc> = Utc::now();
78 let query_duration = end_query_utc.signed_duration_since(begin_query_utc);
79
80 span.record(
81 "/firestore/response_time",
82 query_duration.num_milliseconds(),
83 );
84
85 span.in_scope(|| {
86 debug!(
87 collection_id,
88 document_id = document_id.as_ref(),
89 "Deleted a document.",
90 );
91 });
92
93 Ok(())
94 }
95}