dev_servers.rs

 1use sea_orm::{ActiveValue, ColumnTrait, DatabaseTransaction, EntityTrait, QueryFilter};
 2
 3use super::{channel, dev_server, ChannelId, Database, DevServerId, UserId};
 4
 5impl Database {
 6    pub async fn get_dev_server(
 7        &self,
 8        dev_server_id: DevServerId,
 9    ) -> crate::Result<dev_server::Model> {
10        self.transaction(|tx| async move {
11            Ok(dev_server::Entity::find_by_id(dev_server_id)
12                .one(&*tx)
13                .await?
14                .ok_or_else(|| anyhow::anyhow!("no dev server with id {}", dev_server_id))?)
15        })
16        .await
17    }
18
19    pub async fn get_dev_servers(
20        &self,
21        channel_ids: &Vec<ChannelId>,
22        tx: &DatabaseTransaction,
23    ) -> crate::Result<Vec<dev_server::Model>> {
24        let servers = dev_server::Entity::find()
25            .filter(dev_server::Column::ChannelId.is_in(channel_ids.iter().map(|id| id.0)))
26            .all(tx)
27            .await?;
28        Ok(servers)
29    }
30
31    pub async fn create_dev_server(
32        &self,
33        channel_id: ChannelId,
34        name: &str,
35        hashed_access_token: &str,
36        user_id: UserId,
37    ) -> crate::Result<(channel::Model, dev_server::Model)> {
38        self.transaction(|tx| async move {
39            let channel = self.get_channel_internal(channel_id, &tx).await?;
40            self.check_user_is_channel_admin(&channel, user_id, &tx)
41                .await?;
42
43            let dev_server = dev_server::Entity::insert(dev_server::ActiveModel {
44                id: ActiveValue::NotSet,
45                hashed_token: ActiveValue::Set(hashed_access_token.to_string()),
46                channel_id: ActiveValue::Set(channel_id),
47                name: ActiveValue::Set(name.to_string()),
48            })
49            .exec_with_returning(&*tx)
50            .await?;
51
52            Ok((channel, dev_server))
53        })
54        .await
55    }
56}