{-# LANGUAGE CPP #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}
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
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
""