mirror of
https://github.com/DrizzleTime/Foxel.git
synced 2026-05-10 17:43:35 +08:00
74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
from typing import List, Any, Dict
|
|
from fastapi import APIRouter, HTTPException, Body
|
|
from models import database
|
|
from schemas import PluginCreate, PluginOut
|
|
|
|
router = APIRouter(prefix="/api/plugins", tags=["plugins"])
|
|
|
|
|
|
@router.post("", response_model=PluginOut)
|
|
async def create_plugin(payload: PluginCreate):
|
|
rec = await database.Plugin.create(
|
|
url=payload.url,
|
|
enabled=payload.enabled,
|
|
)
|
|
return PluginOut.model_validate(rec)
|
|
|
|
|
|
@router.get("", response_model=List[PluginOut])
|
|
async def list_plugins():
|
|
rows = await database.Plugin.all().order_by("-id")
|
|
return [PluginOut.model_validate(r) for r in rows]
|
|
|
|
|
|
@router.delete("/{plugin_id}")
|
|
async def delete_plugin(plugin_id: int):
|
|
rec = await database.Plugin.get_or_none(id=plugin_id)
|
|
if not rec:
|
|
raise HTTPException(status_code=404, detail="Plugin not found")
|
|
await rec.delete()
|
|
return {"code": 0, "msg": "ok"}
|
|
|
|
|
|
@router.put("/{plugin_id}", response_model=PluginOut)
|
|
async def update_plugin(plugin_id: int, payload: PluginCreate):
|
|
rec = await database.Plugin.get_or_none(id=plugin_id)
|
|
if not rec:
|
|
raise HTTPException(status_code=404, detail="Plugin not found")
|
|
rec.url = payload.url
|
|
rec.enabled = payload.enabled
|
|
await rec.save()
|
|
return PluginOut.model_validate(rec)
|
|
|
|
|
|
@router.post("/{plugin_id}/metadata", response_model=PluginOut)
|
|
async def update_manifest(plugin_id: int, manifest: Dict[str, Any] = Body(...)):
|
|
rec = await database.Plugin.get_or_none(id=plugin_id)
|
|
if not rec:
|
|
raise HTTPException(status_code=404, detail="Plugin not found")
|
|
key_map = {
|
|
'key': 'key',
|
|
'name': 'name',
|
|
'version': 'version',
|
|
'supported_exts': 'supported_exts',
|
|
'supportedExts': 'supported_exts',
|
|
'default_bounds': 'default_bounds',
|
|
'defaultBounds': 'default_bounds',
|
|
'default_maximized': 'default_maximized',
|
|
'defaultMaximized': 'default_maximized',
|
|
'icon': 'icon',
|
|
'description': 'description',
|
|
'author': 'author',
|
|
'website': 'website',
|
|
'github': 'github',
|
|
}
|
|
for k, v in list(manifest.items()):
|
|
if v is None:
|
|
continue
|
|
attr = key_map.get(k)
|
|
if not attr:
|
|
continue
|
|
setattr(rec, attr, v)
|
|
await rec.save()
|
|
return PluginOut.model_validate(rec)
|