Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 95 additions & 19 deletions spire/public/cli.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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:
Expand All @@ -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),
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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()
Expand Down