{-# LANGUAGE CPP #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}

{- |
Module      :  Google.Client

Define functions to call Google APIs.
-}
module Google.Client
  ( getToken
  , getCalendarEventList
  , postCalendarEvent
  , postGmailSend
  , getGmailList
  , getGmailMessage
  , getDriveFileList
  , createDriveFileMultipart
  , downloadDriveFile
  ) where

import Data.Aeson (FromJSON, ToJSON)
import Data.ByteString.Base64.URL (encode)
import qualified Data.ByteString.Lazy as LBS
import Data.Data (Data)
#if !MIN_VERSION_base(4, 11, 0)
import Data.Monoid ((<>))
#endif
import Data.Proxy (Proxy(..))
import Data.Text (Text)
import Data.Text.Encoding (decodeUtf8)
import Data.Typeable (Typeable)
import GHC.Generics (Generic)
import Network.HTTP.Client (newManager)
import Network.HTTP.Client.TLS (tlsManagerSettings)
import Network.Mail.Mime
import Servant.API
  ( (:<|>)(..)
  , (:>)
  , Capture
  , FormUrlEncoded
  , FromHttpApiData
  , Get
  , Header
  , JSON
  , Post
  , QueryParam
  , QueryParams
  , ReqBody
  , ToHttpApiData
  )
import Servant.Client
  ( BaseUrl(BaseUrl)
  , ClientM
  , Scheme(..)
#if MIN_VERSION_servant(0, 16, 0)
  , ClientError
#else
  , ServantError
#endif
  , client
  , mkClientEnv
  , runClientM
  )

import qualified Google.Form as Form
import Google.JWT (JWT)
import qualified Google.JWT as JWT
import qualified Google.Response as Response
import qualified Google.Type as Type
import Google.Form (ExtendedProperty)

#if !MIN_VERSION_servant(0, 16, 0)
type ClientError = ServantError
#endif

newtype Bearer = Bearer
  { Bearer -> Text
_unBearer :: Text
  } deriving ( Typeable Bearer
DataType
Constr
Typeable Bearer
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> Bearer -> c Bearer)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c Bearer)
-> (Bearer -> Constr)
-> (Bearer -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c Bearer))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Bearer))
-> ((forall b. Data b => b -> b) -> Bearer -> Bearer)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> Bearer -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> Bearer -> r)
-> (forall u. (forall d. Data d => d -> u) -> Bearer -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Bearer -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Bearer -> m Bearer)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Bearer -> m Bearer)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Bearer -> m Bearer)
-> Data Bearer
Bearer -> DataType
Bearer -> Constr
(forall b. Data b => b -> b) -> Bearer -> Bearer
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Bearer -> c Bearer
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Bearer
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Bearer -> u
forall u. (forall d. Data d => d -> u) -> Bearer -> [u]
forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Bearer -> r
forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Bearer -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Bearer -> m Bearer
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Bearer -> m Bearer
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Bearer
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Bearer -> c Bearer
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Bearer)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Bearer)
$cBearer :: Constr
$tBearer :: DataType
gmapMo :: (forall d. Data d => d -> m d) -> Bearer -> m Bearer
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Bearer -> m Bearer
gmapMp :: (forall d. Data d => d -> m d) -> Bearer -> m Bearer
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Bearer -> m Bearer
gmapM :: (forall d. Data d => d -> m d) -> Bearer -> m Bearer
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Bearer -> m Bearer
gmapQi :: Int -> (forall d. Data d => d -> u) -> Bearer -> u
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Bearer -> u
gmapQ :: (forall d. Data d => d -> u) -> Bearer -> [u]
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Bearer -> [u]
gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Bearer -> r
$cgmapQr :: forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Bearer -> r
gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Bearer -> r
$cgmapQl :: forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Bearer -> r
gmapT :: (forall b. Data b => b -> b) -> Bearer -> Bearer
$cgmapT :: (forall b. Data b => b -> b) -> Bearer -> Bearer
dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Bearer)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Bearer)
dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Bearer)
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Bearer)
dataTypeOf :: Bearer -> DataType
$cdataTypeOf :: Bearer -> DataType
toConstr :: Bearer -> Constr
$ctoConstr :: Bearer -> Constr
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Bearer
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Bearer
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Bearer -> c Bearer
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Bearer -> c Bearer
$cp1Data :: Typeable Bearer
Data
             , Bearer -> Bearer -> Bool
