kopia lustrzana https://github.com/bugout-dev/moonstream
Migration to generate resources and replace user IDs in metatx
rodzic
863f9e41e8
commit
5e790835f5
|
|
@ -0,0 +1,152 @@
|
||||||
|
import argparse
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
from typing import Any, Dict, List, Optional
|
||||||
|
|
||||||
|
from bugout.data import BugoutResourceHolder
|
||||||
|
from sqlalchemy.sql import delete, distinct, func, insert, update
|
||||||
|
|
||||||
|
from .. import db, models
|
||||||
|
from ..settings import (
|
||||||
|
MOONSTREAM_ADMIN_ACCESS_TOKEN,
|
||||||
|
MOONSTREAM_APPLICATION_ID,
|
||||||
|
bugout_client,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def generate_handler(args: argparse.Namespace):
|
||||||
|
"""
|
||||||
|
Loop:
|
||||||
|
1. Fetch metatx requester
|
||||||
|
2. Generate resource
|
||||||
|
3. Grant permissions for resource to metatx requester
|
||||||
|
4. Replace metatx requester table with uuid of resource
|
||||||
|
"""
|
||||||
|
resource_data = {"type": "metatx_requester"}
|
||||||
|
|
||||||
|
with db.yield_db_session_ctx() as db_session:
|
||||||
|
query = (
|
||||||
|
db_session.query(
|
||||||
|
models.MetatxRequester.id,
|
||||||
|
func.count(distinct(models.RegisteredContract.id)).label(
|
||||||
|
"registered_contracts_cnt"
|
||||||
|
),
|
||||||
|
func.count(distinct(models.CallRequest.id)).label("call_requests_cnt"),
|
||||||
|
)
|
||||||
|
.outerjoin(
|
||||||
|
models.RegisteredContract,
|
||||||
|
models.RegisteredContract.metatx_requester_id
|
||||||
|
== models.MetatxRequester.id,
|
||||||
|
)
|
||||||
|
.outerjoin(
|
||||||
|
models.CallRequest,
|
||||||
|
models.CallRequest.metatx_requester_id == models.MetatxRequester.id,
|
||||||
|
)
|
||||||
|
.group_by(models.MetatxRequester.id)
|
||||||
|
)
|
||||||
|
|
||||||
|
result = query.all()
|
||||||
|
|
||||||
|
print(f"There are {len(result)} total results")
|
||||||
|
|
||||||
|
response = input(f"Continue? (yes/y): ").strip().lower()
|
||||||
|
if response != "yes" and response != "y":
|
||||||
|
sys.exit(0)
|
||||||
|
print("\n")
|
||||||
|
|
||||||
|
for mr_id, registered_contracts_cnt, call_requests_cnt in query.all():
|
||||||
|
print(
|
||||||
|
f"Processing metatx_requester_id: {mr_id} with registered_contracts_cnt: {registered_contracts_cnt} and call_requests_cnt: {call_requests_cnt}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create Brood resource
|
||||||
|
try:
|
||||||
|
resource = bugout_client.create_resource(
|
||||||
|
token=MOONSTREAM_ADMIN_ACCESS_TOKEN,
|
||||||
|
application_id=MOONSTREAM_APPLICATION_ID,
|
||||||
|
resource_data=resource_data,
|
||||||
|
)
|
||||||
|
print(f"Created resource with ID: {resource.id}")
|
||||||
|
except Exception as e:
|
||||||
|
print(str(e))
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Grant access for resource to metatx requester
|
||||||
|
try:
|
||||||
|
resource_holder = bugout_client.add_resource_holder_permissions(
|
||||||
|
token=MOONSTREAM_ADMIN_ACCESS_TOKEN,
|
||||||
|
resource_id=resource.id,
|
||||||
|
holder_permissions=BugoutResourceHolder(
|
||||||
|
holder_id=str(mr_id),
|
||||||
|
holder_type="user",
|
||||||
|
permissions=["create", "read", "update", "delete"],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
print("Granted permissions for resource to metatx requester")
|
||||||
|
except Exception as e:
|
||||||
|
print(str(e))
|
||||||
|
continue
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Create new metatx_requester_id equal to resource ID
|
||||||
|
metatx_requester_stmt = insert(models.MetatxRequester).values(
|
||||||
|
id=str(resource.id)
|
||||||
|
)
|
||||||
|
db_session.execute(metatx_requester_stmt)
|
||||||
|
|
||||||
|
# Update RegisteredContract table
|
||||||
|
update_registered_contract = (
|
||||||
|
update(models.RegisteredContract)
|
||||||
|
.where(models.RegisteredContract.metatx_requester_id == str(mr_id))
|
||||||
|
.values(metatx_requester_id=str(resource.id))
|
||||||
|
)
|
||||||
|
db_session.execute(update_registered_contract)
|
||||||
|
|
||||||
|
# Update CallRequest table
|
||||||
|
update_call_request = (
|
||||||
|
update(models.CallRequest)
|
||||||
|
.where(models.CallRequest.metatx_requester_id == str(mr_id))
|
||||||
|
.values(metatx_requester_id=str(resource.id))
|
||||||
|
)
|
||||||
|
db_session.execute(update_call_request)
|
||||||
|
|
||||||
|
# Delete old metatx_requester_id
|
||||||
|
delete_metatx_requester = delete(models.MetatxRequester).where(
|
||||||
|
models.MetatxRequester.id == str(mr_id)
|
||||||
|
)
|
||||||
|
db_session.execute(delete_metatx_requester)
|
||||||
|
|
||||||
|
db_session.commit()
|
||||||
|
print(
|
||||||
|
f"Updated all metatx_requester_id from {str(mr_id)} to {str(resource.id)} successfully in each table"
|
||||||
|
)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
db_session.rollback()
|
||||||
|
print(f"Failed to update metatx_requester_id: {e}")
|
||||||
|
|
||||||
|
response = input(f"Continue? (yes/y): ").strip().lower()
|
||||||
|
if response != "yes" and response != "y":
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
print("\n")
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Generates for Metatx requesters Brood resources"
|
||||||
|
)
|
||||||
|
parser.set_defaults(func=lambda _: parser.print_help())
|
||||||
|
subparsers = parser.add_subparsers()
|
||||||
|
|
||||||
|
generate_parser = subparsers.add_parser("generate", help="Generate resources")
|
||||||
|
|
||||||
|
generate_parser.set_defaults(func=generate_handler)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
args.func(args)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Ładowanie…
Reference in New Issue