-----------------------------------------------------------------------------
-- |
-- License     :  BSD-3-Clause
-- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
--
-- The webhooks API, as described at
-- <https://developer.github.com/v3/repos/hooks/>
-- <https://developer.github.com/webhooks>
module GitHub.Endpoints.Repos.Webhooks (
    -- * Querying repositories
    webhooksFor',
    webhooksForR,
    webhookFor',
    webhookForR,

    -- ** Create
    createRepoWebhook',
    createRepoWebhookR,

    -- ** Edit
    editRepoWebhook',
    editRepoWebhookR,

    -- ** Test
    testPushRepoWebhook',
    testPushRepoWebhookR,
    pingRepoWebhook',
    pingRepoWebhookR,

    -- ** Delete
    deleteRepoWebhook',
    deleteRepoWebhookR,
) where

import GitHub.Data
import GitHub.Internal.Prelude
import GitHub.Request
import Prelude ()

webhooksFor' :: Auth -> Name Owner -> Name Repo -> IO (Either Error (Vector RepoWebhook))
webhooksFor' :: Auth
-> Name Owner
-> Name Repo
-> IO (Either Error (Vector RepoWebhook))
webhooksFor' auth :: Auth
auth user :: Name Owner
user repo :: Name Repo
repo =
    Auth
-> GenRequest 'MtJSON Any (Vector RepoWebhook)
-> IO (Either Error (Vector RepoWebhook))
forall am (mt :: MediaType *) a (rw :: RW).
(AuthMethod am, ParseResponse mt a) =>
am -> GenRequest mt rw a -> IO (Either Error a)
executeRequest Auth
auth (GenRequest 'MtJSON Any (Vector RepoWebhook)
 -> IO (Either Error (Vector RepoWebhook)))
-> GenRequest 'MtJSON Any (Vector RepoWebhook)
-> IO (Either Error (Vector RepoWebhook))
forall a b. (a -> b) -> a -> b
$ Name Owner
-> Name Repo
-> FetchCount
-> GenRequest 'MtJSON Any (Vector RepoWebhook)
forall (k :: RW).
Name Owner
-> Name Repo -> FetchCount -> Request k (Vector RepoWebhook)
webhooksForR Name Owner
user Name Repo
repo FetchCount
FetchAll

-- | List hooks.
-- See <https://developer.github.com/v3/repos/hooks/#list-hooks>
webhooksForR :: Name Owner -> Name Repo -> FetchCount -> Request k (Vector RepoWebhook)
webhooksForR :: Name Owner
-> Name Repo -> FetchCount -> Request k (Vector RepoWebhook)
webhooksForR user :: Name Owner
user repo :: Name Repo
repo =
    Paths
-> QueryString -> FetchCount -> Request k (Vector RepoWebhook)
forall a (mt :: RW).
FromJSON a =>
Paths -> QueryString -> FetchCount -> Request mt (Vector a)
pagedQuery ["repos", Name Owner -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Owner
user, Name Repo -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Repo
repo, "hooks"] []

webhookFor' :: Auth -> Name Owner -> Name Repo -> Id RepoWebhook -> IO (Either Error RepoWebhook)
webhookFor' :: Auth
-> Name Owner
-> Name Repo
-> Id RepoWebhook
-> IO (Either Error RepoWebhook)
webhookFor' auth :: Auth
auth user :: Name Owner
user repo :: Name Repo
repo hookId :: Id RepoWebhook
hookId =
    Auth
-> GenRequest 'MtJSON Any RepoWebhook
-> IO (Either Error RepoWebhook)
forall am (mt :: MediaType *) a (rw :: RW).
(AuthMethod am, ParseResponse mt a) =>
am -> GenRequest mt rw a -> IO (Either Error a)
executeRequest Auth
auth (GenRequest 'MtJSON Any RepoWebhook
 -> IO (Either Error RepoWebhook))
-> GenRequest 'MtJSON Any RepoWebhook
-> IO (Either Error RepoWebhook)
forall a b. (a -> b) -> a -> b
$ Name Owner
-> Name Repo
-> Id RepoWebhook
-> GenRequest 'MtJSON Any RepoWebhook
forall (k :: RW).
Name Owner -> Name Repo -> Id RepoWebhook -> Request k RepoWebhook
webhookForR Name Owner
user Name Repo
repo Id RepoWebhook
hookId

-- | Query single hook.
-- See <https://developer.github.com/v3/repos/hooks/#get-single-hook>
webhookForR :: Name Owner -> Name Repo -> Id RepoWebhook -> Request k RepoWebhook
webhookForR :: Name Owner -> Name Repo -> Id RepoWebhook -> Request k RepoWebhook
webhookForR user :: Name Owner
user repo :: Name Repo
repo hookId :: Id RepoWebhook
hookId =
    Paths -> QueryString -> Request k RepoWebhook
