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

module WikiMusic.Servant.UserRoutes
  ( makeResetPasswordLinkRoute,
    doPasswordResetRoute,
    inviteUserRoute,
    deleteUserRoute,
  )
where

import Servant
import WikiMusic.Free.MailCommand
import WikiMusic.Free.UserCommand
import WikiMusic.Free.UserQuery
import WikiMusic.Interaction.Model.User
import WikiMusic.Interaction.User
import WikiMusic.Model.Env
import WikiMusic.Protolude
import WikiMusic.Servant.Utilities
import WikiMusic.Smtp.MailCommandSES ()
import WikiMusic.Sqlite.UserCommand ()
import WikiMusic.Sqlite.UserQuery ()

makeResetPasswordLinkRoute :: Env -> Text -> Handler MakeResetPasswordLinkResponse
makeResetPasswordLinkRoute :: Env -> Text -> Handler MakeResetPasswordLinkResponse
makeResetPasswordLinkRoute Env
env Text
userEmail = IO (Either UserError MakeResetPasswordLinkResponse)
-> Handler (Either UserError MakeResetPasswordLinkResponse)
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 @(UserCommand :+: MailCommand) (Free
   (UserCommand :+: MailCommand)
   (Either UserError MakeResetPasswordLinkResponse)
 -> IO (Either UserError MakeResetPasswordLinkResponse))
-> Free
     (UserCommand :+: MailCommand)
     (Either UserError MakeResetPasswordLinkResponse)
-> IO (Either UserError MakeResetPasswordLinkResponse)
forall a b. (a -> b) -> a -> b
$ Env
-> Text
-> Free
     (UserCommand :+: MailCommand)
     (Either UserError MakeResetPasswordLinkResponse)
forall (f :: * -> *).
(UserCommand :<: f, MailCommand :<: f) =>
Env
-> Text -> Free f (Either UserError MakeResetPasswordLinkResponse)
makeResetPasswordLinkAction Env
env Text
userEmail) Handler (Either UserError MakeResetPasswordLinkResponse)
-> (Either UserError MakeResetPasswordLinkResponse
    -> Handler MakeResetPasswordLinkResponse)
-> Handler MakeResetPasswordLinkResponse
forall a b. Handler a -> (a -> Handler b) -> Handler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Either UserError MakeResetPasswordLinkResponse
-> Handler MakeResetPasswordLinkResponse
forall s b. Show s => Either s b -> Handler b
maybe200

doPasswordResetRoute :: Env -> DoPasswordResetRequest -> Handler ()
doPasswordResetRoute :: Env -> DoPasswordResetRequest -> Handler ()
doPasswordResetRoute Env
env DoPasswordResetRequest
req = IO (Either UserError ()) -> Handler (Either UserError ())
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 @(UserCommand :+: UserQuery :+: MailCommand) (Free
   (UserCommand :+: (UserQuery :+: MailCommand)) (Either UserError ())
 -> IO (Either UserError ()))
-> Free
     (UserCommand :+: (UserQuery :+: MailCommand)) (Either UserError ())
-> IO (Either UserError ())
forall a b. (a -> b) -> a -> b
$ Env
-> DoPasswordResetRequest
-> Free
     (UserCommand :+: (UserQuery :+: MailCommand)) (Either UserError ())
forall (f :: * -> *).
(UserCommand :<: f, UserQuery :<: f, MailCommand :<: f) =>
Env -> DoPasswordResetRequest -> Free f (Either UserError ())
doPasswordResetAction Env
env DoPasswordResetRequest
req) Handler (Either UserError ())
-> (Either UserError () -> Handler ()) -> Handler ()
forall a b. Handler a -> (a -> Handler b) -> Handler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Either UserError () -> Handler ()
forall s b. Show s => Either s b -> Handler b
maybe204

inviteUserRoute :: Env -> Maybe Text -> InviteUsersRequest -> Handler MakeResetPasswordLinkResponse
inviteUserRoute :: Env
-> Maybe Text
-> InviteUsersRequest
-> Handler MakeResetPasswordLinkResponse
inviteUserRoute Env
env Maybe Text
authToken InviteUsersRequest
req =
  Env
-> Maybe Text
-> (WikiMusicUser -> Handler MakeResetPasswordLinkResponse)
-> Handler MakeResetPasswordLinkResponse
forall a.
Env -> Maybe Text -> (WikiMusicUser -> Handler a) -> Handler a
doWithAuth
    Env
env
    Maybe Text
authToken
    ( \WikiMusicUser
authUser ->
        IO (Either UserError MakeResetPasswordLinkResponse)
-> Handler (Either UserError MakeResetPasswordLinkResponse)
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 @(UserCommand :+: MailCommand) (Free
   (UserCommand :+: MailCommand)
   (Either UserError MakeResetPasswordLinkResponse)
 -> IO (Either UserError MakeResetPasswordLinkResponse))
-> Free
     (UserCommand :+: MailCommand)
     (Either UserError MakeResetPasswordLinkResponse)
-> IO (Either UserError MakeResetPasswordLinkResponse)
forall a b. (a -> b) -> a -> b
$ Env
-> WikiMusicUser
-> InviteUsersRequest
-> Free
     (UserCommand :+: MailCommand)
     (Either UserError MakeResetPasswordLinkResponse)
forall (f :: * -> *).
(UserCommand :<: f, MailCommand :<: f) =>
Env
-> WikiMusicUser
-> InviteUsersRequest
-> Free f (Either UserError MakeResetPasswordLinkResponse)
inviteUserAction Env
env WikiMusicUser
authUser InviteUsersRequest
req) Handler (Either UserError MakeResetPasswordLinkResponse)
-> (Either UserError MakeResetPasswordLinkResponse
    -> Handler MakeResetPasswordLinkResponse)
-> Handler MakeResetPasswordLinkResponse
forall a b. Handler a -> (a -> Handler b) -> Handler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Either UserError MakeResetPasswordLinkResponse
-> Handler MakeResetPasswordLinkResponse
forall s b. Show s => Either s b -> Handler b
maybe200
    )

deleteUserRoute :: Env -> Maybe Text -> DeleteUsersRequest -> Handler ()
deleteUserRoute :: Env -> Maybe Text -> DeleteUsersRequest -> Handler ()
deleteUserRoute Env
env Maybe Text
authToken DeleteUsersRequest
req =
  Env -> Maybe Text -> (WikiMusicUser -> Handler ()) -> Handler ()
forall a.
Env -> Maybe Text -> (WikiMusicUser -> Handler a) -> Handler a
doWithAuth
    Env
env
    Maybe Text
authToken
    ( \WikiMusicUser
authUser ->
        IO (Either UserError ()) -> Handler (Either UserError ())
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 @UserCommand (Free UserCommand (Either UserError ())
 -> IO (Either UserError ()))
-> Free UserCommand (Either UserError ())
-> IO (Either UserError ())
forall a b. (a -> b) -> a -> b
$ Env
-> WikiMusicUser
-> DeleteUsersRequest
-> Free UserCommand (Either UserError ())
forall (f :: * -> *).
(UserCommand :<: f) =>
Env
-> WikiMusicUser
-> DeleteUsersRequest
-> Free f (Either UserError ())
deleteUserAction Env
env WikiMusicUser
authUser DeleteUsersRequest
req) Handler (Either UserError ())
-> (Either UserError () -> Handler ()) -> Handler ()
forall a b. Handler a -> (a -> Handler b) -> Handler b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Either UserError () -> Handler ()
forall s b. Show s => Either s b -> Handler b
maybe204
    )