diff --git a/spire/public/cli.py b/spire/public/cli.py index c58bb19..edbae72 100644 --- a/spire/public/cli.py +++ b/spire/public/cli.py @@ -1,6 +1,7 @@ import argparse import json -from uuid import uuid4 +from typing import Any, Dict, List +from uuid import uuid4, UUID from ..broodusers import bugout_api from ..db import RO_SessionLocal, SessionLocal, yield_connection_from_env_ctx @@ -30,7 +31,7 @@ def make_journal_public(args: argparse.Namespace) -> None: token=args.token, journal_id=args.journal_id, holder_type="user", - holder_id=public_user.user_id, + holder_id=str(public_user.user_id), permission_list=public_permission_list, ) except Exception as e: @@ -42,7 +43,7 @@ def make_journal_public(args: argparse.Namespace) -> None: public_journal = actions.create_public_journal( db_session=db_session, journal_id=args.journal_id, - user_id=public_user.user_id, + user_id=UUID(str(public_user.user_id)), ) public_journal_json = { "journal_id": str(public_journal.journal_id), @@ -87,7 +88,7 @@ def revoke_journal_public(args: argparse.Namespace) -> None: token=args.token, journal_id=args.journal_id, holder_type="user", - holder_id=public_user.user_id, + holder_id=str(public_user.user_id), permission_list=permission_list, ) except Exception as e: @@ -210,30 +211,100 @@ def create_public_user(args: argparse.Namespace) -> None: def list_public_users(args: argparse.Namespace) -> None: """ - List all public users. + List all public users with journals. """ + public_users: List[Dict[str, Any]] = [] + session = RO_SessionLocal() try: - public_users = session.query(PublicUser).all() - public_user_json = { - "public_users": [ - { - "user_id": str(public_user.user_id), - "access_token_id": str(public_user.access_token_id), - "restricted_token_id": str(public_user.restricted_token_id), - "created_at": str(public_user.created_at), - "updated_at": str(public_user.updated_at), + query = session.query(PublicUser, PublicJournal).outerjoin( + PublicJournal, PublicJournal.user_id == PublicUser.user_id + ) + if args.user_id is not None: + query = query.filter(PublicUser.user_id == args.user_id) + objects = query.all() + + for obj in objects: + user_obj = obj[0] + + user_exists = False + for user in public_users: + if user["user_id"] == str(user_obj.user_id): + user_exists = True + + if not user_exists: + temp_user: Dict[str, Any] = { + "user_id": str(user_obj.user_id), + "access_token_id": str(user_obj.access_token_id), + "restricted_token_id": str(user_obj.restricted_token_id), + "created_at": str(user_obj.created_at), + "updated_at": str(user_obj.updated_at), + "journals": [], } - for public_user in public_users - ] - } - print(json.dumps(public_user_json)) + + # Extend user with additional info from Brood + try: + brood_user = bugout_api.get_user( + token=str(user_obj.access_token_id) + ) + + temp_user["brood_data"] = True + temp_user["username"] = brood_user.username + temp_user["autogenerated"] = brood_user.autogenerated + temp_user["application_id"] = brood_user.application_id + except Exception: + temp_user["brood_data"] = False + + public_users.append(temp_user) + + # Process user public journal + journal_obj = obj[1] + if journal_obj is None: + continue + + for user in public_users: + if user["user_id"] == str(journal_obj.user_id): + temp_journal: Dict[str, Any] = { + "journal_id": str(journal_obj.journal_id), + "created_at": str(journal_obj.created_at), + "updated_at": str(journal_obj.updated_at), + } + + # Extend journal with additional info from Spire + try: + spire_journal = bugout_api.get_journal( + token=str(user_obj.access_token_id), + journal_id=str(journal_obj.journal_id), + ) + + temp_journal["spire_data"] = True + temp_journal["name"] = spire_journal.name + except Exception: + temp_journal["spire_data"] = False + + # Extend journal with permissions from Spire + try: + spire_scopes_journal = bugout_api.get_journal_permissions( + token=str(user_obj.access_token_id), + journal_id=str(journal_obj.journal_id), + holder_ids=[str(journal_obj.user_id)], + ) + temp_journal["spire_permissions_data"] = True + temp_journal["permissions"] = [ + p.permissions for p in spire_scopes_journal.permissions + ] + except Exception: + temp_journal["spire_permissions_data"] = False + + user["journals"].append(temp_journal) + except Exception as e: print(str(e)) - finally: session.close() + print(json.dumps(public_users)) + def main() -> None: parser = argparse.ArgumentParser( @@ -326,6 +397,11 @@ def main() -> None: parser_user_list = subcommands_users.add_parser( "list", description="List all public bugout users" ) + parser_user_list.add_argument( + "-u", + "--user-id", + help="Filter by user ID", + ) parser_user_list.set_defaults(func=list_public_users) args = parser.parse_args()