(Bearer -> Bearer -> Bool)
-> (Bearer -> Bearer -> Bool) -> Eq Bearer
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Bearer -> Bearer -> Bool
$c/= :: Bearer -> Bearer -> Bool
== :: Bearer -> Bearer -> Bool
$c== :: Bearer -> Bearer -> Bool
Eq
             , ByteString -> Either Text Bearer
Text -> Either Text Bearer
(Text -> Either Text Bearer)
-> (ByteString -> Either Text Bearer)
-> (Text -> Either Text Bearer)
-> FromHttpApiData Bearer
forall a.
(Text -> Either Text a)
-> (ByteString -> Either Text a)
-> (Text -> Either Text a)
-> FromHttpApiData a
parseQueryParam :: Text -> Either Text Bearer
$cparseQueryParam :: Text -> Either Text Bearer
parseHeader :: ByteString -> Either Text Bearer
$cparseHeader :: ByteString -> Either Text Bearer
parseUrlPiece :: Text -> Either Text Bearer
$cparseUrlPiece :: Text -> Either Text Bearer
FromHttpApiData
             , Value -> Parser [Bearer]
Value -> Parser Bearer
(Value -> Parser Bearer)
-> (Value -> Parser [Bearer]) -> FromJSON Bearer
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Bearer]
$cparseJSONList :: Value -> Parser [Bearer]
parseJSON :: Value -> Parser Bearer
$cparseJSON :: Value -> Parser Bearer
FromJSON
             , (forall x. Bearer -> Rep Bearer x)
-> (forall x. Rep Bearer x -> Bearer) -> Generic Bearer
forall x. Rep Bearer x -> Bearer
forall x. Bearer -> Rep Bearer x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Bearer x -> Bearer
$cfrom :: forall x. Bearer -> Rep Bearer x
Generic
             , Eq Bearer
Eq Bearer
-> (Bearer -> Bearer -> Ordering)
-> (Bearer -> Bearer -> Bool)
-> (Bearer -> Bearer -> Bool)
-> (Bearer -> Bearer -> Bool)
-> (Bearer -> Bearer -> Bool)
-> (Bearer -> Bearer -> Bearer)
-> (Bearer -> Bearer -> Bearer)
-> Ord Bearer
Bearer -> Bearer -> Bool
Bearer -> Bearer -> Ordering
Bearer -> Bearer -> Bearer
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Bearer -> Bearer -> Bearer
$cmin :: Bearer -> Bearer -> Bearer
max :: Bearer -> Bearer -> Bearer
$cmax :: Bearer -> Bearer -> Bearer
>= :: Bearer -> Bearer -> Bool
$c>= :: Bearer -> Bearer -> Bool
> :: Bearer -> Bearer -> Bool
$c> :: Bearer -> Bearer -> Bool
<= :: Bearer -> Bearer -> Bool
$c<= :: Bearer -> Bearer -> Bool
< :: Bearer -> Bearer -> Bool
$c< :: Bearer -> Bearer -> Bool
compare :: Bearer -> Bearer -> Ordering
$ccompare :: Bearer -> Bearer -> Ordering
$cp1Ord :: Eq Bearer
Ord
             , Int -> Bearer -> ShowS
[Bearer] -> ShowS
Bearer -> String
(Int -> Bearer -> ShowS)
-> (Bearer -> String) -> ([Bearer] -> ShowS) -> Show Bearer
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Bearer] -> ShowS
$cshowList :: [Bearer] -> ShowS
show :: Bearer -> String
$cshow :: Bearer -> String
showsPrec :: Int -> Bearer -> ShowS
$cshowsPrec :: Int -> Bearer -> ShowS
Show
             , Bearer -> ByteString
