From 5351df773bab95b61d21dd0ffc257f5ccc7e0108 Mon Sep 17 00:00:00 2001 From: ZhenYi <434836402@qq.com> Date: Tue, 28 Apr 2026 22:58:57 +0800 Subject: [PATCH] fix(api): register skill routes inside project scope to fix 404 In actix-web, separate web::scope() trees don't merge. The /projects scope was intercepting /api/projects/{name}/skills before the separate skill scope could match, causing 404 on all skill endpoints. Move skill routes into init_project_routes as /{project_name}/skills/* and remove the standalone configure(skill::init_skill_routes) call. --- libs/api/project/mod.rs | 25 +++++++++++++++++++++++++ libs/api/route.rs | 3 +-- libs/api/skill.rs | 11 ----------- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/libs/api/project/mod.rs b/libs/api/project/mod.rs index dfe82f2..e1a99bf 100644 --- a/libs/api/project/mod.rs +++ b/libs/api/project/mod.rs @@ -281,6 +281,31 @@ pub fn init_project_routes(cfg: &mut web::ServiceConfig) { .route( "/{project_name}/cards/{card_id}", web::delete().to(board::card_delete), + ) + // Skills + .route( + "/{project_name}/skills", + web::get().to(crate::skill::skill_list), + ) + .route( + "/{project_name}/skills", + web::post().to(crate::skill::skill_create), + ) + .route( + "/{project_name}/skills/scan", + web::post().to(crate::skill::skill_scan), + ) + .route( + "/{project_name}/skills/{slug}", + web::get().to(crate::skill::skill_get), + ) + .route( + "/{project_name}/skills/{slug}", + web::patch().to(crate::skill::skill_update), + ) + .route( + "/{project_name}/skills/{slug}", + web::delete().to(crate::skill::skill_delete), ), ); } diff --git a/libs/api/route.rs b/libs/api/route.rs index a1096f1..aa4fca1 100644 --- a/libs/api/route.rs +++ b/libs/api/route.rs @@ -23,8 +23,7 @@ pub fn init_routes(cfg: &mut web::ServiceConfig) { .configure(crate::agent::init_agent_routes) .configure(crate::workspace::init_workspace_routes) .configure(crate::search::init_search_routes) - .configure(crate::room::init_room_routes) - .configure(crate::skill::init_skill_routes), + .configure(crate::room::init_room_routes), ); // SPA fallback — must be registered last so /api/* takes precedence diff --git a/libs/api/skill.rs b/libs/api/skill.rs index 4c0510d..b54c8a9 100644 --- a/libs/api/skill.rs +++ b/libs/api/skill.rs @@ -231,14 +231,3 @@ pub struct ScanResponse { pub removed: i64, } -pub fn init_skill_routes(cfg: &mut web::ServiceConfig) { - cfg.service( - web::scope("/projects/{project_name}/skills") - .route("", web::get().to(skill_list)) - .route("", web::post().to(skill_create)) - .route("/scan", web::post().to(skill_scan)) - .route("/{slug}", web::get().to(skill_get)) - .route("/{slug}", web::patch().to(skill_update)) - .route("/{slug}", web::delete().to(skill_delete)), - ); -}