Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add new APIs - list personal info batch registration uploads #376

Merged
merged 1 commit into from
Aug 29, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/model/db/batch_register_personal_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class BatchRegisterPersonalInfoUpload(Base):
upload_id = Column(String(36), primary_key=True)
# issuer address
issuer_address = Column(String(42), nullable=False, index=True)
# processing status (pending:0, succeeded:1, failed:2)
# processing status (BatchRegisterPersonalInfoUploadStatus)
status = Column(String, nullable=False, index=True)


Expand Down
14 changes: 12 additions & 2 deletions app/model/schema/batch_issue_redeem.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@
SPDX-License-Identifier: Apache-2.0
"""
from typing import List
from pydantic import BaseModel
from pydantic import (
BaseModel,
Field
)

from .types import ResultSet
from app.model.db import TokenType
Expand All @@ -29,13 +32,20 @@

class BatchIssueRedeemUpload(BaseModel):
"""Batch issue/redeem Upload"""
upload_id: str
batch_id: str = Field(description="UUID v4 required")
issuer_address: str
token_type: TokenType
token_address: str
processed: bool
created: str

class Config:
schema_extra = {
"example": {
"batch_id": "cfd83622-34dc-4efe-a68b-2cc275d3d824"
}
}


class ListBatchIssueRedeemUploadResponse(BaseModel):
"""List All Batch issue/redeem Upload(RESPONSE)"""
Expand Down
4 changes: 3 additions & 1 deletion app/model/schema/personal_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@
from typing import Optional, List
from pydantic import (
BaseModel,
validator, Field
validator,
Field
)
from web3 import Web3

from app.model.db import BatchRegisterPersonalInfoUploadStatus
from app.model.schema.types import ResultSet

Expand Down
83 changes: 79 additions & 4 deletions app/routers/bond.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@
)
from app.model.schema.personal_info import (
BatchRegisterPersonalInfoUploadResponse,
ListBatchRegisterPersonalInfoUploadResponse,
GetBatchRegisterPersonalInfoResponse,
BatchRegisterPersonalInfoResult
)
Expand Down Expand Up @@ -496,7 +497,7 @@ def additional_issue(
@router.get(
"/tokens/{token_address}/additional_issue/batch",
response_model=ListBatchIssueRedeemUploadResponse,
responses=get_routers_responses()
responses=get_routers_responses(422)
)
def list_all_additional_issue_upload(
token_address: str,
Expand Down Expand Up @@ -541,7 +542,7 @@ def list_all_additional_issue_upload(
for _upload in _upload_list:
created_utc = timezone("UTC").localize(_upload.created)
uploads.append({
"upload_id": _upload.upload_id,
"batch_id": _upload.upload_id,
"issuer_address": _upload.issuer_address,
"token_type": _upload.token_type,
"token_address": _upload.token_address,
Expand Down Expand Up @@ -748,7 +749,7 @@ def redeem_token(
@router.get(
"/tokens/{token_address}/redeem/batch",
response_model=ListBatchIssueRedeemUploadResponse,
responses=get_routers_responses()
responses=get_routers_responses(422)
)
def list_all_redeem_upload(
token_address: str,
Expand Down Expand Up @@ -793,7 +794,7 @@ def list_all_redeem_upload(
for _upload in _upload_list:
created_utc = timezone("UTC").localize(_upload.created)
uploads.append({
"upload_id": _upload.upload_id,
"batch_id": _upload.upload_id,
"issuer_address": _upload.issuer_address,
"token_type": _upload.token_type,
"token_address": _upload.token_address,
Expand Down Expand Up @@ -1479,6 +1480,80 @@ def register_holder_personal_info(
return


# GET: /bond/tokens/{token_address}/personal_info/batch
@router.get(
"/tokens/{token_address}/personal_info/batch",
response_model=ListBatchRegisterPersonalInfoUploadResponse,
responses=get_routers_responses(422, 404, InvalidParameterError)
)
def list_all_personal_info_batch_registration_uploads(
token_address: str,
issuer_address: str = Header(...),
status: Optional[str] = Query(None),
sort_order: int = Query(1, ge=0, le=1, description="0:asc, 1:desc (created)"),
offset: Optional[int] = Query(None),
limit: Optional[int] = Query(None),
db: Session = Depends(db_session)):
"""List all personal information batch registration uploads"""

# Verify that the token is issued by the issuer_address
_token = db.query(Token). \
filter(Token.type == TokenType.IBET_STRAIGHT_BOND.value). \
filter(Token.issuer_address == issuer_address). \
filter(Token.token_address == token_address). \
filter(Token.token_status != 2). \
first()
if _token is None:
raise HTTPException(status_code=404, detail="token not found")
if _token.token_status == 0:
raise InvalidParameterError("this token is temporarily unavailable")

# Get a list of uploads
query = db.query(BatchRegisterPersonalInfoUpload). \
filter(BatchRegisterPersonalInfoUpload.issuer_address == issuer_address)

total = query.count()

if status is not None:
query = query.filter(BatchRegisterPersonalInfoUpload.status == status)

count = query.count()

# Sort
if sort_order == 0: # ASC
query = query.order_by(BatchRegisterPersonalInfoUpload.created)
else: # DESC
query = query.order_by(desc(BatchRegisterPersonalInfoUpload.created))

# Pagination
if limit is not None:
query = query.limit(limit)
if offset is not None:
query = query.offset(offset)

_upload_list: list[BatchRegisterPersonalInfoUpload] = query.all()

uploads = []
for _upload in _upload_list:
created_utc = timezone("UTC").localize(_upload.created)
uploads.append({
"batch_id": _upload.upload_id,
"issuer_address": _upload.issuer_address,
"status": _upload.status,
"created": created_utc.astimezone(local_tz).isoformat()
})

return ListBatchRegisterPersonalInfoUploadResponse(
result_set={
"count": count,
"offset": offset,
"limit": limit,
"total": total
},
uploads=uploads
)


# POST: /bond/tokens/{token_address}/personal_info/batch
@router.post(
"/tokens/{token_address}/personal_info/batch",
Expand Down
83 changes: 79 additions & 4 deletions app/routers/share.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@
)
from app.model.schema.personal_info import (
BatchRegisterPersonalInfoUploadResponse,
ListBatchRegisterPersonalInfoUploadResponse,
GetBatchRegisterPersonalInfoResponse,
BatchRegisterPersonalInfoResult
)
Expand Down Expand Up @@ -483,7 +484,7 @@ def additional_issue(
@router.get(
"/tokens/{token_address}/additional_issue/batch",
response_model=ListBatchIssueRedeemUploadResponse,
responses=get_routers_responses()
responses=get_routers_responses(422)
)
def list_all_additional_issue_upload(
token_address: str,
Expand Down Expand Up @@ -528,7 +529,7 @@ def list_all_additional_issue_upload(
for _upload in _upload_list:
created_utc = timezone("UTC").localize(_upload.created)
uploads.append({
"upload_id": _upload.upload_id,
"batch_id": _upload.upload_id,
"issuer_address": _upload.issuer_address,
"token_type": _upload.token_type,
"token_address": _upload.token_address,
Expand Down Expand Up @@ -735,7 +736,7 @@ def redeem_token(
@router.get(
"/tokens/{token_address}/redeem/batch",
response_model=ListBatchIssueRedeemUploadResponse,
responses=get_routers_responses()
responses=get_routers_responses(422)
)
def list_all_redeem_upload(
token_address: str,
Expand Down Expand Up @@ -780,7 +781,7 @@ def list_all_redeem_upload(
for _upload in _upload_list:
created_utc = timezone("UTC").localize(_upload.created)
uploads.append({
"upload_id": _upload.upload_id,
"batch_id": _upload.upload_id,
"issuer_address": _upload.issuer_address,
"token_type": _upload.token_type,
"token_address": _upload.token_address,
Expand Down Expand Up @@ -1405,6 +1406,80 @@ def modify_holder_personal_info(
return


# GET: /share/tokens/{token_address}/personal_info/batch
@router.get(
"/tokens/{token_address}/personal_info/batch",
response_model=ListBatchRegisterPersonalInfoUploadResponse,
responses=get_routers_responses(422, 404, InvalidParameterError)
)
def list_all_personal_info_batch_registration_uploads(
token_address: str,
issuer_address: str = Header(...),
status: Optional[str] = Query(None),
sort_order: int = Query(1, ge=0, le=1, description="0:asc, 1:desc (created)"),
offset: Optional[int] = Query(None),
limit: Optional[int] = Query(None),
db: Session = Depends(db_session)):
"""List all personal information batch registration uploads"""

# Verify that the token is issued by the issuer_address
_token = db.query(Token). \
filter(Token.type == TokenType.IBET_SHARE.value). \
filter(Token.issuer_address == issuer_address). \
filter(Token.token_address == token_address). \
filter(Token.token_status != 2). \
first()
if _token is None:
raise HTTPException(status_code=404, detail="token not found")
if _token.token_status == 0:
raise InvalidParameterError("this token is temporarily unavailable")

# Get a list of uploads
query = db.query(BatchRegisterPersonalInfoUpload). \
filter(BatchRegisterPersonalInfoUpload.issuer_address == issuer_address)

total = query.count()

if status is not None:
query = query.filter(BatchRegisterPersonalInfoUpload.status == status)

count = query.count()

# Sort
if sort_order == 0: # ASC
query = query.order_by(BatchRegisterPersonalInfoUpload.created)
else: # DESC
query = query.order_by(desc(BatchRegisterPersonalInfoUpload.created))

# Pagination
if limit is not None:
query = query.limit(limit)
if offset is not None:
query = query.offset(offset)

_upload_list: list[BatchRegisterPersonalInfoUpload] = query.all()

uploads = []
for _upload in _upload_list:
created_utc = timezone("UTC").localize(_upload.created)
uploads.append({
"batch_id": _upload.upload_id,
"issuer_address": _upload.issuer_address,
"status": _upload.status,
"created": created_utc.astimezone(local_tz).isoformat()
})

return ListBatchRegisterPersonalInfoUploadResponse(
result_set={
"count": count,
"offset": offset,
"limit": limit,
"total": total
},
uploads=uploads
)


# POST: /share/tokens/{token_address}/personal_info
@router.post(
"/tokens/{token_address}/personal_info",
Expand Down
Loading