{-# LANGUAGE DuplicateRecordFields #-}

-- | Servant REST API for Arbiter: queue operations and remote job consumers. See
-- 'ArbiterAPI' for the route tree.
--
-- = Quick Start
--
-- @
-- import Arbiter.Servant
-- import Arbiter.Simple (createSimpleEnv, runSimpleDb)
-- import Data.Proxy (Proxy(..))
--
-- main :: IO ()
-- main = do
--   -- Run migrations with event streaming enabled before starting the server.
--   -- The server runs over any backend env.
--   env <- createSimpleEnv (Proxy \@MyRegistry) connStr "arbiter"
--   config <- createArbiterServer (runSimpleDb env)
--
--   -- Start API server on port 8080
--   runArbiterAPI 8080 config
-- @
module Arbiter.Servant
  ( -- * Registry
    QueueSpec (..)
  , Queue

    -- * Server
  , arbiterServer
  , arbiterServerHoisted
  , arbiterApp
  , runArbiterAPI
  , ArbiterServerConfig (..)
  , createArbiterServer
  , defaultStatsCacheTtl
  , defaultMaintenanceInterval
  , defaultMaintenanceBucketIdle
  , defaultMaintenanceSparseInterval
  , defaultMaintenanceTimeout
  , BuildServer (..)
  , CacheCell

    -- * API types
  , ArbiterAPI
  , RegistryToAPI
  , TableAPI (..)
  , SharedAPI
  , PayloadEditNote
  , LeaseRefusal
  , Throws'
  , Throws
  , ThrowsBody
  , EventsAPI
  , QueuesAPI (..)
  , JobsAPI (..)
  , DLQAPI (..)
  , ArchiveAPI (..)
  , StatsAPI (..)
  , MaintenanceAPI (..)
  , CronAPI (..)
  , WorkersAPI (..)
  , HealthAPI (..)
  , RateLimitsAPI (..)
  , ConcurrencyAPI (..)
  , JobSortColumn (..)
  , DLQSortColumn (..)
  , ArchiveSortColumn (..)
  , SortDir (..)

    -- * Request and response types
  , module Arbiter.Servant.Types
  ) where

import Arbiter.Core.QueueRegistry (Queue, QueueSpec (..))

import Arbiter.Servant.API
import Arbiter.Servant.Server
import Arbiter.Servant.Types