//! 行业配置 API handlers use axum::extract::{Path, Query, State}; use axum::Extension; use axum::Json; use crate::error::SaasResult; use crate::state::AppState; use crate::auth::types::AuthContext; use super::types::*; use super::service; /// GET /api/v1/industries — 行业列表(公开,已认证用户可访问) pub async fn list_industries( State(state): State, Query(query): Query, ) -> SaasResult>> { let result = service::list_industries(&state.db, &query).await?; Ok(Json(result)) } /// GET /api/v1/industries/:id — 行业详情(公开) pub async fn get_industry( State(state): State, Path(id): Path, ) -> SaasResult> { let industry = service::get_industry(&state.db, &id).await?; Ok(Json(industry)) } /// POST /api/v1/industries — 创建行业 (admin: config:write) pub async fn create_industry( State(state): State, Extension(ctx): Extension, Json(body): Json, ) -> SaasResult> { require_config_write(&ctx)?; let industry = service::create_industry(&state.db, &body).await?; Ok(Json(industry)) } /// PATCH /api/v1/industries/:id — 更新行业 (admin: config:write) pub async fn update_industry( State(state): State, Extension(ctx): Extension, Path(id): Path, Json(body): Json, ) -> SaasResult> { require_config_write(&ctx)?; let industry = service::update_industry(&state.db, &id, &body).await?; Ok(Json(industry)) } /// GET /api/v1/industries/:id/full-config — 完整配置(含关键词、prompt等) pub async fn get_industry_full_config( State(state): State, Path(id): Path, ) -> SaasResult> { let config = service::get_industry_full_config(&state.db, &id).await?; Ok(Json(config)) } /// GET /api/v1/accounts/:id/industries — 用户授权行业列表 pub async fn list_account_industries( State(state): State, Path(account_id): Path, ) -> SaasResult>> { let items = service::list_account_industries(&state.db, &account_id).await?; Ok(Json(items)) } /// PUT /api/v1/accounts/:id/industries — 设置用户行业 (admin: account:admin) pub async fn set_account_industries( State(state): State, Extension(ctx): Extension, Path(account_id): Path, Json(body): Json, ) -> SaasResult>> { require_account_admin(&ctx)?; let items = service::set_account_industries(&state.db, &account_id, &body).await?; Ok(Json(items)) } /// GET /api/v1/accounts/me/industries — 当前用户行业 pub async fn list_my_industries( State(state): State, Extension(ctx): Extension, ) -> SaasResult>> { let account_id = &ctx.account_id; let items = service::list_account_industries(&state.db, account_id).await?; Ok(Json(items)) } // ============ Helpers ============ fn require_config_write(ctx: &AuthContext) -> SaasResult<()> { if !ctx.permissions.contains(&"config:write".to_string()) && !ctx.permissions.contains(&"admin:full".to_string()) { return Err(crate::error::SaasError::Forbidden("需要 config:write 权限".to_string())); } Ok(()) } fn require_account_admin(ctx: &AuthContext) -> SaasResult<()> { if !ctx.permissions.contains(&"account:admin".to_string()) && !ctx.permissions.contains(&"admin:full".to_string()) { return Err(crate::error::SaasError::Forbidden("需要 account:admin 权限".to_string())); } Ok(()) }