Skip to main content

firestore/db/
delete.rs

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}