module Patrol.Type.Event
  ( Event(..)
  , new
  ) where

import qualified Control.Monad.IO.Class as IO
import qualified Data.Aeson as Aeson
import qualified Data.Map as Map
import qualified Data.Maybe as Maybe
import qualified Data.Text as Text
import qualified Data.Time as Time
import qualified Data.UUID.V4 as Uuid
import qualified Patrol.Type.EventId as EventId
import qualified Patrol.Type.Exception as Exception
import qualified Patrol.Type.Level as Level
import qualified Patrol.Type.Platform as Platform
import qualified Patrol.Type.Request as Request
import qualified Patrol.Type.Timestamp as Timestamp
import qualified Patrol.Type.User as User
import qualified Patrol.Utility.Json as Json

-- | <https://develop.sentry.dev/sdk/event-payloads/>
data Event = Event
  { Event -> Maybe Text
dist :: Maybe Text.Text
  , Event -> Maybe Text
environment :: Maybe Text.Text
  , Event -> EventId
eventId :: EventId.EventId
  , Event -> Maybe [Exception]
exception :: Maybe [Exception.Exception]
  , Event -> Maybe Object
extra :: Maybe Aeson.Object
  , Event -> Maybe [Text]
fingerprint :: Maybe [Text.Text]
  , Event -> Maybe Level
level :: Maybe Level.Level
  , Event -> Maybe Text
logger :: Maybe Text.Text
  , Event -> Maybe (Map Text Text)
modules :: Maybe (Map.Map Text.Text Text.Text)
  , Event -> Platform
platform :: Platform.Platform
  , Event -> Maybe Text
release :: Maybe Text.Text
  , Event -> Maybe Request
request :: Maybe Request.Request
  , Event -> Maybe Text
serverName :: Maybe Text.Text
  , Event -> Maybe (Map Text Text)
tags :: Maybe (Map.Map Text.Text Text.Text)
  , Event -> Timestamp
timestamp :: Timestamp.Timestamp
  , Event -> Maybe Text
transaction :: Maybe Text.Text
  , Event -> Maybe User
user :: Maybe User.User
  } deriving (Event -> Event -> Bool
(Event -> Event -> Bool) -> (Event -> Event -> Bool) -> Eq Event
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Event -> Event -> Bool
$c/= :: Event -> Event -> Bool
== :: Event -> Event -> Bool
$c== :: Event -> Event -> Bool
Eq, Int -> Event -> ShowS
[Event] -> ShowS
Event -> String
(Int -> Event -> ShowS)
-> (Event -> String) -> ([Event] -> ShowS) -> Show Event
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Event] -> ShowS
$cshowList :: [Event] -> ShowS
show :: Event -> String
$cshow :: Event -> String
showsPrec :: Int -> Event -> ShowS
$cshowsPrec :: Int -> Event -> ShowS
Show)

instance Aeson.ToJSON Event where
  toJSON :: Event -> Value
toJSON Event
event = [Pair] -> Value
Aeson.object ([Pair] -> Value) -> [Pair] -> Value
forall a b. (a -> b) -> a -> b
$ [Maybe Pair] -> [Pair]
forall a. [Maybe a] -> [a]
Maybe.catMaybes
    [ String -> Text -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"dist" (Text -> Pair) -> Maybe Text -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe Text
dist Event
event
    , String -> Text -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"environment" (Text -> Pair) -> Maybe Text -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe Text
environment Event
event
    , Pair -> Maybe Pair
forall a. a -> Maybe a
Just (Pair -> Maybe Pair) -> (EventId -> Pair) -> EventId -> Maybe Pair
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> EventId -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"event_id" (EventId -> Maybe Pair) -> EventId -> Maybe Pair
forall a b. (a -> b) -> a -> b
$ Event -> EventId
eventId Event
event
    , String -> Object -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"extra" (Object -> Pair) -> Maybe Object -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe Object
extra Event
event
    , String -> Value -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"exception" (Value -> Pair) -> ([Exception] -> Value) -> [Exception] -> Pair
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Pair] -> Value
Aeson.object ([Pair] -> Value)
-> ([Exception] -> [Pair]) -> [Exception] -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pair -> [Pair]
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Pair -> [Pair]) -> ([Exception] -> Pair) -> [Exception] -> [Pair]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [Exception] -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"values" ([Exception] -> Pair) -> Maybe [Exception] -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe [Exception]
exception Event
event
    , String -> [Text] -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"fingerprint" ([Text] -> Pair) -> Maybe [Text] -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe [Text]
fingerprint Event
event
    , String -> Level -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"level" (Level -> Pair) -> Maybe Level -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe Level
level Event
event
    , String -> Text -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"logger" (Text -> Pair) -> Maybe Text -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe Text
