TH / app / utils / trx / get_trxs.py
get_trxs.py
Raw
import logging
from pydantic import parse_obj_as
from typing import List, Dict, Union

from models import Trx
from utils.types import Address, ChainId


def get_users_token_trxs_len(
    chain_ids: Union[List[ChainId], ChainId],
    addresses: Union[List[Address], Address]
):
    if type(chain_ids) != list:
        chain_ids = [chain_ids]
    trx_len = 0
    for chain_id in chain_ids:
        trx_len += get_users_chain_token_trxs_len(chain_id, addresses)
    return trx_len


def get_users_token_trxs(
    chain_ids: Union[List[ChainId], ChainId],
    addresses: Union[List[Address], Address],
    skip: int = 0,
    limit: int = 0
) -> List[Trx]:
    if type(chain_ids) != list:
        chain_ids = [chain_ids]
    trxs = []
    for chain_id in chain_ids:
        chain_trxs = get_users_chain_token_trxs(
            chain_id, addresses, skip, limit)
        if chain_trxs not in [None, []]:
            trxs.extend(chain_trxs)
    return trxs


def get_users_chain_token_trxs_len(
    chain_id: ChainId,
    addresses: Union[List[Address], Address]
) -> int:
    client = Trx.mongo_client(chain_id)
    if type(addresses) == list:
        addrs = []
        for address in addresses:
            addrs.append({"userAddress": address})
        query = {"$or": addrs}
    else:
        query = {"userAddress": addresses}

    return len(list(client.find(query)))


def get_users_chain_token_trxs(
    chain_id: ChainId,
    addresses: Union[List[Address], Address],
    skip: int = 0,
    limit: int = 0
) -> List[Trx]:

    client = Trx.mongo_client(chain_id)
    if type(addresses) == list:
        addrs = []
        for address in addresses:
            addrs.append({"userAddress": address})
        query = {"$or": addrs}
    else:
        query = {"userAddress": addresses}

    if limit < 1:
        try:
            trxs = list(client.find(query).sort("timeStamp", -1))
        except Exception as e:
            logging.exception(e)
            trxs = list(client.find(query))

    if skip < 1:
        try:
            trxs = list(client.find(query).sort("timeStamp", -1).limit(limit))
        except Exception as e:
            logging.exception(e)
            trxs = list(client.find(query).limit(limit))

    else:
        try:
            trxs = list(client.find(query).sort(
                "timeStamp", -1).skip(skip).limit(limit))
        except Exception as e:
            logging.exception(e)
            trxs = list(client.find(query).skip(skip).limit(limit))

    if trxs in [[], None]:
        return

    return create_trx_objects(trxs)


def create_trx_objects(trxs: List[Dict]):
    trx_objs = []
    for trx in trxs:
        trx_objs.append(parse_obj_as(Trx, trx))
    return trx_objs