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}