module Github.Repos (
userRepos
,organizationRepos
,userRepo
,contributors
,contributorsWithAnonymous
,languagesFor
,tagsFor
,branchesFor
,module Github.Data
,RepoPublicity(..)
,BasicAuth
,createRepo
,createOrganizationRepo
,newRepo
,NewRepo(..)
,editRepo
,def
,Edit(..)
,deleteRepo
) where
import Data.Default
import Data.Aeson.Types
import Github.Data
import Github.Private
import Network.HTTP.Conduit
import qualified Data.ByteString.Char8 as BS
import Control.Applicative
import Network.HTTP.Types
data RepoPublicity =
All
| Owner
| Public
| Private
| Member
deriving (Show, Eq)
userRepos :: String -> RepoPublicity -> IO (Either Error [Repo])
userRepos userName All =
githubGetWithQueryString ["users", userName, "repos"] "type=all"
userRepos userName Owner =
githubGetWithQueryString ["users", userName, "repos"] "type=owner"
userRepos userName Member =
githubGetWithQueryString ["users", userName, "repos"] "type=member"
userRepos userName Public =
githubGetWithQueryString ["users", userName, "repos"] "type=public"
userRepos userName Private =
return $ Left $ UserError "Cannot access private repos using userRepos"
organizationRepos :: String -> IO (Either Error [Repo])
organizationRepos orgName = githubGet ["orgs", orgName, "repos"]
userRepo :: String -> String -> IO (Either Error Repo)
userRepo userName repoName = githubGet ["repos", userName, repoName]
contributors :: String -> String -> IO (Either Error [Contributor])
contributors userName repoName =
githubGet ["repos", userName, repoName, "contributors"]
contributorsWithAnonymous :: String -> String -> IO (Either Error [Contributor])
contributorsWithAnonymous userName repoName =
githubGetWithQueryString
["repos", userName, repoName, "contributors"]
"anon=true"
languagesFor :: String -> String -> IO (Either Error [Language])
languagesFor userName repoName = do
result <- githubGet ["repos", userName, repoName, "languages"]
return $ either Left (Right . getLanguages) result
tagsFor :: String -> String -> IO (Either Error [Tag])
tagsFor userName repoName =
githubGet ["repos", userName, repoName, "tags"]
branchesFor :: String -> String -> IO (Either Error [Branch])
branchesFor userName repoName =
githubGet ["repos", userName, repoName, "branches"]
data NewRepo = NewRepo {
newRepoName :: String
, newRepoDescription :: (Maybe String)
, newRepoHomepage :: (Maybe String)
, newRepoPrivate :: (Maybe Bool)
, newRepoHasIssues :: (Maybe Bool)
, newRepoHasWiki :: (Maybe Bool)
, newRepoHasDownloads :: (Maybe Bool)
} deriving Show
instance ToJSON NewRepo where
toJSON (NewRepo { newRepoName = name
, newRepoDescription = description
, newRepoHomepage = homepage
, newRepoPrivate = private
, newRepoHasIssues = hasIssues
, newRepoHasWiki = hasWiki
, newRepoHasDownloads = hasDownloads
}) = object
[ "name" .= name
, "description" .= description
, "homepage" .= homepage
, "private" .= private
, "has_issues" .= hasIssues
, "has_wiki" .= hasWiki
, "has_downloads" .= hasDownloads
]
newRepo :: String -> NewRepo
newRepo name = NewRepo name Nothing Nothing Nothing Nothing Nothing Nothing
createRepo :: BasicAuth -> NewRepo -> IO (Either Error Repo)
createRepo auth = githubPost auth ["user", "repos"]
createOrganizationRepo :: BasicAuth -> String -> NewRepo -> IO (Either Error Repo)
createOrganizationRepo auth org = githubPost auth ["orgs", org, "repos"]
data Edit = Edit {
editName :: Maybe String
, editDescription :: Maybe String
, editHomepage :: Maybe String
, editPublic :: Maybe Bool
, editHasIssues :: Maybe Bool
, editHasWiki :: Maybe Bool
, editHasDownloads :: Maybe Bool
} deriving Show
instance Default Edit where
def = Edit def def def def def def def
instance ToJSON Edit where
toJSON (Edit { editName = name
, editDescription = description
, editHomepage = homepage
, editPublic = public
, editHasIssues = hasIssues
, editHasWiki = hasWiki
, editHasDownloads = hasDownloads
}) = object
[ "name" .= name
, "description" .= description
, "homepage" .= homepage
, "public" .= public
, "has_issues" .= hasIssues
, "has_wiki" .= hasWiki
, "has_downloads" .= hasDownloads
]
editRepo :: BasicAuth
-> String
-> String
-> Edit
-> IO (Either Error Repo)
editRepo auth user repo body = githubPatch auth ["repos", user, repo] b
where
b = body {editName = editName body <|> Just repo}
deleteRepo :: BasicAuth
-> String
-> String
-> IO (Either Error ())
deleteRepo auth owner repo = do
requestToken >>= either (return . Left) (sendToken)
where
url = "https://github.com/api/v2/json/repos/delete/" ++ owner ++ "/" ++ repo
requestToken :: IO (Either Error DeleteToken)
requestToken = githubAPI "POST" url (Just auth) (Nothing :: Maybe Value)
sendToken (DeleteToken t) = do
let body = RequestBodyBS $ renderSimpleQuery False [("delete_token", t)]
result <- doHttps "POST" url (Just auth) (Just body)
return $ either (Left . HTTPConnectionError)
(const $ Right ())
result
newtype DeleteToken = DeleteToken BS.ByteString
deriving Show
instance FromJSON DeleteToken where
parseJSON (Object o) = DeleteToken <$> o .: "delete_token"
parseJSON _ = fail "Could not build a DeleteToken"