filter eos versions available based on arch

This commit is contained in:
Lucy Cifferello
2022-11-28 17:42:54 -05:00
parent 81ed7962b3
commit 995af16e7e
4 changed files with 58 additions and 32 deletions

View File

@@ -12,15 +12,18 @@ import Database.Esqueleto.Experimental (
orderBy,
select,
table,
where_,
val,
(^.),
(==.)
)
import Foundation (Handler, RegistryCtx (appSettings))
import Handler.Package.V0.ReleaseNotes (ReleaseNotes (..))
import Handler.Util (queryParamAs, tickleMAU)
import Handler.Util (queryParamAs, tickleMAU, getArchQuery)
import Lib.Types.Emver (Version, parseVersion)
import Model (EntityField (..), OsVersion (..))
import Orphans.Emver ()
import Startlude (Bool (..), Down (..), Eq, Generic, Maybe (..), Ord ((<)), Show, Text, const, filter, fst, head, maybe, pure, sortOn, ($), (&&&), (.), (<$>), (<&>), (<=))
import Startlude (Bool (..), Down (..), Eq, Generic, Maybe (..), Ord ((<)), Show, Text, const, filter, fst, head, maybe, pure, sortOn, ($), (&&&), (.), (<$>), (<&>), (<=), (>>=))
import Yesod (ToContent (toContent), ToTypedContent (..), YesodPersist (runDB), getsYesod, sendResponseStatus)
import Yesod.Core.Types (JSONResponse (..))
import Settings (AppSettings(maxEosVersion))
@@ -46,32 +49,36 @@ instance ToTypedContent EosRes where
getEosVersionR :: Handler (JSONResponse (Maybe EosRes))
getEosVersionR = do
currentEosVersion <- queryParamAs "eos-version" parseVersion
case currentEosVersion of
Nothing -> sendResponseStatus status400 (InvalidParamsE "Param is required" "eos-version")
Just currentEosVersion' -> do
maxVersion <- getsYesod $ maxEosVersion . appSettings
allEosVersions <- runDB $
select $ do
vers <- from $ table @OsVersion
orderBy [desc (vers ^. OsVersionNumber)]
pure vers
let osV = determineMaxEosVersionAvailable maxVersion currentEosVersion' $ entityVal <$> allEosVersions
let mLatest = head osV
let mappedVersions =
ReleaseNotes $
HM.fromList $
sortOn (Down . fst) $
filter (maybe (const True) (<) currentEosVersion . fst) $
((osVersionNumber &&& osVersionReleaseNotes))
<$> osV
tickleMAU
pure . JSONResponse $
mLatest <&> \latest ->
EosRes
{ eosResVersion = osVersionNumber latest
, eosResHeadline = osVersionHeadline latest
, eosResReleaseNotes = mappedVersions
}
getArchQuery >>= \case
Nothing -> sendResponseStatus status400 (InvalidParamsE "Param is required" "arch")
Just arch -> do
case currentEosVersion of
Nothing -> sendResponseStatus status400 (InvalidParamsE "Param is required" "eos-version")
Just currentEosVersion' -> do
maxVersion <- getsYesod $ maxEosVersion . appSettings
allEosVersions <- runDB $
select $ do
vers <- from $ table @OsVersion
where_ (vers ^. OsVersionArch ==. val (Just arch))
orderBy [desc (vers ^. OsVersionNumber)]
pure vers
let osV = determineMaxEosVersionAvailable maxVersion currentEosVersion' $ entityVal <$> allEosVersions
let mLatest = head osV
let mappedVersions =
ReleaseNotes $
HM.fromList $
sortOn (Down . fst) $
filter (maybe (const True) (<) currentEosVersion . fst) $
((osVersionNumber &&& osVersionReleaseNotes))
<$> osV
tickleMAU
pure . JSONResponse $
mLatest <&> \latest ->
EosRes
{ eosResVersion = osVersionNumber latest
, eosResHeadline = osVersionHeadline latest
, eosResReleaseNotes = mappedVersions
}
determineMaxEosVersionAvailable :: Version -> Version -> [OsVersion] -> [OsVersion]
determineMaxEosVersionAvailable maxEosVersion currentEosVersion versions = do

View File

@@ -23,7 +23,7 @@ import Lib.PkgRepository (
PkgRepo,
getHash,
)
import Lib.Types.Core (PkgId)
import Lib.Types.Core (PkgId, OsArch)
import Lib.Types.Emver (
Version,
VersionRange,
@@ -177,5 +177,5 @@ fetchCompatiblePkgVersions osVersion pkg = do
Nothing -> const True
Just v -> flip satisfies v
getArchQuery :: Handler (Maybe Text)
getArchQuery :: Handler (Maybe OsArch)
getArchQuery = parseQueryParam "arch" ((flip $ note . mappend "Invalid 'arch': ") =<< readMaybe)

View File

@@ -57,6 +57,7 @@ import Web.HttpApiData (
ToHttpApiData,
)
import Yesod (PathPiece (..))
import Prelude (read)
newtype PkgId = PkgId {unPkgId :: Text}
@@ -88,6 +89,23 @@ instance PathPiece PkgId where
fromPathPiece = fmap PkgId . fromPathPiece
toPathPiece = unPkgId
data OsArch = X86_64 | AARCH64 | RASPBERRYPI
deriving (Eq, Ord)
instance Show OsArch where
show X86_64 = "x86_64"
show AARCH64 = "aarch64"
show RASPBERRYPI = "raspberrypi"
instance Read OsArch where
readsPrec _ "x86_64" = [(X86_64, "")]
readsPrec _ "aarch64" = [(AARCH64, "")]
readsPrec _ "raspberrypi" = [(RASPBERRYPI, "")]
readsPrec _ _ = []
instance PersistField OsArch where
toPersistValue = PersistText . show
fromPersistValue (PersistText t) = Right $ read $ toS t
fromPersistValue other = Left [i|Invalid OsArch: #{other}|]
instance PersistFieldSql OsArch where
sqlType _ = SqlString
newtype Extension (a :: Symbol) = Extension String deriving (Eq)
type S9PK = Extension "s9pk"

View File

@@ -22,7 +22,7 @@ import Database.Persist.TH (
share,
sqlSettings,
)
import Lib.Types.Core (PkgId (PkgId))
import Lib.Types.Core (PkgId (PkgId), OsArch)
import Lib.Types.Emver (
Version,
VersionRange,
@@ -71,6 +71,7 @@ OsVersion
number Version
headline Text
releaseNotes Text
arch OsArch Maybe
deriving Eq
deriving Show
@@ -129,7 +130,7 @@ UserActivity
createdAt UTCTime
serverId Text
osVersion Version
arch Text
arch OsArch
Admin
Id Text