Bearer -> Builder
Bearer -> Text
(Bearer -> Text)
-> (Bearer -> Builder)
-> (Bearer -> ByteString)
-> (Bearer -> Text)
-> ToHttpApiData Bearer
forall a.
(a -> Text)
-> (a -> Builder)
-> (a -> ByteString)
-> (a -> Text)
-> ToHttpApiData a
toQueryParam :: Bearer -> Text
$ctoQueryParam :: Bearer -> Text
toHeader :: Bearer -> ByteString
$ctoHeader :: Bearer -> ByteString
toEncodedUrlPiece :: Bearer -> Builder
$ctoEncodedUrlPiece :: Bearer -> Builder
toUrlPiece :: Bearer -> Text
$ctoUrlPiece :: Bearer -> Text
ToHttpApiData
             , [Bearer] -> Encoding
[Bearer] -> Value
Bearer -> Encoding
Bearer -> Value
(Bearer -> Value)
-> (Bearer -> Encoding)
-> ([Bearer] -> Value)
-> ([Bearer] -> Encoding)
-> ToJSON Bearer
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [Bearer] -> Encoding
$ctoEncodingList :: [Bearer] -> Encoding
toJSONList :: [Bearer] -> Value
$ctoJSONList :: [Bearer] -> Value
toEncoding :: Bearer -> Encoding
$ctoEncoding :: Bearer -> Encoding
toJSON :: Bearer -> Value
$ctoJSON :: Bearer -> Value
ToJSON
             , Typeable
             )

type API
  = "oauth2" :> "v4" :> "token" :>
    ReqBody '[ FormUrlEncoded] Form.Token :>
    Post '[ JSON] Response.Token
  :<|> "calendar" :> "v3" :> "calendars" :>
    Capture "calendarId" Text :>
    "events" :>
    Header "Authorization" Bearer :>
    QueryParam "singleEvents" Bool :>
    QueryParam "timeMin" Form.DateTime :>
    QueryParam "timeMax" Form.DateTime :>
    QueryParam "orderBy" Text :>
    QueryParams "privateExtendedProperty" ExtendedProperty :>
    QueryParams "sharedExtendedProperty" ExtendedProperty :>
    Get '[ JSON] Response.CalendarEventList
  :<|> "calendar" :> "v3" :> "calendars" :>
    Capture "calendarId" Text :>
    "events" :>
    Header "Authorization" Bearer :>
    ReqBody '[ JSON] Form.CalendarEvent :>
    Post '[ JSON] Response.CalendarEvent
  :<|> "gmail" :> "v1" :> "users" :> "me" :> "messages" :> "send" :>
    Header "Authorization" Bearer :>
    ReqBody '[ JSON] Form.GmailSend :>
    Post '[ JSON] Response.GmailSend
  :<|> "gmail" :> "v1" :> "users" :> "me" :> "messages" :>
    Header "Authorization" Bearer :>
    QueryParam "maxResults" Int :>
    QueryParam "labelIds" [Type.LabelId] :>
    Get '[ JSON] Response.GmailList
  :<|> "gmail" :> "v1" :> "users" :> "me" :> "messages" :> Capture "messageId" Text :>
    Header "Authorization" Bearer :>
    Get '[ JSON] Response.GmailMessage
  :<|> "drive":> "v3" :> "files" :>
    Header "Authorization" Bearer :>
    QueryParam "q" Type.QueryString :>
    QueryParam "orderBy" [Type.Order] :>
    Get '[ JSON] Response.FileList
  :<|> "upload" :> "drive":> "v3" :> "files" :>
    Header "Authorization" Bearer :>
    QueryParam "uploadType" Text :>
    ReqBody '[ Type.Multipart] Form.MultipartBody :>
    Post '[ JSON] Response.FileResource
  :<|> "drive":> "v3" :> "files" :>
    Capture "fileId" Type.FileId :>
    "export" :>
    Header "Authorization" Bearer :>
    QueryParam "mimeType" Type.ConversionFormat :>
    Get '[ Type.Arbitrary] Type.MediaContent



api :: Proxy API
api :: Proxy API
api = Proxy API
forall k (t :: k). Proxy t
Proxy

