fooder-api/fooder/view/preset.py

81 lines
2.6 KiB
Python

from fastapi import APIRouter, Depends
from fooder.context import AuthContextDependency, Context
from fooder.controller.preset import PresetController
from fooder.controller.preset_entry import PresetEntryController
from fooder.model.entry import EntryCreateModel, EntryUpdateModel
from fooder.model.preset import PresetModel, PresetUpdateModel
from fooder.model.preset_entry import PresetEntryModel
router = APIRouter()
_auth_ctx = AuthContextDependency()
@router.get("", response_model=list[PresetModel])
async def list_presets(
ctx: Context = Depends(_auth_ctx),
limit: int = 10,
offset: int = 0,
):
return await ctx.repo.preset.list_by_user(
user_id=ctx.user.id, limit=limit, offset=offset
)
@router.patch("/{preset_id}", response_model=PresetModel)
async def update_preset(
preset_id: int,
data: PresetUpdateModel,
ctx: Context = Depends(_auth_ctx),
):
async with ctx.repo.transaction():
preset = await ctx.repo.preset.get_by_id_and_user(preset_id, ctx.user.id)
await PresetController(ctx, preset).update(data)
return preset
@router.delete("/{preset_id}", status_code=204)
async def delete_preset(
preset_id: int,
ctx: Context = Depends(_auth_ctx),
):
async with ctx.repo.transaction():
preset = await ctx.repo.preset.get_by_id_and_user(preset_id, ctx.user.id)
await ctx.repo.preset.delete(preset)
@router.post("/{preset_id}/entry", response_model=PresetEntryModel, status_code=201)
async def create_preset_entry(
preset_id: int,
data: EntryCreateModel,
ctx: Context = Depends(_auth_ctx),
):
async with ctx.repo.transaction():
preset = await ctx.repo.preset.get_by_id_and_user(preset_id, ctx.user.id)
ctrl = await PresetEntryController.create(ctx, preset=preset, data=data)
return ctrl.obj
@router.patch("/{preset_id}/entry/{entry_id}", response_model=PresetEntryModel)
async def update_preset_entry(
preset_id: int,
entry_id: int,
data: EntryUpdateModel,
ctx: Context = Depends(_auth_ctx),
):
async with ctx.repo.transaction():
entry = await ctx.repo.preset_entry.get_by_id_and_user(entry_id, ctx.user.id)
await PresetEntryController(ctx, entry).update(data)
return entry
@router.delete("/{preset_id}/entry/{entry_id}", status_code=204)
async def delete_preset_entry(
preset_id: int,
entry_id: int,
ctx: Context = Depends(_auth_ctx),
):
async with ctx.repo.transaction():
entry = await ctx.repo.preset_entry.get_by_id_and_user(entry_id, ctx.user.id)
await ctx.repo.preset_entry.delete(entry)