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

[server][client] client에서 필요한 pagination data API요청 #226

Closed
NotoriousHong opened this issue Feb 7, 2023 · 18 comments
Closed
Assignees
Labels
Client Working on Client Server Working on Server

Comments

@NotoriousHong
Copy link
Collaborator

NotoriousHong commented Feb 7, 2023

1. mypage에 필요한 API

https://nodeauction.42msnsnsfoav6.ap-northeast-2.cs.amazonlightsail.com/users/my
위와 같은 엔드포인트로 mypage data를 요청합니다.

현재 API응답은 아래와 같은 data로 들어오는데 address, boughtCount, email, nickname, soldCount를 사용할 예정입니다.
크게 변경하실 사항 없이 그대로 데이터 넘겨주시면 됩니다.

address : "0x2ef6e388a4f3ad0d3b11773528705d40b9a0d4ff" //user address
boughtCount : 3 //buyer로서 참여한 횟수
createdAt : 1675522449
deletedAt : null
email : null //user email
lastBought : 1675658649
lastSold : 1675583684
nickname : null //user nickname
nonce : null
soldCount : 3 //seller로서 참여한 횟수
updatedAt : 1675658649


2.swaps filtering에 필요한 API

see more page에서 한 페이지에 10개의 CDS card를 보여줄려합니다.
제일 나중에 들어온 CDS가 1번으로 나올 수 있도록 해주시면 감사하겠습니다.
(현재는 모든 swaps데이터를 들고온다음 client에서 필터링하고 있습니다.)

ex)
proposed swaps를 1번부터 10번까지 API 호출합니다.
https://nodeauction.42msnsnsfoav6.ap-northeast-2.cs.amazonlightsail.com/swaps?staus=proposed&offset=0&limit=10

아래와 같은 데이터를 얻기를 원합니다.

{
	totalCDSs: 265,
	cds: [propsed CDS 1번부터 10번까지 10]
}

마찬가지로
proposed swaps를 11번부터 20번까지 API호출합니다.
https://nodeauction.42msnsnsfoav6.ap-northeast-2.cs.amazonlightsail.com/swaps?staus=proposed&offset=11&limit=20

accepted swaps를 1번부터 10번까지 API호출합니다.
https://nodeauction.42msnsnsfoav6.ap-northeast-2.cs.amazonlightsail.com/swaps?staus=accepted&offset=0&limit=10



2-1.user address filtering

2번의 API데이터에서 user address를 추가로 필터링합니다.

ex)
'0x3434324384738291473289' address를 가진 유저가 연관되어있는 accepted swaps를 1번부터 10번까지 API 호출합니다.
https://nodeauction.42msnsnsfoav6.ap-northeast-2.cs.amazonlightsail.com/swaps?staus=proposed&address=0x3434324384738291473289&offset=0&limit=10

@NotoriousHong NotoriousHong added Server Working on Server Client Working on Client labels Feb 7, 2023
@atoye1
Copy link
Contributor

atoye1 commented Feb 7, 2023

typeorm reference

conditional where clause in querybuilder

.andWhere(status ? `status = :status` : '1=1', { status })

typeorm/typeorm#3103

@atoye1
Copy link
Contributor

atoye1 commented Feb 7, 2023

{
	totalCDSs: 265,
	cds: [propsed CDS 1번부터 10번까지 10개]
}

위의 예시에서 totalCDSs는 전체 CDS인가요? status 등의 필터가 적용된 후의 CDS 개수인가요

@NotoriousHong
Copy link
Collaborator Author

NotoriousHong commented Feb 7, 2023

전체 CDS의 갯수입니다.

client에서는 CDS swaps를 페이지별로 1번부터 10번, 11번 부터 20번 끊어서 그때그때 서버에 get을 요청하기 때문에
client입장에서는 전체 몇개의 CDS swaps가 서버 데이터에 존재하고 이에 따라 몇개의 페이지를 User에게 보여줘야할지 알지 못합니다(10페이지가 끝인지 99페이지가 끝인지 모릅니다).
때문에 전체 CDS swaps의 갯수를 전달받아 페이지 갯수를 측정하기 위해 사용될 예정입니다.

@atoye1
Copy link
Contributor

atoye1 commented Feb 7, 2023

