kopia lustrzana https://github.com/bugout-dev/moonstream
Resource metatx requester logic for call requests
rodzic
51d772992c
commit
2b51aacf5e
|
@ -347,10 +347,7 @@ def register_contract(
|
|||
|
||||
try:
|
||||
metatx_requester_stmt = insert(MetatxRequester.__table__).values(id=resource_id)
|
||||
metatx_requester_stmt_do_nothing_stmt = (
|
||||
metatx_requester_stmt.on_conflict_do_nothing()
|
||||
)
|
||||
db_session.execute(metatx_requester_stmt_do_nothing_stmt)
|
||||
db_session.execute(metatx_requester_stmt)
|
||||
|
||||
contract = RegisteredContract(
|
||||
blockchain_id=blockchain.id,
|
||||
|
@ -507,7 +504,7 @@ def delete_registered_contract(
|
|||
|
||||
def create_request_calls(
|
||||
db_session: Session,
|
||||
metatx_requester_id: uuid.UUID,
|
||||
metatx_requester_ids: List[uuid.UUID],
|
||||
registered_contract_id: Optional[uuid.UUID],
|
||||
contract_address: Optional[str],
|
||||
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
|
||||
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:
|
||||
|
@ -551,7 +548,7 @@ def create_request_calls(
|
|||
try:
|
||||
registered_contract = query.one()
|
||||
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
|
||||
for specification in call_specs:
|
||||
|
@ -585,7 +582,7 @@ def create_request_calls(
|
|||
request = CallRequest(
|
||||
registered_contract_id=registered_contract.id,
|
||||
call_request_type_name=call_request_type,
|
||||
metatx_requester_id=metatx_requester_id,
|
||||
metatx_requester_id=registered_contract.metatx_requester_id,
|
||||
caller=normalized_caller,
|
||||
method=specification.method,
|
||||
request_id=specification.request_id,
|
||||
|
@ -610,7 +607,7 @@ def create_request_calls(
|
|||
|
||||
def get_call_request_from_tuple(
|
||||
db_session: Session,
|
||||
metatx_requester_id: uuid.UUID,
|
||||
metatx_requester_ids: List[uuid.UUID],
|
||||
requests: Set[Tuple[str, str]],
|
||||
contract_id: Optional[uuid.UUID] = None,
|
||||
contract_address: Optional[str] = None,
|
||||
|
@ -625,7 +622,7 @@ def get_call_request_from_tuple(
|
|||
RegisteredContract,
|
||||
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))
|
||||
)
|
||||
if contract_id is not None:
|
||||
|
@ -691,7 +688,7 @@ def list_call_requests(
|
|||
offset: Optional[int] = None,
|
||||
show_expired: bool = False,
|
||||
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 call requests.
|
||||
|
@ -732,9 +729,9 @@ def list_call_requests(
|
|||
|
||||
# If user id not specified, do not show call_requests before live_at.
|
||||
# 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(
|
||||
CallRequest.metatx_requester_id == metatx_requester_id,
|
||||
CallRequest.metatx_requester_id.in_(metatx_requester_ids),
|
||||
)
|
||||
else:
|
||||
query = query.filter(
|
||||
|
@ -767,7 +764,7 @@ def list_call_requests(
|
|||
|
||||
def delete_requests(
|
||||
db_session: Session,
|
||||
metatx_requester_id: uuid.UUID,
|
||||
metatx_requester_ids: List[uuid.UUID],
|
||||
request_ids: List[uuid.UUID] = [],
|
||||
) -> int:
|
||||
"""
|
||||
|
@ -776,7 +773,7 @@ def delete_requests(
|
|||
try:
|
||||
requests_to_delete_query = (
|
||||
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))
|
||||
)
|
||||
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:
|
||||
contracts = lookup_registered_contracts(
|
||||
db_session=db_session,
|
||||
moonstream_user_id=args.user_id,
|
||||
metatx_requester_ids=[args.resource_id],
|
||||
blockchain=args.blockchain,
|
||||
address=args.address,
|
||||
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:
|
||||
create_request_calls(
|
||||
db_session=db_session,
|
||||
moonstream_user_id=args.moonstream_user_id,
|
||||
metatx_requester_ids=[args.resource_id],
|
||||
registered_contract_id=args.registered_contract_id,
|
||||
call_specs=call_specs,
|
||||
ttl_days=args.ttl_days,
|
||||
|
@ -1060,11 +1057,11 @@ def generate_cli() -> argparse.ArgumentParser:
|
|||
help="The type of the contract",
|
||||
)
|
||||
list_contracts_parser.add_argument(
|
||||
"-u",
|
||||
"--user-id",
|
||||
"-r",
|
||||
"--resource-id",
|
||||
type=uuid.UUID,
|
||||
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(
|
||||
"-N",
|
||||
|
@ -1099,7 +1096,7 @@ def generate_cli() -> argparse.ArgumentParser:
|
|||
"--resource-id",
|
||||
type=uuid.UUID,
|
||||
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)
|
||||
|
||||
|
@ -1115,11 +1112,11 @@ def generate_cli() -> argparse.ArgumentParser:
|
|||
help="The ID of the registered contract to create call requests for",
|
||||
)
|
||||
request_calls_parser.add_argument(
|
||||
"-u",
|
||||
"--moonstream-user-id",
|
||||
"-r",
|
||||
"--resource-id",
|
||||
type=uuid.UUID,
|
||||
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(
|
||||
"-c",
|
||||
|
|
|
@ -118,17 +118,15 @@ async def request_user_auth(
|
|||
token: UUID = Depends(oauth2_scheme),
|
||||
) -> Tuple[BugoutUserWithGroups, UUID]:
|
||||
user = brood_auth(token=token)
|
||||
|
||||
return user, token
|
||||
|
||||
|
||||
async def request_none_or_user_auth(
|
||||
authorization: str = Header(None),
|
||||
) -> Optional[BugoutUserWithGroups]:
|
||||
) -> Optional[Tuple[BugoutUserWithGroups, UUID]]:
|
||||
"""
|
||||
Fetch Bugout user if authorization token provided.
|
||||
"""
|
||||
user: Optional[BugoutUserWithGroups] = None
|
||||
if authorization is not None:
|
||||
token: str = ""
|
||||
try:
|
||||
|
@ -143,8 +141,9 @@ async def request_none_or_user_auth(
|
|||
|
||||
if token != "":
|
||||
user = brood_auth(token=token)
|
||||
return user, token
|
||||
|
||||
return user
|
||||
return None
|
||||
|
||||
|
||||
async def metatx_verify_header(
|
||||
|
|
|
@ -496,7 +496,9 @@ async def list_requests_route(
|
|||
offset: Optional[int] = Query(None),
|
||||
show_expired: bool = Query(False),
|
||||
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),
|
||||
) -> 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.
|
||||
"""
|
||||
_, token = user_authorization
|
||||
|
||||
try:
|
||||
metatx_requester_ids = contracts_actions.fetch_metatx_requester_ids(token=token)
|
||||
|
||||
requests = contracts_actions.list_call_requests(
|
||||
db_session=db_session,
|
||||
contract_id=contract_id,
|
||||
|
@ -514,7 +520,12 @@ async def list_requests_route(
|
|||
offset=offset,
|
||||
show_expired=show_expired,
|
||||
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:
|
||||
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.
|
||||
"""
|
||||
user, _ = user_authorization
|
||||
_, token = user_authorization
|
||||
|
||||
try:
|
||||
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"
|
||||
)
|
||||
|
||||
metatx_requester_ids = contracts_actions.fetch_metatx_requester_ids(token=token)
|
||||
|
||||
existing_requests = contracts_actions.get_call_request_from_tuple(
|
||||
db_session=db_session,
|
||||
metatx_requester_id=user.id,
|
||||
metatx_requester_ids=metatx_requester_ids,
|
||||
requests=incoming_requests,
|
||||
contract_id=request_data.contract_id,
|
||||
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:
|
||||
raise EngineHTTPException(
|
||||
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.
|
||||
"""
|
||||
user, _ = user_authorization
|
||||
_, token = user_authorization
|
||||
|
||||
try:
|
||||
metatx_requester_ids = contracts_actions.fetch_metatx_requester_ids(token=token)
|
||||
|
||||
num_requests = contracts_actions.create_request_calls(
|
||||
db_session=db_session,
|
||||
metatx_requester_id=user.id,
|
||||
metatx_requester_ids=metatx_requester_ids,
|
||||
registered_contract_id=request_data.contract_id,
|
||||
contract_address=request_data.contract_address,
|
||||
call_specs=request_data.specifications,
|
||||
ttl_days=request_data.ttl_days,
|
||||
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:
|
||||
raise EngineHTTPException(
|
||||
status_code=400,
|
||||
|
@ -673,14 +698,21 @@ async def delete_requests(
|
|||
"""
|
||||
Allows users to delete requests.
|
||||
"""
|
||||
user, _ = user_authorization
|
||||
_, token = user_authorization
|
||||
|
||||
try:
|
||||
metatx_requester_ids = contracts_actions.fetch_metatx_requester_ids(token=token)
|
||||
|
||||
deleted_requests = contracts_actions.delete_requests(
|
||||
db_session=db_session,
|
||||
metatx_requester_id=user.id,
|
||||
metatx_requester_ids=metatx_requester_ids,
|
||||
request_ids=request_ids,
|
||||
)
|
||||
except contracts_actions.MetatxRequestersNotFound:
|
||||
raise EngineHTTPException(
|
||||
status_code=404,
|
||||
detail="Metatx requester IDs not found",
|
||||
)
|
||||
except Exception as err:
|
||||
logger.error(repr(err))
|
||||
raise EngineHTTPException(status_code=500)
|
||||
|
|
Ładowanie…
Reference in New Issue