Skip to content
Snippets Groups Projects

Draft: Servant Api Specification

Open Emily Pillmore requested to merge emily/modular-servant-api into master
Files
6
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeOperators #-}
module Distribution.Skete.Haskell.API.Features.Upload
( -- * Upload Api
UploadApi(..)
, uploadApi
, uploadApiHandlers
, uploadApiServer
-- ** Package upload endpoints
, PostPackagesUploadApi
, postPackagesUploadApi
-- ** Package Maintainer endpoints
, GetPackageMaintainersApi
, getPackageMaintainersApi
, PutPackageMaintainerApi
, putPackageMaintainerApi
, DeletePackageMaintainerApi
, deletePackageMaintainerApi
-- ** Package Trustee endpoints
, GetPackageTrusteesApi
, getPackageTrusteesApi
, PutPackageTrusteeApi
, putPackageTrusteeApi
, DeletePackageTrusteeApi
, deletePackageTrusteeApi
-- ** Package Uploader endpoints
, GetPackageUploadersApi
, getPackageUploadersApi
, PutPackageUploaderApi
, putPackageUploaderApi
, DeletePackageUploaderApi
, deletePackageUploaderApi
) where
-- -------------------------------------------------------------------------- --
-- Users API definition
import Data.Proxy
import Data.Text
import Distribution.Skete.Haskell.API.Types.Users (UserName)
import GHC.Generics
import Servant
import Servant.API.Generic
import Servant.Server.Generic
-- | The Users Hackage api.
--
-- This Api allows Hackage processes to manipulate the user database. Routes
-- are prefixed with "\/users\/".
--
-- State:
--
-- * List of users
-- * Admins
--
data UploadApi route
= UploadApi
{ postPackagesUpload :: route :- PostPackagesUploadApi
, getPackageMaintainers :: route :- GetPackageMaintainersApi
, putPackageMaintainer :: route :- PutPackageMaintainerApi
, deletePackageMaintainer :: route :- DeletePackageMaintainerApi
, getPackageTrustees :: route :- GetPackageTrusteesApi
, putPackageTrustee :: route :- PutPackageTrusteeApi
, deletePackageTrustee :: route :- DeletePackageTrusteeApi
, getPackageUploaders :: route :- GetPackageUploadersApi
, putPackageUploader :: route :- PutPackageUploaderApi
, deletePackageUploader :: route :- DeletePackageUploaderApi
} deriving Generic
-- | Upload Api Handlers.
--
-- TODO: Stubbed in Distribution.Skete.Haskell.API.Features.Upload.Server
--
uploadApiHandlers :: UploadApi AsServer
uploadApiHandlers = UploadApi
{ postPackagesUpload = error "TODO: handler not yet written"
, getPackageMaintainers = error "TODO: handler not yet written"
, putPackageMaintainer = error "TODO: handler not yet written"
, deletePackageMaintainer = error "TODO: handler not yet written"
, getPackageTrustees = error "TODO: handler not yet written"
, putPackageTrustee = error "TODO: handler not yet written"
, deletePackageTrustee = error "TODO: handler not yet written"
, getPackageUploaders = error "TODO: handler not yet written"
, putPackageUploader = error "TODO: handler not yet written"
, deletePackageUploader = error "TODO: handler not yet written"
}
-- | Singleton instance for 'UploadApi'.
--
uploadApi :: Proxy (ToServantApi UploadApi)
uploadApi = genericApi (Proxy :: Proxy UploadApi)
-- | Upload API server instance
--
uploadApiServer :: ToServant UploadApi AsServer
uploadApiServer = genericServer uploadApiHandlers
-- -------------------------------------------------------------------- --
-- POST /packages/
type PostPackagesUploadApi
= Summary "Upload a packages"
:> Description "Upload a package to Hackage Server"
:> "packages"
:> ReqBody '[Text] Text
:> Post '[Text] Text
-- | Singleton instance for 'PostPackagesUploadApi'.
--
postPackagesUploadApi :: Proxy PostPackagesUploadApi
postPackagesUploadApi = Proxy
-- -------------------------------------------------------------------- --
-- GET /packages/:package/maintainers/
type GetPackageMaintainersApi
= Summary "Get a list of package maintainers"
:> Description "Get a list of package maintainers for a Hackage package"
:> "packages"
:> Capture "package"
:> "maintainers"
:> Get '[JSON] [UserName]
-- | Singleton instance for 'GetPackageMaintainersApi'.
--
getPackageMaintainersApi :: Proxy GetPackageMaintainersApi
getPackageMaintainersApi = Proxy
-- -------------------------------------------------------------------- --
-- PUT /packages/:package/maintainers/user/:username
type PutPackageMaintainerApi
= Summary "Add a maintainer"
:> Description "Add a user to the list of maintainers for package"
:> "packages"
:> Capture "package"
:> "maintainers"
:> "user"
:> Capture "username"
:> Put '[JSON] UserName
-- | Singleton instance for 'PutPackageMaintainersApi'.
--
putPackageMaintainerApi :: Proxy PutPackageMaintainerApi
putPackageMaintainerApi = Proxy
-- -------------------------------------------------------------------- --
-- DELETE /packages/:package/maintainers/user/:username
type DeletePackageMaintainerApi
= Summary "Delete a maintainer"
:> Description "Delete a user from the list of maintainers for package"
:> "packages"
:> Capture "package"
:> "maintainers"
:> "user"
:> Capture "username"
:> DeleteNoContent
-- | Singleton instance for 'DeletePackageMaintainersApi'.
--
deletePackageMaintainerApi :: Proxy DeletePackageMaintainerApi
deletePackageMaintainerApi = Proxy
-- -------------------------------------------------------------------- --
-- GET /packages/trustees/
type GetPackageTrusteesApi
= Summary "Get a list of package maintainers"
:> Description "Get a list of Hackage trustees"
:> "packages"
:> "trustees"
:> Get '[JSON] [UserName]
-- | Singleton instance for 'GetPackageTrusteesApi'.
--
getPackageTrusteesApi :: Proxy GetPackageTrusteesApi
getPackageTrusteesApi = Proxy
-- -------------------------------------------------------------------- --
-- PUT /packages/trustees/user/:username
type PutPackageTrusteeApi
= Summary "Add a user to the trustees group"
:> Description "Add a user to the trustees Hackage user group"
:> "packages"
:> "trustees"
:> "user"
:> Capture "username"
:> Put '[JSON] UserName
-- | Singleton instance for 'PutPackageTrusteeApi'.
--
putPackageTrusteeApi :: Proxy PutPackageTrusteeApi
putPackageTrusteeApi = Proxy
-- -------------------------------------------------------------------- --
-- DELETE /packages/trustees/user/:username
type DeletePackageTrusteeApi
= Summary "Add a user to the trustees group"
:> Description "Add a user to the trustees Hackage user group"
:> "packages"
:> "trustees"
:> "user"
:> Capture "username"
:> DeleteNoContent
-- | Singleton instance for 'DeletePackageTrusteeApi'.
--
deletePackageTrusteeApi :: Proxy DeletePackageTrusteeApi
deletePackageTrusteeApi = Proxy
-- -------------------------------------------------------------------- --
-- GET /packages/uploaders
type GetPackageUploadersApi
= Summary "Get a list of package uploaders"
:> Description "Get a list of Hackage package uploaders"
:> "packages"
:> "uploaders"
:> Get '[JSON] [UserName]
-- | Singleton instance for 'GetPackageUploadersApi'.
--
getPackageUploadersApi :: Proxy GetPackageUploadersApi
getPackageUploadersApi = Proxy
-- -------------------------------------------------------------------- --
-- PUT /packages/uploaders/user/:username
type PutPackageUploaderApi
= Summary "Add a user to the uploaders group"
:> Description "Add a Hackage user to the uploaders group"
:> "packages"
:> "uploaders"
:> "user"
:> Capture "username"
:> Put '[JSON] UserName
-- | Singleton instance for 'PutPackageUploaderApi'.
--
putPackageUploaderApi :: Proxy PutPackageUploaderApi
putPackageUploaderApi = Proxy
-- -------------------------------------------------------------------- --
-- DELETE /packages/uploaders/user/:username
type DeletePackageUploaderApi
= Summary "Add a user to the uploaders group"
:> Description "Add a Hackage user to the uploaders group"
:> "packages"
:> "uploaders"
:> "user"
:> Capture "username"
:> DeleteNoContent
-- | Singleton instance for 'DeletePackageUploaderApi'.
--
deletePackageUploaderApi :: Proxy DeletePackageUploaderApi
deletePackageUploaderApi = Proxy
Loading