{-# LANGUAGE OverloadedStrings #-}

module Lib
    ( someFunc
    )
where

import Data.Maybe (fromMaybe)
import Data.UUID (fromString)
import Database (getConnection, migrate)
import Docs (logMessage)
import qualified Docs
import Docs.ExampleDoc (exampleTree)
import Docs.Hasql.Database (run, runTransaction)
import Logging.Logs (Severity (Error, Info))
import qualified Logging.Scope as Scope
import Mail (testMail)
import Server

someFunc :: IO ()
someFunc :: IO ()
someFunc = do
    Right Connection
connection <- IO (Either ConnectionError Connection)
getConnection
    Right [Maybe MigrationError]
_ <- Connection -> IO (Either SessionError [Maybe MigrationError])
migrate Connection
connection
    Right LogMessage
_ <-
        (HasqlSession LogMessage
 -> Connection -> IO (Either SessionError LogMessage))
-> Connection
-> HasqlSession LogMessage
-> IO (Either SessionError LogMessage)
forall a b c. (a -> b -> c) -> b -> a -> c
flip HasqlSession LogMessage
-> Connection -> IO (Either SessionError LogMessage)
forall a.
HasqlSession a -> Connection -> IO (Either SessionError a)
run Connection
connection (HasqlSession LogMessage -> IO (Either SessionError LogMessage))
-> HasqlSession LogMessage -> IO (Either SessionError LogMessage)
forall a b. (a -> b) -> a -> b
$
            Severity
-> Maybe UserID -> Scope -> String -> HasqlSession LogMessage
forall (m :: * -> *) v.
(HasLogMessage m, ToJSON v) =>
Severity -> Maybe UserID -> Scope -> v -> m LogMessage
logMessage Severity
Info Maybe UserID
forall a. Maybe a
Nothing Scope
Scope.server (String
"Starting Server..." :: String)
    -- Datenbank zumüllen :))
    IO ()
testMail
    let userID :: UserID
userID = UserID -> Maybe UserID -> UserID
forall a. a -> Maybe a -> a
fromMaybe UserID
forall a. HasCallStack => a
undefined (Maybe UserID -> UserID) -> Maybe UserID -> UserID
forall a b. (a -> b) -> a -> b
$ String -> Maybe UserID
fromString String
"7f59659a-9a46-4ba0-a911-09698107a6ea"
    let groupID :: GroupID
groupID = GroupID
1
    let title :: Text
title = Text
"Test Document"
    Either
  SessionError (Result (FullDocument (Rendered TextElementRevision)))
result <-
        (HasqlTransaction
   (Result (FullDocument (Rendered TextElementRevision)))
 -> Connection
 -> IO
      (Either
         SessionError
         (Result (FullDocument (Rendered TextElementRevision)))))
-> Connection
-> HasqlTransaction
     (Result (FullDocument (Rendered TextElementRevision)))
-> IO
     (Either
        SessionError
        (Result (FullDocument (Rendered TextElementRevision))))
forall a b c. (a -> b -> c) -> b -> a -> c
flip
            HasqlTransaction
  (Result (FullDocument (Rendered TextElementRevision)))
-> Connection
-> IO
     (Either
        SessionError
        (Result (FullDocument (Rendered TextElementRevision))))
forall a.
HasqlTransaction a -> Connection -> IO (Either SessionError a)
runTransaction
            Connection
connection
            (HasqlTransaction
   (Result (FullDocument (Rendered TextElementRevision)))
 -> IO
      (Either
         SessionError
         (Result (FullDocument (Rendered TextElementRevision)))))
-> HasqlTransaction
     (Result (FullDocument (Rendered TextElementRevision)))
-> IO
     (Either
        SessionError
        (Result (FullDocument (Rendered TextElementRevision))))
forall a b. (a -> b) -> a -> b
$ UserID
-> GroupID
-> Text
-> FlaggedInputTree'
-> HasqlTransaction
     (Result (FullDocument (Rendered TextElementRevision)))
