packages feed

hercules-ci-api-0.6.0.0: src/Hercules/API/State.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Hercules.API.State where

import Data.ByteString (ByteString)
import Data.Swagger (NamedSchema (NamedSchema), binarySchema)
import Data.Swagger.Schema (ToSchema (..))
import Hercules.API.Prelude
import Hercules.API.Projects.Project (Project)
import Hercules.API.State.ProjectState (ProjectState)
import Servant.API
import Servant.API.Generic

-- | A newtype wrapper for servant-swagger
newtype RawBytes = RawBytes {fromRawBytes :: ByteString}
  deriving newtype (MimeUnrender OctetStream, MimeRender OctetStream)

instance ToSchema RawBytes where
  declareNamedSchema _ = pure $ NamedSchema (Just "RawBytes") binarySchema

type ContentLength = Header "Content-Length" Integer

type ContentDisposition = Header "Content-Disposition" Text

data StateAPI auth f = StateAPI
  { putProjectStateData ::
      f
        :- Summary "Upload a state file"
        :> "projects"
        :> Capture' '[Required, Strict] "projectId" (Id Project)
        :> "state"
        :> Capture' '[Required, Strict] "stateName" Text
        :> "data"
        :> StreamBody NoFraming OctetStream (SourceIO RawBytes)
        :> auth
        :> Put '[JSON] NoContent,
    getProjectStates ::
      f
        :- Summary "List all state files"
        :> "projects"
        :> Capture' '[Required, Strict] "projectId" (Id Project)
        :> "states"
        :> auth
        :> Get '[JSON] ProjectState,
    getProjectStateData ::
      f
        :- Summary "Download a state file"
        :> "projects"
        :> Capture' '[Required, Strict] "projectId" (Id Project)
        :> "state"
        :> Capture' '[Required, Strict] "stateName" Text
        :> "data"
        :> auth
        :> StreamGet NoFraming OctetStream (Headers '[ContentLength, ContentDisposition] (SourceIO RawBytes))
  }
  deriving (Generic)