getToken' :: Form.Token -> ClientM Response.Token
getCalendarEventList' ::
     Text
  -> Maybe Bearer
  -> Maybe Bool
  -> Maybe Form.DateTime
  -> Maybe Form.DateTime
  -> Maybe Text
  -> [ExtendedProperty]
  -> [ExtendedProperty]
  -> ClientM Response.CalendarEventList
postCalendarEvent' ::
     Text
  -> Maybe Bearer
  -> Form.CalendarEvent
  -> ClientM Response.CalendarEvent
postGmailSend' :: Maybe Bearer -> Form.GmailSend -> ClientM Response.GmailSend
getGmailList' :: Maybe Bearer -> Maybe Int -> Maybe [Type.LabelId] -> ClientM Response.GmailList
getGmailMessage' :: Text -> Maybe Bearer -> ClientM Response.GmailMessage
getDriveFileList' ::
     Maybe Bearer
  -> Maybe Type.QueryString
  -> Maybe [Type.Order]
  -> ClientM Response.FileList
createDriveFileMultipart' ::
     Maybe Bearer
  -> Maybe Text
  -> Form.MultipartBody
  -> ClientM Response.FileResource
downloadDriveFile' ::
     Type.FileId
  -> Maybe Bearer
  -> Maybe Type.ConversionFormat
  -> ClientM Type.MediaContent
Token -> ClientM Token
getToken'
  :<|> Text
-> Maybe Bearer
-> Maybe Bool
-> Maybe DateTime
-> Maybe DateTime
-> Maybe Text
-> [ExtendedProperty]
-> [ExtendedProperty]
-> ClientM CalendarEventList
getCalendarEventList'
  :<|> Text -> Maybe Bearer -> CalendarEvent -> ClientM CalendarEvent
postCalendarEvent'
  :<|> Maybe Bearer -> GmailSend -> ClientM GmailSend
postGmailSend'
  :<|> Maybe Bearer -> Maybe Int -> Maybe [LabelId] -> ClientM GmailList
getGmailList'
  :<|> Text -> Maybe Bearer -> ClientM GmailMessage
getGmailMessage'
  :<|> Maybe Bearer
-> Maybe QueryString -> Maybe [Order] -> ClientM FileList
getDriveFileList'
  :<|> Maybe Bearer -> Maybe Text -> MultipartBody -> ClientM FileResource
createDriveFileMultipart'
  :<|> FileId
-> Maybe Bearer -> Maybe ConversionFormat -> ClientM MediaContent
downloadDriveFile'
  = Proxy API -> Client ClientM API
forall api.
HasClient ClientM api =>
Proxy api -> Client ClientM api
client Proxy API
api

getToken ::
     Maybe JWT.Email
  -> JWT
  -> [JWT.Scope]
  -> IO (Either ClientError Response.Token)
getToken :: Maybe Email -> JWT -> [Scope] -> IO (Either ClientError Token)
getToken Maybe Email
maccount JWT
jwt [Scope]
scopes = do
  Manager
manager <- ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
  Right SignedJWT
a <- JWT
-> Maybe Email
-> [Scope]
-> Maybe Int
-> IO (Either String SignedJWT)
JWT.getSignedJWT JWT
jwt Maybe Email
maccount [Scope]
scopes Maybe Int
forall a. Maybe a
Nothing
  ClientM Token -> ClientEnv -> IO (Either ClientError Token)
forall a. ClientM a -> ClientEnv -> IO (Either ClientError a)
runClientM
    (Token -> ClientM Token
getToken' (Token -> ClientM Token) -> Token -> ClientM Token
forall a b. (a -> b) -> a -> b
$
     Token :: Text -> Text -> Token
Form.Token
       { $sel:grantType:Token :: Text
grantType = Text
googleGrantType
       , $sel:assertion:Token :: Text
assertion = ByteString -> Text
decodeUtf8 (ByteString -> Text)
-> (SignedJWT -> ByteString) -> SignedJWT -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SignedJWT -> ByteString
JWT.unSignedJWT (SignedJWT -> Text) -> SignedJWT -> Text
forall a b. (a -> b) -> a -> b
$ SignedJWT
a
       })
    (Manager -> BaseUrl -> ClientEnv
mkClientEnv Manager
manager BaseUrl
googleBaseUrl)

