{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
module User where
import Data.Text.Lazy qualified as TL
import Network.OAuth2.Provider
import Network.OAuth2.Provider.Auth0 qualified as IAuth0
import Network.OAuth2.Provider.AzureAD qualified as IAzureAD
import Network.OAuth2.Provider.DropBox qualified as IDropBox
import Network.OAuth2.Provider.Facebook qualified as IFacebook
import Network.OAuth2.Provider.Fitbit qualified as IFitbit
import Network.OAuth2.Provider.GitHub qualified as IGitHub
import Network.OAuth2.Provider.Google qualified as IGoogle
import Network.OAuth2.Provider.LinkedIn qualified as ILinkedIn
import Network.OAuth2.Provider.Okta qualified as IOkta
import Network.OAuth2.Provider.Slack qualified as ISlack
import Network.OAuth2.Provider.StackExchange qualified as IStackExchange
import Network.OAuth2.Provider.Twitter qualified as ITwitter
import Network.OAuth2.Provider.Weibo qualified as IWeibo
import Network.OAuth2.Provider.ZOHO qualified as IZOHO
import Text.Mustache ((~>))
import Text.Mustache qualified as M
import Prelude hiding (id)
newtype DemoLoginUser = DemoLoginUser
{ loginUserName :: TL.Text
}
deriving (Eq, Show)
instance M.ToMustache DemoLoginUser where
toMustache t' =
M.object
["name" ~> loginUserName t']
class HasDemoLoginUser a where
type IdpUser a
toLoginUser :: IdpUser a -> DemoLoginUser
instance HasDemoLoginUser Auth0 where
type IdpUser Auth0 = IAuth0.Auth0User
toLoginUser :: IAuth0.Auth0User -> DemoLoginUser
toLoginUser IAuth0.Auth0User {..} = DemoLoginUser {loginUserName = name}
instance HasDemoLoginUser Google where
type IdpUser Google = IGoogle.GoogleUser
toLoginUser :: IGoogle.GoogleUser -> DemoLoginUser
toLoginUser IGoogle.GoogleUser {..} = DemoLoginUser {loginUserName = name}
instance HasDemoLoginUser ZOHO where
type IdpUser ZOHO = IZOHO.ZOHOUserResp
toLoginUser :: IdpUser ZOHO -> DemoLoginUser
toLoginUser resp =
let us = IZOHO.users resp
in case us of
[] -> DemoLoginUser {loginUserName = "ZOHO: no user found"}
(a : _) -> DemoLoginUser {loginUserName = IZOHO.fullName a}
instance HasDemoLoginUser AzureAD where
type IdpUser AzureAD = IAzureAD.AzureADUser
toLoginUser :: IAzureAD.AzureADUser -> DemoLoginUser
toLoginUser ouser =
DemoLoginUser
{ loginUserName = IAzureAD.email ouser <> " " <> IAzureAD.name ouser
}
instance HasDemoLoginUser Weibo where
type IdpUser Weibo = IWeibo.WeiboUID
toLoginUser :: IWeibo.WeiboUID -> DemoLoginUser
toLoginUser ouser = DemoLoginUser {loginUserName = TL.pack $ show $ IWeibo.uid ouser}
instance HasDemoLoginUser DropBox where
type IdpUser DropBox = IDropBox.DropBoxUser
toLoginUser :: IDropBox.DropBoxUser -> DemoLoginUser
toLoginUser ouser = DemoLoginUser {loginUserName = IDropBox.displayName $ IDropBox.name ouser}
instance HasDemoLoginUser Facebook where
type IdpUser Facebook = IFacebook.FacebookUser
toLoginUser :: IFacebook.FacebookUser -> DemoLoginUser
toLoginUser ouser = DemoLoginUser {loginUserName = IFacebook.name ouser}
instance HasDemoLoginUser Fitbit where
type IdpUser Fitbit = IFitbit.FitbitUser
toLoginUser :: IFitbit.FitbitUser -> DemoLoginUser
toLoginUser ouser = DemoLoginUser {loginUserName = IFitbit.userName ouser}
instance HasDemoLoginUser GitHub where
type IdpUser GitHub = IGitHub.GitHubUser
toLoginUser :: IGitHub.GitHubUser -> DemoLoginUser
toLoginUser guser = DemoLoginUser {loginUserName = IGitHub.name guser}
instance HasDemoLoginUser LinkedIn where
type IdpUser LinkedIn = ILinkedIn.LinkedInUser
toLoginUser :: ILinkedIn.LinkedInUser -> DemoLoginUser
toLoginUser ILinkedIn.LinkedInUser {..} =
DemoLoginUser
{ loginUserName = localizedFirstName <> " " <> localizedLastName
}
instance HasDemoLoginUser Twitter where
type IdpUser Twitter = ITwitter.TwitterUserResp
toLoginUser :: ITwitter.TwitterUserResp -> DemoLoginUser
toLoginUser ITwitter.TwitterUserResp {..} = DemoLoginUser {loginUserName = ITwitter.name twitterUserRespData}
instance HasDemoLoginUser Okta where
type IdpUser Okta = IOkta.OktaUser
toLoginUser :: IOkta.OktaUser -> DemoLoginUser
toLoginUser ouser = DemoLoginUser {loginUserName = IOkta.name ouser}
instance HasDemoLoginUser Slack where
type IdpUser Slack = ISlack.SlackUser
toLoginUser :: ISlack.SlackUser -> DemoLoginUser
toLoginUser ouser = DemoLoginUser {loginUserName = ISlack.name ouser}
instance HasDemoLoginUser StackExchange where
type IdpUser StackExchange = IStackExchange.StackExchangeResp
toLoginUser :: IStackExchange.StackExchangeResp -> DemoLoginUser
toLoginUser IStackExchange.StackExchangeResp {..} =
case items of
[] -> DemoLoginUser {loginUserName = TL.pack "Cannot find stackexchange user"}
(user : _) -> DemoLoginUser {loginUserName = IStackExchange.displayName user}