module Network.GitHub
(
userOrganisations
, userOrganisationMemberships
, organisationTeams
, getTeam
, teamMembers
, teamRepositories
, user
, userByLogin
, userRepositories
, userInstallationRepositories
, organisationRepositories
, installationRepositories
, appInstallations
, userInstallations
, repositoryCollaborators
, getCommit
, getContent
, getIssues
, integrationJWT
, reqInstallationAccessToken
, GitHub
, runGitHubClientM
, runGitHubNotApiClientM
, runGitHub'
, runGitHub
, AuthToken
, setUserAgent
, resetPagination
, recurseOff
, recurseOn
, pageSize
, getLinks
, module Network.GitHub.API
, module Network.GitHub.Types
)
where
import Control.Lens
import Control.Monad.IO.Class (MonadIO(..))
import Control.Monad.Except
import Data.Proxy
import Data.Monoid ((<>))
import Data.Time.Clock (getCurrentTime, UTCTime(..), addUTCTime)
import Data.Time.Clock.POSIX
(utcTimeToPOSIXSeconds, posixSecondsToUTCTime)
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Data.ByteString.Lazy as B (toStrict)
import Servant.Client (client, ClientM)
import Crypto.Random (MonadRandom(..))
import Crypto.JOSE.JWK (JWK)
import qualified Crypto.JWT as JWT
import Crypto.JOSE.JWS (Alg(..), newJWSHeader)
import Crypto.JOSE.Compact (encodeCompact)
import Network.GitHub.API
import Network.GitHub.Types
import Network.GitHub.Client
userOrganisations :: GitHub [Organisation]
userOrganisations = github (Proxy :: Proxy UserOrganisations)
userOrganisationMemberships :: GitHub [OrganisationMember]
userOrganisationMemberships = github (Proxy :: Proxy UserOrganisationMemberships)
organisationTeams :: OrgLogin -> GitHub [Team]
organisationTeams = github (Proxy :: Proxy OrganisationTeams)
getTeam :: TeamId -> GitHub Team
getTeam = github (Proxy :: Proxy GetTeam)
teamMembers :: TeamId -> GitHub [Member]
teamMembers = github (Proxy :: Proxy TeamMembers)
teamRepositories :: TeamId -> GitHub [Repository]
teamRepositories = github (Proxy :: Proxy TeamRepositories)
user :: GitHub User
user = github (Proxy :: Proxy GetUser)
userByLogin :: Maybe String -> GitHub User
userByLogin = github (Proxy :: Proxy GetUserByLogin)
userRepositories :: Maybe String -> GitHub [Repository]
userRepositories = github (Proxy :: Proxy UserRepositories)
userInstallationRepositories :: Int -> GitHub Repositories
userInstallationRepositories = github (Proxy :: Proxy UserInstallationRepositories)
organisationRepositories :: OrgLogin -> GitHub [Repository]
organisationRepositories = github (Proxy :: Proxy OrganisationRepositories)
installationRepositories :: GitHub Repositories
installationRepositories = github (Proxy :: Proxy InstallationRepositories)
appInstallations :: GitHub [Installation]
appInstallations = github (Proxy :: Proxy AppInstallations)
userInstallations :: Maybe String -> GitHub Installations
userInstallations = github (Proxy :: Proxy UserInstallations)
repositoryCollaborators :: OrgLogin -> RepoName -> GitHub [Member]
repositoryCollaborators = github (Proxy :: Proxy RepositoryCollaborators)
getCommit :: OrgLogin -> RepoName -> Sha -> GitHub Commit
getCommit = github (Proxy :: Proxy GetCommit)
getContent :: OrgLogin -> RepoName -> String -> Maybe String -> Maybe String -> GitHub Content
getContent = github (Proxy :: Proxy GetContent)
type GHOptions =[(String, String)]
getIssues :: GHOptions -> Owner -> RepoName -> GitHub [Issue]
getIssues opts owner repo
= github (Proxy :: Proxy GetIssues) owner repo
(lookup "milestone" opts)
(lookup "state" opts)
(lookup "assignee" opts)
(lookup "creator" opts)
(lookup "mentioned" opts)
(lookup "labels" opts)
(lookup "sort" opts)
(lookup "direction" opts)
(lookup "since" opts)
integrationJWT
:: (MonadRandom m, MonadError e m, JWT.AsError e)
=> JWK
-> Int
-> UTCTime
-> m Text
integrationJWT key integrationId now' = do
let now = posixSecondsToUTCTime . fromInteger . round $ utcTimeToPOSIXSeconds now'
claimsSet = JWT.emptyClaimsSet
& JWT.claimIss .~ Just (review JWT.string $ show integrationId)
& JWT.claimIat .~ Just (JWT.NumericDate now)
& JWT.claimExp .~ Just (JWT.NumericDate $ addUTCTime 60 now)
signed <- JWT.signClaims key (newJWSHeader ((), RS256)) claimsSet
return . T.decodeUtf8 . B.toStrict $ encodeCompact signed
reqInstallationAccessToken
:: JWK -> Int -> Int -> Maybe InstallationUser -> ClientM InstallationAccessToken
reqInstallationAccessToken key integrationId installationId mbUser = do
now <- liftIO getCurrentTime
jwtEth <- liftIO . runExceptT $ integrationJWT key integrationId now
case jwtEth of
Left (err :: JWT.Error) -> liftIO . fail $ show err
Right jwt ->
client (Proxy :: Proxy ReqInstallationAccessToken)
installationId
(Just "Gorbachev IO")
(Just $ "Bearer " <> T.unpack jwt)
mbUser