API list call request types

pull/882/head
kompotkot 2023-08-03 10:25:09 +00:00
rodzic b0d8e17254
commit 6dfca4a49b
5 zmienionych plików z 51 dodań i 14 usunięć

Wyświetl plik

@ -52,6 +52,7 @@ def upgrade():
op.create_table('call_request_types',
sa.Column('id', sa.UUID(), nullable=False),
sa.Column('request_type', sa.VARCHAR(length=128), nullable=False),
sa.Column('description', sa.String(), nullable=True),
sa.PrimaryKeyConstraint('id', name=op.f('pk_call_request_types')),
sa.UniqueConstraint('id', name=op.f('uq_call_request_types_id'))
)
@ -62,8 +63,8 @@ def upgrade():
op.create_foreign_key(op.f('fk_call_requests_call_request_type_id_call_request_types'), 'call_requests', 'call_request_types', ['call_request_type_id'], ['id'], ondelete='CASCADE')
# Manual - Start
op.execute(f"INSERT INTO call_request_types (id, request_type) VALUES ('{str(uuid.uuid4())}', 'raw');")
op.execute(f"INSERT INTO call_request_types (id, request_type) VALUES ('{str(uuid.uuid4())}', 'dropper-v0.2.0');")
op.execute(f"INSERT INTO call_request_types (id, request_type, description) VALUES ('{str(uuid.uuid4())}', 'raw', 'A generic smart contract. You can ask users to submit arbitrary calldata to this contract.');")
op.execute(f"INSERT INTO call_request_types (id, request_type, description) VALUES ('{str(uuid.uuid4())}', 'dropper-v0.2.0', 'A Dropper v0.2.0 contract. You can authorize users to submit claims against this contract.');")
op.execute("UPDATE call_requests SET call_request_type_id = (SELECT call_request_types.id FROM call_request_types INNER JOIN registered_contracts ON call_requests.registered_contract_id = registered_contracts.id WHERE call_request_types.request_type = registered_contracts.contract_type);")
op.alter_column("call_requests", "call_request_type_id", nullable=False)
# Manual - End

Wyświetl plik

@ -12,7 +12,7 @@ from web3 import Web3
from . import data, db
from .data import ContractType
from .models import CallRequest, RegisteredContract
from .models import CallRequest, RegisteredContract, CallRequestType
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@ -334,6 +334,13 @@ def get_call_requests(
)
def list_call_request_types(
db_session: Session,
) -> List[CallRequestType]:
call_request_types = db_session.query(CallRequestType).all()
return call_request_types
def list_call_requests(
db_session: Session,
contract_id: Optional[uuid.UUID],

Wyświetl plik

@ -208,6 +208,19 @@ class ContractType(Enum):
dropper = "dropper-v0.2.0"
class CallRequestTypeResponse(BaseModel):
id: UUID
request_type: str
description: str
class Config:
orm_mode = True
class CallRequestTypesResponse(BaseModel):
call_request_types: List[CallRequestTypeResponse] = Field(default_factory=list)
class RegisterContractRequest(BaseModel):
blockchain: str
address: str

Wyświetl plik

@ -172,6 +172,7 @@ class CallRequestType(Base): # type: ignore
unique=True,
)
request_type = Column(VARCHAR(128), nullable=False, unique=True, index=True)
description = Column(String, nullable=True)
call_requests = relationship(
"CallRequest",

Wyświetl plik

@ -38,6 +38,7 @@ whitelist_paths = {
"/metatx/openapi.json": "GET",
f"/metatx/{DOCS_TARGET_PATH}": "GET",
"/metatx/contracts/types": "GET",
"/metatx/requests/types": "GET",
"/metatx/requests": "GET",
}
@ -62,17 +63,6 @@ app.add_middleware(
)
@app.get("/contracts/types", tags=["contracts"])
async def contract_types() -> Dict[str, str]:
"""
Describes the contract_types that users can register contracts as against this API.
"""
return {
data.ContractType.raw.value: "A generic smart contract. You can ask users to submit arbitrary calldata to this contract.",
data.ContractType.dropper.value: "A Dropper contract. You can authorize users to submit claims against this contract.",
}
@app.get("/contracts", tags=["contracts"], response_model=List[data.RegisteredContract])
async def list_registered_contracts(
request: Request,
@ -219,6 +209,31 @@ async def delete_contract(
return deleted_contract
# TODO(kompotkot): route `/contracts/types` deprecated
@app.get("/contracts/types", tags=["contracts"])
@app.get(
"/requests/types", tags=["requests"], response_model=data.CallRequestTypesResponse
)
async def contract_types(
db_session: Session = Depends(db.yield_db_read_only_session),
) -> data.CallRequestTypesResponse:
"""
Describes the call_request_types that users can register call requests as against this API.
"""
try:
call_request_types = contracts_actions.list_call_request_types(
db_session=db_session,
)
except Exception as e:
logger.error(repr(e))
raise EngineHTTPException(status_code=500)
return data.CallRequestTypesResponse(
call_request_types=[
call_request_type for call_request_type in call_request_types
]
)
@app.get("/requests", tags=["requests"], response_model=List[data.CallRequest])
async def list_requests(
contract_id: Optional[UUID] = Query(None),