Ejemplo n.º 1
0
async def new_transfer(request: Request) -> json_response:
    try:
        transfer = await request.json()
        if len(transfer['master']) < 0:
            return failure_response(403, 'Authorize please')
        if 8 > len(transfer['whom']) > 20:
            return failure_response(400, 'Invalid length of destination email')
        if transfer['amount'] is None or int(transfer['amount']) < 0:
            return failure_response(400, 'Invalid amount')
        pool = request.app['pool']
        async with pool.acquire() as conn:
            async with conn.transaction():
                users = await conn.fetch(
                    'SELECT * FROM users WHERE key=\'{}\''.format(
                        transfer['master']))
                if len(users) == 0:
                    return failure_response(403, 'Authorize please')
                else:
                    if users[0]['email'] == transfer['whom']:
                        return failure_response(400, 'Not bad')
                    if int(users[0]['balance']) < 0:
                        return failure_response(
                            402, 'There is no money in your account')
                    if users[0]['balance'] < int(transfer['amount']):
                        return failure_response(
                            400, 'There is not enough money in your account')
                    u_dests = await conn.fetch(
                        'SELECT * FROM users WHERE email=\'{}\''.format(
                            transfer['whom']))
                    if len(u_dests) == 0:
                        return failure_response(400,
                                                'No such destination email')
                    else:
                        dest = u_dests[0]
                        # how to get last element F**K (MAX & LIMIT didn't work)
                        transfers = await conn.fetch(
                            '''SELECT * FROM transfers''')
                        t = Transfer(master=transfer['master'],
                                     amount=transfer['amount'],
                                     whom=transfer['whom'],
                                     prev=transfer_record_to_json_string(
                                         transfers[-1]))
                        await conn.fetch('''
                        INSERT INTO transfers (transfer_hash, master, whom, amount, time)
                        VALUES (\'{}\', \'{}\', \'{}\', {}, \'{}\')
                        '''.format(t.transfer_hash, users[0]['email'], t.whom,
                                   t.amount, t.time))
                        await conn.fetch(
                            'UPDATE users SET balance={}  WHERE email=\'{}\''.
                            format((users[0]['balance'] -
                                    int(transfer['amount'])),
                                   users[0]['email']))
                        await conn.fetch(
                            'UPDATE users SET balance={}  WHERE email=\'{}\''.
                            format((dest['balance'] + int(transfer['amount'])),
                                   dest['email']))
                        logger.info('New Transfer {} send {} to {}'.format(
                            users[0]['email'], transfer['amount'],
                            transfer['whom']))
                        return success_response(200, 'ok')
    except Exception as e:
        return server_error_response(e)