mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-12-28 05:05:12 -05:00
refactor: ♻️ rewrite migrations frontend/backend (#841)
* refactor(frontend): ♻️ rewrite migrations UI * refactor(backend): ♻️ rewrite recipe migrations * remove vue-demi Co-authored-by: hay-kot <hay-kot@pm.me>
This commit is contained in:
@@ -2,11 +2,13 @@ from datetime import date, timedelta
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
|
||||
from mealie.schema.reports.reports import ReportCategory
|
||||
from mealie.services._base_http_service import RouterFactory
|
||||
from mealie.services.group_services import CookbookService, WebhookService
|
||||
from mealie.services.group_services.meal_service import MealService
|
||||
from mealie.services.group_services.reports_service import GroupReportService
|
||||
|
||||
from . import categories, invitations, preferences, self_service
|
||||
from . import categories, invitations, migrations, preferences, self_service
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@@ -38,3 +40,16 @@ router.include_router(categories.user_router)
|
||||
router.include_router(webhook_router)
|
||||
router.include_router(invitations.router, prefix="/groups/invitations", tags=["Groups: Invitations"])
|
||||
router.include_router(preferences.router, prefix="/groups/preferences", tags=["Group: Preferences"])
|
||||
router.include_router(migrations.router, prefix="/groups/migrations", tags=["Group: Migrations"])
|
||||
|
||||
report_router = RouterFactory(service=GroupReportService, prefix="/groups/reports", tags=["Groups: Reports"])
|
||||
|
||||
|
||||
@report_router.get("")
|
||||
def get_all_reports(
|
||||
report_type: ReportCategory = None, gm_service: GroupReportService = Depends(GroupReportService.private)
|
||||
):
|
||||
return gm_service._get_all(report_type)
|
||||
|
||||
|
||||
router.include_router(report_router)
|
||||
|
||||
26
mealie/routes/groups/migrations.py
Normal file
26
mealie/routes/groups/migrations.py
Normal file
@@ -0,0 +1,26 @@
|
||||
import shutil
|
||||
|
||||
from fastapi import Depends, File, Form
|
||||
from fastapi.datastructures import UploadFile
|
||||
|
||||
from mealie.core.dependencies import temporary_zip_path
|
||||
from mealie.routes.routers import UserAPIRouter
|
||||
from mealie.schema.group.group_migration import SupportedMigrations
|
||||
from mealie.schema.reports.reports import ReportSummary
|
||||
from mealie.services.group_services.migration_service import GroupMigrationService
|
||||
|
||||
router = UserAPIRouter()
|
||||
|
||||
|
||||
@router.post("", response_model=ReportSummary)
|
||||
def start_data_migration(
|
||||
migration_type: SupportedMigrations = Form(...),
|
||||
archive: UploadFile = File(...),
|
||||
temp_path: str = Depends(temporary_zip_path),
|
||||
gm_service: GroupMigrationService = Depends(GroupMigrationService.private),
|
||||
):
|
||||
# Save archive to temp_path
|
||||
with temp_path.open("wb") as buffer:
|
||||
shutil.copyfileobj(archive.file, buffer)
|
||||
|
||||
return gm_service.migrate(migration_type, temp_path)
|
||||
@@ -1,79 +0,0 @@
|
||||
import operator
|
||||
import shutil
|
||||
from typing import List
|
||||
|
||||
from fastapi import Depends, File, HTTPException, UploadFile, status
|
||||
from sqlalchemy.orm.session import Session
|
||||
|
||||
from mealie.core.config import get_app_dirs
|
||||
|
||||
app_dirs = get_app_dirs()
|
||||
from mealie.db.db_setup import generate_session
|
||||
from mealie.routes.routers import AdminAPIRouter
|
||||
from mealie.routes.users.crud import get_logged_in_user
|
||||
from mealie.schema.admin import MigrationFile, Migrations
|
||||
from mealie.schema.user.user import PrivateUser
|
||||
from mealie.services.migrations import migration
|
||||
|
||||
router = AdminAPIRouter(prefix="/api/migrations", tags=["Migration"])
|
||||
|
||||
|
||||
@router.get("", response_model=List[Migrations])
|
||||
def get_all_migration_options():
|
||||
"""Returns a list of avaiable directories that can be imported into Mealie"""
|
||||
response_data = []
|
||||
migration_dirs = [
|
||||
app_dirs.MIGRATION_DIR.joinpath("nextcloud"),
|
||||
app_dirs.MIGRATION_DIR.joinpath("chowdown"),
|
||||
]
|
||||
for directory in migration_dirs:
|
||||
migration = Migrations(type=directory.stem)
|
||||
for zip in directory.iterdir():
|
||||
if zip.suffix == ".zip":
|
||||
migration_zip = MigrationFile(name=zip.name, date=zip.stat().st_ctime)
|
||||
migration.files.append(migration_zip)
|
||||
response_data.append(migration)
|
||||
|
||||
migration.files.sort(key=operator.attrgetter("date"), reverse=True)
|
||||
|
||||
return response_data
|
||||
|
||||
|
||||
@router.post("/{import_type}/{file_name}/import")
|
||||
def import_migration(
|
||||
import_type: migration.Migration,
|
||||
file_name: str,
|
||||
session: Session = Depends(generate_session),
|
||||
user: PrivateUser = Depends(get_logged_in_user),
|
||||
):
|
||||
"""Imports all the recipes in a given directory"""
|
||||
file_path = app_dirs.MIGRATION_DIR.joinpath(import_type.value, file_name)
|
||||
return migration.migrate(user, import_type, file_path, session)
|
||||
|
||||
|
||||
@router.delete("/{import_type}/{file_name}/delete", status_code=status.HTTP_200_OK)
|
||||
def delete_migration_data(import_type: migration.Migration, file_name: str):
|
||||
"""Removes migration data from the file system"""
|
||||
|
||||
remove_path = app_dirs.MIGRATION_DIR.joinpath(import_type.value, file_name)
|
||||
|
||||
if remove_path.is_file():
|
||||
remove_path.unlink()
|
||||
elif remove_path.is_dir():
|
||||
shutil.rmtree(remove_path)
|
||||
else:
|
||||
raise HTTPException(status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
@router.post("/{import_type}/upload", status_code=status.HTTP_200_OK)
|
||||
def upload_nextcloud_zipfile(import_type: migration.Migration, archive: UploadFile = File(...)):
|
||||
"""Upload a .zip File to later be imported into Mealie"""
|
||||
dir = app_dirs.MIGRATION_DIR.joinpath(import_type.value)
|
||||
dir.mkdir(parents=True, exist_ok=True)
|
||||
dest = dir.joinpath(archive.filename)
|
||||
|
||||
with dest.open("wb") as buffer:
|
||||
shutil.copyfileobj(archive.file, buffer)
|
||||
|
||||
if not dest.is_file:
|
||||
raise HTTPException(status.HTTP_400_BAD_REQUEST)
|
||||
Reference in New Issue
Block a user