scufflecloud_core_cedar/models/
organization.rs1use core_db_types::models::{
2 Organization, OrganizationInvitation, OrganizationMember, Policy, Project, Role, ServiceAccount, ServiceAccountToken,
3};
4use ext_traits::OptionExt;
5
6use crate::macros::{cedar_entity, cedar_entity_id};
7use crate::{CedarIdentifiable, EntityTypeName, JsonEntityUid, entity_type_name};
8
9cedar_entity!(Organization);
10
11cedar_entity!(Project);
12
13cedar_entity!(Policy);
14
15cedar_entity!(Role);
16
17impl crate::CedarIdentifiable for OrganizationMember {
18 const ENTITY_TYPE: EntityTypeName = entity_type_name!("OrganizationMember");
19
20 fn entity_id(&self) -> cedar_policy::EntityId {
21 cedar_policy::EntityId::new(format!("{}:{}", self.organization_id.unprefixed(), self.user_id.unprefixed()))
22 }
23}
24
25impl crate::CedarEntity for OrganizationMember {
26 async fn parents(&self, _: &impl core_traits::Global) -> Result<impl IntoIterator<Item = JsonEntityUid>, tonic::Status> {
27 Ok(std::iter::once(self.organization_id.entity_uid()))
28 }
29}
30
31cedar_entity_id!(ServiceAccount);
32
33impl crate::CedarEntity for ServiceAccount {
34 async fn parents(&self, _: &impl core_traits::Global) -> Result<impl IntoIterator<Item = JsonEntityUid>, tonic::Status> {
35 Ok(std::iter::once(self.organization_id.entity_uid()).chain(self.project_id.map(|id| id.entity_uid())))
36 }
37}
38
39cedar_entity!(ServiceAccountToken);
40
41cedar_entity_id!(OrganizationInvitation);
42
43impl crate::CedarEntity for OrganizationInvitation {
44 async fn additional_attributes(
45 &self,
46 global: &impl core_traits::Global,
47 ) -> Result<impl serde::Serialize, tonic::Status> {
48 #[derive(serde_derive::Serialize)]
49 struct AdditionalAttrs {
50 organization: Organization,
51 }
52
53 Ok(AdditionalAttrs {
54 organization: global
55 .organization_loader()
56 .load(self.organization_id)
57 .await
58 .ok()
59 .into_tonic_internal_err("failed to query organization")?
60 .into_tonic_not_found("organization not found")?,
61 })
62 }
63}