Files
MoviePilot/app/api/endpoints/plugininstance.py

59 lines
2.4 KiB
Python

"""插件实例彻底清理接口。"""
from typing import Any
from fastapi import Depends
from app.api.dependencies.auth import get_current_active_superuser
from app.api.dependencies.plugin import get_plugin_config_command
from app.api.principal import ApiPrincipal
from app.api.response import ResponseAPIRouter
from app.application.plugin.config import PluginConfigCommand, PluginPurgeScope
from app.schemas.plugin import PluginInstancePurgeOutcome as _SchemaPluginInstancePurgeOutcome
from app.schemas.plugin import PluginInstancePurgeRequest as _SchemaPluginInstancePurgeRequest
from app.schemas.response import Response as _SchemaResponse
router = ResponseAPIRouter()
@router.post( # type: ignore[misc]
"/instance/{instance_id}/purge",
summary="按选定范围彻底清理插件实例",
response_model=_SchemaResponse[_SchemaPluginInstancePurgeOutcome],
)
def purge_plugin_instance(
instance_id: str,
request: _SchemaPluginInstancePurgeRequest,
_: ApiPrincipal = Depends(get_current_active_superuser),
command: PluginConfigCommand = Depends(get_plugin_config_command),
) -> Any:
"""
按用户逐项勾选的范围彻底清理一个实例的配置与数据
与停用是两件事:停用只把启用位置假、设置原样留着且可随时恢复,这里才真正删除
用户数据,因而范围完全由请求给定,一项没选直接拒绝。分身会连同实例行一并消失,
本体的行则保留——它还承载着这个插件的启用状态与展示覆盖。
权限与卸载、重置同档(仅超级管理员),因为破坏性相当:它删的是同一批东西。
``instance_id`` 会被拼进插件数据目录路径,用例层在动任何存储之前先做格式校验,
删除目录时再按解析后的真实路径确认落在插件数据根内。
"""
result = command.purge(
instance_id,
PluginPurgeScope(
config=request.config,
plugin_data=request.plugin_data,
own_database=request.own_database,
data_directory=request.data_directory,
),
)
if not result.success:
return _SchemaResponse(success=False, message=result.message)
return _SchemaResponse(
success=True,
data=_SchemaPluginInstancePurgeOutcome(
purged=list(result.purged),
instance_removed=result.instance_removed,
),
)