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

module WikiMusic.Interaction.Auth
  ( fetchMeAction,
  )
where

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

fetchMeAction :: (AuthQuery :<: f) => Env -> UUID -> Free f (Maybe GetMeQueryResponse)
fetchMeAction :: forall (f :: * -> *).
(AuthQuery :<: f) =>
Env -> UUID -> Free f (Maybe GetMeQueryResponse)
fetchMeAction Env
env UUID
identifier = do
  Either AuthQueryError (Maybe WikiMusicUser)
maybeUserOrErr <- Env -> UUID -> Free f (Either AuthQueryError (Maybe WikiMusicUser))
forall (f :: * -> *).
(AuthQuery :<: f) =>
Env -> UUID -> Free f (Either AuthQueryError (Maybe WikiMusicUser))
fetchMe Env
env UUID
identifier
  case Either AuthQueryError (Maybe WikiMusicUser)
maybeUserOrErr of
    Left AuthQueryError
_ -> do
      Maybe GetMeQueryResponse -> Free f (Maybe GetMeQueryResponse)
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe GetMeQueryResponse
forall a. Maybe a
Nothing
    Right Maybe WikiMusicUser
maybeWikiMusicUser -> do
      Maybe GetMeQueryResponse -> Free f (Maybe GetMeQueryResponse)
forall a. a -> Free f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe GetMeQueryResponse -> Free f (Maybe GetMeQueryResponse))
-> Maybe GetMeQueryResponse -> Free f (Maybe GetMeQueryResponse)
forall a b. (a -> b) -> a -> b
$ WikiMusicUser -> GetMeQueryResponse
forall {k} {k} {k} {k} {s}.
(Is k A_Getter, Is k A_Getter, Is k A_Getter, Is k A_Getter,
 LabelOptic "identifier" k s s UUID UUID,
 LabelOptic "displayName" k s s Text Text,
 LabelOptic "emailAddress" k s s Text Text,
 LabelOptic "roles" k s s [UserRole] [UserRole]) =>
s -> GetMeQueryResponse
userToResponse (WikiMusicUser -> GetMeQueryResponse)
-> Maybe WikiMusicUser -> Maybe GetMeQueryResponse
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe WikiMusicUser
maybeWikiMusicUser
  where
    userToResponse :: s -> GetMeQueryResponse
userToResponse s
x =
      GetMeQueryResponse
        { $sel:identifier:GetMeQueryResponse :: UUID
identifier = s
x s -> Optic' k NoIx s UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' k NoIx s UUID
#identifier,
          $sel:displayName:GetMeQueryResponse :: Text
displayName = s
x s -> Optic' k NoIx s Text -> Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' k NoIx s Text
#displayName,
          $sel:emailAddress:GetMeQueryResponse :: Text
emailAddress = s
x s -> Optic' k NoIx s Text -> Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' k NoIx s Text
#emailAddress,
          $sel:roles:GetMeQueryResponse :: [UserRole]
roles = s
x s -> Optic' k NoIx s [UserRole] -> [UserRole]
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' k NoIx s [UserRole]
#roles
        }