Updated and delete registered contract using resources

pull/1124/head
kompotkot 2024-08-14 13:16:12 +00:00
rodzic fba1a1f488
commit 1ef102de8a
2 zmienionych plików z 53 dodań i 14 usunięć

Wyświetl plik

@ -204,6 +204,16 @@ def delete_resource_for_registered_contract(resource_id: uuid.UUID) -> None:
logger.info(f"Delete resource with ID: {resource.id} for registered contract")
def clean_metatx_requester_id(db_session: Session, metatx_requester_id: uuid.UUID):
query = db_session.query(RegisteredContract).filter(
RegisteredContract.metatx_requester_id == metatx_requester_id
)
r_contracts = query.all()
if len(r_contracts) == 0:
delete_resource_for_registered_contract(resource_id=metatx_requester_id)
def register_contract(
db_session: Session,
blockchain_name: str,
@ -267,7 +277,7 @@ def register_contract(
def update_registered_contract(
db_session: Session,
metatx_requester_id: uuid.UUID,
metatx_requester_ids: List[uuid.UUID],
contract_id: uuid.UUID,
title: Optional[str] = None,
description: Optional[str] = None,
@ -283,7 +293,7 @@ def update_registered_contract(
.join(Blockchain, Blockchain.id == RegisteredContract.blockchain_id)
.filter(
RegisteredContract.id == contract_id,
RegisteredContract.metatx_requester_id == metatx_requester_id,
RegisteredContract.metatx_requester_id.in_(metatx_requester_ids),
)
.one()
)
@ -364,17 +374,18 @@ def lookup_registered_contracts(
def delete_registered_contract(
db_session: Session,
metatx_requester_id: uuid.UUID,
metatx_requester_ids: List[uuid.UUID],
registered_contract_id: uuid.UUID,
) -> Tuple[RegisteredContract, Blockchain]:
"""
Delete a registered contract
"""
try:
contract_with_blockchain = (
db_session.query(RegisteredContract, Blockchain)
.join(Blockchain, Blockchain.id == RegisteredContract.blockchain_id)
.filter(RegisteredContract.metatx_requester_id == metatx_requester_id)
.filter(RegisteredContract.metatx_requester_id.in_(metatx_requester_ids))
.filter(RegisteredContract.id == registered_contract_id)
.one()
)
@ -790,7 +801,7 @@ def handle_delete(args: argparse.Namespace) -> None:
deleted_contract = delete_registered_contract(
db_session=db_session,
registered_contract_id=args.id,
moonstream_user_id=args.user_id,
moonstream_user_ids=[args.resource_id],
)
except Exception as err:
logger.error(err)
@ -982,11 +993,11 @@ def generate_cli() -> argparse.ArgumentParser:
help="The ID of the contract to delete",
)
delete_parser.add_argument(
"-u",
"--user-id",
"-r",
"--resource-id",
type=uuid.UUID,
required=True,
help="The ID of the Moonstream user whose contract to delete",
help="The ID of the Moonstream resource whose contract to delete",
)
delete_parser.set_defaults(func=handle_delete)

Wyświetl plik

@ -11,7 +11,7 @@ from typing import Dict, List, Optional, Set, Tuple
from uuid import UUID
from bugout.data import BugoutUser
from fastapi import Body, Depends, FastAPI, Form, Path, Query, Request
from fastapi import BackgroundTasks, Body, Depends, FastAPI, Form, Path, Query, Request
from sqlalchemy.exc import NoResultFound
from sqlalchemy.orm import Session
from web3 import Web3
@ -220,18 +220,25 @@ async def update_contract_route(
user_authorization: Tuple[BugoutUser, UUID] = Depends(request_user_auth),
db_session: Session = Depends(db.yield_db_session),
) -> data.RegisteredContractResponse:
user, _ = user_authorization
_, token = user_authorization
try:
metatx_requester_ids = contracts_actions.fetch_metatx_requester_ids(token=token)
contract_with_blockchain = contracts_actions.update_registered_contract(
db_session=db_session,
metatx_requester_id=user.id,
metatx_requester_ids=metatx_requester_ids,
contract_id=contract_id,
title=update_info.title,
description=update_info.description,
image_uri=update_info.image_uri,
ignore_nulls=update_info.ignore_nulls,
)
except contracts_actions.MetatxRequestersNotFound:
raise EngineHTTPException(
status_code=404,
detail="Metatx requester IDs not found",
)
except NoResultFound:
raise EngineHTTPException(
status_code=404,
@ -252,6 +259,7 @@ async def update_contract_route(
response_model=data.RegisteredContractResponse,
)
async def delete_contract_route(
background_tasks: BackgroundTasks,
contract_id: UUID = Path(...),
user_authorization: Tuple[BugoutUser, UUID] = Depends(request_user_auth),
db_session: Session = Depends(db.yield_db_session),
@ -259,22 +267,42 @@ async def delete_contract_route(
"""
Allows users to delete contracts that they have registered.
"""
user, _ = user_authorization
_, token = user_authorization
try:
metatx_requester_ids = contracts_actions.fetch_metatx_requester_ids(token=token)
deleted_contract_with_blockchain = contracts_actions.delete_registered_contract(
db_session=db_session,
metatx_requester_id=user.id,
metatx_requester_ids=metatx_requester_ids,
registered_contract_id=contract_id,
)
except contracts_actions.MetatxRequestersNotFound:
raise EngineHTTPException(
status_code=404,
detail="Metatx requester IDs not found",
)
except NoResultFound:
raise EngineHTTPException(
status_code=404,
detail="Either there is not contract with that ID or you do not have access to that contract.",
)
except Exception as err:
logger.error(repr(err))
raise EngineHTTPException(status_code=500)
return contracts_actions.parse_registered_contract_response(
parsed_registered_contract = contracts_actions.parse_registered_contract_response(
deleted_contract_with_blockchain
)
background_tasks.add_task(
contracts_actions.clean_metatx_requester_id,
db_session=db_session,
metatx_requester_id=parsed_registered_contract.metatx_requester_id,
)
return parsed_registered_contract
# TODO(kompotkot): route `/contracts/types` deprecated
@app.get("/contracts/types", tags=["contracts"])