알겠습니다.

그리고 CDS라고 말하면 용어가 헷갈리는데, CDS로 부터 파생된 개별 계약은 swap이라고 정의했으면 좋겠습니다.

따라서 api 응답도 아래와 같이 드리면 안될까요?

{
	totalSwapCount: 111,
	filteredSwapCount: 30,
	swaps: [swap1, swap2, ...];
}

@NotoriousHong
Copy link
Collaborator Author

네 알겠습니다.

위와 같이 주시면 감사하겠습니다!

@atoye1
Copy link
Contributor

atoye1 commented Feb 7, 2023

LIMIT를 명시하지 않고 OFFSET을 입력했을 경우 아래와 같은 오류 발생하므로
OFFSET 활용시 항상 LIMIT도 입력해야 합니다.

"RDBMS does not support OFFSET without LIMIT in SELECT statements. You must use limit in conjunction with offset function (or take in conjunction with skip function if you are using pagination)."

아니면 기본 LIMIT를 서버에서 정의할 수도 있습니다.
LIMIT가 입력되지 않은 경우 몇개 단위로 드리는게 좋을까요?

@NotoriousHong
Copy link
Collaborator Author

LIMIT을 기본적으로 서버에서 정해주는 편이 더 간단할듯 합니다.

LIMIT이 입력되지 않은 경우 10개로 넘겨주시면 감사하겠습니다.

@atoye1
Copy link
Contributor

atoye1 commented Feb 7, 2023

반환 양식은 아래와 같습니다.

{
	"totalSwapCount":39,
	"filteredSwapCount":39,
	"swaps":[<swap data>],
	"offset":0,
	"limit":10,
	"statusFilter":"all",
	"addressFilter":null
}

현재 쿼리로 보낼 수 있는 인자는 다음과 같습니다.

offset
limit
status
order (ASC or DESC default DESC)
address

다음 배포판에서는 seller, buyer 기준으로 필터도 가능합니다.

address > buyer > seller 순으로 우선순위가 적용되어 하나의 필터만 작동하며,

상위 필터가 있는 경우 하위 필터는 무시됩니다.

@NotoriousHong
Copy link
Collaborator Author

NotoriousHong commented Feb 7, 2023

https://nodeauction.42msnsnsfoav6.ap-northeast-2.cs.amazonlightsail.com/swaps?staus=proposed&offset=0&limit=10

위 엔드포인트로 get요청을 보내면 아래와 같은 데이터가 전달됩니다.
swaps데이터가 들어오지 않는 것 같은데 확인해주실 수 있을까요?

{
"totalSwapCount":39,
"offset":0,
"limit":10,
"statusFilter":"all",
"addressFilter":null,
"sellerFilter":null,
"buyerFilter":null
}

@atoye1 atoye1 reopened this Feb 7, 2023
@atoye1
Copy link
Contributor

atoye1 commented Feb 7, 2023

status가 잘못 지정되어서 그렇습니다.
컨트랙트에 정의된 status를 보내셔야 됩니다.

inactive, pending, 등등 인데 컨트랙트 참조 바랍니다.

@atoye1
Copy link
Contributor

atoye1 commented Feb 7, 2023

아아 staus 가 오타군요
status 로 하셔야 될겁니다.

@NotoriousHong
Copy link
Collaborator Author

https://nodeauction.42msnsnsfoav6.ap-northeast-2.cs.amazonlightsail.com/swaps?status=pending&offset=0&limit=10

아래와 같은 데이터를 반환합니다😭
여전히 swaps가 보이지 않습니다. 한번 더 확인해주시면 감사하겠습니다.

{
          "totalSwapCount":39,
          "offset":0,
          "limit":10,
          "statusFilter":"pending",
          "addressFilter":null,
          "sellerFilter":null,
          "buyerFilter":null
}

@atoye1
Copy link
Contributor

atoye1 commented Feb 7, 2023

앗 바로 수정해서 올리겠습니다.

@atoye1
Copy link
Contributor

atoye1 commented Feb 7, 2023

오래 기다리셨습니다. 수정하고 배포했습니다.
코드를 리팩토링하다가 뭘 잘못건드려서 버그가 생겼네요ㅜㅜ

@NotoriousHong
Copy link
Collaborator Author

