Exemplo n.º 1
0
async def transfer(
        request: web.Request,
        destination: uuid.UUID,
        amount: decimal.Decimal,
) -> web.Response:
    user_id = await authorized_userid(request)
    wallet = await get_wallet(request.app['db'], user_id)

    if wallet is None:
        return responses.not_found("Wallet does not exist.")

    wallet_balance = await get_wallet_balance(request.app['db'], wallet.id)

    if wallet_balance < amount:
        return responses.bad_request("Insufficient funds.")

    ops = await create_operation_transfer(
        request.app['db'],
        source_wallet_id=wallet.id,
        destination_wallet_id=str(destination),
        amount=amount,
    )

    op = ops[0]

    return responses.success(op.to_json())
Exemplo n.º 2
0
async def retrieve(request: web.Request) -> web.Response:
    user_id = await authorized_userid(request)
    wallet = await get_wallet(request.app['db'], user_id)

    if wallet is None:
        return responses.not_found("Wallet does not exist.")

    wallet_balance = await get_wallet_balance(request.app['db'], wallet.id)
    return responses.success(wallet.to_json(balance=wallet_balance))
Exemplo n.º 3
0
async def deposit(
        request: web.Request,
        amount: decimal.Decimal,
) -> web.Response:
    user_id = await authorized_userid(request)
    wallet = await get_wallet(request.app['db'], user_id)

    if wallet is None:
        return responses.not_found("Wallet does not exist.")

    op = await create_operation_deposit(request.app['db'], wallet.id, amount)

    return responses.success(op.to_json())
Exemplo n.º 4
0
async def login(
        request: web.Request,
        username: str,
        password: str,
) -> web.Response:
    user = await get_user(request.app['db'], username)
    success = user and is_password_correct(password, user.password)

    if not success or not user:
        return responses.unauthorized(message="Invalid username or password.")

    response = responses.success(user.to_json())
    await remember(request, response, username)
    return response
Exemplo n.º 5
0
async def register(
        request: web.Request,
        username: str,
        password: str,
        password_confirm: str,
) -> web.Response:
    user_with_requested_username = await get_user(request.app['db'], username)

    if user_with_requested_username is not None:
        return responses.bad_request(
            message="This username already taken.",
            target="username",
        )

    user = await create_user(request.app['db'], username, password)
    await create_wallet(request.app['db'], user.id)

    response = responses.success(user.to_json())
    await remember(request, response, username)
    return response
Exemplo n.º 6
0
async def operations(
        request: web.Request,
        timestamp: Optional[datetime] = None,
        order: Order = "desc",
        limit: int = 100,
) -> web.Response:
    user_id = await authorized_userid(request)
    wallet = await get_wallet(request.app['db'], user_id)

    if wallet is None:
        return responses.not_found("Wallet does not exist.")

    ops = await get_operations(
        request.app['db'],
        wallet.id,
        timestamp,
        order,
        limit,
    )
    ops_json = [op.to_json() for op in ops]

    return responses.success(ops_json)
Exemplo n.º 7
0
async def logout(request: web.Request) -> web.Response:
    response = responses.success(data=None)
    await forget(request, response)
    return response