packages feed

kitchen-sink-0.2.0.0: src/KitchenSink/Engine/Api.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}

module KitchenSink.Engine.Api where

import Data.Aeson (ToJSON)
import GHC.Generics (Generic)
import Prod.Status qualified as Prod
import Servant

import KitchenSink.Engine.Track (WatchResult)
import KitchenSink.Prelude
import Prod.Proxy qualified as ProdProxy

type DevApi =
    DevWatchApi
        :<|> DevListTargetsApi
        :<|> DevProduceApi
        :<|> DevPublishApi
        :<|> DevForceReloadApi
        :<|> ProxyApi
        :<|> OnTheFlyProductionApi

type ServeApi =
    ProxyApi
        :<|> OnTheFlyProductionApi

type TargetPathName = Text

type DevWatchApi = "dev" :> "watch" :> QueryParam "server-id" Text :> QueryParam "pathname" TargetPathName :> Get '[JSON] (Prod.Identification, WatchResult)

type DevListTargetsApi = "dev" :> "targets" :> Get '[JSON] [Text]

newtype DevTextOutput = DevTextOutput Text
    deriving (Generic, Show)
instance ToJSON DevTextOutput

type DevProduceApi = "dev" :> "produce" :> Post '[JSON] DevTextOutput

type DevPublishApi = "dev" :> "publish" :> Post '[JSON] DevTextOutput

data ForceReloadStatus = ForceReloaded
    deriving (Generic, Show)
instance ToJSON ForceReloadStatus

type DevForceReloadApi = "dev" :> "reload" :> Post '[JSON] (Maybe ForceReloadStatus)

type ProxyApi = "api" :> ProdProxy.Api

type OnTheFlyProductionApi = Raw