{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE NoFieldSelectors #-}

module WikiMusic.Servant.AuthRoutes
  ( fetchMeRoute,
  )
where

import Servant
import WikiMusic.Free.AuthQuery
import WikiMusic.Interaction.Auth
import WikiMusic.Interaction.Model.Auth
import WikiMusic.Model.Env
import WikiMusic.Protolude
import WikiMusic.Servant.Utilities
import WikiMusic.Sqlite.AuthQuery ()

fetchMeRoute :: Env -> Maybe Text -> Handler GetMeQueryResponse
fetchMeRoute :: Env -> Maybe Text -> Handler GetMeQueryResponse
fetchMeRoute Env
env Maybe Text
authToken = do
  Env
-> Maybe Text
-> (WikiMusicUser -> Handler GetMeQueryResponse)
-> Handler GetMeQueryResponse
forall a.
Env -> Maybe Text -> (WikiMusicUser -> Handler a) -> Handler a
doWithAuth
    Env
env
    Maybe Text
authToken
    ( \WikiMusicUser
authUser -> do
        Maybe GetMeQueryResponse
maybeUser <- IO (Maybe GetMeQueryResponse) -> Handler (Maybe GetMeQueryResponse)
forall a. IO a -> Handler a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (forall (f :: * -> *) a. Exec f => Free f a -> IO a
exec @AuthQuery (Free AuthQuery (Maybe GetMeQueryResponse)
 -> IO (Maybe GetMeQueryResponse))
-> Free AuthQuery (Maybe GetMeQueryResponse)
-> IO (Maybe GetMeQueryResponse)
forall a b. (a -> b) -> a -> b
$ Env -> UUID -> Free AuthQuery (Maybe GetMeQueryResponse)
forall (f :: * -> *).
(AuthQuery :<: f) =>
Env -> UUID -> Free f (Maybe GetMeQueryResponse)
fetchMeAction Env
env (WikiMusicUser
authUser WikiMusicUser -> Optic' A_Lens NoIx WikiMusicUser UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx WikiMusicUser UUID
#identifier))
        Handler GetMeQueryResponse
-> (GetMeQueryResponse -> Handler GetMeQueryResponse)
-> Maybe GetMeQueryResponse
-> Handler GetMeQueryResponse
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (ServerError -> Handler GetMeQueryResponse
forall a. ServerError -> Handler a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError ServerError
err404) GetMeQueryResponse -> Handler GetMeQueryResponse
forall a. a -> Handler a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe GetMeQueryResponse
maybeUser
    )