fooder-api/fooder/view/user.py

38 lines
1.3 KiB
Python

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
)