Resource metatx requester logic for call requests

pull/1124/head
kompotkot 2024-08-15 11:14:12 +00:00
rodzic 51d772992c
commit 2b51aacf5e
3 zmienionych plików z 64 dodań i 36 usunięć

Wyświetl plik

@ -347,10 +347,7 @@ def register_contract(
try: try:
metatx_requester_stmt = insert(MetatxRequester.__table__).values(id=resource_id) metatx_requester_stmt = insert(MetatxRequester.__table__).values(id=resource_id)
metatx_requester_stmt_do_nothing_stmt = ( db_session.execute(metatx_requester_stmt)
metatx_requester_stmt.on_conflict_do_nothing()
)
db_session.execute(metatx_requester_stmt_do_nothing_stmt)
contract = RegisteredContract( contract = RegisteredContract(
blockchain_id=blockchain.id, blockchain_id=blockchain.id,
@ -507,7 +504,7 @@ def delete_registered_contract(
def create_request_calls( def create_request_calls(
db_session: Session, db_session: Session,
metatx_requester_id: uuid.UUID, metatx_requester_ids: List[uuid.UUID],
registered_contract_id: Optional[uuid.UUID], registered_contract_id: Optional[uuid.UUID],
contract_address: Optional[str], contract_address: Optional[str],
call_specs: List[data.CallSpecification], call_specs: List[data.CallSpecification],
@ -537,7 +534,7 @@ def create_request_calls(
# Check that the moonstream_user_id matches a RegisteredContract with the given id or address # Check that the moonstream_user_id matches a RegisteredContract with the given id or address
query = db_session.query(RegisteredContract).filter( query = db_session.query(RegisteredContract).filter(
RegisteredContract.metatx_requester_id == metatx_requester_id RegisteredContract.metatx_requester_id.in_(metatx_requester_ids)
) )
if registered_contract_id is not None: if registered_contract_id is not None:
@ -551,7 +548,7 @@ def create_request_calls(
try: try:
registered_contract = query.one() registered_contract = query.one()
except NoResultFound: except NoResultFound:
raise ValueError("Invalid registered_contract_id or metatx_requester_id") raise ValueError("Invalid registered_contract_id or metatx_requester_ids")
# Normalize the caller argument using Web3.toChecksumAddress # Normalize the caller argument using Web3.toChecksumAddress
for specification in call_specs: for specification in call_specs:
@ -585,7 +582,7 @@ def create_request_calls(
request = CallRequest( request = CallRequest(
registered_contract_id=registered_contract.id, registered_contract_id=registered_contract.id,
call_request_type_name=call_request_type, call_request_type_name=call_request_type,
metatx_requester_id=metatx_requester_id, metatx_requester_id=registered_contract.metatx_requester_id,
caller=normalized_caller, caller=normalized_caller,
method=specification.method, method=specification.method,
request_id=specification.request_id, request_id=specification.request_id,
@ -610,7 +607,7 @@ def create_request_calls(
def get_call_request_from_tuple( def get_call_request_from_tuple(
db_session: Session, db_session: Session,
metatx_requester_id: uuid.UUID, metatx_requester_ids: List[uuid.UUID],
requests: Set[Tuple[str, str]], requests: Set[Tuple[str, str]],
contract_id: Optional[uuid.UUID] = None, contract_id: Optional[uuid.UUID] = None,
contract_address: Optional[str] = None, contract_address: Optional[str] = None,
@ -625,7 +622,7 @@ def get_call_request_from_tuple(
RegisteredContract, RegisteredContract,
CallRequest.registered_contract_id == RegisteredContract.id, CallRequest.registered_contract_id == RegisteredContract.id,
) )
.filter(RegisteredContract.metatx_requester_id == metatx_requester_id) .filter(RegisteredContract.metatx_requester_id.in_(metatx_requester_ids))
.filter(tuple_(CallRequest.caller, CallRequest.request_id).in_(requests)) .filter(tuple_(CallRequest.caller, CallRequest.request_id).in_(requests))
) )
if contract_id is not None: if contract_id is not None:
@ -691,7 +688,7 @@ def list_call_requests(
offset: Optional[int] = None, offset: Optional[int] = None,
show_expired: bool = False, show_expired: bool = False,
live_after: Optional[int] = None, live_after: Optional[int] = None,
metatx_requester_id: Optional[uuid.UUID] = None, metatx_requester_ids: List[uuid.UUID] = [],
) -> List[Row[Tuple[CallRequest, RegisteredContract, CallRequestType]]]: ) -> List[Row[Tuple[CallRequest, RegisteredContract, CallRequestType]]]:
""" """
List call requests. List call requests.
@ -732,9 +729,9 @@ def list_call_requests(
# If user id not specified, do not show call_requests before live_at. # If user id not specified, do not show call_requests before live_at.
# Otherwise check show_before_live_at argument from query parameter # Otherwise check show_before_live_at argument from query parameter
if metatx_requester_id is not None: if len(metatx_requester_ids) != 0:
query = query.filter( query = query.filter(
CallRequest.metatx_requester_id == metatx_requester_id, CallRequest.metatx_requester_id.in_(metatx_requester_ids),
) )
else: else:
query = query.filter( query = query.filter(
@ -767,7 +764,7 @@ def list_call_requests(
def delete_requests( def delete_requests(
db_session: Session, db_session: Session,
metatx_requester_id: uuid.UUID, metatx_requester_ids: List[uuid.UUID],
request_ids: List[uuid.UUID] = [], request_ids: List[uuid.UUID] = [],
) -> int: ) -> int:
""" """
@ -776,7 +773,7 @@ def delete_requests(
try: try:
requests_to_delete_query = ( requests_to_delete_query = (
db_session.query(CallRequest) db_session.query(CallRequest)
.filter(CallRequest.metatx_requester_id == metatx_requester_id) .filter(CallRequest.metatx_requester_id.in_(metatx_requester_ids))
.filter(CallRequest.id.in_(request_ids)) .filter(CallRequest.id.in_(request_ids))
) )
requests_to_delete_num: int = requests_to_delete_query.delete( requests_to_delete_num: int = requests_to_delete_query.delete(
@ -880,7 +877,7 @@ def handle_list(args: argparse.Namespace) -> None:
with db.yield_db_session_ctx() as db_session: with db.yield_db_session_ctx() as db_session:
contracts = lookup_registered_contracts( contracts = lookup_registered_contracts(
db_session=db_session, db_session=db_session,
moonstream_user_id=args.user_id, metatx_requester_ids=[args.resource_id],
blockchain=args.blockchain, blockchain=args.blockchain,
address=args.address, address=args.address,
contract_type=args.contract_type, contract_type=args.contract_type,
@ -934,7 +931,7 @@ def handle_request_calls(args: argparse.Namespace) -> None:
with db.yield_db_session_ctx() as db_session: with db.yield_db_session_ctx() as db_session:
create_request_calls( create_request_calls(
db_session=db_session, db_session=db_session,
moonstream_user_id=args.moonstream_user_id, metatx_requester_ids=[args.resource_id],
registered_contract_id=args.registered_contract_id, registered_contract_id=args.registered_contract_id,
call_specs=call_specs, call_specs=call_specs,
ttl_days=args.ttl_days, ttl_days=args.ttl_days,
@ -1060,11 +1057,11 @@ def generate_cli() -> argparse.ArgumentParser:
help="The type of the contract", help="The type of the contract",
) )
list_contracts_parser.add_argument( list_contracts_parser.add_argument(
"-u", "-r",
"--user-id", "--resource-id",
type=uuid.UUID, type=uuid.UUID,
required=True, required=True,
help="The ID of the Moonstream user whose contracts to list", help="The ID of the Bugout resource representing metatx requester whose contracts to list",
) )
list_contracts_parser.add_argument( list_contracts_parser.add_argument(
"-N", "-N",
@ -1099,7 +1096,7 @@ def generate_cli() -> argparse.ArgumentParser:
"--resource-id", "--resource-id",
type=uuid.UUID, type=uuid.UUID,
required=True, required=True,
help="The ID of the Moonstream resource whose contract to delete", help="The ID of the Bugout resource representing metatx requester whose contract to delete",
) )
delete_parser.set_defaults(func=handle_delete) delete_parser.set_defaults(func=handle_delete)
@ -1115,11 +1112,11 @@ def generate_cli() -> argparse.ArgumentParser:
help="The ID of the registered contract to create call requests for", help="The ID of the registered contract to create call requests for",
) )
request_calls_parser.add_argument( request_calls_parser.add_argument(
"-u", "-r",
"--moonstream-user-id", "--resource-id",
type=uuid.UUID, type=uuid.UUID,
required=True, required=True,
help="The ID of the Moonstream user who owns the contract", help="The ID of the Bugout resource representing metatx requester who owns the contract",
) )
request_calls_parser.add_argument( request_calls_parser.add_argument(
"-c", "-c",

Wyświetl plik

@ -118,17 +118,15 @@ async def request_user_auth(
token: UUID = Depends(oauth2_scheme), token: UUID = Depends(oauth2_scheme),
) -> Tuple[BugoutUserWithGroups, UUID]: ) -> Tuple[BugoutUserWithGroups, UUID]:
user = brood_auth(token=token) user = brood_auth(token=token)
return user, token return user, token
async def request_none_or_user_auth( async def request_none_or_user_auth(
authorization: str = Header(None), authorization: str = Header(None),
) -> Optional[BugoutUserWithGroups]: ) -> Optional[Tuple[BugoutUserWithGroups, UUID]]:
""" """
Fetch Bugout user if authorization token provided. Fetch Bugout user if authorization token provided.
""" """
user: Optional[BugoutUserWithGroups] = None
if authorization is not None: if authorization is not None:
token: str = "" token: str = ""
try: try:
@ -143,8 +141,9 @@ async def request_none_or_user_auth(
if token != "": if token != "":
user = brood_auth(token=token) user = brood_auth(token=token)
return user, token
return user return None
async def metatx_verify_header( async def metatx_verify_header(

Wyświetl plik

@ -496,7 +496,9 @@ async def list_requests_route(
offset: Optional[int] = Query(None), offset: Optional[int] = Query(None),
show_expired: bool = Query(False), show_expired: bool = Query(False),
live_after: Optional[int] = Query(None), live_after: Optional[int] = Query(None),
user: Optional[BugoutUser] = Depends(request_none_or_user_auth), user_authorization: Optional[Tuple[BugoutUser, UUID]] = Depends(
request_none_or_user_auth
),
db_session: Session = Depends(db.yield_db_read_only_session), db_session: Session = Depends(db.yield_db_read_only_session),
) -> List[data.CallRequestResponse]: ) -> List[data.CallRequestResponse]:
""" """
@ -504,7 +506,11 @@ async def list_requests_route(
At least one of `contract_id` or `contract_address` must be provided as query parameters. At least one of `contract_id` or `contract_address` must be provided as query parameters.
""" """
_, token = user_authorization
try: try:
metatx_requester_ids = contracts_actions.fetch_metatx_requester_ids(token=token)
requests = contracts_actions.list_call_requests( requests = contracts_actions.list_call_requests(
db_session=db_session, db_session=db_session,
contract_id=contract_id, contract_id=contract_id,
@ -514,7 +520,12 @@ async def list_requests_route(
offset=offset, offset=offset,
show_expired=show_expired, show_expired=show_expired,
live_after=live_after, live_after=live_after,
metatx_requester_id=user.id if user is not None else None, metatx_requester_ids=metatx_requester_ids,
)
except contracts_actions.MetatxRequestersNotFound:
raise EngineHTTPException(
status_code=404,
detail="Metatx requester IDs not found",
) )
except ValueError as e: except ValueError as e:
logger.error(repr(e)) logger.error(repr(e))
@ -538,7 +549,7 @@ async def check_requests_route(
""" """
Implemented for pre-check until list of requests to be pushed into database. Implemented for pre-check until list of requests to be pushed into database.
""" """
user, _ = user_authorization _, token = user_authorization
try: try:
incoming_requests: Set[Tuple[str, str]] = set() incoming_requests: Set[Tuple[str, str]] = set()
@ -553,13 +564,20 @@ async def check_requests_route(
"There are same call_request_id's in one request" "There are same call_request_id's in one request"
) )
metatx_requester_ids = contracts_actions.fetch_metatx_requester_ids(token=token)
existing_requests = contracts_actions.get_call_request_from_tuple( existing_requests = contracts_actions.get_call_request_from_tuple(
db_session=db_session, db_session=db_session,
metatx_requester_id=user.id, metatx_requester_ids=metatx_requester_ids,
requests=incoming_requests, requests=incoming_requests,
contract_id=request_data.contract_id, contract_id=request_data.contract_id,
contract_address=request_data.contract_address, contract_address=request_data.contract_address,
) )
except contracts_actions.MetatxRequestersNotFound:
raise EngineHTTPException(
status_code=404,
detail="Metatx requester IDs not found",
)
except contracts_actions.CallRequestIdDuplicates: except contracts_actions.CallRequestIdDuplicates:
raise EngineHTTPException( raise EngineHTTPException(
status_code=400, detail="There are same call_request_id's in one request" status_code=400, detail="There are same call_request_id's in one request"
@ -620,18 +638,25 @@ async def create_requests(
At least one of `contract_id` or `contract_address` must be provided in the request body. At least one of `contract_id` or `contract_address` must be provided in the request body.
""" """
user, _ = user_authorization _, token = user_authorization
try: try:
metatx_requester_ids = contracts_actions.fetch_metatx_requester_ids(token=token)
num_requests = contracts_actions.create_request_calls( num_requests = contracts_actions.create_request_calls(
db_session=db_session, db_session=db_session,
metatx_requester_id=user.id, metatx_requester_ids=metatx_requester_ids,
registered_contract_id=request_data.contract_id, registered_contract_id=request_data.contract_id,
contract_address=request_data.contract_address, contract_address=request_data.contract_address,
call_specs=request_data.specifications, call_specs=request_data.specifications,
ttl_days=request_data.ttl_days, ttl_days=request_data.ttl_days,
live_at=request_data.live_at, live_at=request_data.live_at,
) )
except contracts_actions.MetatxRequestersNotFound:
raise EngineHTTPException(
status_code=404,
detail="Metatx requester IDs not found",
)
except contracts_actions.InvalidAddressFormat as err: except contracts_actions.InvalidAddressFormat as err:
raise EngineHTTPException( raise EngineHTTPException(
status_code=400, status_code=400,
@ -673,14 +698,21 @@ async def delete_requests(
""" """
Allows users to delete requests. Allows users to delete requests.
""" """
user, _ = user_authorization _, token = user_authorization
try: try:
metatx_requester_ids = contracts_actions.fetch_metatx_requester_ids(token=token)
deleted_requests = contracts_actions.delete_requests( deleted_requests = contracts_actions.delete_requests(
db_session=db_session, db_session=db_session,
metatx_requester_id=user.id, metatx_requester_ids=metatx_requester_ids,
request_ids=request_ids, request_ids=request_ids,
) )
except contracts_actions.MetatxRequestersNotFound:
raise EngineHTTPException(
status_code=404,
detail="Metatx requester IDs not found",
)
except Exception as err: except Exception as err:
logger.error(repr(err)) logger.error(repr(err))
raise EngineHTTPException(status_code=500) raise EngineHTTPException(status_code=500)