@@ -16,6 +16,7 @@ import Control.Monad.Reader
1616import Control.Task.Scheduler
1717import Data.Aeson
1818import Data.ByteString
19+import qualified Data.Csv as Csv
1920import Data.IORef
2021import Data.Map (Map)
2122import qualified Data.Map as M
@@ -26,12 +27,13 @@ import Data.Tasks.StatusUpdate
2627import qualified Data.Text as T
2728import Data.Yaml
2829import GHC.Generics
29−import GitHub
30+import GitHub hiding (Accept)
3031import GitHub.App.Auth
3132import GitHub.App.Request
3233import GitHub.Data.Name
3334import GitHub.Data.Webhooks.Events
3435import GitHub.Data.Webhooks.Payload
36+import Network.HTTP.Media.MediaType
3537import Network.Wai.Handler.Warp
3638import Servant
3739import Servant.GitHub.Webhook
@@ -64,6 +66,7 @@ type API =
6466 :> Capture "sha" String
6567 :> "restart"
6668 :> Post '[HTML] Markup
69+ :<|> "results" :> Capture "task name" String :> Get '[CSV, HTML] [Score]
6770
6871webhookInstallation :: MonadIO m => RepoWebhookEvent -> ((), InstallationEvent) -> m ()
6972webhookInstallation _ ((), ev) =
@@ -146,7 +149,7 @@ newtype ServerM (schema :: SchemasType) a
146149 )
147150
148151server :: ServerT API (ServerM Schema)
149−server = (webhookInstallation :<|> webhookPushEvent) :<|> getSubmissionR :<|> retestSubmission
152+server = (webhookInstallation :<|> webhookPushEvent) :<|> getSubmissionR :<|> retestSubmission :<|> getResults
150153
151154runServer :: IO ()
152155runServer = do
@@ -166,7 +169,7 @@ runServer = do
166169 githubUserName = GithubUserName githubUsername,
167170 githubAccessToken = GithubAccessToken personalAccessToken,
168171 tasks = ts,
169− logger = simpleMessageAction,
172+ logger = cfilter ((logSeverity <=) . msgSeverity) richMessageAction,
170173 baseUrl = baseSiteUrl,
171174 dockerUrl = T.pack cfgDockerUrl
172175 }
@@ -260,3 +263,11 @@ instance HasLog (ServerData m) Message m where
260263 setLogAction :: LogAction m Message -> ServerData m -> ServerData m
261264 setLogAction newLogAction env = env {logger = newLogAction}
262265 {-# INLINE setLogAction #-}
266+
267+data CSV
268+
269+instance Accept CSV where
270+ contentType Proxy = "text" // "csv"
271+
272+instance Csv.ToRecord a => MimeRender CSV [a] where
273+ mimeRender Proxy = Csv.encode