Skip to content

Commit

Permalink
Merge pull request #558 from BoostryJP/feature/personal-info-on-trans…
Browse files Browse the repository at this point in the history
…fer-approve-list

Add `personal_information` to token transfer approval list API response
  • Loading branch information
YoshihitoAso authored Nov 17, 2023
2 parents bd19310 + a3aafef commit 79f1f13
Show file tree
Hide file tree
Showing 6 changed files with 3,459 additions and 14 deletions.
2 changes: 2 additions & 0 deletions app/model/schema/transfer.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,9 @@ class TransferApprovalTokenResponse(BaseModel):
exchange_address: str
application_id: int
from_address: str
from_address_personal_information: Optional[dict] = Field(...)
to_address: str
to_address_personal_information: Optional[dict] = Field(...)
amount: int
application_datetime: str
application_blocktimestamp: str
Expand Down
82 changes: 74 additions & 8 deletions app/routers/bond.py
Original file line number Diff line number Diff line change
Expand Up @@ -2836,7 +2836,7 @@ def list_token_transfer_approval_history(
and_(
IDXTransferApproval.transfer_approved == None,
TransferApprovalHistory.operation_type
== TransferApprovalOperationType.APPROVE,
== TransferApprovalOperationType.APPROVE.value,
),
2,
), # Approve(operation completed, event synchronizing)
Expand All @@ -2848,7 +2848,7 @@ def list_token_transfer_approval_history(
and_(
IDXTransferApproval.cancelled == None,
TransferApprovalHistory.operation_type
== TransferApprovalOperationType.CANCEL,
== TransferApprovalOperationType.CANCEL.value,
),
3,
), # Cancel(operation completed, event synchronizing)
Expand All @@ -2871,8 +2871,44 @@ def list_token_transfer_approval_history(
)