forall (mt :: RW) a. Paths -> QueryString -> Request mt a
query ["repos", Name Owner -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Owner
user, Name Repo -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Repo
repo, "hooks", Id RepoWebhook -> Text
forall a. IsPathPart a => a -> Text
toPathPart Id RepoWebhook
hookId] []

createRepoWebhook' :: Auth -> Name Owner -> Name Repo -> NewRepoWebhook -> IO (Either Error RepoWebhook)
createRepoWebhook' :: Auth
-> Name Owner
-> Name Repo
-> NewRepoWebhook
-> IO (Either Error RepoWebhook)
createRepoWebhook' auth :: Auth
auth user :: Name Owner
user repo :: Name Repo
repo hook :: NewRepoWebhook
hook =
    Auth
-> GenRequest 'MtJSON 'RW RepoWebhook
-> IO (Either Error RepoWebhook)
forall am (mt :: MediaType *) a (rw :: RW).
(AuthMethod am, ParseResponse mt a) =>
am -> GenRequest mt rw a -> IO (Either Error a)
executeRequest Auth
auth (GenRequest 'MtJSON 'RW RepoWebhook
 -> IO (Either Error RepoWebhook))
-> GenRequest 'MtJSON 'RW RepoWebhook
-> IO (Either Error RepoWebhook)
forall a b. (a -> b) -> a -> b
$ Name Owner
-> Name Repo
-> NewRepoWebhook
-> GenRequest 'MtJSON 'RW RepoWebhook
createRepoWebhookR Name Owner
user Name Repo
repo NewRepoWebhook
hook

-- | Create a hook.
-- See <https://developer.github.com/v3/repos/hooks/#create-a-hook>
createRepoWebhookR :: Name Owner -> Name Repo -> NewRepoWebhook -> Request 'RW RepoWebhook
createRepoWebhookR :: Name Owner
-> Name Repo
-> NewRepoWebhook
-> GenRequest 'MtJSON 'RW RepoWebhook
createRepoWebhookR user :: Name Owner
user repo :: Name Repo
repo hook :: NewRepoWebhook
hook =
    CommandMethod
-> Paths -> ByteString -> GenRequest 'MtJSON 'RW RepoWebhook
forall a. CommandMethod -> Paths -> ByteString -> Request 'RW a
command CommandMethod
Post ["repos", Name Owner -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Owner
user, Name Repo -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Repo
repo, "hooks"] (NewRepoWebhook -> ByteString
forall a. ToJSON a => a -> ByteString
encode NewRepoWebhook
hook)

editRepoWebhook' :: Auth -> Name Owner -> Name Repo -> Id RepoWebhook -> EditRepoWebhook -> IO (Either Error RepoWebhook)
editRepoWebhook' :: Auth
-> Name Owner
-> Name Repo
-> Id RepoWebhook
-> EditRepoWebhook
-> IO (Either Error RepoWebhook)
editRepoWebhook' auth :: Auth
auth user :: Name Owner
user repo :: Name Repo
repo hookId :: Id RepoWebhook
hookId hookEdit :: EditRepoWebhook
hookEdit =
    Auth
-> GenRequest 'MtJSON 'RW RepoWebhook
-> IO (Either Error RepoWebhook)
forall am (mt :: MediaType *) a (rw :: RW).
(AuthMethod am, ParseResponse mt a) =>
am -> GenRequest mt rw a -> IO (Either Error a)
executeRequest Auth
auth (GenRequest 'MtJSON 'RW RepoWebhook
 -> IO (Either Error RepoWebhook))
-> GenRequest 'MtJSON 'RW RepoWebhook
-> IO (Either Error RepoWebhook)
forall a b. (a -> b) -> a -> b
$ Name Owner
-> Name Repo
-> Id RepoWebhook
-> EditRepoWebhook
-> GenRequest 'MtJSON 'RW RepoWebhook
editRepoWebhookR Name Owner
user Name Repo
repo Id RepoWebhook
hookId EditRepoWebhook
hookEdit

-- | Edit a hook.
-- See <https://developer.github.com/v3/repos/hooks/#edit-a-hook>
editRepoWebhookR :: Name Owner -> Name Repo -> Id RepoWebhook -> EditRepoWebhook -> Request 'RW RepoWebhook
editRepoWebhookR :: Name Owner
-> Name Repo
-> Id RepoWebhook
-> EditRepoWebhook
-> GenRequest 'MtJSON 'RW RepoWebhook
editRepoWebhookR user :: Name Owner
user repo :: Name Repo
repo hookId :: Id RepoWebhook
hookId hookEdit :: EditRepoWebhook
hookEdit =
    CommandMethod
