packages feed

cicero-api-0.1.1.3: src/IOHK/Cicero/API/Invocation.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralisedNewtypeDeriving #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE OverloadedStrings #-}
module IOHK.Cicero.API.Invocation where

import Data.Aeson
import Data.UUID as UUID
import Data.Coerce
import Data.Time.LocalTime
import Servant.API
import Servant.API.Generic
import Servant.API.NamedRoutes

import IOHK.Cicero.API.Action

newtype InvocationID = InvocationID { uuid :: UUID } deriving newtype (ToJSON, FromJSON, ToHttpApiData, Eq, Ord)

invocationIdFromString :: String -> Maybe InvocationID
invocationIdFromString = coerce . UUID.fromString

type API = NamedRoutes InvocationRoutes

data InvocationRoutes mode = InvocationRoutes
  { get :: mode :- Capture "id" InvocationID :> Get '[JSON] InvocationV1
  } deriving stock Generic

data InvocationV1 = Invocation
  { id :: !InvocationID
  , actionId :: !ActionID
  , createdAt :: !ZonedTime
  , finishedAt :: !(Maybe ZonedTime)
  }

instance FromJSON InvocationV1 where
  parseJSON = withObject "InvocationV1" \o -> Invocation
    <$> o .: "id"
    <*> o .: "action_id"
    <*> o .: "created_at"
    <*> o .:? "finished_at"

instance ToJSON InvocationV1 where
  toJSON i = object
    [ "id" .= i.id
    , "action_id" .= i.actionId
    , "created_at" .= i.createdAt
    , "finished_at" .= i.finishedAt
    ]
  toEncoding i = pairs
    ( "id" .= i.id
   <> "action_id" .= i.actionId
   <> "created_at" .= i.createdAt
   <> "finished_at" .= i.finishedAt
    )