1use rpc::proto;
2
3use super::*;
4
5impl Database {
6 pub async fn get_hosted_projects(
7 &self,
8 channel_ids: &Vec<ChannelId>,
9 roles: &HashMap<ChannelId, ChannelRole>,
10 tx: &DatabaseTransaction,
11 ) -> Result<Vec<proto::HostedProject>> {
12 Ok(hosted_project::Entity::find()
13 .filter(hosted_project::Column::ChannelId.is_in(channel_ids.iter().map(|id| id.0)))
14 .all(&*tx)
15 .await?
16 .into_iter()
17 .flat_map(|project| {
18 if project.deleted_at.is_some() {
19 return None;
20 }
21 match project.visibility {
22 ChannelVisibility::Public => {}
23 ChannelVisibility::Members => {
24 let is_visible = roles
25 .get(&project.channel_id)
26 .map(|role| role.can_see_all_descendants())
27 .unwrap_or(false);
28 if !is_visible {
29 return None;
30 }
31 }
32 };
33 Some(proto::HostedProject {
34 id: project.id.to_proto(),
35 channel_id: project.channel_id.to_proto(),
36 name: project.name.clone(),
37 visibility: project.visibility.into(),
38 })
39 })
40 .collect())
41 }
42}