instrumentality/routes/groups/
delete.rs

1//! Route for deleting groups.
2//!
3//! The /delete route is implemented here.
4//!
5//! See endpoint documentation at
6//! <https://docs.berserksystems.com/endpoints/groups/delete/>.
7
8use axum::{http::StatusCode, response::IntoResponse, Json};
9use mongodb::bson::doc;
10use mongodb::Collection;
11use serde::{Deserialize, Serialize};
12
13use crate::database::DBHandle;
14use crate::group::Group;
15use crate::routes::response::ErrorResponse;
16use crate::routes::response::OkResponse;
17use crate::user::User;
18
19#[derive(Debug, Serialize, Deserialize, Clone)]
20pub struct DeleteGroupRequest {
21    pub uuid: String,
22}
23
24// This is ugly. Can probably do better than an if-else.
25pub async fn delete(
26    user: User,
27    mut db: DBHandle,
28    Json(data): Json<DeleteGroupRequest>,
29) -> impl IntoResponse {
30    // UUID of the requester.
31    let req_uuid = user.uuid;
32    let group_coll: Collection<Group> = db.collection("groups");
33    if let Ok(Some(_)) = group_coll
34        .find_one_with_session(
35            doc! {"uuid": &data.uuid, "created_by": &req_uuid},
36            None,
37            &mut db.session,
38        )
39        .await
40    {
41        group_coll
42            .delete_one_with_session(
43                doc! {"uuid": &data.uuid, "created_by": &req_uuid},
44                None,
45                &mut db.session,
46            )
47            .await
48            .unwrap();
49        db.session.commit_transaction().await.unwrap();
50        ok!()
51    } else {
52        error!(
53            BAD_REQUEST,
54            "No such group exists or it was not created by the user with the given key."
55        )
56    }
57}