-> Paths -> ByteString -> GenRequest 'MtJSON 'RW RepoWebhook
forall a. CommandMethod -> Paths -> ByteString -> Request 'RW a
command CommandMethod
Patch ["repos", Name Owner -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Owner
user, Name Repo -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Repo
repo, "hooks", Id RepoWebhook -> Text
forall a. IsPathPart a => a -> Text
toPathPart Id RepoWebhook
hookId] (EditRepoWebhook -> ByteString
forall a. ToJSON a => a -> ByteString
encode EditRepoWebhook
hookEdit)

testPushRepoWebhook' :: Auth -> Name Owner -> Name Repo -> Id RepoWebhook -> IO (Either Error Bool)
testPushRepoWebhook' :: Auth
-> Name Owner
-> Name Repo
-> Id RepoWebhook
-> IO (Either Error Bool)
testPushRepoWebhook' auth :: Auth
auth user :: Name Owner
user repo :: Name Repo
repo hookId :: Id RepoWebhook
hookId =
    Auth -> GenRequest 'MtStatus 'RW Bool -> IO (Either Error Bool)
forall am (mt :: MediaType *) a (rw :: RW).
(AuthMethod am, ParseResponse mt a) =>
am -> GenRequest mt rw a -> IO (Either Error a)
executeRequest Auth
auth (GenRequest 'MtStatus 'RW Bool -> IO (Either Error Bool))
-> GenRequest 'MtStatus 'RW Bool -> IO (Either Error Bool)
forall a b. (a -> b) -> a -> b
$ Name Owner
-> Name Repo -> Id RepoWebhook -> GenRequest 'MtStatus 'RW Bool
testPushRepoWebhookR Name Owner
user Name Repo
repo Id RepoWebhook
hookId

-- | Test a push hook.
-- See <https://developer.github.com/v3/repos/hooks/#test-a-push-hook>
testPushRepoWebhookR :: Name Owner -> Name Repo -> Id RepoWebhook -> GenRequest 'MtStatus 'RW Bool
testPushRepoWebhookR :: Name Owner
-> Name Repo -> Id RepoWebhook -> GenRequest 'MtStatus 'RW Bool
testPushRepoWebhookR user :: Name Owner
user repo :: Name Repo
repo hookId :: Id RepoWebhook
hookId =
    CommandMethod
-> Paths -> ByteString -> GenRequest 'MtStatus 'RW Bool
forall (mt :: MediaType *) a.
CommandMethod -> Paths -> ByteString -> GenRequest mt 'RW a
Command CommandMethod
Post (Name Owner -> Name Repo -> Id RepoWebhook -> Maybe Text -> Paths
createWebhookOpPath Name Owner
user Name Repo
repo Id RepoWebhook
hookId (Maybe Text -> Paths) -> Maybe Text -> Paths
forall a b. (a -> b) -> a -> b
$ Text -> Maybe Text
forall a. a -> Maybe a
Just "tests") (() -> ByteString
forall a. ToJSON a => a -> ByteString
encode ())

pingRepoWebhook' :: Auth -> Name Owner -> Name Repo -> Id RepoWebhook -> IO (Either Error Bool)
pingRepoWebhook' :: Auth
-> Name Owner
-> Name Repo
-> Id RepoWebhook
-> IO (Either Error Bool)
pingRepoWebhook' auth :: Auth
auth user :: Name Owner
user repo :: Name Repo
repo hookId :: Id RepoWebhook
hookId =
    Auth -> GenRequest 'MtStatus 'RW Bool -> IO (Either Error Bool)
forall am (mt :: MediaType *) a (rw :: RW).
(AuthMethod am, ParseResponse mt a) =>
am -> GenRequest mt rw a -> IO (Either Error a)
executeRequest Auth
auth (GenRequest 'MtStatus 'RW Bool -> IO (Either Error Bool))
-> GenRequest 'MtStatus 'RW Bool -> IO (Either Error Bool)
forall a b. (a -> b) -> a -> b
$ Name Owner
-> Name Repo -> Id RepoWebhook -> GenRequest 'MtStatus 'RW Bool
pingRepoWebhookR Name Owner
user Name Repo
repo Id RepoWebhook
hookId

-- | Ping a hook.
-- See <https://developer.github.com/v3/repos/hooks/#ping-a-hook>
pingRepoWebhookR :: Name Owner -> Name Repo -> Id RepoWebhook -> GenRequest 'MtStatus 'RW Bool
pingRepoWebhookR :: Name Owner
-> Name Repo -> Id RepoWebhook -> GenRequest 'MtStatus 'RW Bool
pingRepoWebhookR user :: Name Owner
user repo :: Name Repo
repo hookId :: Id RepoWebhook
hookId =
    CommandMethod
