From b4a22a1c44dbb446e370fc97a1a1915a55af6a93 Mon Sep 17 00:00:00 2001 From: Alex Blank Date: Mon, 11 May 2026 22:01:31 +0200 Subject: [PATCH] feat(routers): add executions, backups, and settings endpoints --- backend/app/routers/backups.py | 34 ++++++++++++++++++++++-- backend/app/routers/executions.py | 23 +++++++++++++++-- backend/app/routers/settings.py | 43 +++++++++++++++++++++++++++++-- 3 files changed, 94 insertions(+), 6 deletions(-) diff --git a/backend/app/routers/backups.py b/backend/app/routers/backups.py index f7e24d7..6a3b441 100644 --- a/backend/app/routers/backups.py +++ b/backend/app/routers/backups.py @@ -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"]) -# 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"} diff --git a/backend/app/routers/executions.py b/backend/app/routers/executions.py index b080216..c51dab8 100644 --- a/backend/app/routers/executions.py +++ b/backend/app/routers/executions.py @@ -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"]) -# 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 diff --git a/backend/app/routers/settings.py b/backend/app/routers/settings.py index d4dc4e3..f69c846 100644 --- a/backend/app/routers/settings.py +++ b/backend/app/routers/settings.py @@ -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"]) -# 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