gitdataai/libs/service/workspace/settings.rs
2026-04-15 09:08:09 +08:00

83 lines
2.6 KiB
Rust

use crate::AppService;
use crate::error::AppError;
use chrono::Utc;
use models::workspaces::{WorkspaceRole, workspace};
use sea_orm::*;
use serde::{Deserialize, Serialize};
use session::Session;
#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)]
pub struct WorkspaceUpdateParams {
pub name: Option<String>,
pub description: Option<String>,
pub avatar_url: Option<String>,
pub billing_email: Option<String>,
}
impl AppService {
pub async fn workspace_update(
&self,
ctx: &Session,
workspace_slug: String,
params: WorkspaceUpdateParams,
) -> Result<workspace::Model, AppError> {
let user_uid = ctx.user().ok_or(AppError::Unauthorized)?;
let ws = self
.utils_find_workspace_by_slug(workspace_slug.clone())
.await?;
self.utils_check_workspace_permission(ws.id, user_uid, &[WorkspaceRole::Admin])
.await?;
let mut m: workspace::ActiveModel = ws.into();
if let Some(name) = params.name {
// Check name uniqueness
if workspace::Entity::find()
.filter(workspace::Column::Name.eq(&name))
.filter(workspace::Column::DeletedAt.is_null())
.filter(workspace::Column::Id.ne(m.id.clone().unwrap()))
.one(&self.db)
.await?
.is_some()
{
return Err(AppError::WorkspaceNameAlreadyExists);
}
m.name = Set(name);
}
if let Some(description) = params.description {
m.description = Set(Some(description));
}
if let Some(avatar_url) = params.avatar_url {
m.avatar_url = Set(Some(avatar_url));
}
if let Some(billing_email) = params.billing_email {
m.billing_email = Set(Some(billing_email));
}
m.updated_at = Set(Utc::now());
m.update(&self.db).await.map_err(Into::into)
}
/// Soft-delete a workspace. Only owner can delete.
pub async fn workspace_delete(
&self,
ctx: &Session,
workspace_slug: String,
) -> Result<(), AppError> {
let user_uid = ctx.user().ok_or(AppError::Unauthorized)?;
let ws = self.utils_find_workspace_by_slug(workspace_slug).await?;
self.utils_check_workspace_permission(ws.id, user_uid, &[WorkspaceRole::Owner])
.await?;
let mut m: workspace::ActiveModel = ws.into();
m.deleted_at = Set(Some(Utc::now()));
m.updated_at = Set(Utc::now());
m.update(&self.db).await?;
Ok(())
}
}