mxivideo/src-tauri/src/commands/resource_category.rs

619 lines
17 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* ResourceCategory 命令封装
* 统一使用 execute_python_cli_command 模式
*/
use serde::{Deserialize, Serialize};
use tauri::{command, AppHandle};
use crate::python_executor::execute_python_command;
#[derive(Debug, Serialize, Deserialize)]
pub struct ResourceCategoryResponse {
pub success: bool,
pub message: String,
pub data: Option<serde_json::Value>,
pub output: Option<String>,
pub error: Option<String>,
}
#[derive(Debug, Deserialize)]
pub struct CategoryListRequest {
pub user_id: Option<String>,
pub include_cloud: Option<bool>,
pub limit: Option<i32>,
pub verbose: Option<bool>,
pub json_output: Option<bool>,
}
#[derive(Debug, Deserialize)]
pub struct CategoryGetRequest {
pub category_id: String,
pub user_id: Option<String>,
pub verbose: Option<bool>,
pub json_output: Option<bool>,
}
#[derive(Debug, Deserialize)]
pub struct CategoryCreateRequest {
pub title: String,
pub ai_prompt: Option<String>,
pub color: Option<String>,
pub is_cloud: Option<bool>,
pub user_id: Option<String>,
pub verbose: Option<bool>,
pub json_output: Option<bool>,
}
#[derive(Debug, Deserialize)]
pub struct CategoryUpdateRequest {
pub category_id: String,
pub title: Option<String>,
pub ai_prompt: Option<String>,
pub color: Option<String>,
pub is_active: Option<bool>,
pub user_id: Option<String>,
pub verbose: Option<bool>,
pub json_output: Option<bool>,
}
#[derive(Debug, Deserialize)]
pub struct CategoryDeleteRequest {
pub category_id: String,
pub hard_delete: Option<bool>,
pub user_id: Option<String>,
pub verbose: Option<bool>,
pub json_output: Option<bool>,
}
#[derive(Debug, Deserialize)]
pub struct CategorySearchRequest {
pub query: String,
pub user_id: Option<String>,
pub include_cloud: Option<bool>,
pub limit: Option<i32>,
pub verbose: Option<bool>,
pub json_output: Option<bool>,
}
#[derive(Debug, Deserialize)]
pub struct CategoryColorRequest {
pub color: String,
pub user_id: Option<String>,
pub include_cloud: Option<bool>,
pub limit: Option<i32>,
pub verbose: Option<bool>,
pub json_output: Option<bool>,
}
#[derive(Debug, Deserialize)]
pub struct CategoryBatchCreateRequest {
pub categories: Vec<CategoryBatchItem>,
pub user_id: Option<String>,
pub verbose: Option<bool>,
pub json_output: Option<bool>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CategoryBatchItem {
pub title: String,
pub ai_prompt: Option<String>,
pub color: Option<String>,
pub is_cloud: Option<bool>,
}
// 保持向后兼容的旧结构体
#[derive(Debug, Serialize, Deserialize)]
pub struct CreateCategoryRequest {
pub title: String,
pub ai_prompt: String,
pub color: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UpdateCategoryRequest {
pub title: Option<String>,
pub ai_prompt: Option<String>,
pub color: Option<String>,
pub is_active: Option<bool>,
}
/// 执行Python CLI命令的通用函数统一模式
async fn execute_python_cli_command(
app: AppHandle,
command_args: Vec<String>,
) -> Result<ResourceCategoryResponse, String> {
// 构建完整的命令参数
let mut args = vec!["-m".to_string(), "python_core.cli".to_string()];
args.extend(command_args);
println!("Executing ResourceCategory CLI: python {}", args.join(" "));
match execute_python_command(app, &args, None).await {
Ok(output) => {
// 尝试解析JSON响应
if let Ok(json_value) = serde_json::from_str::<serde_json::Value>(&output) {
Ok(ResourceCategoryResponse {
success: true,
message: "素材分类命令执行成功".to_string(),
data: Some(json_value),
output: Some(output),
error: None,
})
} else {
// 如果不是JSON直接返回文本输出
Ok(ResourceCategoryResponse {
success: true,
message: "素材分类命令执行成功".to_string(),
data: None,
output: Some(output),
error: None,
})
}
}
Err(error) => {
Ok(ResourceCategoryResponse {
success: false,
message: "素材分类命令执行失败".to_string(),
data: None,
output: None,
error: Some(error),
})
}
}
}
/// 获取所有资源分类新版本使用CLI模式
#[command]
pub async fn get_all_resource_categories_cli(
app: AppHandle,
request: CategoryListRequest,
) -> Result<ResourceCategoryResponse, String> {
let mut args = vec!["resource-category".to_string(), "list".to_string()];
if let Some(user_id) = request.user_id {
args.push("--user-id".to_string());
args.push(user_id);
}
if request.include_cloud.unwrap_or(true) {
args.push("--include-cloud".to_string());
}
if let Some(limit) = request.limit {
args.push("--limit".to_string());
args.push(limit.to_string());
}
if request.verbose.unwrap_or(false) {
args.push("--verbose".to_string());
}
if request.json_output.unwrap_or(true) {
args.push("--json".to_string());
}
execute_python_cli_command(app, args).await
}
/// 获取所有资源分类(保持向后兼容)
#[command]
pub async fn get_all_resource_categories(app: AppHandle) -> Result<String, String> {
let args = vec![
"-m".to_string(),
"python_core.services.resource_category_manager".to_string(),
"get_all_categories".to_string(),
];
execute_python_command(app, &args, None).await
}
/// 根据ID获取资源分类新版本使用CLI模式
#[command]
pub async fn get_resource_category_by_id_cli(
app: AppHandle,
request: CategoryGetRequest,
) -> Result<ResourceCategoryResponse, String> {
let mut args = vec!["resource-category".to_string(), "get".to_string(), request.category_id];
if let Some(user_id) = request.user_id {
args.push("--user-id".to_string());
args.push(user_id);
}
if request.verbose.unwrap_or(false) {
args.push("--verbose".to_string());
}
if request.json_output.unwrap_or(true) {
args.push("--json".to_string());
}
execute_python_cli_command(app, args).await
}
/// 根据ID获取资源分类保持向后兼容
#[command]
pub async fn get_resource_category_by_id(app: AppHandle, category_id: String) -> Result<String, String> {
let args = vec![
"-m".to_string(),
"python_core.services.resource_category_manager".to_string(),
"get_category_by_id".to_string(),
category_id,
];
execute_python_command(app, &args, None).await
}
/// 创建新的资源分类新版本使用CLI模式
#[command]
pub async fn create_resource_category_cli(
app: AppHandle,
request: CategoryCreateRequest,
) -> Result<ResourceCategoryResponse, String> {
let mut args = vec!["resource-category".to_string(), "create".to_string(), request.title];
if let Some(ai_prompt) = request.ai_prompt {
args.push("--ai-prompt".to_string());
args.push(ai_prompt);
}
if let Some(color) = request.color {
args.push("--color".to_string());
args.push(color);
}
if request.is_cloud.unwrap_or(false) {
args.push("--is-cloud".to_string());
}
if let Some(user_id) = request.user_id {
args.push("--user-id".to_string());
args.push(user_id);
}
if request.verbose.unwrap_or(false) {
args.push("--verbose".to_string());
}
if request.json_output.unwrap_or(true) {
args.push("--json".to_string());
}
execute_python_cli_command(app, args).await
}
/// 创建新的资源分类(保持向后兼容)
#[command]
pub async fn create_resource_category(app: AppHandle, request: CreateCategoryRequest) -> Result<String, String> {
let args = vec![
"-m".to_string(),
"python_core.services.resource_category_manager".to_string(),
"create_category".to_string(),
request.title,
request.ai_prompt,
request.color,
];
execute_python_command(app, &args, None).await
}
/// 更新资源分类新版本使用CLI模式
#[command]
pub async fn update_resource_category_cli(
app: AppHandle,
request: CategoryUpdateRequest,
) -> Result<ResourceCategoryResponse, String> {
let mut args = vec!["resource-category".to_string(), "update".to_string(), request.category_id];
if let Some(title) = request.title {
args.push("--title".to_string());
args.push(title);
}
if let Some(ai_prompt) = request.ai_prompt {
args.push("--ai-prompt".to_string());
args.push(ai_prompt);
}
if let Some(color) = request.color {
args.push("--color".to_string());
args.push(color);
}
if let Some(is_active) = request.is_active {
if is_active {
args.push("--activate".to_string());
} else {
args.push("--deactivate".to_string());
}
}
if let Some(user_id) = request.user_id {
args.push("--user-id".to_string());
args.push(user_id);
}
if request.verbose.unwrap_or(false) {
args.push("--verbose".to_string());
}
if request.json_output.unwrap_or(true) {
args.push("--json".to_string());
}
execute_python_cli_command(app, args).await
}
/// 更新资源分类(保持向后兼容)
#[command]
pub async fn update_resource_category(
app: AppHandle,
category_id: String,
request: UpdateCategoryRequest,
) -> Result<String, String> {
let request_json = serde_json::to_string(&request)
.map_err(|e| format!("Failed to serialize request: {}", e))?;
let args = vec![
"-m".to_string(),
"python_core.services.resource_category_manager".to_string(),
"update_category".to_string(),
category_id,
request_json,
];
execute_python_command(app, &args, None).await
}
/// 删除资源分类新版本使用CLI模式
#[command]
pub async fn delete_resource_category_cli(
app: AppHandle,
request: CategoryDeleteRequest,
) -> Result<ResourceCategoryResponse, String> {
let mut args = vec!["resource-category".to_string(), "delete".to_string(), request.category_id];
if request.hard_delete.unwrap_or(true) {
args.push("--hard-delete".to_string());
}
if let Some(user_id) = request.user_id {
args.push("--user-id".to_string());
args.push(user_id);
}
if request.verbose.unwrap_or(false) {
args.push("--verbose".to_string());
}
if request.json_output.unwrap_or(true) {
args.push("--json".to_string());
}
execute_python_cli_command(app, args).await
}
/// 删除资源分类(保持向后兼容)
#[command]
pub async fn delete_resource_category(app: AppHandle, category_id: String) -> Result<String, String> {
let args = vec![
"-m".to_string(),
"python_core.services.resource_category_manager".to_string(),
"delete_category".to_string(),
category_id,
];
execute_python_command(app, &args, None).await
}
/// 搜索资源分类新版本使用CLI模式
#[command]
pub async fn search_resource_categories_cli(
app: AppHandle,
request: CategorySearchRequest,
) -> Result<ResourceCategoryResponse, String> {
let mut args = vec!["resource-category".to_string(), "search".to_string(), request.query];
if let Some(user_id) = request.user_id {
args.push("--user-id".to_string());
args.push(user_id);
}
if request.include_cloud.unwrap_or(true) {
args.push("--include-cloud".to_string());
}
if let Some(limit) = request.limit {
args.push("--limit".to_string());
args.push(limit.to_string());
}
if request.verbose.unwrap_or(false) {
args.push("--verbose".to_string());
}
if request.json_output.unwrap_or(true) {
args.push("--json".to_string());
}
execute_python_cli_command(app, args).await
}
/// 搜索资源分类(保持向后兼容)
#[command]
pub async fn search_resource_categories(app: AppHandle, keyword: String) -> Result<String, String> {
let args = vec![
"-m".to_string(),
"python_core.services.resource_category_manager".to_string(),
"search_categories".to_string(),
keyword,
];
execute_python_command(app, &args, None).await
}
/// 按颜色获取资源分类新版本使用CLI模式
#[command]
pub async fn get_resource_categories_by_color_cli(
app: AppHandle,
request: CategoryColorRequest,
) -> Result<ResourceCategoryResponse, String> {
let mut args = vec!["resource-category".to_string(), "by-color".to_string(), request.color];
if let Some(user_id) = request.user_id {
args.push("--user-id".to_string());
args.push(user_id);
}
if request.include_cloud.unwrap_or(true) {
args.push("--include-cloud".to_string());
}
if let Some(limit) = request.limit {
args.push("--limit".to_string());
args.push(limit.to_string());
}
if request.verbose.unwrap_or(false) {
args.push("--verbose".to_string());
}
if request.json_output.unwrap_or(true) {
args.push("--json".to_string());
}
execute_python_cli_command(app, args).await
}
/// 获取云端资源分类新版本使用CLI模式
#[command]
pub async fn get_cloud_resource_categories_cli(
app: AppHandle,
request: CategoryListRequest,
) -> Result<ResourceCategoryResponse, String> {
let mut args = vec!["resource-category".to_string(), "cloud".to_string()];
if let Some(limit) = request.limit {
args.push("--limit".to_string());
args.push(limit.to_string());
}
if request.verbose.unwrap_or(false) {
args.push("--verbose".to_string());
}
if request.json_output.unwrap_or(true) {
args.push("--json".to_string());
}
execute_python_cli_command(app, args).await
}
/// 批量创建资源分类新版本使用CLI模式
#[command]
pub async fn batch_create_resource_categories_cli(
app: AppHandle,
request: CategoryBatchCreateRequest,
) -> Result<ResourceCategoryResponse, String> {
// 将批量数据序列化为JSON
let categories_json = serde_json::to_string(&request.categories)
.map_err(|e| format!("Failed to serialize categories: {}", e))?;
let mut args = vec!["resource-category".to_string(), "batch-create".to_string()];
// 通过临时文件传递批量数据
args.push("--data".to_string());
args.push(categories_json);
if let Some(user_id) = request.user_id {
args.push("--user-id".to_string());
args.push(user_id);
}
if request.verbose.unwrap_or(false) {
args.push("--verbose".to_string());
}
if request.json_output.unwrap_or(true) {
args.push("--json".to_string());
}
execute_python_cli_command(app, args).await
}
/// 获取资源分类数量新版本使用CLI模式
#[command]
pub async fn get_resource_category_count_cli(
app: AppHandle,
request: CategoryListRequest,
) -> Result<ResourceCategoryResponse, String> {
let mut args = vec!["resource-category".to_string(), "count".to_string()];
if let Some(user_id) = request.user_id {
args.push("--user-id".to_string());
args.push(user_id);
}
if request.include_cloud.unwrap_or(true) {
args.push("--include-cloud".to_string());
}
if request.verbose.unwrap_or(false) {
args.push("--verbose".to_string());
}
if request.json_output.unwrap_or(true) {
args.push("--json".to_string());
}
execute_python_cli_command(app, args).await
}
/// 激活资源分类新版本使用CLI模式
#[command]
pub async fn activate_resource_category_cli(
app: AppHandle,
request: CategoryGetRequest,
) -> Result<ResourceCategoryResponse, String> {
let mut args = vec!["resource-category".to_string(), "activate".to_string(), request.category_id];
if let Some(user_id) = request.user_id {
args.push("--user-id".to_string());
args.push(user_id);
}
if request.verbose.unwrap_or(false) {
args.push("--verbose".to_string());
}
if request.json_output.unwrap_or(true) {
args.push("--json".to_string());
}
execute_python_cli_command(app, args).await
}
/// 停用资源分类新版本使用CLI模式
#[command]
pub async fn deactivate_resource_category_cli(
app: AppHandle,
request: CategoryGetRequest,
) -> Result<ResourceCategoryResponse, String> {
let mut args = vec!["resource-category".to_string(), "deactivate".to_string(), request.category_id];
if let Some(user_id) = request.user_id {
args.push("--user-id".to_string());
args.push(user_id);
}
if request.verbose.unwrap_or(false) {
args.push("--verbose".to_string());
}
if request.json_output.unwrap_or(true) {
args.push("--json".to_string());
}
execute_python_cli_command(app, args).await
}