Внесены изменения в API и веб-приложение для поддержки восстановления резервных копий данных. Добавлена новая мутация API для восстановления бэкапов. Добавлена кнопка восстановления в веб-приложении. Добавлена функция прерывания всех запросов при восстановлении бэкапа.
122 lines
3.1 KiB
Python
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)
|