diff --git a/crates/core-service/src/vars/mod.rs b/crates/core-service/src/vars/mod.rs index 68dd3d76..bb560b4b 100644 --- a/crates/core-service/src/vars/mod.rs +++ b/crates/core-service/src/vars/mod.rs @@ -11,6 +11,17 @@ pub use envs::EnvVar; pub mod admin; +#[derive(Debug, Default, Serialize)] +pub struct OkRespVar { + pub ok: bool, +} + +impl OkRespVar { + pub fn new() -> Self { + Self { ok: true } + } +} + /// PageVars is the common variables for all pages #[derive(Debug, Default, Serialize)] pub struct PageVars { diff --git a/crates/dao/src/projects.rs b/crates/dao/src/projects.rs index 98637322..63ff73ca 100644 --- a/crates/dao/src/projects.rs +++ b/crates/dao/src/projects.rs @@ -257,6 +257,7 @@ pub async fn update_name(id: i32, name: String, desc: String) -> Result<()> { .col_expr(project::Column::Name, Expr::value(name.clone())) .col_expr(project::Column::ProdDomain, Expr::value(name)) .col_expr(project::Column::Description, Expr::value(desc)) + .col_expr(project::Column::UpdatedAt, Expr::value(now_time())) .filter(project::Column::Id.eq(id)) .exec(db) .await?; diff --git a/land-apiserver/src/v1/mod.rs b/land-apiserver/src/v1/mod.rs index 10db47e8..2ea33a99 100644 --- a/land-apiserver/src/v1/mod.rs +++ b/land-apiserver/src/v1/mod.rs @@ -16,7 +16,10 @@ pub fn router() -> Result { Ok(Router::new() .route("/v1/token", post(tokens::create)) .route("/v1/projects", get(projects::list)) - .route("/v1/projects/:project_name", get(projects::single)) + .route( + "/v1/projects/:project_name", + get(projects::single).post(projects::update_names), + ) .route_layer(middleware::from_fn(clerk::middleware)) .layer(cors)) } diff --git a/land-apiserver/src/v1/projects.rs b/land-apiserver/src/v1/projects.rs index 3570542b..8dbf1eab 100644 --- a/land-apiserver/src/v1/projects.rs +++ b/land-apiserver/src/v1/projects.rs @@ -3,7 +3,7 @@ use axum::http::StatusCode; use axum::response::IntoResponse; use axum::{Extension, Json}; use land_core_service::httputil::ServerJsonError; -use land_core_service::vars::{PaginationVar, ProjectVar}; +use land_core_service::vars::{OkRespVar, PaginationVar, ProjectVar}; use land_service::clerk::AuthUser; use tracing::debug; @@ -65,3 +65,31 @@ pub async fn single( let project_var = ProjectVar::new(&p, py.as_ref()).await?; Ok(Json(project_var)) } + +#[derive(Debug, serde::Deserialize)] +pub struct UpdateNamesForm { + pub name: String, + pub description: String, +} + +/// update_names updates project names +pub async fn update_names( + Extension(user): Extension, + Path(project_name): Path, + Json(f): Json, +) -> Result { + debug!( + "update project names: {:?}, old_name: {:?}", + f, project_name + ); + let p = land_dao::projects::get_by_name(project_name, Some(user.id)).await?; + if p.is_none() { + return Err(ServerJsonError( + StatusCode::NOT_FOUND, + anyhow::anyhow!("Project not found"), + )); + } + let p = p.unwrap(); + land_dao::projects::update_name(p.id, f.name, f.description).await?; + Ok(Json(OkRespVar::new())) +}