From 27aa85352e91e6eda5adb0e9a1896da8efd1fa21 Mon Sep 17 00:00:00 2001 From: jankun4 Date: Sun, 21 Apr 2024 20:18:22 +0200 Subject: [PATCH] [#756] add pagination to drep/list Signed-off-by: jankun4 --- CHANGELOG.md | 1 + govtool/backend/src/VVA/API.hs | 26 ++++++++++++++++---- govtool/backend/src/VVA/API/Types.hs | 36 ++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 122798219..57824e9fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ changes. ### Added +- added pagination to `drep/list` [Issue 756](https://github.com/IntersectMBO/govtool/issues/756) - added search query param to the `drep/getVotes` [Issue 640](https://github.com/IntersectMBO/govtool/issues/640) - added filtering and sorting capabilities to the `drep/list` [Issue 722](https://github.com/IntersectMBO/govtool/issues/722) - added drepView and txHash to the `ada-holder/get-current-delegation` [Issue 689](https://github.com/IntersectMBO/govtool/issues/689) diff --git a/govtool/backend/src/VVA/API.hs b/govtool/backend/src/VVA/API.hs index 08789bbbf..d982c61dd 100644 --- a/govtool/backend/src/VVA/API.hs +++ b/govtool/backend/src/VVA/API.hs @@ -47,7 +47,9 @@ type VVAApi = :> QueryParam "search" Text :> QueryParams "status" DRepStatus :> QueryParam "sort" DRepSortMode - :> Get '[JSON] [DRep] + :> QueryParam "page" Natural + :> QueryParam "pageSize" Natural + :> Get '[JSON] ListDRepsResponse :<|> "drep" :> "get-voting-power" :> Capture "drepId" HexText :> Get '[JSON] Integer :<|> "drep" :> "getVotes" :> Capture "drepId" HexText @@ -120,8 +122,8 @@ delegationToResponse Types.Delegation {..} = } -drepList :: App m => Maybe Text -> [DRepStatus] -> Maybe DRepSortMode -> m [DRep] -drepList mSearchQuery statuses mSortMode = do +drepList :: App m => Maybe Text -> [DRepStatus] -> Maybe DRepSortMode -> Maybe Natural -> Maybe Natural -> m ListDRepsResponse +drepList mSearchQuery statuses mSortMode mPage mPageSize = do CacheEnv {dRepListCache} <- asks vvaCache dreps <- cacheRequest dRepListCache () DRep.listDReps @@ -148,7 +150,23 @@ drepList mSearchQuery statuses mSortMode = do dRepRegistrationStatus - return $ map drepRegistrationToDrep $ sortDReps $ filterDRepsByQuery $ filterDRepsByStatus dreps + let allValidDReps = map drepRegistrationToDrep $ sortDReps $ filterDRepsByQuery $ filterDRepsByStatus dreps + + + let page = (fromIntegral $ fromMaybe 0 mPage) :: Int + pageSize = (fromIntegral $ fromMaybe 10 mPageSize) :: Int + + total = length allValidDReps :: Int + + let elements = take pageSize $ drop (page * pageSize) allValidDReps + + return $ ListDRepsResponse + { listDRepsResponsePage = fromIntegral page + , listDRepsResponsePageSize = fromIntegral pageSize + , listDRepsResponseTotal = fromIntegral total + , listDRepsResponseElements = elements + } + getVotingPower :: App m => HexText -> m Integer getVotingPower (unHexText -> dRepId) = do diff --git a/govtool/backend/src/VVA/API/Types.hs b/govtool/backend/src/VVA/API/Types.hs index 4462f5a82..e911afa35 100644 --- a/govtool/backend/src/VVA/API/Types.hs +++ b/govtool/backend/src/VVA/API/Types.hs @@ -750,6 +750,42 @@ instance ToSchema DRep where & example ?~ toJSON exampleDrep + +exampleListDRepsResponse :: Text +exampleListDRepsResponse = + "{ \"page\": 0," + <> "\"pageSize\": 1," + <> "\"total\": 1000," + <> "\"elements\": [" + <> exampleDrep <> "]}" + +data ListDRepsResponse + = ListDRepsResponse + { listDRepsResponsePage :: Integer + , listDRepsResponsePageSize :: Integer + , listDRepsResponseTotal :: Integer + , listDRepsResponseElements :: [DRep] + } + deriving (Generic, Show) + +deriveJSON (jsonOptions "listDRepsResponse") ''ListDRepsResponse + +instance ToSchema ListDRepsResponse where + declareNamedSchema proxy = do + NamedSchema name_ schema_ <- + genericDeclareNamedSchema + ( fromAesonOptions $ + jsonOptions "listDRepsResponse" + ) + proxy + return $ + NamedSchema name_ $ + schema_ + & description ?~ "ListProposalsResponse" + & example + ?~ toJSON exampleListDRepsResponse + + data DelegationResponse = DelegationResponse { delegationResponseDRepHash :: Maybe HexText