secure routes

This commit is contained in:
hay-kot 2021-03-28 12:30:45 -08:00
commit bdbc9e323d
11 changed files with 89 additions and 53 deletions

View file

@ -4,6 +4,7 @@ import shutil
from fastapi import APIRouter, Depends, File, HTTPException, UploadFile from fastapi import APIRouter, Depends, File, HTTPException, UploadFile
from mealie.core.config import BACKUP_DIR, TEMPLATE_DIR from mealie.core.config import BACKUP_DIR, TEMPLATE_DIR
from mealie.db.db_setup import generate_session from mealie.db.db_setup import generate_session
from mealie.routes.deps import get_current_user
from mealie.schema.backup import BackupJob, ImportJob, Imports, LocalBackup from mealie.schema.backup import BackupJob, ImportJob, Imports, LocalBackup
from mealie.schema.snackbar import SnackResponse from mealie.schema.snackbar import SnackResponse
from mealie.services.backups import imports from mealie.services.backups import imports
@ -11,7 +12,7 @@ from mealie.services.backups.exports import backup_all
from sqlalchemy.orm.session import Session from sqlalchemy.orm.session import Session
from starlette.responses import FileResponse from starlette.responses import FileResponse
router = APIRouter(prefix="/api/backups", tags=["Backups"]) router = APIRouter(prefix="/api/backups", tags=["Backups"], dependencies=[Depends(get_current_user)])
@router.get("/available", response_model=Imports) @router.get("/available", response_model=Imports)
@ -52,7 +53,7 @@ def export_database(data: BackupJob, session: Session = Depends(generate_session
@router.post("/upload") @router.post("/upload")
def upload_backup_zipfile(archive: UploadFile = File(...)): def upload_backup_file(archive: UploadFile = File(...)):
""" Upload a .zip File to later be imported into Mealie """ """ Upload a .zip File to later be imported into Mealie """
dest = BACKUP_DIR.joinpath(archive.filename) dest = BACKUP_DIR.joinpath(archive.filename)
@ -66,7 +67,7 @@ def upload_backup_zipfile(archive: UploadFile = File(...)):
@router.get("/{file_name}/download") @router.get("/{file_name}/download")
async def upload_nextcloud_zipfile(file_name: str): async def download_backup_file(file_name: str):
""" Upload a .zip File to later be imported into Mealie """ """ Upload a .zip File to later be imported into Mealie """
file = BACKUP_DIR.joinpath(file_name) file = BACKUP_DIR.joinpath(file_name)

View file

@ -1,9 +1,10 @@
import json import json
from fastapi import APIRouter, Depends
from mealie.core.config import APP_VERSION, DEBUG_DIR, LOGGER_FILE from mealie.core.config import APP_VERSION, DEBUG_DIR, LOGGER_FILE
from fastapi import APIRouter from mealie.routes.deps import get_current_user
router = APIRouter(prefix="/api/debug", tags=["Debug"]) router = APIRouter(prefix="/api/debug", tags=["Debug"], dependencies=[Depends(get_current_user)])
@router.get("/version") @router.get("/version")
@ -25,9 +26,7 @@ async def get_log(num: int):
""" Doc Str """ """ Doc Str """
with open(LOGGER_FILE, "rb") as f: with open(LOGGER_FILE, "rb") as f:
log_text = tail(f, num) log_text = tail(f, num)
HTML_RESPONSE = log_text return log_text
return HTML_RESPONSE
def tail(f, lines=20): def tail(f, lines=20):

View file

@ -25,9 +25,7 @@ def get_all_meals(
@router.post("/create") @router.post("/create")
def create_meal_plan( def create_meal_plan(
data: MealPlanIn, data: MealPlanIn, session: Session = Depends(generate_session), current_user=Depends(get_current_user)
session: Session = Depends(generate_session),
current_user=Depends(get_current_user),
): ):
""" Creates a meal plan database entry """ """ Creates a meal plan database entry """
processed_plan = process_meals(session, data) processed_plan = process_meals(session, data)
@ -37,7 +35,12 @@ def create_meal_plan(
@router.put("/{plan_id}") @router.put("/{plan_id}")
def update_meal_plan(plan_id: str, meal_plan: MealPlanIn, session: Session = Depends(generate_session)): def update_meal_plan(
plan_id: str,
meal_plan: MealPlanIn,
session: Session = Depends(generate_session),
current_user=Depends(get_current_user),
):
""" Updates a meal plan based off ID """ """ Updates a meal plan based off ID """
processed_plan = process_meals(session, meal_plan) processed_plan = process_meals(session, meal_plan)
processed_plan = MealPlanInDB(uid=plan_id, **processed_plan.dict()) processed_plan = MealPlanInDB(uid=plan_id, **processed_plan.dict())
@ -47,7 +50,7 @@ def update_meal_plan(plan_id: str, meal_plan: MealPlanIn, session: Session = Dep
@router.delete("/{plan_id}") @router.delete("/{plan_id}")
def delete_meal_plan(plan_id, session: Session = Depends(generate_session)): def delete_meal_plan(plan_id, session: Session = Depends(generate_session), current_user=Depends(get_current_user)):
""" Removes a meal plan from the database """ """ Removes a meal plan from the database """
db.meals.delete(session, plan_id) db.meals.delete(session, plan_id)
@ -56,20 +59,14 @@ def delete_meal_plan(plan_id, session: Session = Depends(generate_session)):
@router.get("/this-week", response_model=MealPlanInDB) @router.get("/this-week", response_model=MealPlanInDB)
def get_this_week( def get_this_week(session: Session = Depends(generate_session), current_user: UserInDB = Depends(get_current_user)):
session: Session = Depends(generate_session),
current_user: UserInDB = Depends(get_current_user),
):
""" Returns the meal plan data for this week """ """ Returns the meal plan data for this week """
return db.groups.get_meals(session, current_user.group)[0] return db.groups.get_meals(session, current_user.group)[0]
@router.get("/today", tags=["Meal Plan"]) @router.get("/today", tags=["Meal Plan"])
def get_today( def get_today(session: Session = Depends(generate_session), current_user: UserInDB = Depends(get_current_user)):
session: Session = Depends(generate_session),
current_user: UserInDB = Depends(get_current_user),
):
""" """
Returns the recipe slug for the meal scheduled for today. Returns the recipe slug for the meal scheduled for today.
If no meal is scheduled nothing is returned If no meal is scheduled nothing is returned

View file

@ -1,6 +1,7 @@
from fastapi import APIRouter, Depends
from mealie.db.database import db from mealie.db.database import db
from mealie.db.db_setup import generate_session from mealie.db.db_setup import generate_session
from fastapi import APIRouter, Depends from mealie.routes.deps import get_current_user
from mealie.schema.meal import MealPlanInDB from mealie.schema.meal import MealPlanInDB
from mealie.schema.recipe import Recipe from mealie.schema.recipe import Recipe
from sqlalchemy.orm.session import Session from sqlalchemy.orm.session import Session
@ -9,13 +10,15 @@ router = APIRouter(prefix="/api/meal-plans", tags=["Meal Plan"])
@router.get("/{id}/shopping-list") @router.get("/{id}/shopping-list")
def get_shopping_list(id: str, session: Session = Depends(generate_session)): def get_shopping_list(
id: str,
session: Session = Depends(generate_session),
current_user=Depends(get_current_user),
):
#! Refactor into Single Database Call #! Refactor into Single Database Call
mealplan = db.meals.get(session, id) mealplan = db.meals.get(session, id)
mealplan: MealPlanInDB mealplan: MealPlanInDB
slugs = [x.slug for x in mealplan.meals] slugs = [x.slug for x in mealplan.meals]
recipes: list[Recipe] = [db.recipes.get(session, x) for x in slugs] recipes: list[Recipe] = [db.recipes.get(session, x) for x in slugs]
ingredients = [{"name": x.name, "recipeIngredient": x.recipeIngredient} for x in recipes if x] return [{"name": x.name, "recipeIngredient": x.recipeIngredient} for x in recipes if x]
return ingredients

View file

@ -2,16 +2,17 @@ import operator
import shutil import shutil
from typing import List from typing import List
from fastapi import APIRouter, Depends, File, HTTPException, UploadFile
from mealie.core.config import MIGRATION_DIR from mealie.core.config import MIGRATION_DIR
from mealie.db.db_setup import generate_session from mealie.db.db_setup import generate_session
from fastapi import APIRouter, Depends, File, HTTPException, UploadFile from mealie.routes.deps import get_current_user
from mealie.schema.migration import MigrationFile, Migrations from mealie.schema.migration import MigrationFile, Migrations
from mealie.schema.snackbar import SnackResponse
from mealie.services.migrations.chowdown import chowdown_migrate as chowdow_migrate from mealie.services.migrations.chowdown import chowdown_migrate as chowdow_migrate
from mealie.services.migrations.nextcloud import migrate as nextcloud_migrate from mealie.services.migrations.nextcloud import migrate as nextcloud_migrate
from sqlalchemy.orm.session import Session from sqlalchemy.orm.session import Session
from mealie.schema.snackbar import SnackResponse
router = APIRouter(prefix="/api/migrations", tags=["Migration"]) router = APIRouter(prefix="/api/migrations", tags=["Migration"], dependencies=[Depends(get_current_user)])
@router.get("", response_model=List[Migrations]) @router.get("", response_model=List[Migrations])

View file

@ -1,3 +1,4 @@
from mealie.routes.deps import get_current_user
from mealie.db.database import db from mealie.db.database import db
from mealie.db.db_setup import generate_session from mealie.db.db_setup import generate_session
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends
@ -26,7 +27,7 @@ def get_all_recipes_by_category(category: str, session: Session = Depends(genera
@router.delete("/{category}") @router.delete("/{category}")
async def delete_recipe_category(category: str, session: Session = Depends(generate_session)): async def delete_recipe_category(category: str, session: Session = Depends(generate_session), current_user=Depends(get_current_user)):
"""Removes a recipe category from the database. Deleting a """Removes a recipe category from the database. Deleting a
category does not impact a recipe. The category will be removed category does not impact a recipe. The category will be removed
from any recipes that contain it""" from any recipes that contain it"""

View file

@ -1,8 +1,9 @@
from mealie.db.database import db
from mealie.db.db_setup import generate_session
from fastapi import APIRouter, Depends, File, Form, HTTPException from fastapi import APIRouter, Depends, File, Form, HTTPException
from fastapi.logger import logger from fastapi.logger import logger
from fastapi.responses import FileResponse from fastapi.responses import FileResponse
from mealie.db.database import db
from mealie.db.db_setup import generate_session
from mealie.routes.deps import get_current_user
from mealie.schema.recipe import Recipe, RecipeURLIn from mealie.schema.recipe import Recipe, RecipeURLIn
from mealie.schema.snackbar import SnackResponse from mealie.schema.snackbar import SnackResponse
from mealie.services.image_services import read_image, write_image from mealie.services.image_services import read_image, write_image
@ -16,7 +17,11 @@ router = APIRouter(
@router.post("/create", status_code=201, response_model=str) @router.post("/create", status_code=201, response_model=str)
def create_from_json(data: Recipe, session: Session = Depends(generate_session)) -> str: def create_from_json(
data: Recipe,
session: Session = Depends(generate_session),
current_user=Depends(get_current_user),
) -> str:
""" Takes in a JSON string and loads data into the database as a new entry""" """ Takes in a JSON string and loads data into the database as a new entry"""
recipe: Recipe = db.recipes.create(session, data.dict()) recipe: Recipe = db.recipes.create(session, data.dict())
@ -24,7 +29,11 @@ def create_from_json(data: Recipe, session: Session = Depends(generate_session))
@router.post("/create-url", status_code=201, response_model=str) @router.post("/create-url", status_code=201, response_model=str)
def parse_recipe_url(url: RecipeURLIn, session: Session = Depends(generate_session)): def parse_recipe_url(
url: RecipeURLIn,
session: Session = Depends(generate_session),
current_user=Depends(get_current_user),
):
""" Takes in a URL and attempts to scrape data and load it into the database """ """ Takes in a URL and attempts to scrape data and load it into the database """
recipe = create_from_url(url.url) recipe = create_from_url(url.url)
@ -41,7 +50,12 @@ def get_recipe(recipe_slug: str, session: Session = Depends(generate_session)):
@router.put("/{recipe_slug}") @router.put("/{recipe_slug}")
def update_recipe(recipe_slug: str, data: Recipe, session: Session = Depends(generate_session)): def update_recipe(
recipe_slug: str,
data: Recipe,
session: Session = Depends(generate_session),
current_user=Depends(get_current_user),
):
""" Updates a recipe by existing slug and data. """ """ Updates a recipe by existing slug and data. """
recipe: Recipe = db.recipes.update(session, recipe_slug, data.dict()) recipe: Recipe = db.recipes.update(session, recipe_slug, data.dict())
@ -50,7 +64,11 @@ def update_recipe(recipe_slug: str, data: Recipe, session: Session = Depends(gen
@router.delete("/{recipe_slug}") @router.delete("/{recipe_slug}")
def delete_recipe(recipe_slug: str, session: Session = Depends(generate_session)): def delete_recipe(
recipe_slug: str,
session: Session = Depends(generate_session),
current_user=Depends(get_current_user),
):
""" Deletes a recipe by slug """ """ Deletes a recipe by slug """
try: try:
@ -77,6 +95,7 @@ def update_recipe_image(
image: bytes = File(...), image: bytes = File(...),
extension: str = Form(...), extension: str = Form(...),
session: Session = Depends(generate_session), session: Session = Depends(generate_session),
current_user=Depends(get_current_user),
): ):
""" Removes an existing image and replaces it with the incoming file. """ """ Removes an existing image and replaces it with the incoming file. """
response = write_image(recipe_slug, image, extension) response = write_image(recipe_slug, image, extension)

View file

@ -1,10 +1,9 @@
from fastapi import APIRouter, Depends
from mealie.db.database import db from mealie.db.database import db
from mealie.db.db_setup import generate_session from mealie.db.db_setup import generate_session
from fastapi import APIRouter, Depends from mealie.routes.deps import get_current_user
from mealie.schema.snackbar import SnackResponse
from sqlalchemy.orm.session import Session from sqlalchemy.orm.session import Session
from mealie.schema.snackbar import SnackResponse
from mealie.schema.snackbar import SnackResponse
router = APIRouter(tags=["Recipes"]) router = APIRouter(tags=["Recipes"])
@ -27,7 +26,9 @@ def get_all_recipes_by_tag(tag: str, session: Session = Depends(generate_session
@router.delete("/{tag}") @router.delete("/{tag}")
async def delete_recipe_tag(tag: str, session: Session = Depends(generate_session)): async def delete_recipe_tag(
tag: str, session: Session = Depends(generate_session), current_user=Depends(get_current_user)
):
"""Removes a recipe tag from the database. Deleting a """Removes a recipe tag from the database. Deleting a
tag does not impact a recipe. The tag will be removed tag does not impact a recipe. The tag will be removed
from any recipes that contain it""" from any recipes that contain it"""

View file

@ -57,7 +57,12 @@ async def get_single_page(
@router.put("/{id}") @router.put("/{id}")
async def update_single_age(data: CustomPageOut, id: int, session: Session = Depends(generate_session)): async def update_single_age(
data: CustomPageOut,
id: int,
session: Session = Depends(generate_session),
current_user=Depends(get_current_user),
):
""" Removes a custom page from the database """ """ Removes a custom page from the database """
return db.custom_pages.update(session, id, data.dict()) return db.custom_pages.update(session, id, data.dict())

View file

@ -1,13 +1,12 @@
from fastapi import APIRouter, Depends
from mealie.db.database import db from mealie.db.database import db
from mealie.db.db_setup import generate_session from mealie.db.db_setup import generate_session
from fastapi import APIRouter, Depends from mealie.routes.deps import get_current_user
from mealie.schema.settings import SiteSettings from mealie.schema.settings import SiteSettings
from mealie.schema.snackbar import SnackResponse from mealie.schema.snackbar import SnackResponse
from mealie.schema.user import GroupInDB, UserInDB from mealie.schema.user import GroupInDB, UserInDB
from sqlalchemy.orm.session import Session
from mealie.utils.post_webhooks import post_webhooks from mealie.utils.post_webhooks import post_webhooks
from sqlalchemy.orm.session import Session
from mealie.routes.deps import get_current_user
router = APIRouter(prefix="/api/site-settings", tags=["Settings"]) router = APIRouter(prefix="/api/site-settings", tags=["Settings"])
@ -20,7 +19,11 @@ def get_main_settings(session: Session = Depends(generate_session)):
@router.put("") @router.put("")
def update_settings(data: SiteSettings, session: Session = Depends(generate_session)): def update_settings(
data: SiteSettings,
session: Session = Depends(generate_session),
current_user=Depends(get_current_user),
):
""" Returns Site Settings """ """ Returns Site Settings """
db.settings.update(session, 1, data.dict()) db.settings.update(session, 1, data.dict())

View file

@ -1,9 +1,10 @@
from mealie.db.db_setup import generate_session
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends
from mealie.db.database import db
from mealie.db.db_setup import generate_session
from mealie.routes.deps import get_current_user
from mealie.schema.snackbar import SnackResponse
from mealie.schema.theme import SiteTheme from mealie.schema.theme import SiteTheme
from sqlalchemy.orm.session import Session from sqlalchemy.orm.session import Session
from mealie.schema.snackbar import SnackResponse
from mealie.db.database import db
router = APIRouter(prefix="/api", tags=["Themes"]) router = APIRouter(prefix="/api", tags=["Themes"])
@ -16,7 +17,7 @@ def get_all_themes(session: Session = Depends(generate_session)):
@router.post("/themes/create") @router.post("/themes/create")
def create_theme(data: SiteTheme, session: Session = Depends(generate_session)): def create_theme(data: SiteTheme, session: Session = Depends(generate_session), current_user=Depends(get_current_user)):
""" Creates a site color theme database entry """ """ Creates a site color theme database entry """
db.themes.create(session, data.dict()) db.themes.create(session, data.dict())
@ -30,7 +31,12 @@ def get_single_theme(theme_name: str, session: Session = Depends(generate_sessio
@router.put("/themes/{theme_name}") @router.put("/themes/{theme_name}")
def update_theme(theme_name: str, data: SiteTheme, session: Session = Depends(generate_session)): def update_theme(
theme_name: str,
data: SiteTheme,
session: Session = Depends(generate_session),
current_user=Depends(get_current_user),
):
""" Update a theme database entry """ """ Update a theme database entry """
db.themes.update(session, theme_name, data.dict()) db.themes.update(session, theme_name, data.dict())
@ -38,7 +44,7 @@ def update_theme(theme_name: str, data: SiteTheme, session: Session = Depends(ge
@router.delete("/themes/{theme_name}") @router.delete("/themes/{theme_name}")
def delete_theme(theme_name: str, session: Session = Depends(generate_session)): def delete_theme(theme_name: str, session: Session = Depends(generate_session), current_user=Depends(get_current_user)):
""" Deletes theme from the database """ """ Deletes theme from the database """
db.themes.delete(session, theme_name) db.themes.delete(session, theme_name)