visus-plus/api/app/controllers/backup_router.py
andrei 8042460557 feat: Добавлена функция восстановления бэкапов
Внесены изменения в API и веб-приложение для поддержки восстановления резервных копий данных. Добавлена новая мутация API для восстановления бэкапов. Добавлена кнопка восстановления в веб-приложении. Добавлена функция прерывания всех запросов при восстановлении бэкапа.
2025-07-03 08:38:26 +05:00

122 lines
3.1 KiB
Python

from fastapi import APIRouter, Depends, File, UploadFile
from sqlalchemy.ext.asyncio import AsyncSession
from starlette.responses import FileResponse
from app.database.session import get_db, engine
from app.domain.entities.responses.backup import BackupResponseEntity
from app.infrastructure.backup_service import BackupService
from app.infrastructure.dependencies import require_admin
from app.settings import settings
router = APIRouter()
@router.get(
'/',
response_model=list[BackupResponseEntity],
summary='Get all backups',
description='Get all backups',
)
async def get_all_backups(
db: AsyncSession = Depends(get_db),
user=Depends(require_admin),
):
backup_service = BackupService(db)
return await backup_service.get_all_backups()
@router.get(
'/{backup_id}/file/',
response_class=FileResponse,
summary='Get a backup file',
description='Get a backup file',
)
async def get_backup(
backup_id: int,
db: AsyncSession = Depends(get_db),
user=Depends(require_admin),
):
backup_service = BackupService(db)
return await backup_service.get_backup_file_by_id(backup_id)
@router.post(
"/",
response_model=BackupResponseEntity,
summary="Create backup",
description="Create backup",
)
async def create_backup(
db: AsyncSession = Depends(get_db),
user=Depends(require_admin),
):
backup_service = BackupService(
db,
settings.BACKUP_DB_URL,
settings.FILE_UPLOAD_DIR,
settings.BACKUP_DIR,
settings.PG_DUMP_PATH,
)
return await backup_service.create_backup(user.id)
@router.post(
'/upload/',
response_model=BackupResponseEntity,
summary='Upload a backup',
description='Upload a backup',
)
async def upload_backup(
file: UploadFile = File(...),
db: AsyncSession = Depends(get_db),
user=Depends(require_admin),
):
backup_service = BackupService(
db,
backup_dir=settings.BACKUP_DIR,
app_files_dir=settings.FILE_UPLOAD_DIR,
)
return await backup_service.upload_backup(file, user)
@router.post(
'/{backup_id}/restore/',
response_model=BackupResponseEntity,
summary='Restore a backup',
description='Restore a backup by ID, overwriting existing data',
)
async def restore_backup(
backup_id: int,
db: AsyncSession = Depends(get_db),
user=Depends(require_admin),
):
backup_service = BackupService(
db,
settings.BACKUP_DB_URL,
settings.FILE_UPLOAD_DIR,
settings.BACKUP_DIR,
settings.PG_DUMP_PATH,
)
return await backup_service.restore_backup(backup_id, engine)
@router.delete(
'/{backup_id}/',
response_model=BackupResponseEntity,
summary='Delete backup',
description='Delete backup',
)
async def delete_backup(
backup_id: int,
db: AsyncSession = Depends(get_db),
user=Depends(require_admin),
):
backup_service = BackupService(
db,
settings.BACKUP_DB_URL,
settings.FILE_UPLOAD_DIR,
settings.BACKUP_DIR,
settings.PG_DUMP_PATH,
)
return await backup_service.delete_backup(backup_id)