servant-auth-token-api-0.1.0.0: src/Servant/API/Auth/Token/Pagination.hs
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-|
Module : Servant.API.Auth.Token.Pagination
Description : Helpers for response pagination support.
Copyright : (c) Anton Gushcha, 2016
License : MIT
Maintainer : ncrashed@gmail.com
Stability : experimental
Portability : Portable
-}
module Servant.API.Auth.Token.Pagination(
-- * API types
PageParam
, Page
, PageSizeParam
, PageSize
-- ** Helpers
, PagedList(..)
) where
import Data.Aeson.WithField
import Data.Proxy
import Data.Swagger
import GHC.Generics
import Servant.API
import Servant.API.Auth.Token.Internal.DeriveJson
import Servant.API.Auth.Token.Internal.Schema
import Servant.Docs
-- | Query parameter that carries pagination page number
type PageParam = QueryParam "page" Page
-- | A page number
type Page = Word
-- | Query parameter that carries pagination page size value
type PageSizeParam = QueryParam "size" PageSize
-- | Number of items on a page
type PageSize = Word
instance ToParam PageParam where
toParam _ = DocQueryParam "page" ["0", "42"] "Index of page" Normal
instance ToParam PageSizeParam where
toParam _ = DocQueryParam "size" ["42", "10"] "Number of elements on page" Normal
-- | Collection of 'a' with attached ids of type 'i' and additional
-- page info.
data PagedList i a = PagedList {
pagedListItems :: ![WithId i a] -- ^ Payload
, pagedListPages :: !Word -- ^ Count of available pages
} deriving (Generic, Show)
$(deriveJSON (derivePrefix "pagedList") ''PagedList)
instance (ToSchema i, ToSchema a) => ToSchema (PagedList i a) where
declareNamedSchema = genericDeclareNamedSchema $
schemaOptionsDropPrefix "pagedList"
instance (ToSample i, ToSample a) => ToSample (PagedList i a) where
toSamples _ = samples $ [s $ toSamples (Proxy :: Proxy (WithId i a))]
where
s as = PagedList {
pagedListItems = snd <$> as
, pagedListPages = 1
}