diff --git a/api/src/database/enums.rs b/api/src/database/enums.rs index d02757dfb..4911dd7f8 100644 --- a/api/src/database/enums.rs +++ b/api/src/database/enums.rs @@ -101,6 +101,50 @@ impl AssetPermissionRole { } } +#[derive( + Serialize, + Deserialize, + Debug, + Clone, + Copy, + PartialEq, + Eq, + diesel::AsExpression, + diesel::FromSqlRow, +)] +#[diesel(sql_type = sql_types::UserOrganizationStatusEnum)] +#[serde(rename_all = "camelCase")] +pub enum UserOrganizationStatus { + Active, + Inactive, + Pending, + Guest, +} + +impl ToSql for UserOrganizationStatus { + fn to_sql<'b>(&'b self, out: &mut Output<'b, '_, Pg>) -> serialize::Result { + match *self { + UserOrganizationStatus::Active => out.write_all(b"active")?, + UserOrganizationStatus::Inactive => out.write_all(b"inactive")?, + UserOrganizationStatus::Pending => out.write_all(b"pending")?, + UserOrganizationStatus::Guest => out.write_all(b"guest")?, + } + Ok(IsNull::No) + } +} + +impl FromSql for UserOrganizationStatus { + fn from_sql(bytes: PgValue<'_>) -> deserialize::Result { + match bytes.as_bytes() { + b"active" => Ok(UserOrganizationStatus::Active), + b"inactive" => Ok(UserOrganizationStatus::Inactive), + b"pending" => Ok(UserOrganizationStatus::Pending), + b"guest" => Ok(UserOrganizationStatus::Guest), + _ => Err("Unrecognized enum variant".into()), + } + } +} + #[derive( Serialize, Deserialize, diff --git a/api/src/database/models.rs b/api/src/database/models.rs index 709be3905..6d7e91387 100644 --- a/api/src/database/models.rs +++ b/api/src/database/models.rs @@ -443,6 +443,7 @@ pub struct UserToOrganization { pub created_by: Uuid, pub updated_by: Uuid, pub deleted_by: Option, + pub status: UserOrganizationStatus, } #[derive(Queryable, Insertable, Associations, Debug)] diff --git a/api/src/routes/rest/routes/assets/get_asset_access.rs b/api/src/routes/rest/routes/assets/get_asset_access.rs index fce4dd925..171534d3b 100644 --- a/api/src/routes/rest/routes/assets/get_asset_access.rs +++ b/api/src/routes/rest/routes/assets/get_asset_access.rs @@ -359,8 +359,8 @@ async fn is_organization_admin_or_owner( } }; - let is_organization_adminig = if is_organization_admin == UserOrganizationRole::Admin - || is_organization_admin == UserOrganizationRole::Owner + let is_organization_adminig = if is_organization_admin == UserOrganizationRole::WorkspaceAdmin + || is_organization_admin == UserOrganizationRole::DataAdmin { true } else { diff --git a/api/src/routes/rest/routes/data_sources/post_data_sources.rs b/api/src/routes/rest/routes/data_sources/post_data_sources.rs index 6a1c4ce2d..8cc4c2753 100644 --- a/api/src/routes/rest/routes/data_sources/post_data_sources.rs +++ b/api/src/routes/rest/routes/data_sources/post_data_sources.rs @@ -72,8 +72,8 @@ async fn post_data_sources_handler( .filter(users_to_organizations::deleted_at.is_null()) .filter( users_to_organizations::role - .eq(UserOrganizationRole::Owner) - .or(users_to_organizations::role.eq(UserOrganizationRole::Admin)), + .eq(UserOrganizationRole::WorkspaceAdmin) + .or(users_to_organizations::role.eq(UserOrganizationRole::DataAdmin)), ) .filter(users_to_organizations::user_id.eq(user_id)) .first::(&mut conn) diff --git a/api/src/routes/ws/data_sources/data_source_utils/data_source_utils.rs b/api/src/routes/ws/data_sources/data_source_utils/data_source_utils.rs index 52cea88ac..0b45cf2c9 100644 --- a/api/src/routes/ws/data_sources/data_source_utils/data_source_utils.rs +++ b/api/src/routes/ws/data_sources/data_source_utils/data_source_utils.rs @@ -85,8 +85,8 @@ pub async fn get_data_source_state(user_id: &Uuid, id: Uuid) -> Result Result<()> { .filter(data_sources::deleted_at.is_null()) .filter( users_to_organizations::role - .eq(UserOrganizationRole::Owner) - .or(users_to_organizations::role.eq(UserOrganizationRole::Admin)), + .eq(UserOrganizationRole::WorkspaceAdmin) + .or(users_to_organizations::role.eq(UserOrganizationRole::DataAdmin)), ) .filter(users_to_organizations::user_id.eq(user_id)) .first::(&mut conn) diff --git a/api/src/routes/ws/data_sources/list_data_sources.rs b/api/src/routes/ws/data_sources/list_data_sources.rs index 601d17c24..e954021eb 100644 --- a/api/src/routes/ws/data_sources/list_data_sources.rs +++ b/api/src/routes/ws/data_sources/list_data_sources.rs @@ -108,8 +108,8 @@ async fn list_data_sources_handler( .filter(users_to_organizations::user_id.eq(user_id)) .filter( users_to_organizations::role - .eq(UserOrganizationRole::Admin) - .or(users_to_organizations::role.eq(UserOrganizationRole::Owner)), + .eq(UserOrganizationRole::WorkspaceAdmin) + .or(users_to_organizations::role.eq(UserOrganizationRole::DataAdmin)), ) .filter(users_to_organizations::deleted_at.is_null()) .filter(data_sources::deleted_at.is_null()) diff --git a/api/src/routes/ws/data_sources/post_data_source.rs b/api/src/routes/ws/data_sources/post_data_source.rs index 37a702a2c..02d310bee 100644 --- a/api/src/routes/ws/data_sources/post_data_source.rs +++ b/api/src/routes/ws/data_sources/post_data_source.rs @@ -119,8 +119,8 @@ async fn post_data_source_handler( .filter(users_to_organizations::deleted_at.is_null()) .filter( users_to_organizations::role - .eq(UserOrganizationRole::Owner) - .or(users_to_organizations::role.eq(UserOrganizationRole::Admin)), + .eq(UserOrganizationRole::WorkspaceAdmin) + .or(users_to_organizations::role.eq(UserOrganizationRole::DataAdmin)), ) .filter(users_to_organizations::user_id.eq(user_id)) .first::(&mut conn) diff --git a/api/src/routes/ws/data_sources/update_data_source.rs b/api/src/routes/ws/data_sources/update_data_source.rs index e712723ed..74b874706 100644 --- a/api/src/routes/ws/data_sources/update_data_source.rs +++ b/api/src/routes/ws/data_sources/update_data_source.rs @@ -128,8 +128,8 @@ async fn update_data_source_handler( .filter(data_sources::deleted_at.is_null()) .filter( users_to_organizations::role - .eq(UserOrganizationRole::Owner) - .or(users_to_organizations::role.eq(UserOrganizationRole::Admin)), + .eq(UserOrganizationRole::WorkspaceAdmin) + .or(users_to_organizations::role.eq(UserOrganizationRole::DataAdmin)), ) .filter(users_to_organizations::user_id.eq(user_id)) .first::(&mut conn) diff --git a/api/src/routes/ws/datasets/dataset_utils.rs b/api/src/routes/ws/datasets/dataset_utils.rs index f90c05f01..fe920fa0f 100644 --- a/api/src/routes/ws/datasets/dataset_utils.rs +++ b/api/src/routes/ws/datasets/dataset_utils.rs @@ -393,8 +393,8 @@ pub async fn is_organization_admin_or_owner( } }; - let is_organization_adminig = if is_organization_admin == UserOrganizationRole::Admin - || is_organization_admin == UserOrganizationRole::Owner + let is_organization_adminig = if is_organization_admin == UserOrganizationRole::WorkspaceAdmin + || is_organization_admin == UserOrganizationRole::DataAdmin { true } else { diff --git a/api/src/routes/ws/organizations/post_organization.rs b/api/src/routes/ws/organizations/post_organization.rs index 7a9d4ff59..e08408cab 100644 --- a/api/src/routes/ws/organizations/post_organization.rs +++ b/api/src/routes/ws/organizations/post_organization.rs @@ -7,7 +7,7 @@ use uuid::Uuid; use crate::{ database::{ - enums::{SharingSetting, UserOrganizationRole}, + enums::{SharingSetting, UserOrganizationRole, UserOrganizationStatus}, lib::get_pg_pool, models::{Organization, User, UserToOrganization}, schema::{organizations, users_to_organizations}, @@ -86,7 +86,7 @@ async fn post_organization_handler(user: &User, name: String) -> Result Result(&mut conn) diff --git a/api/src/routes/ws/threads_and_messages/messages_utils.rs b/api/src/routes/ws/threads_and_messages/messages_utils.rs index 1b6d4463b..52fa6cd61 100644 --- a/api/src/routes/ws/threads_and_messages/messages_utils.rs +++ b/api/src/routes/ws/threads_and_messages/messages_utils.rs @@ -298,8 +298,8 @@ async fn is_organization_admin_or_owner(user_id: Arc, message_id: Arc, thread_id: Arc } }; - let is_organization_adminig = if is_organization_admin == UserOrganizationRole::Admin - || is_organization_admin == UserOrganizationRole::Owner + let is_organization_adminig = if is_organization_admin == UserOrganizationRole::WorkspaceAdmin + || is_organization_admin == UserOrganizationRole::DataAdmin { true } else { diff --git a/api/src/routes/ws/users/invite_users.rs b/api/src/routes/ws/users/invite_users.rs index 06d62a619..408464312 100644 --- a/api/src/routes/ws/users/invite_users.rs +++ b/api/src/routes/ws/users/invite_users.rs @@ -10,7 +10,7 @@ use uuid::Uuid; use crate::{ database::{ - enums::{SharingSetting, TeamToUserRole, UserOrganizationRole}, + enums::{SharingSetting, TeamToUserRole, UserOrganizationRole, UserOrganizationStatus}, lib::{get_pg_pool, UserConfig}, models::{TeamToUser, User, UserToOrganization}, schema::{teams_to_users, users, users_to_organizations}, @@ -97,7 +97,8 @@ async fn invite_users_handler(user: &User, req: InviteUsersRequest) -> Result<() let user_to_organization = UserToOrganization { user_id: new_user.id, organization_id: organization.id, - role: UserOrganizationRole::Member, + role: UserOrganizationRole::Querier, + status: UserOrganizationStatus::Active, created_at: Utc::now(), updated_at: Utc::now(), sharing_setting: SharingSetting::Public, diff --git a/api/src/utils/query_engine/query_engine.rs b/api/src/utils/query_engine/query_engine.rs index e4d0f3c27..27d69c40c 100644 --- a/api/src/utils/query_engine/query_engine.rs +++ b/api/src/utils/query_engine/query_engine.rs @@ -53,8 +53,8 @@ pub async fn modeling_query_engine( .filter(data_sources::id.eq(data_source_id)) .filter( users_to_organizations::role - .eq(UserOrganizationRole::Admin) - .or(users_to_organizations::role.eq(UserOrganizationRole::Owner)), + .eq(UserOrganizationRole::WorkspaceAdmin) + .or(users_to_organizations::role.eq(UserOrganizationRole::DataAdmin)), ) .select(users_to_organizations::user_id) .first::(&mut conn)