Beispiel #1
0
async def group_list_count(
    delay: int = Query(
        None,
        title=title,
        description=delay_description,
        ge=1,
        le=121,
        alias="delay",
    ),
    is_active: bool = Query(None, title="by active status", alias="active"),
    group_type: GroupTypeEnum = Query(None,
                                      title="groupType",
                                      description="Type of group",
                                      alias="groupType"),
) -> dict:
    """[summary]
    Get a count of groups
    Args:
        delay (int, optional): [description]. Defaults to Query( None,
         title=title, description="Seconds to delay (max 121)", ge=1, le=121, \
             alias="delay", ).
        is_active (bool, optional): [description]. Defaults to Query(None,
         title="by active status", alias="active").
        group_type (GroupTypeEnum, optional): [description]. Defaults to Query( None,
         title="groupType", description="Type of group", alias="groupType" ).

    Returns:
        dict: [description]
        count based on filters
    """
    criteria = []
    # sleep if delay option is used
    if delay is not None:
        await asyncio.sleep(delay)

    if is_active is not None:
        criteria.append((groups.c.is_active, is_active))

    if group_type is not None:
        criteria.append((groups.c.group_type, group_type))

    query = groups.select().order_by(groups.c.date_create)
    count_query = groups.select()

    for crit in criteria:
        col, val = crit
        query = query.where(col == val)
        count_query = count_query.where(col == val)

    total_count = await database.fetch_all(count_query)

    result = {
        "parameters": {
            "total_count": len(total_count),
            "filter": is_active,
            "delay": delay,
        },
    }
    return result
Beispiel #2
0
async def count_groups():
    query = groups.select()
    count = await database.fetch_all(query)

    result = len(count)
    logger.info(f"number of users in DB: {result}")
    return result
Beispiel #3
0
async def check_id_exists(id: str) -> bool:
    query = groups.select().where(groups.c.id == id)
    result = await fetch_one_db(query=query)
    logger.debug(result)
    if result is None:
        logger.warning(f"Group ID: {id} does not exists")
        return False
    else:
        logger.info(f"Group ID: {id} found")
        return True
Beispiel #4
0
async def check_unique_name(name: str) -> bool:
    query = groups.select().where(groups.c.name == name)
    result = await fetch_one_db(query=query)
    logger.debug(result)
    if result is not None:
        logger.debug(f"existing name {name}")
        return False
    else:
        logger.debug("no duplicate value")
        return True
Beispiel #5
0
async def group_id(
    group_id: str = Query(
        None,
        title="Group ID",
        description="Get by the Group UUID",
        alias="groupId",
    ),
    group_name: str = Query(
        None,
        title="Group Name",
        description="Get by the Group Name",
        alias="groupName",
    ),
    delay: int = Query(
        None,
        title=title,
        description=delay_description,
        ge=1,
        le=121,
        alias="delay",
    ),
) -> dict:
    """[summary]
    Get individual group data, including users
    Args:
        group_id (str, optional): [description]. Defaults to Query( None,
         title="Group ID", description="Get by the Group UUID", alias="groupId", ).
        group_name (str, optional): [description]. Defaults to Query( None,
         title="Group Name", description="Get by the Group Name", alias="groupName", ).
        delay (int, optional): [description]. Defaults to Query( None,
         title=title, description="Seconds to delay (max 121)", ge=1, le=121, \
             alias="delay", ).

    Returns:
        dict: [description]
        Group data and associated users
    """
    # sleep if delay option is used
    if delay is not None:
        await asyncio.sleep(delay)

    # if search by ID
    if group_id is not None:

        id_exists = await check_id_exists(group_id)
        if id_exists is False:
            error: dict = {"error": f"Group ID: '{group_id}' not found"}
            logger.warning(error)
            return JSONResponse(status_code=404, content=error)

    # elif search by name
    elif group_name is not None:

        name_exists = await check_unique_name(group_name)
        if name_exists is True:
            error: dict = {"error": f"Group Name: '{group_name}' not found"}
            logger.warning(error)
            return JSONResponse(status_code=404, content=error)

        query = groups.select().where(groups.c.name == group_name)
        name_result = await fetch_one_db(query=query)
        group_id = name_result["id"]
    # else at least one needs to be selected
    else:
        error: dict = {"error": "groupId or groupName must be used"}
        logger.warning(error)
        return JSONResponse(status_code=404, content=error)

    query = groups_item.select().where(groups_item.c.group_id == group_id)
    db_result = await fetch_all_db(query=query)

    users_list: list = []
    user_dict: list = []
    for r in db_result:
        logger.debug(r)
        user_data: dict = {
            "id": r["id"],
            "user": r["user"],
            "date_created": str(r["date_create"]),
        }
        user_dict.append(user_data)
        users_list.append(r["user"])
    result = {
        "group_id": group_id,
        "count": len(users_list),
        "users": users_list,
        "user_info": user_dict,
    }
    return JSONResponse(status_code=200, content=result)
