#!/usr/bin/env stack {- stack --nix --resolver lts-10.3 --install-ghc script --package http-types --package yesod --package yesod-core --package text --package aeson -} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE ScopedTypeVariables #-} import Data.Semigroup import GHC.Generics import Control.Monad import Data.Maybe (isJust) import Data.Text import Yesod import Network.HTTP.Types.Status (status400, status200) import Data.Aeson data App = App mkYesod "App" [parseRoutes| /query QueryR GET /number NumberR POST |] -- | Start a simple warp server on 3000 main :: IO () main = warp 3000 App -- | Initiate Yesod. The default method instances are fine for a prototype or -- demo app. instance Yesod App -- | A type to describe the shape of our core model data Caller = Caller { name :: Text , number :: Text , context :: Text } deriving (Show, Eq, Generic, ToJSON, FromJSON) -- | Standardize errors. data ApiError = ApiError { msg :: Text } deriving (Show, Eq, Generic, ToJSON, FromJSON) -- FIXME findByNumber = id getQueryR :: Handler RepJson getQueryR = do qm <- lookupGetParam "number" case qm of Nothing -> sendStatusJSON status400 $ (ApiError "Invalid request. Could not parse 'number' parameter.") Just q -> sendStatusJSON status200 $ object [ "msg" .= ("FIXME" :: Text) ] postNumberR :: Handler RepJson postNumberR = do (obj :: Result Value) <- parseJsonBody case obj of Error err -> sendStatusJSON status400 $ ApiError $ "Invalid request. Could not parse JSON body: " <> pack err Success v -> sendStatusJSON status200 $ object [ "msg" .= ("FIXME" :: Text) ]