getCalendarEventList ::
     Response.Token
  -> Text
  -> Maybe Bool
  -> Maybe Form.DateTime
  -> Maybe Form.DateTime
  -> Maybe Text
  -> [ExtendedProperty]
  -> [ExtendedProperty]
  -> IO (Either ClientError Response.CalendarEventList)
getCalendarEventList :: Token
-> Text
-> Maybe Bool
-> Maybe DateTime
-> Maybe DateTime
-> Maybe Text
-> [ExtendedProperty]
-> [ExtendedProperty]
-> IO (Either ClientError CalendarEventList)
getCalendarEventList Token
token Text
calendarId Maybe Bool
singleEvents Maybe DateTime
timeMin Maybe DateTime
timeMax Maybe Text
orderBy [ExtendedProperty]
privateExtendedProperties [ExtendedProperty]
sharedExtendedProperties = do
  Manager
manager <- ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
  ClientM CalendarEventList
-> ClientEnv -> IO (Either ClientError CalendarEventList)
forall a. ClientM a -> ClientEnv -> IO (Either ClientError a)
runClientM
    (Text
-> Maybe Bearer
-> Maybe Bool
-> Maybe DateTime
-> Maybe DateTime
-> Maybe Text
-> [ExtendedProperty]
-> [ExtendedProperty]
-> ClientM CalendarEventList
getCalendarEventList'
       Text
calendarId
       (Bearer -> Maybe Bearer
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bearer -> Maybe Bearer)
-> (Token -> Bearer) -> Token -> Maybe Bearer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Bearer
toBearer (Token -> Maybe Bearer) -> Token -> Maybe Bearer
forall a b. (a -> b) -> a -> b
$ Token
token)
       Maybe Bool
singleEvents
       Maybe DateTime
timeMin
       Maybe DateTime
timeMax
       Maybe Text
orderBy
       [ExtendedProperty]
privateExtendedProperties
       [ExtendedProperty]
sharedExtendedProperties)
    (Manager -> BaseUrl -> ClientEnv
mkClientEnv Manager
manager BaseUrl
googleBaseUrl)

postCalendarEvent ::
     Response.Token
  -> Form.CalendarEvent
  -> IO (Either ClientError Response.CalendarEvent)
postCalendarEvent :: Token -> CalendarEvent -> IO (Either ClientError CalendarEvent)
postCalendarEvent Token
token CalendarEvent
event = do
  Manager
manager <- ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
  ClientM CalendarEvent
-> ClientEnv -> IO (Either ClientError CalendarEvent)
forall a. ClientM a -> ClientEnv -> IO (Either ClientError a)
runClientM
    (Text -> Maybe Bearer -> CalendarEvent -> ClientM CalendarEvent
postCalendarEvent'
       (Account -> Text
Form.email (Account -> Text)
-> (CalendarEvent -> Account) -> CalendarEvent -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CalendarEvent -> Account
Form.creator (CalendarEvent -> Text) -> CalendarEvent -> Text
forall a b. (a -> b) -> a -> b
$ CalendarEvent
event)
       (Bearer -> Maybe Bearer
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bearer -> Maybe Bearer)
-> (Token -> Bearer) -> Token -> Maybe Bearer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Bearer
toBearer (Token -> Maybe Bearer) -> Token -> Maybe Bearer
forall a b. (a -> b) -> a -> b
$ Token
token)
       CalendarEvent
event)
    (Manager -> BaseUrl -> ClientEnv
mkClientEnv Manager
manager BaseUrl
googleBaseUrl)

postGmailSend ::
     Response.Token -> Form.Email -> IO (Either ClientError Response.GmailSend)
postGmailSend :: Token -> Email -> IO (Either ClientError GmailSend)
postGmailSend Token
token Email
email = do
  Manager
manager <- ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
  ByteString
mail <- (Mail -> IO ByteString
renderMail' (Mail -> IO ByteString) -> IO Mail -> IO ByteString
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Email -> IO Mail
Form.toMail Email
email)
  let gmailSend :: GmailSend
