38 lines
1.3 KiB
Python
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
|
|
)
|