forall (m :: * -> *).
(HasCreateDocument m, HasLogMessage m, HasCreateTextElement m,
 HasCreateTextRevision m, HasGetTextElementRevision m,
 HasExistsComment m, HasCreateTreeRevision m, HasGetTreeRevision m,
 HasGetRevisionKey m, HasGetDocument m, HasRollback m,
 HasDraftTextRevision m) =>
UserID
-> GroupID
-> Text
-> FlaggedInputTree'
-> m (Result (FullDocument (Rendered TextElementRevision)))
Docs.newDefaultDocument
                UserID
userID
                GroupID
groupID
                Text
title
                FlaggedInputTree'
exampleTree

    Either SessionError LogMessage
_ <- case Either
  SessionError (Result (FullDocument (Rendered TextElementRevision)))
result of
        Left SessionError
err ->
            (HasqlSession LogMessage
 -> Connection -> IO (Either SessionError LogMessage))
-> Connection
-> HasqlSession LogMessage
-> IO (Either SessionError LogMessage)
forall a b c. (a -> b -> c) -> b -> a -> c
flip HasqlSession LogMessage
-> Connection -> IO (Either SessionError LogMessage)
forall a.
HasqlSession a -> Connection -> IO (Either SessionError a)
run Connection
connection (HasqlSession LogMessage -> IO (Either SessionError LogMessage))
-> HasqlSession LogMessage -> IO (Either SessionError LogMessage)
forall a b. (a -> b) -> a -> b
$
                Severity
-> Maybe UserID -> Scope -> String -> HasqlSession LogMessage
forall (m :: * -> *) v.
(HasLogMessage m, ToJSON v) =>
Severity -> Maybe UserID -> Scope -> v -> m LogMessage
logMessage Severity
Error Maybe UserID
forall a. Maybe a
Nothing Scope
Scope.server (String -> HasqlSession LogMessage)
-> String -> HasqlSession LogMessage
forall a b. (a -> b) -> a -> b
$
                    SessionError -> String
forall a. Show a => a -> String
show SessionError
err
        Right (Left Error
err) ->
            (HasqlSession LogMessage
 -> Connection -> IO (Either SessionError LogMessage))
-> Connection
-> HasqlSession LogMessage
-> IO (Either SessionError LogMessage)
forall a b c. (a -> b -> c) -> b -> a -> c
flip HasqlSession LogMessage
-> Connection -> IO (Either SessionError LogMessage)
forall a.
HasqlSession a -> Connection -> IO (Either SessionError a)
run Connection
connection (HasqlSession LogMessage -> IO (Either SessionError LogMessage))
-> HasqlSession LogMessage -> IO (Either SessionError LogMessage)
forall a b. (a -> b) -> a -> b
$ Severity
-> Maybe UserID -> Scope -> Error -> HasqlSession LogMessage
forall (m :: * -> *) v.
(HasLogMessage m, ToJSON v) =>
Severity -> Maybe UserID -> Scope -> v -> m LogMessage
logMessage Severity
Error Maybe UserID
forall a. Maybe a
Nothing Scope
Scope.server Error
err
        Either
  SessionError (Result (FullDocument (Rendered TextElementRevision)))
_ ->
            (HasqlSession LogMessage
 -> Connection -> IO (Either SessionError LogMessage))
-> Connection
-> HasqlSession LogMessage
-> IO (Either SessionError LogMessage)
forall a b c. (a -> b -> c) -> b -> a -> c
flip HasqlSession LogMessage
-> Connection -> IO (Either SessionError LogMessage)
forall a.
HasqlSession a -> Connection -> IO (Either SessionError a)
run Connection
connection (HasqlSession LogMessage -> IO (Either SessionError LogMessage))
-> HasqlSession LogMessage -> IO (Either SessionError LogMessage)
forall a b. (a -> b) -> a -> b
$
                Severity
-> Maybe UserID -> Scope -> String -> HasqlSession LogMessage
forall (m :: * -> *) v.
(HasLogMessage m, ToJSON v) =>
Severity -> Maybe UserID -> Scope -> v -> m LogMessage
logMessage
                    Severity
Info
                    Maybe UserID
forall a. Maybe a
Nothing
                    Scope
Scope.server
                    (String
"Document insertion successful" :: String)
    IO ()
runServer
    () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()