# Webapp-Example: MyService/Types.hs

Anleitung siehe Webapp-Development in Haskell.

    {-# OPTIONS_GHC -Wno-orphans #-}
    {-# OPTIONS_GHC -Wno-name-shadowing #-}
    {-# LANGUAGE DeriveAnyClass        #-}
    {-# LANGUAGE DeriveFunctor         #-}
    {-# LANGUAGE DeriveGeneric         #-}
    {-# LANGUAGE DerivingVia           #-}
    {-# LANGUAGE DuplicateRecordFields #-}
    {-# LANGUAGE FlexibleContexts      #-}
    {-# LANGUAGE FlexibleInstances     #-}
    {-# LANGUAGE GADTs                 #-}
    {-# LANGUAGE LambdaCase            #-}
    {-# LANGUAGE MultiParamTypeClasses #-}
    {-# LANGUAGE OverloadedStrings     #-}
    {-# LANGUAGE RankNTypes            #-}
    {-# LANGUAGE RecordWildCards       #-}
    module MyService.Types where

    import           Data.Aeson                     (FromJSON, ToJSON)
    import           Data.Text
    import           Data.Time.Clock
    import           GHC.Generics
    import           System.Envy
    import           Text.PrettyPrint               (text)
    import           Text.PrettyPrint.GenericPretty

    -- Out hat hierfür keine Instanzen, daher kurz eine einfach Definition.
    instance Out Text where
      doc = text . unpack
      docPrec i a = text $ showsPrec i a ""

    instance Out UTCTime where
      doc = text . show
      docPrec i a = text $ showsPrec i a ""

    -- Der ServerConfig-Typ. Wird mit den defaults unten initialisiert, dann mit den Variablen aus der .env-Datei überschrieben und zum Schluss können Serveradmins diese via $MYSERVICE_FOO nochmal überschreiben.
    data ServerConfig = ServerConfig
                      { myserviceHost              :: String -- ^ Environment: $MYSERVICE_HOST
                      , myservicePort              :: Int    -- ^ Environment: $MYSERVICE_PORT
                      , myserviceMaxTimeout        :: Int    -- ^ Environment: $MYSERVICE_MAX_TIMEOUT
                      , myserviceInternalProxyUrl  :: String -- ^ Environment: $MYSERVICE_INTERNAL_PROXY_URL
                      , myserviceInternalProxyPort :: Int    -- ^ Environment: $MYSERVICE_INTERNAL_PROXY_PORT
                      , myserviceExternalProxyUrl  :: String -- ^ Environment: $MYSERVICE_EXTERNAL_PROXY_URL
                      , myserviceExternalProxyPort :: Int    -- ^ Environment: $MYSERVICE_EXTERNAL_PROXY_PORT
                      , myserviceActivemqHost      :: String -- ^ Environment: $MYSERVICE_ACTIVEMQ_HOST
                      , myserviceActivemqPort      :: Int    -- ^ Environment: $MYSERVICE_ACTIVEMQ_PORT
                      , myserviceActivemqUsername  :: String -- ^ Environment: $MYSERVICE_ACTIVEMQ_USERNAME
                      , myserviceActivemqPassword  :: String -- ^ Environment: $MYSERVICE_ACTIVEMQ_PASSWORD
                      , myserviceMongoUsername     :: String -- ^ Environment: $MYSERVICE_MONGO_USERNAME
                      , myserviceMongoPassword     :: String -- ^ Environment: $MYSERVICE_MONGO_PASSWORD
                      , myserviceDebug             :: Bool   -- ^ Environment: $MYSERVICE_DEBUG
                      } deriving (Show, Eq, Generic)

    -- Default-Konfigurations-Instanz für diesen Service.
    instance DefConfig ServerConfig where
      defConfig = ServerConfig "0.0.0.0" 8080 20
                               ""
                               ""
                               ""
                               0
                               ""
                               0
                               ""
                               0
                               ""
                               ""
                               ""
                               ""
                               False

    -- Kann auch aus dem ENV gefüllt werden
    instance FromEnv ServerConfig
    -- Und hübsch ausgegeben werden.
    instance Out ServerConfig

    instance Out Response
    instance FromBSON Repsonse -- FromBSON-Instanz geht immer davon aus, dass alle keys da sind (ggf. mit null bei Nothing).

Links to this page

- Webapp-Development in Haskell

  Webapp-Example: MyService/Types.hs