algohub_server/utils/
organization.rs

1use anyhow::Result;
2use serde::Deserialize;
3use surrealdb::{engine::remote::ws::Client, sql::Thing, Surreal};
4
5use crate::models::organization::{CreateOrganization, Organization, OrganizationData, UpdateOrg};
6
7pub async fn create(
8    db: &Surreal<Client>,
9    org: CreateOrganization<'_>,
10) -> Result<Option<Organization>> {
11    Ok(db
12        .create("organization")
13        .content(Into::<Organization>::into(org))
14        .await?)
15}
16
17pub async fn get_by_id<M>(db: &Surreal<Client>, id: &str) -> Result<Option<M>>
18where
19    for<'de> M: Deserialize<'de>,
20{
21    Ok(db.select(("organization", id)).await?)
22}
23
24pub async fn update(
25    db: &Surreal<Client>,
26    id: &str,
27    org: OrganizationData<'_>,
28) -> Result<Option<Organization>> {
29    Ok(db
30        .update(("organization", id))
31        .merge(Into::<UpdateOrg>::into(org))
32        .await?)
33}
34
35const ADD_MEMBERS_QUERY: &str = r#"
36UPDATE type::thing("organization", $id)
37    SET members = array::union(members, $new_members)
38"#;
39pub async fn add(
40    db: &Surreal<Client>,
41    id: &str,
42    member: Vec<&str>,
43) -> Result<Option<Organization>> {
44    let members_to_add: Vec<Thing> = member
45        .into_iter()
46        .map(|id| ("account", id).into())
47        .collect();
48
49    Ok(db
50        .query(ADD_MEMBERS_QUERY)
51        .bind(("id", id.to_string()))
52        .bind(("new_members", members_to_add))
53        .await?
54        .take(0)?)
55}
56
57const REMOVE_MEMBERS_QUERY: &str = r#"
58UPDATE type::thing("organization", $id)
59    SET members = array::complement(members, $new_members)
60"#;
61pub async fn remove(
62    db: &Surreal<Client>,
63    id: &str,
64    member: Vec<&str>,
65) -> Result<Option<Organization>> {
66    let members_to_remove: Vec<Thing> = member
67        .into_iter()
68        .map(|id| ("account", id).into())
69        .collect();
70
71    Ok(db
72        .query(REMOVE_MEMBERS_QUERY)
73        .bind(("id", id.to_string()))
74        .bind(("new_members", members_to_remove))
75        .await?
76        .take(0)?)
77}
78
79pub async fn delete(db: &Surreal<Client>, id: &str) -> Result<Option<Organization>> {
80    Ok(db.delete(("organization", id)).await?)
81}