아닙니다 빠른 조치 감사합니다!

@atoye1
Copy link
Contributor

atoye1 commented Feb 7, 2023

두 개의 라우터가 추가되었습니다.
둘 다 로그인상태에서만 호출가능합니다.

GET /users/my/swaps : 나와 관련 있는 모든 스왑의 정보를 응답으로 줍니다.

{
"address": "0x73baecc02919c375ad756de355d89538720d725c",
    "totalSwapCount": 11,
    "swaps": [
        {
            "swapId": 8,
            "contractAddress": "0x39beb4cce2dd17eee785609a1f905c96e0ad6e31",
            "initialAssetPrice": 24000,
            "amountOfAssets": 2,
            "totalAssets": 48000,
            "premium": 96,
            "premiumRate": 2,
            "dropRate": "0.1000",
            "premiumInterval": 2419200,
            "remainPremiumRounds": 1,
            "totalPremiumRounds": 1,
            "sellerDeposit": "4800",
            "buyerDeposit": "288",
            "claimPrice": "21600",
            "liquidationPrice": "21600",
            "status": "active",
            "updatableStatus": null,
            "createdAt": 1675524144,
            "updatedAt": 1675524144,
            "lastPaidAt": null,
            "terminatedAt": null,
            "deletedAt": null,
            "seller": "0x2ef6e388a4f3ad0d3b11773528705d40b9a0d4ff",
            "buyer": "0x73baecc02919c375ad756de355d89538720d725c"
        },
        {
            "swapId": 9,
            "contractAddress": "0x7b7ff84bd9cf3adf547af8d424cb7fc09a689180",
            "initialAssetPrice": 24000,
            "amountOfAssets": 3,
            "totalAssets": 72000,
            "premium": 360,
            "premiumRate": 2,
            "dropRate": "0.2500",
            "premiumInterval": 2419200,
            "remainPremiumRounds": 4,
            "totalPremiumRounds": 4,
            "sellerDeposit": "18000",
            "buyerDeposit": "1080",
            "claimPrice": "18000",
            "liquidationPrice": "18000",
            "status": "inactive",
            "updatableStatus": null,
            "createdAt": 1675524444,
            "updatedAt": 1675560589,
            "lastPaidAt": null,
            "terminatedAt": 1675560589,
            "deletedAt": null,
            "seller": "0x73baecc02919c375ad756de355d89538720d725c",
            "buyer": null
        },
    ]
}

GET /users/my/transactions : 나와 관련있는 모든 스왑의 트랜잭션 정보를 응답으로 줍니다.

응답으로 받은 트랜잭션은 내가 아니라 거래상대방이 발생시킨 트랜잭션일 수 있습니다.

{
    "address": "0x73baecc02919c375ad756de355d89538720d725c",
    "totaltransactionCount": 21,
    "transactions": [
        {
            "txHash": "0xa3a22e42a6996f1f3d61fcdd2443d577a20d8c4b4eaa3301e2bc8e0a2f4d0fb3",
            "blockNum": 53798,
            "event": "AcceptSwap",
            "createdAt": 1675583684,
            "updatedAt": 1675583684,
            "deletedAt": null,
            "swapId": 8
        },
        {
            "txHash": "0xd54a8dc766e2e59a1ffec261429969087b80cce50d502f0c98dc7ac06c59e73e",
            "blockNum": 41890,
            "event": "CreateSwap",
            "createdAt": 1675524144,
            "updatedAt": 1675524144,
            "deletedAt": null,
            "swapId": 8
        },
     ]
}

@atoye1
Copy link
Contributor

atoye1 commented Feb 7, 2023

하는김에 유사한 두 개의 라우터가 더 추가되었습니다.
위의 라우터와 동일하지만 얘들은 로그인하지 않아도 해당 address만 정확하다면 값을 돌려줍니다.
반환값 예시는 위와 동일하므로 생략합니다.

GET /users/:address/swaps
GET /users/:address/transactions

@atoye1
Copy link
Contributor

atoye1 commented Feb 12, 2023

완료되었으므로 닫습니다.

@atoye1 atoye1 closed this as completed Feb 12, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Client Working on Client Server Working on Server
Projects
None yet
Development

No branches or pull requests

2 participants