{-# LANGUAGE ExistentialQuantification #-} module MixPanel.Types.TrackData ( TrackData(..) , Properties , mkProperties ) where import Data.Aeson ( ToJSON , toJSON , encode , Value(..) , Object , (.=) ) import Data.Text ( Text ) import qualified Data.ByteString.Base64.Lazy as B64 import Data.Time.Clock.POSIX ( POSIXTime ) import GHC.Exts ( fromList ) import GHC.Generics ( Generic ) import Servant.API import Data.String.Conv ( toS ) import MixPanel.Types.Core ( AuthToken ) data TrackData = TrackData { event :: Text , properties :: Properties } deriving (Generic, ToJSON) instance ToHttpApiData TrackData where toUrlPiece = toS . B64.encode . encode data Properties = Properties { token :: AuthToken , distinctId :: Maybe Text , time :: Maybe POSIXTime , ip :: Maybe Text , extraProperties :: Object } instance ToJSON Properties where toJSON Properties{..} = Object $ extraProperties <> fromList [ "token" .= token , "distinct_id" .= distinctId , "time" .= time , "ip" .= ip ] mkProperties :: AuthToken -> Object -> Properties mkProperties token obj = Properties { token = token , distinctId = Nothing , time = Nothing , ip = Nothing , extraProperties = obj }