feat(comfy-cloud): 站点配置读取 resolve_comfy_cloud_site
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,2 @@
|
|||||||
|
//! Comfy Cloud 工作流执行适配器 service 层。
|
||||||
|
pub mod site;
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
use crate::error::{AppError, AppResult};
|
||||||
|
use sqlx::SqlitePool;
|
||||||
|
|
||||||
|
/// 解析 Comfy Cloud 站点配置,返回 (base_url, api_key)。
|
||||||
|
/// 取 platform='comfy_cloud' 且 status='active' 的站点。
|
||||||
|
pub async fn resolve_comfy_cloud_site(db: &SqlitePool) -> AppResult<(String, String)> {
|
||||||
|
let row: Option<(String, Option<String>)> = sqlx::query_as(
|
||||||
|
"SELECT url, api_key FROM sites
|
||||||
|
WHERE platform = 'comfy_cloud' AND status = 'active'
|
||||||
|
ORDER BY COALESCE(sort_order, 0), id LIMIT 1",
|
||||||
|
)
|
||||||
|
.fetch_optional(db)
|
||||||
|
.await?;
|
||||||
|
let (url, api_key) = row.ok_or_else(|| {
|
||||||
|
AppError::ServiceUnavailable("未配置 Comfy Cloud 站点(站点管理添加 comfy_cloud 平台)".into())
|
||||||
|
})?;
|
||||||
|
let api_key = api_key
|
||||||
|
.map(|k| k.trim().to_string())
|
||||||
|
.filter(|k| !k.is_empty())
|
||||||
|
.ok_or_else(|| AppError::ServiceUnavailable("Comfy Cloud 站点缺少 API Key".into()))?;
|
||||||
|
let base_url = url.trim().trim_end_matches('/').to_string();
|
||||||
|
Ok((base_url, api_key))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use sqlx::sqlite::SqlitePoolOptions;
|
||||||
|
|
||||||
|
async fn pool() -> SqlitePool {
|
||||||
|
let pool = SqlitePoolOptions::new().max_connections(1).connect("sqlite::memory:").await.unwrap();
|
||||||
|
sqlx::query("CREATE TABLE sites (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, url TEXT NOT NULL, platform TEXT NOT NULL, status TEXT NOT NULL, api_key TEXT, sort_order INTEGER)")
|
||||||
|
.execute(&pool).await.unwrap();
|
||||||
|
pool
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn resolves_active_comfy_cloud_site() {
|
||||||
|
let pool = pool().await;
|
||||||
|
sqlx::query("INSERT INTO sites (name,url,platform,status,api_key) VALUES ('cc','https://cloud.comfy.org/','comfy_cloud','active','key-123')")
|
||||||
|
.execute(&pool).await.unwrap();
|
||||||
|
let (url, key) = resolve_comfy_cloud_site(&pool).await.unwrap();
|
||||||
|
assert_eq!(url, "https://cloud.comfy.org");
|
||||||
|
assert_eq!(key, "key-123");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn errors_when_not_configured() {
|
||||||
|
let pool = pool().await;
|
||||||
|
let r = resolve_comfy_cloud_site(&pool).await;
|
||||||
|
assert!(matches!(r, Err(AppError::ServiceUnavailable(_))));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,3 +13,4 @@ pub mod runtime_auth;
|
|||||||
pub mod runtime_logs;
|
pub mod runtime_logs;
|
||||||
pub mod shared;
|
pub mod shared;
|
||||||
pub mod workspace;
|
pub mod workspace;
|
||||||
|
pub mod comfy_cloud;
|
||||||
|
|||||||
Reference in New Issue
Block a user