from fastapi import APIRouter, Depends, Request from fooder.captcha import verify_turnstile from fooder.command.create_user import create_user from fooder.context import Context, ContextDependency, AuthContextDependency from fooder.controller.user import UserController from fooder.model.token import TokenResponse from fooder.model.user import UserCreateModel, UserChangePasswordModel from fooder.view.token import gen_token_response router = APIRouter(tags=["user"]) _ctx = ContextDependency() _auth_ctx = AuthContextDependency() @router.post("", response_model=TokenResponse, status_code=201) async def user_create( data: UserCreateModel, request: Request, ctx: Context = Depends(_ctx), ) -> TokenResponse: ip = request.client.host if request.client else None await verify_turnstile(data.captcha_token, ip) async with ctx.repo.transaction(): user = await create_user(ctx, data.username, data.password) return gen_token_response(user.id, ctx.clock()) @router.patch("/password", status_code=204) async def user_change_password( data: UserChangePasswordModel, ctx: Context = Depends(_auth_ctx), ) -> None: async with ctx.repo.transaction(): await UserController(ctx, ctx.user).change_password( data.current_password, data.new_password )