-> Paths -> ByteString -> GenRequest 'MtStatus 'RW Bool
forall (mt :: MediaType *) a.
CommandMethod -> Paths -> ByteString -> GenRequest mt 'RW a
Command CommandMethod
Post (Name Owner -> Name Repo -> Id RepoWebhook -> Maybe Text -> Paths
createWebhookOpPath Name Owner
user Name Repo
repo Id RepoWebhook
hookId (Maybe Text -> Paths) -> Maybe Text -> Paths
forall a b. (a -> b) -> a -> b
$ Text -> Maybe Text
forall a. a -> Maybe a
Just "pings") (() -> ByteString
forall a. ToJSON a => a -> ByteString
encode ())

deleteRepoWebhook' :: Auth -> Name Owner -> Name Repo -> Id RepoWebhook -> IO (Either Error ())
deleteRepoWebhook' :: Auth
-> Name Owner
-> Name Repo
-> Id RepoWebhook
-> IO (Either Error ())
deleteRepoWebhook' auth :: Auth
auth user :: Name Owner
user repo :: Name Repo
repo hookId :: Id RepoWebhook
hookId =
    Auth -> GenRequest 'MtUnit 'RW () -> IO (Either Error ())
forall am (mt :: MediaType *) a (rw :: RW).
(AuthMethod am, ParseResponse mt a) =>
am -> GenRequest mt rw a -> IO (Either Error a)
executeRequest Auth
auth (GenRequest 'MtUnit 'RW () -> IO (Either Error ()))
-> GenRequest 'MtUnit 'RW () -> IO (Either Error ())
forall a b. (a -> b) -> a -> b
$ Name Owner
-> Name Repo -> Id RepoWebhook -> GenRequest 'MtUnit 'RW ()
deleteRepoWebhookR Name Owner
user Name Repo
repo Id RepoWebhook
hookId

-- | Delete a hook.
-- See <https://developer.github.com/v3/repos/hooks/#delete-a-hook>
deleteRepoWebhookR :: Name Owner -> Name Repo -> Id RepoWebhook -> GenRequest 'MtUnit 'RW ()
deleteRepoWebhookR :: Name Owner
-> Name Repo -> Id RepoWebhook -> GenRequest 'MtUnit 'RW ()
deleteRepoWebhookR user :: Name Owner
user repo :: Name Repo
repo hookId :: Id RepoWebhook
hookId =
    CommandMethod -> Paths -> ByteString -> GenRequest 'MtUnit 'RW ()
forall (mt :: MediaType *) a.
CommandMethod -> Paths -> ByteString -> GenRequest mt 'RW a
Command CommandMethod
Delete (Name Owner -> Name Repo -> Id RepoWebhook -> Maybe Text -> Paths
createWebhookOpPath Name Owner
user Name Repo
repo Id RepoWebhook
hookId Maybe Text
forall a. Maybe a
Nothing) ByteString
forall a. Monoid a => a
mempty

createBaseWebhookPath :: Name Owner -> Name Repo -> Id RepoWebhook -> Paths
createBaseWebhookPath :: Name Owner -> Name Repo -> Id RepoWebhook -> Paths
createBaseWebhookPath user :: Name Owner
user repo :: Name Repo
repo hookId :: Id RepoWebhook
hookId =
    ["repos", Name Owner -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Owner
user, Name Repo -> Text
forall a. IsPathPart a => a -> Text
toPathPart Name Repo
repo, "hooks", Id RepoWebhook -> Text
forall a. IsPathPart a => a -> Text
toPathPart Id RepoWebhook
hookId]

createWebhookOpPath :: Name Owner -> Name Repo -> Id RepoWebhook -> Maybe Text -> Paths
createWebhookOpPath :: Name Owner -> Name Repo -> Id RepoWebhook -> Maybe Text -> Paths
createWebhookOpPath owner :: Name Owner
owner reqName :: Name Repo
reqName webhookId :: Id RepoWebhook
webhookId Nothing = Name Owner -> Name Repo -> Id RepoWebhook -> Paths
createBaseWebhookPath Name Owner
owner Name Repo
reqName Id RepoWebhook
webhookId
createWebhookOpPath owner :: Name Owner
owner reqName :: Name Repo
reqName webhookId :: Id RepoWebhook
webhookId (Just operation :: Text
operation) = Name Owner -> Name Repo -> Id RepoWebhook -> Paths
createBaseWebhookPath Name Owner
owner Name Repo
reqName Id RepoWebhook
webhookId Paths -> Paths -> Paths
forall a. [a] -> [a] -> [a]
++ [Text
operation]