# Get transfer approval history
stmt = select(subquery, literal_column("status")).where(
subquery.token_address == token_address
from_address_personal_info = aliased(IDXPersonalInfo)
to_address_personal_info = aliased(IDXPersonalInfo)
stmt = (
select(
subquery,
literal_column("status"),
# Snapshot Personal Information
TransferApprovalHistory.from_address_personal_info,
TransferApprovalHistory.to_address_personal_info,
# Latest Personal Information
from_address_personal_info,
to_address_personal_info,
)
.join(Token, subquery.token_address == Token.token_address)
.outerjoin(
TransferApprovalHistory,
and_(
TransferApprovalHistory.token_address == token_address,
subquery.token_address == TransferApprovalHistory.token_address,
subquery.exchange_address == TransferApprovalHistory.exchange_address,
subquery.application_id == TransferApprovalHistory.application_id,
),
)
.outerjoin(
from_address_personal_info,
and_(
Token.issuer_address == from_address_personal_info.issuer_address,
subquery.from_address == from_address_personal_info.account_address,
),
)
.outerjoin(
to_address_personal_info,
and_(
Token.issuer_address == to_address_personal_info.issuer_address,
subquery.to_address == to_address_personal_info.account_address,
),
)
.where(subquery.token_address == token_address)
)

total = db.scalar(select(func.count()).select_from(stmt.subquery()))
Expand Down Expand Up @@ -2906,12 +2942,26 @@ def list_token_transfer_approval_history(
if offset is not None:
stmt = stmt.offset(offset)

_transfer_approvals: Sequence[tuple[IDXTransferApproval, int]] = db.execute(
stmt
).all()
_transfer_approvals: Sequence[
tuple[
IDXTransferApproval,
int,
dict | None,
dict | None,
IDXPersonalInfo | None,
IDXPersonalInfo | None,
]
] = db.execute(stmt).all()

transfer_approval_history = []
for _transfer_approval, status in _transfer_approvals:
for (
_transfer_approval,
status,
_from_address_snapshot_personal_info,
_to_address_snapshot_personal_info,
_from_address_latest_personal_info,
_to_address_latest_personal_info,
) in _transfer_approvals:
if status == 2:
transfer_approved = True
cancelled = False
Expand Down Expand Up @@ -2972,6 +3022,20 @@ def list_token_transfer_approval_history(
else:
cancellation_blocktimestamp = None

from_address_personal_info = (
_from_address_snapshot_personal_info
if _from_address_snapshot_personal_info is not None
else _from_address_latest_personal_info.personal_info
if _from_address_latest_personal_info is not None
else None
)
to_address_personal_info = (
_to_address_snapshot_personal_info
if _to_address_snapshot_personal_info is not None
else _to_address_latest_personal_info.personal_info
if _to_address_latest_personal_info is not None
else None
)
transfer_approval_history.append(
{
"id": _transfer_approval.id,
Expand All @@ -2991,6 +3055,8 @@ def list_token_transfer_approval_history(
"transfer_approved": transfer_approved,
"status": status,
"issuer_cancelable": issuer_cancelable,
"from_address_personal_information": from_address_personal_info,
"to_address_personal_information": to_address_personal_info,
}
)

Expand Down
78 changes: 72 additions & 6 deletions app/routers/share.py
Original file line number Diff line number Diff line change
Expand Up @@ -2863,8 +2863,44 @@ def list_token_transfer_approval_history(
)

# Get transfer approval history
stmt = select(subquery, literal_column("status")).where(
subquery.token_address == token_address
from_address_personal_info = aliased(IDXPersonalInfo)
to_address_personal_info = aliased(IDXPersonalInfo)
stmt = (
select(
subquery,
literal_column("status"),
# Snapshot Personal Information
TransferApprovalHistory.from_address_personal_info,
TransferApprovalHistory.to_address_personal_info,
# Latest Personal Information
from_address_personal_info,
to_address_personal_info,
)
.join(Token, subquery.token_address == Token.token_address)
.outerjoin(
TransferApprovalHistory,
and_(
TransferApprovalHistory.token_address == token_address,
subquery.token_address == TransferApprovalHistory.token_address,
subquery.exchange_address == TransferApprovalHistory.exchange_address,
subquery.application_id == TransferApprovalHistory.application_id,
),
)
.outerjoin(
from_address_personal_info,
and_(
Token.issuer_address == from_address_personal_info.issuer_address,
subquery.from_address == from_address_personal_info.account_address,
),
)
.outerjoin(
to_address_personal_info,
and_(
Token.issuer_address == to_address_personal_info.issuer_address,
subquery.to_address == to_address_personal_info.account_address,
),
)
.where(subquery.token_address == token_address)
)

total = db.scalar(select(func.count()).select_from(stmt.subquery()))
Expand Down Expand Up @@ -2898,12 +2934,26 @@ def list_token_transfer_approval_history(
if offset is not None:
stmt = stmt.offset(offset)

_transfer_approvals: Sequence[tuple[IDXTransferApproval, int]] = (
db.execute(stmt).tuples().all()
)
_transfer_approvals: Sequence[
tuple[
IDXTransferApproval,
int,
dict | None,
dict | None,
IDXPersonalInfo | None,
IDXPersonalInfo | None,
]
] = db.execute(stmt).all()

transfer_approval_history = []
for _transfer_approval, status in _transfer_approvals:
for (
_transfer_approval,
status,
_from_address_snapshot_personal_info,
_to_address_snapshot_personal_info,
_from_address_latest_personal_info,
_to_address_latest_personal_info,
) in _transfer_approvals:
if status == 2:
transfer_approved = True
cancelled = False
Expand Down Expand Up @@ -2964,6 +3014,20 @@ def list_token_transfer_approval_history(
else:
cancellation_blocktimestamp = None

from_address_personal_info = (
_from_address_snapshot_personal_info
if _from_address_snapshot_personal_info is not None
else _from_address_latest_personal_info.personal_info
if _from_address_latest_personal_info is not None
else None
)
to_address_personal_info = (
_to_address_snapshot_personal_info
if _to_address_snapshot_personal_info is not None
else _to_address_latest_personal_info.personal_info
if _to_address_latest_personal_info is not None
else None
)
transfer_approval_history.append(
{
"id": _transfer_approval.id,
Expand All @@ -2983,6 +3047,8 @@ def list_token_transfer_approval_history(
"transfer_approved": transfer_approved,
"status": status,
"issuer_cancelable": issuer_cancelable,
"from_address_personal_information": from_address_personal_info,
"to_address_personal_information": to_address_personal_info,
}
)

Expand Down
1 change: 1 addition & 0 deletions cmd/explorer/src/connector/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from typing import Any

from aiohttp import ClientSession

from cache import AsyncTTL

path = os.path.join(os.path.dirname(__file__), "../../../../")
Expand Down
Loading

0 comments on commit 79f1f13

Please sign in to comment.