gmailSend = GmailSend :: Text -> GmailSend
Form.GmailSend {$sel:raw:GmailSend :: Text
raw = ByteString -> Text
decodeUtf8 (ByteString -> Text) -> ByteString -> Text
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
encode (ByteString -> ByteString) -> ByteString -> ByteString
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString
LBS.toStrict ByteString
mail}
  ClientM GmailSend -> ClientEnv -> IO (Either ClientError GmailSend)
forall a. ClientM a -> ClientEnv -> IO (Either ClientError a)
runClientM
    (Maybe Bearer -> GmailSend -> ClientM GmailSend
postGmailSend' (Bearer -> Maybe Bearer
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bearer -> Maybe Bearer)
-> (Token -> Bearer) -> Token -> Maybe Bearer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Bearer
toBearer (Token -> Maybe Bearer) -> Token -> Maybe Bearer
forall a b. (a -> b) -> a -> b
$ Token
token) GmailSend
gmailSend)
    (Manager -> BaseUrl -> ClientEnv
mkClientEnv Manager
manager BaseUrl
googleBaseUrl)

getGmailList ::
     Response.Token -> Maybe Int -> Maybe [Type.LabelId] -> IO (Either ClientError Response.GmailList)
getGmailList :: Token
-> Maybe Int
-> Maybe [LabelId]
-> IO (Either ClientError GmailList)
getGmailList Token
token Maybe Int
maxResults Maybe [LabelId]
labelIds = do
  Manager
manager <- ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
  ClientM GmailList -> ClientEnv -> IO (Either ClientError GmailList)
forall a. ClientM a -> ClientEnv -> IO (Either ClientError a)
runClientM
    (Maybe Bearer -> Maybe Int -> Maybe [LabelId] -> ClientM GmailList
getGmailList' (Bearer -> Maybe Bearer
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bearer -> Maybe Bearer)
-> (Token -> Bearer) -> Token -> Maybe Bearer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Bearer
toBearer (Token -> Maybe Bearer) -> Token -> Maybe Bearer
forall a b. (a -> b) -> a -> b
$ Token
token) Maybe Int
maxResults Maybe [LabelId]
labelIds)
    (Manager -> BaseUrl -> ClientEnv
mkClientEnv Manager
manager BaseUrl
googleBaseUrl)

getGmailMessage ::
     Response.Token -> Text -> IO (Either ClientError Response.GmailMessage)
getGmailMessage :: Token -> Text -> IO (Either ClientError GmailMessage)
getGmailMessage Token
token Text
messageId = do
  Manager
manager <- ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
  ClientM GmailMessage
-> ClientEnv -> IO (Either ClientError GmailMessage)
forall a. ClientM a -> ClientEnv -> IO (Either ClientError a)
runClientM
    (Text -> Maybe Bearer -> ClientM GmailMessage
getGmailMessage' Text
messageId (Bearer -> Maybe Bearer
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bearer -> Maybe Bearer)
-> (Token -> Bearer) -> Token -> Maybe Bearer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Bearer
toBearer (Token -> Maybe Bearer) -> Token -> Maybe Bearer
forall a b. (a -> b) -> a -> b
$ Token
token))
    (Manager -> BaseUrl -> ClientEnv
mkClientEnv Manager
manager BaseUrl
googleBaseUrl)

getDriveFileList ::
     Response.Token
  -> Form.GetFileParams
  -> IO (Either ClientError Response.FileList)
getDriveFileList :: Token -> GetFileParams -> IO (Either ClientError FileList)
getDriveFileList Token
token Form.GetFileParams{Maybe [Order]
Maybe QueryString
$sel:orderBy:GetFileParams :: GetFileParams -> Maybe [Order]
$sel:query:GetFileParams :: GetFileParams -> Maybe QueryString
orderBy :: Maybe [Order]
query :: Maybe QueryString
..} = do
  Manager
manager <- ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
  ClientM FileList -> ClientEnv -> IO (Either ClientError FileList)
