-- |
--
-- <https://developer.github.com/v3/pulls/review_requests>
--
module GitHub.Endpoints.PullRequests.ReviewRequests
    ( RequestReview(..)
    , requestOneReviewer
    , ReviewRequest(..)
    , createReviewRequest
    , createReviewRequestR
    )
where

import Prelude

import Data.Aeson
import GitHub.Data
import GitHub.Request

data RequestReview = RequestReview
    { RequestReview -> [Name User]
requestReviewReviewers :: [Name User]
    , RequestReview -> [Name Team]
requestReviewTeamReviewers :: [Name Team]
    }

requestOneReviewer :: Name User -> RequestReview
requestOneReviewer :: Name User -> RequestReview
requestOneReviewer reviewer :: Name User
reviewer = RequestReview :: [Name User] -> [Name Team] -> RequestReview
RequestReview
    { requestReviewReviewers :: [Name User]
requestReviewReviewers = [Name User
reviewer]
    , requestReviewTeamReviewers :: [Name Team]
requestReviewTeamReviewers = []
    }

instance ToJSON RequestReview where
    toJSON :: RequestReview -> Value
toJSON rr :: RequestReview
rr = [Pair] -> Value
object
        [ "reviewers" Text -> [Name User] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= RequestReview -> [Name User]
requestReviewReviewers RequestReview
rr
        , "team_reviewers" Text -> [Name Team] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= RequestReview -> [Name Team]
requestReviewTeamReviewers RequestReview
rr
        ]

newtype ReviewRequest = ReviewRequest
    { ReviewRequest -> URL
reviewRequestUrl :: URL
    }

instance FromJSON ReviewRequest where
    parseJSON :: Value -> Parser ReviewRequest
parseJSON = String
-> (Object -> Parser ReviewRequest)
-> Value
-> Parser ReviewRequest
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject "ReviewRequest" ((Object -> Parser ReviewRequest) -> Value -> Parser ReviewRequest)
-> (Object -> Parser ReviewRequest)
-> Value
-> Parser ReviewRequest
forall a b. (a -> b) -> a -> b
$ \o :: Object
o -> URL -> ReviewRequest
ReviewRequest (URL -> ReviewRequest) -> Parser URL -> Parser ReviewRequest
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser URL
forall a. FromJSON a => Object -> Text -> Parser a
.: "url"

createReviewRequest
    :: Auth
    -> Name Owner
    -> Name Repo
    -> IssueNumber
    -> RequestReview
    -> IO (Either Error ReviewRequest)
createReviewRequest :: Auth
-> Name Owner
-> Name Repo
-> IssueNumber
-> RequestReview
-> IO (Either Error ReviewRequest)
createReviewRequest auth :: Auth
auth user :: Name Owner
user repo :: Name Repo
repo pull :: IssueNumber
pull =
    Auth
-> GenRequest 'MtJSON 'RW ReviewRequest
-> IO (Either Error ReviewRequest)
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 ReviewRequest
 -> IO (Either Error ReviewRequest))
-> (RequestReview -> GenRequest 'MtJSON 'RW ReviewRequest)
-> RequestReview
-> IO (Either Error ReviewRequest)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name Owner
-> Name Repo
-> IssueNumber
-> RequestReview
-> GenRequest 'MtJSON 'RW ReviewRequest
createReviewRequestR Name Owner
user Name Repo
repo IssueNumber
pull

createReviewRequestR
    :: Name Owner
    -> Name Repo
    -> IssueNumber
    -> RequestReview
    -> Request 'RW ReviewRequest
createReviewRequestR :: Name Owner
-> Name Repo
-> IssueNumber
-> RequestReview
-> GenRequest 'MtJSON 'RW ReviewRequest
createReviewRequestR user :: Name Owner
user repo :: Name Repo
repo pull :: IssueNumber
pull = CommandMethod
-> Paths -> ByteString -> GenRequest 'MtJSON 'RW ReviewRequest
forall a. CommandMethod -> Paths -> ByteString -> Request 'RW a
command CommandMethod
Post Paths
paths (ByteString -> GenRequest 'MtJSON 'RW ReviewRequest)
-> (RequestReview -> ByteString)
-> RequestReview
-> GenRequest 'MtJSON 'RW ReviewRequest
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RequestReview -> ByteString
forall a. ToJSON a => a -> ByteString
encode
  where
    paths :: Paths
paths =
        [ "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
        , "pulls"
        , IssueNumber -> Text
forall a. IsPathPart a => a -> Text
toPathPart IssueNumber
pull
        , "requested_reviewers"
        ]