{-# 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
{ TrackData -> Text
event :: Text
, TrackData -> Properties
properties :: Properties
} deriving ((forall x. TrackData -> Rep TrackData x)
-> (forall x. Rep TrackData x -> TrackData) -> Generic TrackData
forall x. Rep TrackData x -> TrackData
forall x. TrackData -> Rep TrackData x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep TrackData x -> TrackData
$cfrom :: forall x. TrackData -> Rep TrackData x
Generic, [TrackData] -> Encoding
[TrackData] -> Value
TrackData -> Encoding
TrackData -> Value
(TrackData -> Value)
-> (TrackData -> Encoding)
-> ([TrackData] -> Value)
-> ([TrackData] -> Encoding)
-> ToJSON TrackData
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [TrackData] -> Encoding
$ctoEncodingList :: [TrackData] -> Encoding
toJSONList :: [TrackData] -> Value
$ctoJSONList :: [TrackData] -> Value
toEncoding :: TrackData -> Encoding
$ctoEncoding :: TrackData -> Encoding
toJSON :: TrackData -> Value
$ctoJSON :: TrackData -> Value
ToJSON)
instance ToHttpApiData TrackData where
toUrlPiece :: TrackData -> Text
toUrlPiece = ByteString -> Text
forall a b. StringConv a b => a -> b
toS (ByteString -> Text)
-> (TrackData -> ByteString) -> TrackData -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
B64.encode (ByteString -> ByteString)
-> (TrackData -> ByteString) -> TrackData -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TrackData -> ByteString
forall a. ToJSON a => a -> ByteString
encode
data Properties = Properties
{ Properties -> AuthToken
token :: AuthToken
, Properties -> Maybe Text
distinctId :: Maybe Text
, Properties -> Maybe POSIXTime
time :: Maybe POSIXTime
, Properties -> Maybe Text
ip :: Maybe Text
, :: Object
}
instance ToJSON Properties where
toJSON :: Properties -> Value
toJSON Properties{Maybe Text
Maybe POSIXTime
Object
AuthToken
extraProperties :: Object
ip :: Maybe Text
time :: Maybe POSIXTime
distinctId :: Maybe Text
token :: AuthToken
extraProperties :: Properties -> Object
ip :: Properties -> Maybe Text
time :: Properties -> Maybe POSIXTime
distinctId :: Properties -> Maybe Text
token :: Properties -> AuthToken
..} = Object -> Value
Object (Object -> Value) -> Object -> Value
forall a b. (a -> b) -> a -> b
$ Object
extraProperties Object -> Object -> Object
forall a. Semigroup a => a -> a -> a
<> [Item Object] -> Object
forall l. IsList l => [Item l] -> l
fromList
[ Text
"token" Text -> AuthToken -> (Text, Value)
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= AuthToken
token
, Text
"distinct_id" Text -> Maybe Text -> (Text, Value)
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
distinctId
, Text
"time" Text -> Maybe POSIXTime -> (Text, Value)
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe POSIXTime
time
, Text
"ip" Text -> Maybe Text -> (Text, Value)
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Maybe Text
ip
]
mkProperties :: AuthToken -> Object -> Properties
mkProperties :: AuthToken -> Object -> Properties
mkProperties AuthToken
token Object
obj = Properties :: AuthToken
-> Maybe Text
-> Maybe POSIXTime
-> Maybe Text
-> Object
-> Properties
Properties
{ token :: AuthToken
token = AuthToken
token
, distinctId :: Maybe Text
distinctId = Maybe Text
forall a. Maybe a
Nothing
, time :: Maybe POSIXTime
time = Maybe POSIXTime
forall a. Maybe a
Nothing
, ip :: Maybe Text
ip = Maybe Text
forall a. Maybe a
Nothing
, extraProperties :: Object
extraProperties = Object
obj
}