forall a. ClientM a -> ClientEnv -> IO (Either ClientError a)
runClientM
    (Maybe Bearer
-> Maybe QueryString -> Maybe [Order] -> ClientM FileList
getDriveFileList'
       (Bearer -> Maybe Bearer
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bearer -> Maybe Bearer)
-> (Token -> Bearer) -> Token -> Maybe Bearer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Bearer
toBearer (Token -> Maybe Bearer) -> Token -> Maybe Bearer
forall a b. (a -> b) -> a -> b
$ Token
token)
       Maybe QueryString
query
       Maybe [Order]
orderBy)
    (Manager -> BaseUrl -> ClientEnv
mkClientEnv Manager
manager BaseUrl
googleBaseUrl)

createDriveFileMultipart ::
     Response.Token
  -> Form.MultipartBody
  -> IO (Either ClientError Response.FileResource)
createDriveFileMultipart :: Token -> MultipartBody -> IO (Either ClientError FileResource)
createDriveFileMultipart Token
token MultipartBody
body = do
  Manager
manager <- ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
  ClientM FileResource
-> ClientEnv -> IO (Either ClientError FileResource)
forall a. ClientM a -> ClientEnv -> IO (Either ClientError a)
runClientM
    (Maybe Bearer -> Maybe Text -> MultipartBody -> ClientM FileResource
createDriveFileMultipart'
      (Bearer -> Maybe Bearer
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bearer -> Maybe Bearer)
-> (Token -> Bearer) -> Token -> Maybe Bearer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Bearer
toBearer (Token -> Maybe Bearer) -> Token -> Maybe Bearer
forall a b. (a -> b) -> a -> b
$ Token
token)
      (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"multipart")
      MultipartBody
body)
    (Manager -> BaseUrl -> ClientEnv
mkClientEnv Manager
manager BaseUrl
googleBaseUrl)

downloadDriveFile ::
     Response.Token
  -> Form.DownloadFileParams
  -> IO (Either ClientError Response.MediaContent)
downloadDriveFile :: Token -> DownloadFileParams -> IO (Either ClientError MediaContent)
downloadDriveFile Token
token Form.DownloadFileParams {FileId
ConversionFormat
$sel:conversionFormat:DownloadFileParams :: DownloadFileParams -> ConversionFormat
$sel:fileId:DownloadFileParams :: DownloadFileParams -> FileId
conversionFormat :: ConversionFormat
fileId :: FileId
..} = do
  Manager
manager <- ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
  ClientM MediaContent
-> ClientEnv -> IO (Either ClientError MediaContent)
forall a. ClientM a -> ClientEnv -> IO (Either ClientError a)
runClientM
    (FileId
-> Maybe Bearer -> Maybe ConversionFormat -> ClientM MediaContent
downloadDriveFile'
       FileId
fileId
       (Bearer -> Maybe Bearer
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bearer -> Maybe Bearer)
-> (Token -> Bearer) -> Token -> Maybe Bearer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> Bearer
toBearer (Token -> Maybe Bearer) -> Token -> Maybe Bearer
forall a b. (a -> b) -> a -> b
$ Token
token)
       (ConversionFormat -> Maybe ConversionFormat
forall a. a -> Maybe a
Just ConversionFormat
conversionFormat))
    (Manager -> BaseUrl -> ClientEnv
mkClientEnv Manager
manager BaseUrl
googleBaseUrl)

toBearer :: Response.Token -> Bearer
toBearer :: Token -> Bearer
toBearer Response.Token {Text
$sel:accessToken:Token :: Token -> Text
accessToken :: Text
accessToken} = Text -> Bearer
Bearer (Text -> Bearer) -> Text -> Bearer
forall a b. (a -> b) -> a -> b
$ Text
"Bearer " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
accessToken

{- =================
 -  Constant values
 - ================= -}
googleGrantType :: Text
googleGrantType :: Text
googleGrantType = Text
"urn:ietf:params:oauth:grant-type:jwt-bearer"

googleBaseUrl :: BaseUrl
googleBaseUrl :: BaseUrl
googleBaseUrl = Scheme -> String -> Int -> String -> BaseUrl
BaseUrl Scheme
Https String
"www.googleapis.com" Int
443 String
""