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 PresetCreateModel, 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.post("/", response_model=PresetModel, status_code=201) async def create_preset( data: PresetCreateModel, ctx: Context = Depends(_auth_ctx), ): async with ctx.repo.transaction(): ctrl = await PresetController.create(ctx, data.name) return ctrl.obj @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)