logger Event
event
    , String -> Map Text Text -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"modules" (Map Text Text -> Pair) -> Maybe (Map Text Text) -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe (Map Text Text)
modules Event
event
    , Pair -> Maybe Pair
forall a. a -> Maybe a
Just (Pair -> Maybe Pair)
-> (Platform -> Pair) -> Platform -> Maybe Pair
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Platform -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"platform" (Platform -> Maybe Pair) -> Platform -> Maybe Pair
forall a b. (a -> b) -> a -> b
$ Event -> Platform
platform Event
event
    , String -> Text -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"release" (Text -> Pair) -> Maybe Text -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe Text
release Event
event
    , String -> Request -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"request" (Request -> Pair) -> Maybe Request -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe Request
request Event
event
    , String -> Text -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"server_name" (Text -> Pair) -> Maybe Text -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe Text
serverName Event
event
    , String -> Map Text Text -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"tags" (Map Text Text -> Pair) -> Maybe (Map Text Text) -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe (Map Text Text)
tags Event
event
    , Pair -> Maybe Pair
forall a. a -> Maybe a
Just (Pair -> Maybe Pair)
-> (Timestamp -> Pair) -> Timestamp -> Maybe Pair
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Timestamp -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"timestamp" (Timestamp -> Maybe Pair) -> Timestamp -> Maybe Pair
forall a b. (a -> b) -> a -> b
$ Event -> Timestamp
timestamp Event
event
    , String -> Text -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"transaction" (Text -> Pair) -> Maybe Text -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe Text
transaction Event
event
    , String -> User -> Pair
forall value pair.
(ToJSON value, KeyValue pair) =>
String -> value -> pair
Json.pair String
"user" (User -> Pair) -> Maybe User -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event -> Maybe User
user Event
event
    ]

new :: IO.MonadIO io => io Event
new :: io Event
new = IO Event -> io Event
forall (m :: * -> *) a. MonadIO m => IO a -> m a
IO.liftIO (IO Event -> io Event) -> IO Event -> io Event
forall a b. (a -> b) -> a -> b
$ do
  EventId
eventId <- UUID -> EventId
EventId.fromUuid (UUID -> EventId) -> IO UUID -> IO EventId
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO UUID
Uuid.nextRandom
  Timestamp
timestamp <- UTCTime -> Timestamp
Timestamp.fromUtcTime (UTCTime -> Timestamp) -> IO UTCTime -> IO Timestamp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO UTCTime
Time.getCurrentTime
  Event -> IO Event
forall (f :: * -> *) a. Applicative f => a -> f a
pure Event :: Maybe Text
-> Maybe Text
-> EventId
-> Maybe [Exception]
-> Maybe Object
-> Maybe [Text]
-> Maybe Level
-> Maybe Text
-> Maybe (Map Text Text)
-> Platform
-> Maybe Text
-> Maybe Request
-> Maybe Text
-> Maybe (Map Text Text)
-> Timestamp
-> Maybe Text
-> Maybe User
-> Event
Event
    { dist :: Maybe Text
dist = Maybe Text
forall a. Maybe a
Nothing
    , environment :: Maybe Text
environment = Maybe Text
forall a. Maybe a
Nothing
    , EventId
eventId :: EventId
eventId :: EventId
eventId
    , exception :: Maybe [Exception]
exception = Maybe [Exception]
forall a. Maybe a
Nothing
    , extra :: Maybe Object
extra = Maybe Object
forall a. Maybe a
Nothing
    , fingerprint :: Maybe [Text]
fingerprint = Maybe [Text]
forall a. Maybe a
Nothing
    , level :: Maybe Level
level = Maybe Level
forall a. Maybe a
Nothing
    , logger :: Maybe Text
logger = Maybe Text
forall a. Maybe a
Nothing
    , modules :: Maybe (Map Text Text)
modules = Maybe (Map Text Text)
forall a. Maybe a
Nothing
    , platform :: Platform
platform = Platform
Platform.Haskell
    , release :: Maybe Text
release = Maybe Text
forall a. Maybe a
Nothing
    , request :: Maybe Request
request = Maybe Request
forall a. Maybe a
Nothing
    , serverName :: Maybe Text
serverName = Maybe Text
forall a. Maybe a
Nothing
    , tags :: Maybe (Map Text Text)
tags = Maybe (Map Text Text)
forall a. Maybe a
Nothing
    , Timestamp
timestamp :: Timestamp
timestamp :: Timestamp
timestamp
    , transaction :: Maybe Text
transaction = Maybe Text
forall a. Maybe a
Nothing
    , user :: Maybe User
user = Maybe User
forall a. Maybe a
Nothing
    }