algohub_server/utils/
organization.rs1use 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}