feat(routers): add executions, backups, and settings endpoints
This commit is contained in:
@@ -1,4 +1,34 @@
|
|||||||
from fastapi import APIRouter
|
from fastapi import APIRouter, Depends, HTTPException
|
||||||
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
from sqlalchemy import select
|
||||||
|
from typing import List
|
||||||
|
from app.database import get_db
|
||||||
|
from app.models import Backup
|
||||||
|
from app.schemas import Backup as BackupSchema
|
||||||
|
|
||||||
router = APIRouter(prefix="/api/backups", tags=["backups"])
|
router = APIRouter(prefix="/api/backups", tags=["backups"])
|
||||||
# Will be implemented in later tasks
|
|
||||||
|
@router.get("/", response_model=List[BackupSchema])
|
||||||
|
async def list_backups(db: AsyncSession = Depends(get_db)):
|
||||||
|
result = await db.execute(select(Backup).order_by(Backup.created_at.desc()))
|
||||||
|
backups = result.scalars().all()
|
||||||
|
return backups
|
||||||
|
|
||||||
|
@router.get("/{backup_id}", response_model=BackupSchema)
|
||||||
|
async def get_backup(backup_id: int, db: AsyncSession = Depends(get_db)):
|
||||||
|
result = await db.execute(select(Backup).where(Backup.id == backup_id))
|
||||||
|
backup = result.scalar_one_or_none()
|
||||||
|
if not backup:
|
||||||
|
raise HTTPException(status_code=404, detail="Backup not found")
|
||||||
|
return backup
|
||||||
|
|
||||||
|
@router.delete("/{backup_id}")
|
||||||
|
async def delete_backup(backup_id: int, db: AsyncSession = Depends(get_db)):
|
||||||
|
result = await db.execute(select(Backup).where(Backup.id == backup_id))
|
||||||
|
backup = result.scalar_one_or_none()
|
||||||
|
if not backup:
|
||||||
|
raise HTTPException(status_code=404, detail="Backup not found")
|
||||||
|
|
||||||
|
await db.delete(backup)
|
||||||
|
await db.commit()
|
||||||
|
return {"message": "Backup deleted"}
|
||||||
|
|||||||
@@ -1,4 +1,23 @@
|
|||||||
from fastapi import APIRouter
|
from fastapi import APIRouter, Depends, HTTPException
|
||||||
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
from sqlalchemy import select
|
||||||
|
from typing import List
|
||||||
|
from app.database import get_db
|
||||||
|
from app.models import JobExecution
|
||||||
|
from app.schemas import JobExecution as JobExecutionSchema
|
||||||
|
|
||||||
router = APIRouter(prefix="/api/executions", tags=["executions"])
|
router = APIRouter(prefix="/api/executions", tags=["executions"])
|
||||||
# Will be implemented in later tasks
|
|
||||||
|
@router.get("/", response_model=List[JobExecutionSchema])
|
||||||
|
async def list_executions(db: AsyncSession = Depends(get_db)):
|
||||||
|
result = await db.execute(select(JobExecution).order_by(JobExecution.started_at.desc()))
|
||||||
|
executions = result.scalars().all()
|
||||||
|
return executions
|
||||||
|
|
||||||
|
@router.get("/{execution_id}", response_model=JobExecutionSchema)
|
||||||
|
async def get_execution(execution_id: int, db: AsyncSession = Depends(get_db)):
|
||||||
|
result = await db.execute(select(JobExecution).where(JobExecution.id == execution_id))
|
||||||
|
execution = result.scalar_one_or_none()
|
||||||
|
if not execution:
|
||||||
|
raise HTTPException(status_code=404, detail="Execution not found")
|
||||||
|
return execution
|
||||||
|
|||||||
@@ -1,4 +1,43 @@
|
|||||||
from fastapi import APIRouter
|
from fastapi import APIRouter, Depends, HTTPException
|
||||||
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
from sqlalchemy import select
|
||||||
|
from typing import List
|
||||||
|
from app.database import get_db
|
||||||
|
from app.models import Setting
|
||||||
|
from app.schemas import Setting as SettingSchema, SettingUpdate
|
||||||
|
|
||||||
router = APIRouter(prefix="/api/settings", tags=["settings"])
|
router = APIRouter(prefix="/api/settings", tags=["settings"])
|
||||||
# Will be implemented in later tasks
|
|
||||||
|
@router.get("/", response_model=List[SettingSchema])
|
||||||
|
async def list_settings(db: AsyncSession = Depends(get_db)):
|
||||||
|
result = await db.execute(select(Setting))
|
||||||
|
settings = result.scalars().all()
|
||||||
|
return settings
|
||||||
|
|
||||||
|
@router.get("/{key}", response_model=SettingSchema)
|
||||||
|
async def get_setting(key: str, db: AsyncSession = Depends(get_db)):
|
||||||
|
result = await db.execute(select(Setting).where(Setting.key == key))
|
||||||
|
setting = result.scalar_one_or_none()
|
||||||
|
if not setting:
|
||||||
|
raise HTTPException(status_code=404, detail="Setting not found")
|
||||||
|
return setting
|
||||||
|
|
||||||
|
@router.put("/{key}", response_model=SettingSchema)
|
||||||
|
async def update_setting(
|
||||||
|
key: str,
|
||||||
|
setting_update: SettingUpdate,
|
||||||
|
db: AsyncSession = Depends(get_db)
|
||||||
|
):
|
||||||
|
result = await db.execute(select(Setting).where(Setting.key == key))
|
||||||
|
setting = result.scalar_one_or_none()
|
||||||
|
|
||||||
|
if not setting:
|
||||||
|
# Create if not exists
|
||||||
|
setting = Setting(key=key, value=setting_update.value)
|
||||||
|
db.add(setting)
|
||||||
|
else:
|
||||||
|
setting.value = setting_update.value
|
||||||
|
|
||||||
|
await db.commit()
|
||||||
|
await db.refresh(setting)
|
||||||
|
return setting
|
||||||
|
|||||||
Reference in New Issue
Block a user