/ frontend / src / Request.hs
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"