Add UserOrganizationStatus enum and update role checks

- Introduced a new UserOrganizationStatus enum to manage user organization statuses (Active, Inactive, Pending, Guest) in the database schema.
- Updated the UserToOrganization model to include a status field.
- Refactored role checks across various routes to replace the previous UserOrganizationRole values (Owner, Admin) with new roles (WorkspaceAdmin, DataAdmin) for better role management.
- Enhanced data source handling in multiple routes to align with the updated role structure.

These changes improve the clarity and functionality of user organization management within the application.
This commit is contained in:
dal 2025-01-08 11:38:06 -07:00
parent dcfaa43e9e
commit 371b507acd
17 changed files with 77 additions and 29 deletions

View File

@ -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<sql_types::UserOrganizationStatusEnum, Pg> 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<sql_types::UserOrganizationStatusEnum, Pg> for UserOrganizationStatus {
fn from_sql(bytes: PgValue<'_>) -> deserialize::Result<Self> {
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,

View File

@ -443,6 +443,7 @@ pub struct UserToOrganization {
pub created_by: Uuid,
pub updated_by: Uuid,
pub deleted_by: Option<Uuid>,
pub status: UserOrganizationStatus,
}
#[derive(Queryable, Insertable, Associations, Debug)]

View File

@ -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 {

View File

@ -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::<Uuid>(&mut conn)

View File

@ -85,8 +85,8 @@ pub async fn get_data_source_state(user_id: &Uuid, id: Uuid) -> Result<DataSourc
.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())

View File

@ -93,8 +93,8 @@ async fn delete_data_source_handler(user_id: &Uuid, id: Uuid) -> 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::<Uuid>(&mut conn)

View File

@ -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())

View File

@ -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::<Uuid>(&mut conn)

View File

@ -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::<Uuid>(&mut conn)

View File

@ -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 {

View File

@ -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<UserInfo
let organization_user = UserToOrganization {
user_id: user.id.clone(),
organization_id: organization.id,
role: UserOrganizationRole::Owner,
role: UserOrganizationRole::WorkspaceAdmin,
sharing_setting: SharingSetting::Public,
edit_sql: true,
upload_csv: true,
@ -98,6 +98,7 @@ async fn post_organization_handler(user: &User, name: String) -> Result<UserInfo
created_by: user.id.clone(),
updated_by: user.id.clone(),
deleted_by: None,
status: UserOrganizationStatus::Active,
};
let mut conn = get_pg_pool().get().await?;

View File

@ -7,7 +7,7 @@ use uuid::Uuid;
use crate::{
database::{
enums::{SharingSetting, UserOrganizationRole},
enums::{SharingSetting, UserOrganizationRole, UserOrganizationStatus},
lib::{get_pg_pool, UserConfig},
models::{User, UserToOrganization},
schema::{users, users_to_organizations},
@ -109,6 +109,7 @@ async fn post_user_handler(
created_by: *user_id,
updated_by: *user_id,
deleted_by: None,
status: UserOrganizationStatus::Active,
};
let mut conn = get_pg_pool().get().await?;

View File

@ -121,8 +121,8 @@ async fn run_dataset_sql_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)),
)
.select(users_to_organizations::user_id)
.first::<Uuid>(&mut conn)

View File

@ -298,8 +298,8 @@ async fn is_organization_admin_or_owner(user_id: Arc<Uuid>, message_id: Arc<Uuid
}
};
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 {

View File

@ -522,8 +522,8 @@ async fn is_organization_admin_or_owner(user_id: Arc<Uuid>, thread_id: Arc<Uuid>
}
};
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 {

View File

@ -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,

View File

@ -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::<Uuid>(&mut conn)