From 25769d05d149282a648b4c67050fa4241478a6d0 Mon Sep 17 00:00:00 2001 From: Lucy Cifferello <12953208+elvece@users.noreply.github.com> Date: Sat, 9 Jul 2022 16:32:13 -0600 Subject: [PATCH] filter empty version sets --- src/Handler/Package/V0/Latest.hs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Handler/Package/V0/Latest.hs b/src/Handler/Package/V0/Latest.hs index cffe72e..895ef6d 100644 --- a/src/Handler/Package/V0/Latest.hs +++ b/src/Handler/Package/V0/Latest.hs @@ -1,11 +1,12 @@ module Handler.Package.V0.Latest where -import Conduit (mapC, runConduit, sinkList, (.|)) +import Conduit (concatMapC, mapC, runConduit, sinkList, (.|)) import Data.Aeson (ToJSON (..), eitherDecode) import Data.ByteString.Lazy qualified as LBS import Data.HashMap.Strict (HashMap) import Data.HashMap.Strict qualified as HM import Data.List (lookup, sortOn) +import Data.List.NonEmpty.Extra qualified as NE import Data.Tuple.Extra (second) import Database.Queries (collateVersions, getPkgDataSource) import Foundation (Handler) @@ -15,7 +16,7 @@ import Lib.Types.Core (PkgId) import Lib.Types.Emver (Version, satisfies) import Model (VersionRecord (..)) import Network.HTTP.Types (status400) -import Startlude (Bool (True), Down (Down), Either (..), Generic, Maybe (..), Show, const, encodeUtf8, filter, flip, headMay, pure, ($), (.), (<$>), (<&>)) +import Startlude (Bool (True), Down (Down), Either (..), Generic, Maybe (..), NonEmpty, Show, const, encodeUtf8, filter, flip, headMay, nonEmpty, pure, ($), (.), (<$>), (<&>)) import Yesod (ToContent (..), ToTypedContent (..), YesodPersist (runDB), YesodRequest (reqGetParams), getRequest, sendResponseStatus) @@ -51,13 +52,14 @@ getVersionLatestR = do -- filter out versions of apps that are incompatible with the OS predicate .| mapC (second (filter (osPredicate' . versionRecordOsVersion))) -- prune empty version sets + .| concatMapC (\(pkgId, vs) -> (pkgId,) <$> nonEmpty vs) -- grab the latest matching version if it exists - .| mapC (\(a, b) -> (a, (selectLatestVersion b))) + .| mapC (\(a, b) -> (a, (Just $ selectLatestVersion b))) .| sinkList -- if the requested package does not have available versions, return it as a key with a null value pure $ VersionLatestRes $ HM.union (HM.fromList $ filteredPackages) (HM.fromList packageList) where - selectLatestVersion :: [VersionRecord] -> Maybe Version - selectLatestVersion vs = headMay $ (versionRecordNumber <$>) $ sortOn (Down . versionRecordNumber) $ vs + selectLatestVersion :: NonEmpty VersionRecord -> Version + selectLatestVersion vs = NE.head $ (versionRecordNumber <$>) $ NE.sortOn (Down . versionRecordNumber) $ vs