Request.hs
1 module Request 2 ( contents, 3 rateLimit, 4 search, 5 users, 6 ) 7 where 8 9 import Common.Model (Owner, Repo, Token) 10 import Control.Lens ((<>~), (^.), _Wrapped) 11 import Data.Map (Map) 12 import Data.Text (Text) 13 import qualified Data.Text as T 14 import Data.Text.Encoding (decodeUtf8, encodeUtf8) 15 import Network.HTTP.Types.URI (renderSimpleQuery) 16 import Reflex.Dom.Core 17 18 users :: Maybe Token -> Owner -> XhrRequest () 19 users mbToken owner = 20 xhrRequest "GET" (usersURL owner) (requestConfig mbToken) 21 22 contents :: Maybe Token -> Owner -> Repo -> [Text] -> XhrRequest () 23 contents mbToken owner repo path = 24 xhrRequest "GET" (contentsURL owner repo path) (requestConfig mbToken) 25 26 rateLimit :: Token -> XhrRequest () 27 rateLimit token = 28 xhrRequest "GET" rateLimitURL (requestConfig $ Just token) 29 30 search :: Token -> Owner -> Repo -> [Text] -> XhrRequest () 31 search token owner repo keywords = 32 xhrRequest "GET" (searchURL <> queryParams) (requestConfig $ Just token) 33 where 34 queryParams = 35 decodeUtf8 $ 36 renderSimpleQuery 37 True 38 [ ( "q", 39 encodeUtf8 40 . T.unwords 41 $ keywords 42 <> ["repo:" <> owner ^. _Wrapped <> "/" <> repo ^. _Wrapped] 43 ), 44 -- That is the maximum the GibHub API allows 45 ("per_page", "100") 46 ] 47 48 requestConfig :: Maybe Token -> XhrRequestConfig () 49 requestConfig mbToken = def & xhrRequestConfig_headers <>~ tokenHeader mbToken 50 51 tokenHeader :: Maybe Token -> Map Text Text 52 tokenHeader (Just token) = "Authorization" =: ("Bearer " <> token ^. _Wrapped) 53 tokenHeader Nothing = mempty 54 55 contentsURL :: Owner -> Repo -> [Text] -> Text 56 contentsURL owner repo path = 57 T.intercalate "/" $ 58 [ githubBaseURL, 59 "repos", 60 owner ^. _Wrapped, 61 repo ^. _Wrapped, 62 "contents" 63 ] 64 <> path 65 66 usersURL :: Owner -> Text 67 usersURL owner = 68 T.intercalate 69 "/" 70 [ githubBaseURL, 71 "users", 72 owner ^. _Wrapped 73 ] 74 75 rateLimitURL :: Text 76 rateLimitURL = githubBaseURL <> "/rate_limit" 77 78 searchURL :: Text 79 searchURL = githubBaseURL <> "/search/code" 80 81 githubBaseURL :: Text 82 githubBaseURL = "https://api.github.com"