Beispiel #6
0
async def group_list(
    delay: int = Query(
        None,
        title=title,
        description=delay_description,
        ge=1,
        le=121,
        alias="delay",
    ),
    qty: int = Query(
        None,
        title="Quanity",
        description="Records to return (max 500)",
        ge=1,
        le=500,
        alias="qty",
    ),
    offset: int = Query(None,
                        title="Offset",
                        description="Offset increment",
                        ge=0,
                        alias="offset"),
    is_active: bool = Query(None, title="by active status", alias="active"),
    group_type: GroupTypeEnum = Query(None,
                                      title="groupType",
                                      description="Type of group",
                                      alias="groupType"),
    group_name: str = Query(
        None,
        title="Group Name",
        description="Get by the Group Name",
        alias="groupName",
    ),
) -> dict:
    """[summary]
    Get list of all groups and associated information

    Args:
        delay (int, optional): [description]. Defaults to Query( None, title=title,
         description="Seconds to delay (max 121)", ge=1, le=121, alias="delay", ).
        qty (int, optional): [description]. Defaults to Query( None, title="Quanity",
         description="Records to return (max 500)", ge=1, le=500, alias="qty", ).
        offset (int, optional): [description]. Defaults to Query( None, title="Offset",
         description="Offset increment", ge=0, alias="offset" ).
        is_active (bool, optional): [description]. Defaults to Query(None,
         title="by active status", alias="active").
        group_type (GroupTypeEnum, optional): [description]. Defaults to Query( None,
         title="groupType", description="Type of group", alias="groupType" ).

    Returns:
        dict: [description]
        GroupId, Name, Description, active state, dates created & updated
    """
    criteria = []
    # sleep if delay option is used
    if delay is not None:
        await asyncio.sleep(delay)

    if qty is None:
        qty: int = 100

    if offset is None:
        offset: int = 0

    if is_active is not None:
        criteria.append((groups.c.is_active, is_active, "equal"))

    if group_type is not None:
        criteria.append((groups.c.group_type, group_type, "equal"))

    if group_name is not None:
        criteria.append((groups.c.name, group_name, "ilike"))

    query = groups.select().order_by(
        groups.c.date_create).limit(qty).offset(offset)
    count_query = groups.select()

    for crit in criteria:
        col, val, compare_type = crit

        if compare_type == "ilike":
            query = query.where(col.ilike(f"%{val}%"))

        else:
            query = query.where(col == val)

        count_query = count_query.where(col == val)

    db_result = await database.fetch_all(query)
    total_count = await database.fetch_all(count_query)

    result = {
        "parameters": {
            "returned_results": len(db_result),
            "qty": qty,
            "total_count": len(total_count),
            "offset": offset,
            "filter": is_active,
            "delay": delay,
        },
        "groups": db_result,
    }
    return result