From 6c55244aa49f19fddf35025595c6c270942243d7 Mon Sep 17 00:00:00 2001 From: Keagan McClelland Date: Wed, 29 Sep 2021 14:11:51 -0600 Subject: [PATCH] send back release notes for eos --- src/Handler/Version.hs | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/Handler/Version.hs b/src/Handler/Version.hs index 100aa53..4e0a1ac 100644 --- a/src/Handler/Version.hs +++ b/src/Handler/Version.hs @@ -15,17 +15,20 @@ import qualified Data.Attoparsec.Text as Atto import Data.String.Interpolate.IsString ( i ) import qualified Data.Text as T +import qualified Data.Text.IO as T import Foundation import Handler.Types.Status import Lib.Error ( S9Error(NotFoundE) ) import Lib.PkgRepository ( getBestVersion ) import Lib.Types.AppIndex ( PkgId ) -import Lib.Types.Emver ( parseVersion +import Lib.Types.Emver ( Version(..) + , parseVersion , satisfies ) import Network.HTTP.Types.Status ( status404 ) import Settings import System.FilePath ( () ) +import System.IO.Error ( isDoesNotExistError ) import UnliftIO.Directory ( listDirectory ) import Util.Shared ( getVersionSpecFromQuery , orThrow @@ -41,7 +44,13 @@ getPkgVersionR pkg = do status404 (NotFoundE [i|Version for #{pkg} satisfying #{spec}|]) -getEosVersionR :: Handler AppVersionRes + +data EosVersionRes = EosVersionRes + { eosVersionVersion :: Version + , eosVersionReleaseNotes :: Text + } + +getEosVersionR :: Handler EosVersionRes getEosVersionR = do spec <- getVersionSpecFromQuery root <- getsYesod $ ( "eos") . resourcesDir . appSettings @@ -49,4 +58,10 @@ getEosVersionR = do let (failures, successes) = partitionEithers $ (Atto.parseOnly parseVersion . T.pack) <$> subdirs for_ failures $ \f -> $logWarn [i|Emver Parse Failure for EOS: #{f}|] let res = headMay . sortOn Down . filter (`satisfies` spec) $ successes - maybe (sendResponseStatus status404 (NotFoundE [i|EOS version satisfying #{spec}|])) (pure . AppVersionRes) res + case res of + Nothing -> sendResponseStatus status404 (NotFoundE [i|EOS version satisfying #{spec}|]) + Just r -> do + let notesPath = root show r "release-notes.md" + notes <- liftIO $ T.readFile notesPath `catch` \e -> + if isDoesNotExistError e then pure [i|# Release Notes Missing for #{r}|] else throwIO e + pure $ EosVersionRes r notes