feature/multi-tenancy and move caddy server (#980)

* update to GUIDs

* fix cookbook id relationships

* update webhook keys

* cleanup naming and attribute orders

* remove old database tables

* fix meal-plan images

* remove dashbaord and events api

* use recipe-id instead of id

* cleanup documentation assets

* cleanup docs for v1 beta-release

* add depends_on for docker-compose

* use docker volumes for examples

* move caddy to frontend container
This commit is contained in:
Hayden
2022-02-20 14:17:51 -09:00
committed by GitHub
parent 14cc541f7a
commit 602f248541
91 changed files with 187 additions and 1170 deletions

View File

@@ -1,7 +0,0 @@
from fastapi import APIRouter
from . import events
about_router = APIRouter(prefix="/api/about")
about_router.include_router(events.router, tags=["Events: CRUD"])

View File

@@ -1,25 +0,0 @@
from mealie.routes._base.routers import AdminAPIRouter
from mealie.schema.events import EventsOut
from .._base import BaseAdminController, controller
router = AdminAPIRouter(prefix="/events")
@controller(router)
class EventsController(BaseAdminController):
@router.get("", response_model=EventsOut)
async def get_events(self):
"""Get event from the Database"""
return EventsOut(total=self.repos.events.count_all(), events=self.repos.events.get_all(order_by="time_stamp"))
@router.delete("")
async def delete_events(self):
"""Get event from the Database"""
self.repos.events.delete_all()
return {"message": "All events deleted"}
@router.delete("/{item_id}")
async def delete_event(self, item_id: int):
"""Delete event from the Database"""
return self.repos.events.delete(item_id)

View File

@@ -1,7 +1,7 @@
from datetime import timedelta
from typing import Optional
from fastapi import APIRouter, BackgroundTasks, Depends, Form, Request, status
from fastapi import APIRouter, Depends, Form, status
from fastapi.exceptions import HTTPException
from fastapi.security import OAuth2PasswordRequestForm
from pydantic import BaseModel
@@ -13,7 +13,6 @@ from mealie.core.security import authenticate_user
from mealie.db.db_setup import generate_session
from mealie.routes._base.routers import UserAPIRouter
from mealie.schema.user import PrivateUser
from mealie.services.events import create_user_event
public_router = APIRouter(tags=["Users: Authentication"])
user_router = UserAPIRouter(tags=["Users: Authentication"])
@@ -50,8 +49,6 @@ class MealieAuthToken(BaseModel):
@public_router.post("/token")
def get_token(
background_tasks: BackgroundTasks,
request: Request,
data: CustomOAuth2Form = Depends(),
session: Session = Depends(generate_session),
):
@@ -61,9 +58,6 @@ def get_token(
user: PrivateUser = authenticate_user(session, email, password)
if not user:
background_tasks.add_task(
create_user_event, "Failed Login", f"Username: {email}, Source IP: '{request.client.host}'"
)
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
headers={"WWW-Authenticate": "Bearer"},

View File

@@ -1,8 +1,7 @@
import operator
import shutil
from pathlib import Path
from fastapi import BackgroundTasks, Depends, File, HTTPException, UploadFile, status
from fastapi import Depends, File, HTTPException, UploadFile, status
from sqlalchemy.orm.session import Session
from mealie.core.config import get_app_dirs
@@ -16,7 +15,6 @@ from mealie.schema.admin import AllBackups, BackupFile, CreateBackup, ImportJob
from mealie.schema.user.user import PrivateUser
from mealie.services.backups import imports
from mealie.services.backups.exports import backup_all
from mealie.services.events import create_backup_event
router = AdminAPIRouter(prefix="/api/backups", tags=["Backups"])
logger = get_logger()
@@ -38,9 +36,7 @@ def available_imports():
@router.post("/export/database", status_code=status.HTTP_201_CREATED)
def export_database(
background_tasks: BackgroundTasks, data: CreateBackup, session: Session = Depends(generate_session)
):
def export_database(data: CreateBackup, session: Session = Depends(generate_session)):
"""Generates a backup of the recipe database in json format."""
try:
export_path = backup_all(
@@ -52,9 +48,7 @@ def export_database(
export_groups=data.options.groups,
export_notifications=data.options.notifications,
)
background_tasks.add_task(
create_backup_event, "Database Backup", f"Manual Backup Created '{Path(export_path).name}'", session
)
return {"export_path": export_path}
except Exception as e:
logger.error(e)
@@ -83,15 +77,13 @@ async def download_backup_file(file_name: str):
@router.post("/{file_name}/import", status_code=status.HTTP_200_OK)
def import_database(
background_tasks: BackgroundTasks,
file_name: str,
import_data: ImportJob,
session: Session = Depends(generate_session),
user: PrivateUser = Depends(get_current_user),
):
"""Import a database backup file generated from Mealie."""
db_import = imports.import_database(
return imports.import_database(
user=user,
session=session,
archive=import_data.name,
@@ -103,9 +95,6 @@ def import_database(
rebase=import_data.rebase,
)
background_tasks.add_task(create_backup_event, "Database Restore", f"Restore File: {file_name}", session)
return db_import
@router.delete("/{file_name}/delete", status_code=status.HTTP_200_OK)
def delete_backup(file_name: str):

View File

@@ -2,6 +2,7 @@ from functools import cached_property
from typing import Type
from fastapi import APIRouter
from pydantic import UUID4
from mealie.core.exceptions import mealie_registered_exceptions
from mealie.routes._base import BaseUserController, controller
@@ -54,17 +55,16 @@ class GroupCookbookController(BaseUserController):
return updated
@router.get("/{item_id}", response_model=RecipeCookBook)
def get_one(self, item_id: str):
try:
item_id = int(item_id)
return self.mixins.get_one(item_id)
except Exception:
def get_one(self, item_id: UUID4 | str):
if isinstance(item_id, str):
self.mixins.get_one(item_id, key="slug")
else:
return self.mixins.get_one(item_id)
@router.put("/{item_id}", response_model=RecipeCookBook)
def update_one(self, item_id: int, data: CreateCookBook):
def update_one(self, item_id: str, data: CreateCookBook):
return self.mixins.update_one(data, item_id)
@router.delete("/{item_id}", response_model=RecipeCookBook)
def delete_one(self, item_id: int):
def delete_one(self, item_id: str):
return self.mixins.delete_one(item_id)

View File

@@ -1,6 +1,7 @@
from functools import cached_property
from fastapi import APIRouter, Depends
from pydantic import UUID4
from mealie.routes._base.abc_controller import BaseUserController
from mealie.routes._base.controller import controller
@@ -32,13 +33,13 @@ class ReadWebhookController(BaseUserController):
return self.mixins.create_one(save)
@router.get("/{item_id}", response_model=ReadWebhook)
def get_one(self, item_id: int):
def get_one(self, item_id: UUID4):
return self.mixins.get_one(item_id)
@router.put("/{item_id}", response_model=ReadWebhook)
def update_one(self, item_id: int, data: CreateWebhook):
def update_one(self, item_id: UUID4, data: CreateWebhook):
return self.mixins.update_one(data, item_id)
@router.delete("/{item_id}", response_model=ReadWebhook)
def delete_one(self, item_id: int):
def delete_one(self, item_id: UUID4):
return self.mixins.delete_one(item_id) # type: ignore