Transaction CLI

Agora vamos criar um comando para adicionar saldo via CLI, sempre que feito via CLI o usuário de origem dos pontos from_id será o admin.

O comando vai simplesmente chamar a função add_transaction que criamos anteriormente mas colocaremos lógica adicional para garantir a existencia dos usuários e para formatar os dados aprensentados em uma tabela no terminal.

EDITE dundie/cli.py e adicione um novo comando no final do arquivo.

# No topo

from dundie.tasks.transaction import add_transaction
from dundie.models.transaction import Transaction, Balance

# No comando `shell` adicione novos objetos
def shell():
    ...
    _vars = {
      ...
      "Transaction": Transaction,
      "Balance": Balance,
      "add_transaction": add_transaction,
    }

# Crie o comando que adiciona transactions 
@main.command()
def transaction(
    username: str,
    value: int,
):
    """Adds specified value to the user"""

    table = Table(title="Transaction")
    fields = ["user", "before", "after"]
    for header in fields:
        table.add_column(header, style="magenta")

    with Session(engine) as session:
        from_user = session.exec(select(User).where(User.username == "admin")).first()
        if not from_user:
            typer.echo("admin user not found")
            exit(1)
        user = session.exec(select(User).where(User.username == username)).first()
        if not user:
            typer.echo(f"user {username} not found")
            exit(1)

        from_user_before = from_user.balance
        user_before = user.balance
        add_transaction(user=user, from_user=from_user, session=session, value=value)
        table.add_row(from_user.username, str(from_user_before), str(from_user.balance))
        table.add_row(user.username, str(user_before), str(user.balance))

        Console().print(table)

E para usar podemos fazer o seguinte no terminal:

$ docker compose exec api dundie transaction jim-halpert 900

          Transaction           
┏━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓
┃ user        ┃ before ┃ after ┃
┡━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩
│ admin       │ 0      │ -900  │
│ jim-halpert │ 0      │ 900   │
└─────────────┴────────┴───────┘

O usuário admin será ficará com saldo negativo e não tem limite de transferencia, assim como qualquer usuário que seja super-user.

Tarefa

Ao chamarmos o comando dundie transaction assim como o user-list o retorno é mostrado em uma tabela formatada no terminal, em alguns casos seria interessante poder passar um argumento --format=json e obter o retorno em formato JSON para posterior tratamento.

Consegue adicionar essa funcionalidade?

Agora vamos partir para a API adicionando a mesma funcionalidade -->