From a0a1bde88cdca0fc47412116f5abbce99eaab871 Mon Sep 17 00:00:00 2001 From: Wu Clan Date: Wed, 8 Jul 2026 11:48:51 +0800 Subject: [PATCH] Update capability plugin config validation (#1219) --- .schemas/plugin.schema.json | 4 ++-- backend/plugin/validator.py | 11 ++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.schemas/plugin.schema.json b/.schemas/plugin.schema.json index 1eb8d7e5..1e5ce51d 100644 --- a/.schemas/plugin.schema.json +++ b/.schemas/plugin.schema.json @@ -11,7 +11,7 @@ "plugin": { "type": "object", "description": "Plugin metadata", - "required": ["summary", "version", "description", "author", "tags", "database"], + "required": ["summary", "version", "description", "author", "tags"], "additionalProperties": false, "x-tombi-table-keys-order": "schema", "properties": { @@ -55,7 +55,7 @@ "database": { "type": "array", "minItems": 1, - "description": "Supported databases", + "description": "Supported databases. Required for app-level and extend-level plugins, optional for capability-level plugins without models.", "items": { "type": "string", "enum": ["mysql", "postgresql"] diff --git a/backend/plugin/validator.py b/backend/plugin/validator.py index f1e9cdda..e4a9e0dc 100644 --- a/backend/plugin/validator.py +++ b/backend/plugin/validator.py @@ -69,6 +69,12 @@ class PluginInfoSchema(BaseModel): return v +class CapabilityPluginInfoSchema(PluginInfoSchema): + """能力型插件信息模型""" + + database: list[str] = Field(default_factory=list, description='数据库支持') + + class AppPluginAppSchema(BaseModel): """应用级插件 app 配置模型""" @@ -168,7 +174,7 @@ class CapabilityPluginConfigSchema(BaseModel): model_config = ConfigDict(extra='forbid') - plugin: PluginInfoSchema = Field(..., description='插件信息') + plugin: CapabilityPluginInfoSchema = Field(..., description='插件信息') settings: dict[str, Any] = Field(default_factory=dict, description='配置项') @field_validator('settings') @@ -220,6 +226,9 @@ def validate_plugin_config(plugin_name: str, config: dict[str, Any]) -> PluginLe plugin_dir = Path(PLUGIN_DIR) / plugin_name model_dir = plugin_dir / 'model' if model_dir.is_dir(): + if not config['plugin'].get('database'): + raise PluginConfigError(f'插件 {plugin_name} 包含 model 目录时必须声明支持的数据库') + sql_dir = plugin_dir / 'sql' supported_db_types = [] missing_details = []